source: translator/CodeGen/GenType.cc @ c11e31c

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

fixed sizeof type variable, find lowest cost alternative for sizeof expression, removed unused classes, added compiler flag, remove temporary file for -CFA, formatting

  • Property mode set to 100644
File size: 5.2 KB
Line 
1#include <strstream>
2#include <cassert>
3
4#include "GenType.h"
5#include "CodeGenerator2.h"
6#include "SynTree/Visitor.h"
7#include "SynTree/Type.h"
8#include "SynTree/Expression.h"
9
10namespace CodeGen {
11    class GenType : public Visitor {
12      public:
13        GenType( const std::string &typeString );
14        std::string get_typeString() const { return typeString; }
15        void set_typeString( const std::string &newValue ) { typeString = newValue; }
16 
17        virtual void visit( FunctionType *funcType );
18        virtual void visit( VoidType *voidType );
19        virtual void visit( BasicType *basicType );
20        virtual void visit( PointerType *pointerType );
21        virtual void visit( ArrayType *arrayType );
22        virtual void visit( StructInstType *structInst );
23        virtual void visit( UnionInstType *unionInst );
24        virtual void visit( EnumInstType *enumInst );
25        virtual void visit( TypeInstType *typeInst );
26 
27      private:
28        void handleQualifiers( Type *type );
29        void genArray( const Type::Qualifiers &qualifiers, Type *base, Expression *dimension, bool isVarLen, bool isStatic );
30 
31        std::string typeString;
32    };
33
34    std::string genType( Type *type, const std::string &baseString ) {
35        GenType gt( baseString );
36        type->accept( gt );
37        return gt.get_typeString();
38    }
39
40    GenType::GenType( const std::string &typeString ) : typeString( typeString ) {}
41
42    void GenType::visit( VoidType *voidType ) {
43        typeString = "void " + typeString;
44        handleQualifiers( voidType );
45    }
46
47    void GenType::visit( BasicType *basicType ) {
48        BasicType::Kind kind = basicType->get_kind();
49        assert( 0 <= kind && kind < BasicType::NUMBER_OF_BASIC_TYPES );
50        typeString = std::string( BasicType::typeNames[kind] ) + " " + typeString;
51        handleQualifiers( basicType );
52    }
53
54    void GenType::genArray( const Type::Qualifiers &qualifiers, Type *base, Expression *dimension, bool isVarLen, bool isStatic ) {
55        std::ostrstream os;
56        if ( typeString != "" ) {
57            if ( typeString[ 0 ] == '*' ) {
58                os << "(" << typeString << ")";
59            } else {
60                os << typeString;
61            } // if
62        } // if
63        os << "[";
64
65        if ( isStatic ) {
66            os << "static ";
67        } // if
68        if ( qualifiers.isConst ) {
69            os << "const ";
70        } // if
71        if ( qualifiers.isVolatile ) {
72            os << "volatile ";
73        } // if
74        if ( qualifiers.isRestrict ) {
75            os << "__restrict ";
76        } // if
77        if ( qualifiers.isAtomic ) {
78            os << "_Atomic ";
79        } // if
80        if ( isVarLen ) {
81            os << "*";
82        } // if
83        if ( dimension != 0 ) {
84            CodeGenerator2 cg( os );
85            dimension->accept( cg );
86        } // if
87        os << "]";
88
89        typeString = std::string( os.str(), os.pcount() );
90 
91        base->accept( *this );
92    }
93
94    void GenType::visit( PointerType *pointerType ) {
95        assert( pointerType->get_base() != 0);
96        if ( pointerType->get_isStatic() || pointerType->get_isVarLen() || pointerType->get_dimension() ) {
97            genArray( pointerType->get_qualifiers(), pointerType->get_base(), pointerType->get_dimension(), pointerType->get_isVarLen(), pointerType->get_isStatic() );
98        } else {
99            handleQualifiers( pointerType );
100            if ( typeString[ 0 ] == '?' ) {
101                typeString = "* " + typeString;
102            } else {
103                typeString = "*" + typeString;
104            } // if
105            pointerType->get_base()->accept( *this );
106        } // if
107    }
108
109    void GenType::visit( ArrayType *arrayType ){
110        genArray( arrayType->get_qualifiers(), arrayType->get_base(), arrayType->get_dimension(), arrayType->get_isVarLen(), arrayType->get_isStatic() );
111    }
112
113    void GenType::visit( FunctionType *funcType ) {
114        std::ostrstream os;
115
116        if ( typeString != "" ) {
117            if ( typeString[ 0 ] == '*' ) {
118                os << "(" << typeString << ")";
119            } else {
120                os << typeString;
121            } // if
122        } // if
123 
124        /************* parameters ***************/
125
126        const std::list<DeclarationWithType *> &pars = funcType->get_parameters();
127
128        if ( pars.empty() ) {
129            if ( funcType->get_isVarArgs() ) {
130                os << "()";
131            } else {
132                os << "(void)";
133            } // if
134        } else {
135            CodeGenerator2 cg( os );
136            os << "(" ;
137
138            cg.genCommaList( pars.begin(), pars.end() );
139
140            if ( funcType->get_isVarArgs() ){
141                os << ", ...";
142            } // if
143            os << ")";
144        } // if
145 
146        typeString = std::string( os.str(), os.pcount() );
147
148        if ( funcType->get_returnVals().size() == 0 ) {
149            typeString = "void " + typeString;
150        } else {
151            funcType->get_returnVals().front()->get_type()->accept( *this );
152        } // if
153    }
154
155    void GenType::visit( StructInstType *structInst )  {
156        typeString = "struct " + structInst->get_name() + " " + typeString;
157        handleQualifiers( structInst );
158    }
159
160    void GenType::visit( UnionInstType *unionInst ) {
161        typeString = "union " + unionInst->get_name() + " " + typeString;
162        handleQualifiers( unionInst );
163    }
164
165    void GenType::visit( EnumInstType *enumInst ) {
166        typeString = "enum " + enumInst->get_name() + " " + typeString;
167        handleQualifiers( enumInst );
168    }
169
170    void GenType::visit( TypeInstType *typeInst ) {
171        typeString = typeInst->get_name() + " " + typeString;
172        handleQualifiers( typeInst );
173    }
174
175    void GenType::handleQualifiers( Type *type ) {
176        if ( type->get_isConst() ) {
177            typeString = "const " + typeString;
178        } // if
179        if ( type->get_isVolatile() ) {
180            typeString = "volatile " + typeString;
181        } // if
182        if ( type->get_isRestrict() ) {
183            typeString = "__restrict " + typeString;
184        } // if
185        if ( type->get_isAtomic() ) {
186            typeString = "_Atomic " + typeString;
187        } // if
188    }
189} // namespace CodeGen
Note: See TracBrowser for help on using the repository browser.