source: src/SynTree/Type.h@ fd782b2

ADT aaron-thesis arm-eh ast-experimental cleanup-dtors deferred_resn demangler enum forall-pointer-decay jacob/cs343-translation jenkins-sandbox new-ast new-ast-unique-expr new-env no_list persistent-indexer pthread-emulation qualifiedEnum resolv-new stuck-waitfor-destruct with_gc
Last change on this file since fd782b2 was f006f01, checked in by Rob Schluntz <rschlunt@…>, 9 years ago

replace tuple types with an equivalent struct type

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