source: src/SynTree/Type.h @ bdad1679

ADTaaron-thesisarm-ehast-experimentalcleanup-dtorsctordeferred_resndemanglerenumforall-pointer-decaygc_noraiijacob/cs343-translationjenkins-sandboxmemorynew-astnew-ast-unique-exprnew-envno_listpersistent-indexerpthread-emulationqualifiedEnumresolv-newstringwith_gc
Last change on this file since bdad1679 was bdad1679, checked in by Peter A. Buhr <pabuhr@…>, 9 years ago

Merge branch 'master' of plg2:software/cfa/cfa-cc

  • Property mode set to 100644
File size: 16.8 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
7// Type.h --
8//
9// Author           : Richard C. Bilson
10// Created On       : Mon May 18 07:44:20 2015
11// Last Modified By : Peter A. Buhr
12// Last Modified On : Fri Feb 26 14:34:08 2016
13// Update Count     : 19
14//
15
16#ifndef TYPE_H
17#define TYPE_H
18
19#include "SynTree.h"
20#include "Visitor.h"
21#include "Mutator.h"
22
23class Type {
24  public:
25        struct Qualifiers {
26                Qualifiers(): isConst( false ), isVolatile( false ), isRestrict( false ), isLvalue( false ), isAtomic( false ), isAttribute( false ) {}
27                Qualifiers( bool isConst, bool isVolatile, bool isRestrict, bool isLvalue, bool isAtomic, bool isAttribute ): isConst( isConst ), isVolatile( isVolatile ), isRestrict( isRestrict ), isLvalue( isLvalue ), isAtomic( isAtomic ), isAttribute( isAttribute ) {}
28
29                Qualifiers &operator+=( const Qualifiers &other );
30                Qualifiers &operator-=( const Qualifiers &other );
31                Qualifiers operator+( const Type::Qualifiers &other );
32                bool operator==( const Qualifiers &other );
33                bool operator!=( const Qualifiers &other );
34                bool operator<=( const Qualifiers &other );
35                bool operator>=( const Qualifiers &other );
36                bool operator<( const Qualifiers &other );
37                bool operator>( const Qualifiers &other );
38
39                bool isConst;
40                bool isVolatile;
41                bool isRestrict;
42                bool isLvalue;
43                bool isAtomic;
44                bool isAttribute;
45        };
46
47        Type( const Qualifiers &tq );
48        Type( const Type &other );
49        virtual ~Type();
50
51        Qualifiers &get_qualifiers() { return tq; }
52        bool get_isConst() { return tq.isConst; }
53        bool get_isVolatile() { return tq.isVolatile; }
54        bool get_isRestrict() { return tq.isRestrict; }
55        bool get_isLvalue() { return tq.isLvalue; }
56        bool get_isAtomic() { return tq.isAtomic; }
57        bool get_isAttribute() { return tq.isAttribute; }
58        void set_isConst( bool newValue ) { tq.isConst = newValue; }
59        void set_isVolatile( bool newValue ) { tq.isVolatile = newValue; }
60        void set_isRestrict( bool newValue ) { tq.isRestrict = newValue; }
61        void set_isLvalue( bool newValue ) { tq.isLvalue = newValue; }
62        void set_isAtomic( bool newValue ) { tq.isAtomic = newValue; }
63        void set_isAttribute( bool newValue ) { tq.isAttribute = newValue; }
64        std::list<TypeDecl*>& get_forall() { return forall; }
65
66        virtual Type *clone() const = 0;
67        virtual void accept( Visitor &v ) = 0;
68        virtual Type *acceptMutator( Mutator &m ) = 0;
69        virtual void print( std::ostream &os, int indent = 0 ) const;
70  private:
71        Qualifiers tq;
72        std::list<TypeDecl*> forall;
73};
74
75class VoidType : public Type {
76  public:
77        VoidType( const Type::Qualifiers &tq );
78
79        virtual VoidType *clone() const { return new VoidType( *this ); }
80        virtual void accept( Visitor &v ) { v.visit( this ); }
81        virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); }
82        virtual void print( std::ostream &os, int indent = 0 ) const;
83};
84
85class BasicType : public Type {
86  public:
87        enum Kind {
88                Bool,
89                Char,
90                SignedChar,
91                UnsignedChar,
92                ShortSignedInt,
93                ShortUnsignedInt,
94                SignedInt,
95                UnsignedInt,
96                LongSignedInt,
97                LongUnsignedInt,
98                LongLongSignedInt,
99                LongLongUnsignedInt,
100                Float,
101                Double,
102                LongDouble,
103                FloatComplex,
104                DoubleComplex,
105                LongDoubleComplex,
106                FloatImaginary,
107                DoubleImaginary,
108                LongDoubleImaginary,
109                NUMBER_OF_BASIC_TYPES
110        };
111
112        static const char *typeNames[];                                         // string names for basic types, MUST MATCH with Kind
113
114        BasicType( const Type::Qualifiers &tq, Kind bt );
115
116        Kind get_kind() { return kind; }
117        void set_kind( Kind newValue ) { kind = newValue; }
118
119        virtual BasicType *clone() const { return new BasicType( *this ); }
120        virtual void accept( Visitor &v ) { v.visit( this ); }
121        virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); }
122        virtual void print( std::ostream &os, int indent = 0 ) const;
123
124        bool isInteger() const;
125  private:
126        Kind kind;
127};
128
129class PointerType : public Type {
130  public:
131        PointerType( const Type::Qualifiers &tq, Type *base );
132        PointerType( const Type::Qualifiers &tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic );
133        PointerType( const PointerType& );
134        virtual ~PointerType();
135
136        Type *get_base() { return base; }
137        void set_base( Type *newValue ) { base = newValue; }
138        Expression *get_dimension() { return dimension; }
139        void set_dimension( Expression *newValue ) { dimension = newValue; }
140        bool get_isVarLen() { return isVarLen; }
141        void set_isVarLen( bool newValue ) { isVarLen = newValue; }
142        bool get_isStatic() { return isStatic; }
143        void set_isStatic( bool newValue ) { isStatic = newValue; }
144
145        virtual PointerType *clone() const { return new PointerType( *this ); }
146        virtual void accept( Visitor &v ) { v.visit( this ); }
147        virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); }
148        virtual void print( std::ostream &os, int indent = 0 ) const;
149  private:
150        Type *base;
151
152        // In C99, pointer types can be qualified in many ways e.g., int f( int a[ static 3 ] )
153        Expression *dimension;
154        bool isVarLen;
155        bool isStatic;
156};
157
158class ArrayType : public Type {
159  public:
160        ArrayType( const Type::Qualifiers &tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic );
161        ArrayType( const ArrayType& );
162        virtual ~ArrayType();
163
164        Type *get_base() { return base; }
165        void set_base( Type *newValue ) { base = newValue; }
166        Expression *get_dimension() { return dimension; }
167        void set_dimension( Expression *newValue ) { dimension = newValue; }
168        bool get_isVarLen() { return isVarLen; }
169        void set_isVarLen( bool newValue ) { isVarLen = newValue; }
170        bool get_isStatic() { return isStatic; }
171        void set_isStatic( bool newValue ) { isStatic = newValue; }
172
173        virtual ArrayType *clone() const { return new ArrayType( *this ); }
174        virtual void accept( Visitor &v ) { v.visit( this ); }
175        virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); }
176        virtual void print( std::ostream &os, int indent = 0 ) const;
177  private:
178        Type *base;
179        Expression *dimension;
180        bool isVarLen;
181        bool isStatic;
182};
183
184class FunctionType : public Type {
185  public:
186        FunctionType( const Type::Qualifiers &tq, bool isVarArgs );
187        FunctionType( const FunctionType& );
188        virtual ~FunctionType();
189
190        std::list<DeclarationWithType*> & get_returnVals() { return returnVals; }
191        std::list<DeclarationWithType*> & get_parameters() { return parameters; }
192        bool get_isVarArgs() { return isVarArgs; }
193        void set_isVarArgs( bool newValue ) { isVarArgs = newValue; }
194
195        virtual FunctionType *clone() const { return new FunctionType( *this ); }
196        virtual void accept( Visitor &v ) { v.visit( this ); }
197        virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); }
198        virtual void print( std::ostream &os, int indent = 0 ) const;
199  private:
200        std::list<DeclarationWithType*> returnVals;
201        std::list<DeclarationWithType*> parameters;
202
203        // Does the function accept a variable number of arguments following the arguments specified in the parameters list.
204        // This could be because of
205        // - an ellipsis in a prototype declaration
206        // - an unprototyped declaration
207        bool isVarArgs;
208};
209
210class ReferenceToType : public Type {
211  public:
212        ReferenceToType( const Type::Qualifiers &tq, const std::string &name );
213        ReferenceToType( const ReferenceToType &other );
214        virtual ~ReferenceToType();
215
216        const std::string &get_name() const { return name; }
217        void set_name( std::string newValue ) { name = newValue; }
218        std::list< Expression* >& get_parameters() { return parameters; }
219
220        virtual ReferenceToType *clone() const = 0;
221        virtual void accept( Visitor &v ) = 0;
222        virtual Type *acceptMutator( Mutator &m ) = 0;
223        virtual void print( std::ostream &os, int indent = 0 ) const;
224  protected:
225        virtual std::string typeString() const = 0;
226        std::list< Expression* > parameters;
227  private:
228        std::string name;
229};
230
231class StructInstType : public ReferenceToType {
232        typedef ReferenceToType Parent;
233  public:
234        StructInstType( const Type::Qualifiers &tq, const std::string &name ) : Parent( tq, name ), baseStruct( 0 ) {}
235        StructInstType( const StructInstType &other ) : Parent( other ), baseStruct( other.baseStruct ) {}
236
237        StructDecl *get_baseStruct() const { return baseStruct; }
238        void set_baseStruct( StructDecl *newValue ) { baseStruct = newValue; }
239
240        /// Accesses generic parameters of base struct (NULL if none such)
241        std::list<TypeDecl*> * get_baseParameters();
242
243        /// Looks up the members of this struct named "name" and places them into "foundDecls".
244        /// Clones declarations into "foundDecls", caller responsible for freeing
245        void lookup( const std::string &name, std::list< Declaration* > &foundDecls ) const;
246
247        virtual StructInstType *clone() const { return new StructInstType( *this ); }
248        virtual void accept( Visitor &v ) { v.visit( this ); }
249        virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); }
250  private:
251        virtual std::string typeString() const;
252
253        // this decl is not "owned" by the struct inst; it is merely a pointer to elsewhere in the tree,
254        // where the structure used in this type is actually defined
255        StructDecl *baseStruct;
256};
257
258class UnionInstType : public ReferenceToType {
259        typedef ReferenceToType Parent;
260  public:
261        UnionInstType( const Type::Qualifiers &tq, const std::string &name ) : Parent( tq, name ), baseUnion( 0 ) {}
262        UnionInstType( const UnionInstType &other ) : Parent( other ), baseUnion( other.baseUnion ) {}
263
264        UnionDecl *get_baseUnion() const { return baseUnion; }
265        void set_baseUnion( UnionDecl *newValue ) { baseUnion = newValue; }
266
267        /// Accesses generic parameters of base union (NULL if none such)
268        std::list<TypeDecl*> * get_baseParameters();
269
270        /// looks up the members of this union named "name" and places them into "foundDecls"
271        /// Clones declarations into "foundDecls", caller responsible for freeing
272        void lookup( const std::string &name, std::list< Declaration* > &foundDecls ) const;
273
274        virtual UnionInstType *clone() const { return new UnionInstType( *this ); }
275        virtual void accept( Visitor &v ) { v.visit( this ); }
276        virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); }
277  private:
278        virtual std::string typeString() const;
279
280        // this decl is not "owned" by the union inst; it is merely a pointer to elsewhere in the tree,
281        // where the union used in this type is actually defined
282        UnionDecl *baseUnion;
283};
284
285class EnumInstType : public ReferenceToType {
286        typedef ReferenceToType Parent;
287  public:
288        EnumInstType( const Type::Qualifiers &tq, const std::string &name ) : Parent( tq, name ) {}
289        EnumInstType( const EnumInstType &other ) : Parent( other ) {}
290
291        virtual EnumInstType *clone() const { return new EnumInstType( *this ); }
292        virtual void accept( Visitor &v ) { v.visit( this ); }
293        virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); }
294  private:
295        virtual std::string typeString() const;
296};
297
298class ContextInstType : public ReferenceToType {
299        typedef ReferenceToType Parent;
300  public:
301        ContextInstType( const Type::Qualifiers &tq, const std::string &name ) : Parent( tq, name ) {}
302        ContextInstType( const ContextInstType &other );
303        ~ContextInstType();
304
305        std::list< Declaration* >& get_members() { return members; }
306
307        virtual ContextInstType *clone() const { return new ContextInstType( *this ); }
308        virtual void accept( Visitor &v ) { v.visit( this ); }
309        virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); }
310  private:
311        virtual std::string typeString() const;
312
313        // this member is filled in by the validate pass, which instantiates the members of the correponding
314        // aggregate with the actual type parameters specified for this use of the context
315        std::list< Declaration* > members;
316};
317
318class TypeInstType : public ReferenceToType {
319        typedef ReferenceToType Parent;
320  public:
321        TypeInstType( const Type::Qualifiers &tq, const std::string &name, TypeDecl *baseType );
322        TypeInstType( const Type::Qualifiers &tq, const std::string &name, bool isFtype );
323        TypeInstType( const TypeInstType &other ) : Parent( other ), baseType( other.baseType ), isFtype( other.isFtype ) {}
324
325        TypeDecl *get_baseType() const { return baseType; }
326        void set_baseType( TypeDecl *newValue );
327        bool get_isFtype() const { return isFtype; }
328        void set_isFtype( bool newValue ) { isFtype = newValue; }
329
330        virtual TypeInstType *clone() const { return new TypeInstType( *this ); }
331        virtual void accept( Visitor &v ) { v.visit( this ); }
332        virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); }
333        virtual void print( std::ostream &os, int indent = 0 ) const;
334  private:
335        virtual std::string typeString() const;
336        // this decl is not "owned" by the type inst; it is merely a pointer to elsewhere in the tree,
337        // where the type used here is actually defined
338        TypeDecl *baseType;
339        bool isFtype;
340};
341
342class TupleType : public Type {
343  public:
344        TupleType( const Type::Qualifiers &tq );
345        TupleType( const TupleType& );
346        virtual ~TupleType();
347
348        std::list<Type*>& get_types() { return types; }
349
350        virtual TupleType *clone() const { return new TupleType( *this ); }
351        virtual void accept( Visitor &v ) { v.visit( this ); }
352        virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); }
353        virtual void print( std::ostream &os, int indent = 0 ) const;
354  private:
355        std::list<Type*> types;
356};
357
358class TypeofType : public Type {
359  public:
360        TypeofType( const Type::Qualifiers &tq, Expression *expr );
361        TypeofType( const TypeofType& );
362        virtual ~TypeofType();
363
364        Expression *get_expr() const { return expr; }
365        void set_expr( Expression *newValue ) { expr = newValue; }
366
367        virtual TypeofType *clone() const { return new TypeofType( *this ); }
368        virtual void accept( Visitor &v ) { v.visit( this ); }
369        virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); }
370        virtual void print( std::ostream &os, int indent = 0 ) const;
371  private:
372        Expression *expr;
373};
374
375class AttrType : public Type {
376  public:
377        AttrType( const Type::Qualifiers &tq, const std::string &name, Expression *expr );
378        AttrType( const Type::Qualifiers &tq, const std::string &name, Type *type );
379        AttrType( const AttrType& );
380        virtual ~AttrType();
381
382        const std::string &get_name() const { return name; }
383        void set_name( const std::string &newValue ) { name = newValue; }
384        Expression *get_expr() const { return expr; }
385        void set_expr( Expression *newValue ) { expr = newValue; }
386        Type *get_type() const { return type; }
387        void set_type( Type *newValue ) { type = newValue; }
388        bool get_isType() const { return isType; }
389        void set_isType( bool newValue ) { isType = newValue; }
390
391        virtual AttrType *clone() const { return new AttrType( *this ); }
392        virtual void accept( Visitor &v ) { v.visit( this ); }
393        virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); }
394        virtual void print( std::ostream &os, int indent = 0 ) const;
395  private:
396        std::string name;
397        Expression *expr;
398        Type *type;
399        bool isType;
400};
401
402/// Represents the GCC built-in varargs type
403class VarArgsType : public Type {
404  public:
405        VarArgsType();
406        VarArgsType( Type::Qualifiers &tq );
407
408        virtual VarArgsType *clone() const { return new VarArgsType( *this ); }
409        virtual void accept( Visitor &v ) { v.visit( this ); }
410        virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); }
411        virtual void print( std::ostream &os, int indent = 0 ) const;
412};
413
414inline Type::Qualifiers &Type::Qualifiers::operator+=( const Type::Qualifiers &other ) {
415        isConst |= other.isConst;
416        isVolatile |= other.isVolatile;
417        isRestrict |= other.isRestrict;
418        isLvalue |= other.isLvalue;
419        isAtomic |= other.isAtomic;
420        return *this;
421}
422
423inline Type::Qualifiers &Type::Qualifiers::operator-=( const Type::Qualifiers &other ) {
424        if ( other.isConst ) isConst = 0;
425        if ( other.isVolatile ) isVolatile = 0;
426        if ( other.isRestrict ) isRestrict = 0;
427        if ( other.isAtomic ) isAtomic = 0;
428        return *this;
429}
430
431inline Type::Qualifiers Type::Qualifiers::operator+( const Type::Qualifiers &other ) {
432        Qualifiers q = other;
433        q += *this;
434        return q;
435}
436
437inline bool Type::Qualifiers::operator==( const Qualifiers &other ) {
438        return isConst == other.isConst
439                && isVolatile == other.isVolatile
440//              && isRestrict == other.isRestrict
441//              && isLvalue == other.isLvalue
442                && isAtomic == other.isAtomic;
443}
444
445inline bool Type::Qualifiers::operator!=( const Qualifiers &other ) {
446        return isConst != other.isConst
447                || isVolatile != other.isVolatile
448//              || isRestrict != other.isRestrict
449//              || isLvalue != other.isLvalue
450                || isAtomic != other.isAtomic;
451}
452
453inline bool Type::Qualifiers::operator<=( const Type::Qualifiers &other ) {
454        return isConst <= other.isConst
455                && isVolatile <= other.isVolatile
456//              && isRestrict <= other.isRestrict
457//              && isLvalue >= other.isLvalue
458                && isAtomic == other.isAtomic;
459}
460
461inline bool Type::Qualifiers::operator>=( const Type::Qualifiers &other ) {
462        return isConst >= other.isConst
463                && isVolatile >= other.isVolatile
464//              && isRestrict >= other.isRestrict
465//              && isLvalue <= other.isLvalue
466                && isAtomic == other.isAtomic;
467}
468
469inline bool Type::Qualifiers::operator<( const Type::Qualifiers &other ) {
470        return operator!=( other ) && operator<=( other );
471}
472
473inline bool Type::Qualifiers::operator>( const Type::Qualifiers &other ) {
474        return operator!=( other ) && operator>=( other );
475}
476
477std::ostream & operator<<( std::ostream & out, Type * type );
478
479#endif // TYPE_H
480
481// Local Variables: //
482// tab-width: 4 //
483// mode: c++ //
484// compile-command: "make install" //
485// End: //
Note: See TracBrowser for help on using the repository browser.