source: src/SynTree/Type.h @ 721f17a

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 721f17a was 721f17a, checked in by Peter A. Buhr <pabuhr@…>, 9 years ago

fix OT_LABELADDRESS warning, parse genric types

  • Property mode set to 100644
File size: 15.9 KB
RevLine 
[0dd3a2f]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
[721f17a]12// Last Modified On : Fri Jun 26 16:47:54 2015
13// Update Count     : 13
[0dd3a2f]14//
15
[51b7345]16#ifndef TYPE_H
17#define TYPE_H
18
19#include "SynTree.h"
20#include "Visitor.h"
21#include "Mutator.h"
22
[c8ffe20b]23class Type {
24  public:
[0dd3a2f]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 ) {}
[51b7345]28       
[0dd3a2f]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 );
[51b7345]38       
[0dd3a2f]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; }
[721f17a]59        void set_isVolatile( bool newValue ) { tq.isVolatile = newValue; }
[0dd3a2f]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;
[c8ffe20b]70  private:
[0dd3a2f]71        Qualifiers tq;
72        std::list<TypeDecl*> forall;
[51b7345]73};
74
[c8ffe20b]75class VoidType : public Type {
76  public:
[0dd3a2f]77        VoidType( const Type::Qualifiers &tq );
[51b7345]78
[0dd3a2f]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;
[51b7345]83};
84
[c8ffe20b]85class BasicType : public Type {
86  public:
[0dd3a2f]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
[59db689]112        static const char *typeNames[];                                         // string names for basic types, MUST MATCH with Kind
[0dd3a2f]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;
[c8ffe20b]125  private:
[0dd3a2f]126        Kind kind;
[51b7345]127};
128
[c8ffe20b]129class PointerType : public Type {
130  public:
[0dd3a2f]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;
[c8ffe20b]149  private:
[0dd3a2f]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;
[51b7345]156};
157
[c8ffe20b]158class ArrayType : public Type {
159  public:
[0dd3a2f]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;
[c8ffe20b]177  private:
[0dd3a2f]178        Type *base;
179        Expression *dimension;
180        bool isVarLen;
181        bool isStatic;
[51b7345]182};
183
[c8ffe20b]184class FunctionType : public Type {
185  public:
[0dd3a2f]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;
[c8ffe20b]199  private:
[0dd3a2f]200        std::list<DeclarationWithType*> returnVals;
201        std::list<DeclarationWithType*> parameters;
202
203        // does the function accept a variable number of arguments following the arguments
204        // specified in the parameters list.    This could be because of
205        // - an ellipsis in a prototype declaration
206        // - an unprototyped declaration
207        bool isVarArgs;
[51b7345]208};
209
[c8ffe20b]210class ReferenceToType : public Type {
211  public:
[0dd3a2f]212        ReferenceToType( const Type::Qualifiers &tq, const std::string &name );
213        ReferenceToType( const ReferenceToType &other );
214        virtual ~ReferenceToType();
215
[5f2f2d7]216        const std::string &get_name() const { return name; }
[0dd3a2f]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;
[c8ffe20b]224  protected:
[0dd3a2f]225        virtual std::string typeString() const = 0;
226        std::list< Expression* > parameters;
[c8ffe20b]227  private:
[0dd3a2f]228        std::string name;
[51b7345]229};
230
[c8ffe20b]231class StructInstType : public ReferenceToType {
[0dd3a2f]232        typedef ReferenceToType Parent;
[c8ffe20b]233  public:
[0dd3a2f]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 ) {}
[51b7345]236
[0dd3a2f]237        StructDecl *get_baseStruct() const { return baseStruct; }
238        void set_baseStruct( StructDecl *newValue ) { baseStruct = newValue; }
239       
240        // a utility function
241        void lookup( const std::string &name, std::list< Declaration* > &foundDecls ) const;
[51b7345]242
[0dd3a2f]243        virtual StructInstType *clone() const { return new StructInstType( *this ); }
244        virtual void accept( Visitor &v ) { v.visit( this ); }
245        virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); }
[c8ffe20b]246  private:
[0dd3a2f]247        virtual std::string typeString() const;
248       
249        // this decl is not "owned" by the struct inst; it is merely a pointer to elsewhere in the tree,
250        // where the structure used in this type is actually defined
251        StructDecl *baseStruct;
[51b7345]252};
253
[c8ffe20b]254class UnionInstType : public ReferenceToType {
[0dd3a2f]255        typedef ReferenceToType Parent;
[c8ffe20b]256  public:
[0dd3a2f]257        UnionInstType( const Type::Qualifiers &tq, const std::string &name ) : Parent( tq, name ), baseUnion( 0 ) {}
258        UnionInstType( const UnionInstType &other ) : Parent( other ), baseUnion( other.baseUnion ) {}
259
260        UnionDecl *get_baseUnion() const { return baseUnion; }
261        void set_baseUnion( UnionDecl *newValue ) { baseUnion = newValue; }
262       
263        // a utility function
264        void lookup( const std::string &name, std::list< Declaration* > &foundDecls ) const;
265
266        virtual UnionInstType *clone() const { return new UnionInstType( *this ); }
267        virtual void accept( Visitor &v ) { v.visit( this ); }
268        virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); }
[c8ffe20b]269  private:
[0dd3a2f]270        virtual std::string typeString() const;
271       
272        // this decl is not "owned" by the union inst; it is merely a pointer to elsewhere in the tree,
273        // where the union used in this type is actually defined
274        UnionDecl *baseUnion;
[51b7345]275};
276
[c8ffe20b]277class EnumInstType : public ReferenceToType {
[0dd3a2f]278        typedef ReferenceToType Parent;
[c8ffe20b]279  public:
[0dd3a2f]280        EnumInstType( const Type::Qualifiers &tq, const std::string &name ) : Parent( tq, name ) {}
281        EnumInstType( const EnumInstType &other ) : Parent( other ) {}
[51b7345]282
[0dd3a2f]283        virtual EnumInstType *clone() const { return new EnumInstType( *this ); }
284        virtual void accept( Visitor &v ) { v.visit( this ); }
285        virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); }
[c8ffe20b]286  private:
[0dd3a2f]287        virtual std::string typeString() const;
[51b7345]288};
289
[c8ffe20b]290class ContextInstType : public ReferenceToType {
[0dd3a2f]291        typedef ReferenceToType Parent;
[c8ffe20b]292  public:
[0dd3a2f]293        ContextInstType( const Type::Qualifiers &tq, const std::string &name ) : Parent( tq, name ) {}
294        ContextInstType( const ContextInstType &other );
295        ~ContextInstType();
[51b7345]296
[0dd3a2f]297        std::list< Declaration* >& get_members() { return members; }
[51b7345]298
[0dd3a2f]299        virtual ContextInstType *clone() const { return new ContextInstType( *this ); }
300        virtual void accept( Visitor &v ) { v.visit( this ); }
301        virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); }
[c8ffe20b]302  private:
[0dd3a2f]303        virtual std::string typeString() const;
304       
305        // this member is filled in by the validate pass, which instantiates the members of the correponding
306        // aggregate with the actual type parameters specified for this use of the context
307        std::list< Declaration* > members;
[51b7345]308};
309
[c8ffe20b]310class TypeInstType : public ReferenceToType {
[0dd3a2f]311        typedef ReferenceToType Parent;
[c8ffe20b]312  public:
[0dd3a2f]313        TypeInstType( const Type::Qualifiers &tq, const std::string &name, TypeDecl *baseType );
314        TypeInstType( const Type::Qualifiers &tq, const std::string &name, bool isFtype );
315        TypeInstType( const TypeInstType &other ) : Parent( other ), baseType( other.baseType ), isFtype( other.isFtype ) {}
316
317        TypeDecl *get_baseType() const { return baseType; }
318        void set_baseType( TypeDecl *newValue );
319        bool get_isFtype() const { return isFtype; }
320        void set_isFtype( bool newValue ) { isFtype = newValue; }
321       
322        virtual TypeInstType *clone() const { return new TypeInstType( *this ); }
323        virtual void accept( Visitor &v ) { v.visit( this ); }
324        virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); }
325        virtual void print( std::ostream &os, int indent = 0 ) const;
[c8ffe20b]326  private:
[0dd3a2f]327        virtual std::string typeString() const;
328        // this decl is not "owned" by the type inst; it is merely a pointer to elsewhere in the tree,
329        // where the type used here is actually defined
330        TypeDecl *baseType;
331        bool isFtype;
[51b7345]332};
333
[c8ffe20b]334class TupleType : public Type {
335  public:
[0dd3a2f]336        TupleType( const Type::Qualifiers &tq );
337        TupleType( const TupleType& );
338        virtual ~TupleType();
[51b7345]339
[0dd3a2f]340        std::list<Type*>& get_types() { return types; }
[51b7345]341
[0dd3a2f]342        virtual TupleType *clone() const { return new TupleType( *this ); }
343        virtual void accept( Visitor &v ) { v.visit( this ); }
344        virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); }
345        virtual void print( std::ostream &os, int indent = 0 ) const;
[c8ffe20b]346  private:
[0dd3a2f]347        std::list<Type*> types;
[51b7345]348};
349
[c8ffe20b]350class TypeofType : public Type {
351  public:
[0dd3a2f]352        TypeofType( const Type::Qualifiers &tq, Expression *expr );
353        TypeofType( const TypeofType& );
354        virtual ~TypeofType();
[51b7345]355
[0dd3a2f]356        Expression *get_expr() const { return expr; }
357        void set_expr( Expression *newValue ) { expr = newValue; }
[51b7345]358
[0dd3a2f]359        virtual TypeofType *clone() const { return new TypeofType( *this ); }
360        virtual void accept( Visitor &v ) { v.visit( this ); }
361        virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); }
362        virtual void print( std::ostream &os, int indent = 0 ) const;
[c8ffe20b]363  private:
[0dd3a2f]364        Expression *expr;
[51b7345]365};
366
[c8ffe20b]367class AttrType : public Type {
368  public:
[0dd3a2f]369        AttrType( const Type::Qualifiers &tq, const std::string &name, Expression *expr );
370        AttrType( const Type::Qualifiers &tq, const std::string &name, Type *type );
371        AttrType( const AttrType& );
372        virtual ~AttrType();
373
[5f2f2d7]374        const std::string &get_name() const { return name; }
[0dd3a2f]375        void set_name( const std::string &newValue ) { name = newValue; }
376        Expression *get_expr() const { return expr; }
377        void set_expr( Expression *newValue ) { expr = newValue; }
378        Type *get_type() const { return type; }
379        void set_type( Type *newValue ) { type = newValue; }
380        bool get_isType() const { return isType; }
381        void set_isType( bool newValue ) { isType = newValue; }
382
383        virtual AttrType *clone() const { return new AttrType( *this ); }
384        virtual void accept( Visitor &v ) { v.visit( this ); }
385        virtual Type *acceptMutator( Mutator &m ) { return m.mutate( this ); }
386        virtual void print( std::ostream &os, int indent = 0 ) const;
[c8ffe20b]387  private:
[0dd3a2f]388        std::string name;
389        Expression *expr;
390        Type *type;
391        bool isType;
[51b7345]392};
393
[c8ffe20b]394inline Type::Qualifiers &Type::Qualifiers::operator+=( const Type::Qualifiers &other ) {
[0dd3a2f]395        isConst |= other.isConst;
396        isVolatile |= other.isVolatile;
397        isRestrict |= other.isRestrict;
398        isLvalue |= other.isLvalue;
399        isAtomic |= other.isAtomic;
400        return *this;
[51b7345]401}
402
[c8ffe20b]403inline Type::Qualifiers &Type::Qualifiers::operator-=( const Type::Qualifiers &other ) {
[0dd3a2f]404        if ( other.isConst ) isConst = 0;
405        if ( other.isVolatile ) isVolatile = 0;
406        if ( other.isRestrict ) isRestrict = 0;
407        if ( other.isAtomic ) isAtomic = 0;
408        return *this;
[51b7345]409}
410
[c8ffe20b]411inline Type::Qualifiers Type::Qualifiers::operator+( const Type::Qualifiers &other ) {
[0dd3a2f]412        Qualifiers q = other;
413        q += *this;
414        return q;
[51b7345]415}
416
[c8ffe20b]417inline bool Type::Qualifiers::operator==( const Qualifiers &other ) {
[0dd3a2f]418        return isConst == other.isConst
419                && isVolatile == other.isVolatile
420                && isRestrict == other.isRestrict
[bdd516a]421//      && isLvalue == other.isLvalue
[0dd3a2f]422                && isAtomic == other.isAtomic;
[51b7345]423}
424
[c8ffe20b]425inline bool Type::Qualifiers::operator!=( const Qualifiers &other ) {
[0dd3a2f]426        return isConst != other.isConst
427                || isVolatile != other.isVolatile
428                || isRestrict != other.isRestrict
[bdd516a]429//      || isLvalue != other.isLvalue
[0dd3a2f]430                || isAtomic != other.isAtomic;
[51b7345]431}
432
[c8ffe20b]433inline bool Type::Qualifiers::operator<=( const Type::Qualifiers &other ) {
[0dd3a2f]434        return isConst <= other.isConst
435                && isVolatile <= other.isVolatile
436                && isRestrict <= other.isRestrict
[bdd516a]437//      && isLvalue >= other.isLvalue
[0dd3a2f]438                && isAtomic == other.isAtomic;
[51b7345]439}
440
[c8ffe20b]441inline bool Type::Qualifiers::operator>=( const Type::Qualifiers &other ) {
[0dd3a2f]442        return isConst >= other.isConst
443                && isVolatile >= other.isVolatile
444                && isRestrict >= other.isRestrict
[bdd516a]445//      && isLvalue <= other.isLvalue
[0dd3a2f]446                && isAtomic == other.isAtomic;
[51b7345]447}
448
[c8ffe20b]449inline bool Type::Qualifiers::operator<( const Type::Qualifiers &other ) {
[0dd3a2f]450        return operator!=( other ) && operator<=( other );
[51b7345]451}
452
[c8ffe20b]453inline bool Type::Qualifiers::operator>( const Type::Qualifiers &other ) {
[0dd3a2f]454        return operator!=( other ) && operator>=( other );
[51b7345]455}
456
[c8ffe20b]457#endif // TYPE_H
[0dd3a2f]458
459// Local Variables: //
460// tab-width: 4 //
461// mode: c++ //
462// compile-command: "make install" //
463// End: //
Note: See TracBrowser for help on using the repository browser.