source: src/SynTree/Type.h @ f066321

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 f066321 was f6835e5, checked in by Aaron Moss <a3moss@…>, 8 years ago

Removed restrict qualifier from type comparisons

  • Property mode set to 100644
File size: 15.9 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 : Thu Jul  9 16:46:15 2015
13// Update Count     : 14
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
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;
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        // a utility function
241        void lookup( const std::string &name, std::list< Declaration* > &foundDecls ) const;
242
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 ); }
246  private:
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;
252};
253
254class UnionInstType : public ReferenceToType {
255        typedef ReferenceToType Parent;
256  public:
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 ); }
269  private:
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;
275};
276
277class EnumInstType : public ReferenceToType {
278        typedef ReferenceToType Parent;
279  public:
280        EnumInstType( const Type::Qualifiers &tq, const std::string &name ) : Parent( tq, name ) {}
281        EnumInstType( const EnumInstType &other ) : Parent( other ) {}
282
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 ); }
286  private:
287        virtual std::string typeString() const;
288};
289
290class ContextInstType : public ReferenceToType {
291        typedef ReferenceToType Parent;
292  public:
293        ContextInstType( const Type::Qualifiers &tq, const std::string &name ) : Parent( tq, name ) {}
294        ContextInstType( const ContextInstType &other );
295        ~ContextInstType();
296
297        std::list< Declaration* >& get_members() { return members; }
298
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 ); }
302  private:
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;
308};
309
310class TypeInstType : public ReferenceToType {
311        typedef ReferenceToType Parent;
312  public:
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;
326  private:
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;
332};
333
334class TupleType : public Type {
335  public:
336        TupleType( const Type::Qualifiers &tq );
337        TupleType( const TupleType& );
338        virtual ~TupleType();
339
340        std::list<Type*>& get_types() { return types; }
341
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;
346  private:
347        std::list<Type*> types;
348};
349
350class TypeofType : public Type {
351  public:
352        TypeofType( const Type::Qualifiers &tq, Expression *expr );
353        TypeofType( const TypeofType& );
354        virtual ~TypeofType();
355
356        Expression *get_expr() const { return expr; }
357        void set_expr( Expression *newValue ) { expr = newValue; }
358
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;
363  private:
364        Expression *expr;
365};
366
367class AttrType : public Type {
368  public:
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
374        const std::string &get_name() const { return name; }
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;
387  private:
388        std::string name;
389        Expression *expr;
390        Type *type;
391        bool isType;
392};
393
394inline Type::Qualifiers &Type::Qualifiers::operator+=( const Type::Qualifiers &other ) {
395        isConst |= other.isConst;
396        isVolatile |= other.isVolatile;
397        isRestrict |= other.isRestrict;
398        isLvalue |= other.isLvalue;
399        isAtomic |= other.isAtomic;
400        return *this;
401}
402
403inline Type::Qualifiers &Type::Qualifiers::operator-=( const Type::Qualifiers &other ) {
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;
409}
410
411inline Type::Qualifiers Type::Qualifiers::operator+( const Type::Qualifiers &other ) {
412        Qualifiers q = other;
413        q += *this;
414        return q;
415}
416
417inline bool Type::Qualifiers::operator==( const Qualifiers &other ) {
418        return isConst == other.isConst
419                && isVolatile == other.isVolatile
420//              && isRestrict == other.isRestrict
421//              && isLvalue == other.isLvalue
422                && isAtomic == other.isAtomic;
423}
424
425inline bool Type::Qualifiers::operator!=( const Qualifiers &other ) {
426        return isConst != other.isConst
427                || isVolatile != other.isVolatile
428//              || isRestrict != other.isRestrict
429//              || isLvalue != other.isLvalue
430                || isAtomic != other.isAtomic;
431}
432
433inline bool Type::Qualifiers::operator<=( const Type::Qualifiers &other ) {
434        return isConst <= other.isConst
435                && isVolatile <= other.isVolatile
436//              && isRestrict <= other.isRestrict
437//              && isLvalue >= other.isLvalue
438                && isAtomic == other.isAtomic;
439}
440
441inline bool Type::Qualifiers::operator>=( const Type::Qualifiers &other ) {
442        return isConst >= other.isConst
443                && isVolatile >= other.isVolatile
444//              && isRestrict >= other.isRestrict
445//              && isLvalue <= other.isLvalue
446                && isAtomic == other.isAtomic;
447}
448
449inline bool Type::Qualifiers::operator<( const Type::Qualifiers &other ) {
450        return operator!=( other ) && operator<=( other );
451}
452
453inline bool Type::Qualifiers::operator>( const Type::Qualifiers &other ) {
454        return operator!=( other ) && operator>=( other );
455}
456
457#endif // TYPE_H
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.