Changes in src/SymTab/Autogen.h [1a5ad8c:d180746]
- File:
-
- 1 edited
-
src/SymTab/Autogen.h (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/SymTab/Autogen.h
r1a5ad8c rd180746 19 19 #include <string> // for string 20 20 21 #include "CodeGen/OperatorTable.h"22 21 #include "Common/UniqueName.h" // for UniqueName 23 22 #include "InitTweak/InitTweak.h" // for InitExpander … … 41 40 extern Type * SizeType; 42 41 43 /// intrinsic dereference operator for unqualified types - set when *? function is seen in FindSpecialDeclarations.44 /// Useful for creating dereference ApplicationExprs without a full resolver pass.45 extern FunctionDecl * dereferenceOperator;46 47 // generate the type of an assignment function for paramType48 FunctionType * genAssignType( Type * paramType );49 50 // generate the type of a default constructor or destructor for paramType51 FunctionType * genDefaultType( Type * paramType );52 53 // generate the type of a copy constructor for paramType54 FunctionType * genCopyType( Type * paramType );55 56 42 /// inserts into out a generated call expression to function fname with arguments dstParam and srcParam. Intended to be used with generated ?=?, ?{}, and ^?{} calls. 57 43 template< typename OutputIterator > … … 61 47 /// optionally returns a statement which must be inserted prior to the containing loop, if there is one 62 48 template< typename OutputIterator > 63 Statement * genScalarCall( InitTweak::InitExpander & srcParam, Expression * dstParam, std::string fname, OutputIterator out, Type * type, bool addCast = false ) { 64 bool isReferenceCtorDtor = false; 65 if ( dynamic_cast< ReferenceType * >( type ) && CodeGen::isCtorDtor( fname ) ) { 66 // reference constructors are essentially application of the rebind operator. 67 // apply & to both arguments, do not need a cast 68 fname = "?=?"; 69 dstParam = new AddressExpr( dstParam ); 70 addCast = false; 71 isReferenceCtorDtor = true; 72 } 49 Statement * genScalarCall( InitTweak::InitExpander & srcParam, Expression *dstParam, const std::string & fname, OutputIterator out, Type * type, bool addCast = false ) { 50 // want to be able to generate assignment, ctor, and dtor generically, 51 // so fname is either ?=?, ?{}, or ^?{} 52 UntypedExpr *fExpr = new UntypedExpr( new NameExpr( fname ) ); 73 53 74 // want to be able to generate assignment, ctor, and dtor generically, 75 // so fname is either ?=?, ?{}, or ^?{} 76 UntypedExpr * fExpr = new UntypedExpr( new NameExpr( fname ) ); 54 // do something special for unnamed members 55 dstParam = new AddressExpr( dstParam ); 56 if ( addCast ) { 57 // cast to T* with qualifiers removed, so that qualified objects can be constructed 58 // and destructed with the same functions as non-qualified objects. 59 // unfortunately, lvalue is considered a qualifier. For AddressExpr to resolve, its argument 60 // must have an lvalue qualified type, so remove all qualifiers except lvalue. If we ever 61 // remove lvalue as a qualifier, this can change to 62 // type->get_qualifiers() = Type::Qualifiers(); 63 assert( type ); 64 Type * castType = type->clone(); 65 castType->get_qualifiers() -= Type::Qualifiers( Type::Const | Type::Volatile | Type::Restrict | Type::Atomic ); 66 castType->set_lvalue( true ); // xxx - might not need this 67 dstParam = new CastExpr( dstParam, new PointerType( Type::Qualifiers(), castType ) ); 68 } 69 fExpr->get_args().push_back( dstParam ); 77 70 78 if ( addCast ) { 79 // cast to T& with qualifiers removed, so that qualified objects can be constructed 80 // and destructed with the same functions as non-qualified objects. 81 // unfortunately, lvalue is considered a qualifier. For AddressExpr to resolve, its argument 82 // must have an lvalue qualified type, so remove all qualifiers except lvalue. If we ever 83 // remove lvalue as a qualifier, this can change to 84 // type->get_qualifiers() = Type::Qualifiers(); 85 assert( type ); 86 Type * castType = type->clone(); 87 castType->get_qualifiers() -= Type::Qualifiers( Type::Lvalue | Type::Const | Type::Volatile | Type::Restrict | Type::Atomic ); 88 // castType->set_lvalue( true ); // xxx - might not need this 89 dstParam = new CastExpr( dstParam, new ReferenceType( Type::Qualifiers(), castType ) ); 90 } 91 fExpr->args.push_back( dstParam ); 71 Statement * listInit = srcParam.buildListInit( fExpr ); 92 72 93 Statement * listInit = srcParam.buildListInit( fExpr ); 73 std::list< Expression * > args = *++srcParam; 74 fExpr->get_args().splice( fExpr->get_args().end(), args ); 94 75 95 // fetch next set of arguments 96 ++srcParam; 76 *out++ = new ExprStmt( noLabels, fExpr ); 97 77 98 // return if adding reference fails - will happen on default constructor and destructor 99 if ( isReferenceCtorDtor && ! srcParam.addReference() ) { 100 delete fExpr; 101 return listInit; 102 } 78 srcParam.clearArrayIndices(); 103 79 104 std::list< Expression * > args = *srcParam; 105 fExpr->args.splice( fExpr->args.end(), args ); 106 107 *out++ = new ExprStmt( noLabels, fExpr ); 108 109 srcParam.clearArrayIndices(); 110 111 return listInit; 80 return listInit; 112 81 } 113 82 … … 125 94 // generate: for ( int i = 0; i < N; ++i ) 126 95 begin = new ConstantExpr( Constant::from_int( 0 ) ); 127 end = array-> dimension->clone();96 end = array->get_dimension()->clone(); 128 97 cmp = new NameExpr( "?<?" ); 129 98 update = new NameExpr( "++?" ); … … 131 100 // generate: for ( int i = N-1; i >= 0; --i ) 132 101 begin = new UntypedExpr( new NameExpr( "?-?" ) ); 133 ((UntypedExpr*)begin)-> args.push_back( array->dimension->clone() );134 ((UntypedExpr*)begin)-> args.push_back( new ConstantExpr( Constant::from_int( 1 ) ) );102 ((UntypedExpr*)begin)->get_args().push_back( array->get_dimension()->clone() ); 103 ((UntypedExpr*)begin)->get_args().push_back( new ConstantExpr( Constant::from_int( 1 ) ) ); 135 104 end = new ConstantExpr( Constant::from_int( 0 ) ); 136 105 cmp = new NameExpr( "?>=?" ); … … 141 110 142 111 UntypedExpr *cond = new UntypedExpr( cmp ); 143 cond-> args.push_back( new VariableExpr( index ) );144 cond-> args.push_back( end );112 cond->get_args().push_back( new VariableExpr( index ) ); 113 cond->get_args().push_back( end ); 145 114 146 115 UntypedExpr *inc = new UntypedExpr( update ); 147 inc-> args.push_back( new VariableExpr( index) );116 inc->get_args().push_back( new AddressExpr( new VariableExpr( index ) ) ); 148 117 149 118 UntypedExpr *dstIndex = new UntypedExpr( new NameExpr( "?[?]" ) ); 150 dstIndex-> args.push_back( dstParam );151 dstIndex-> args.push_back( new VariableExpr( index ) );119 dstIndex->get_args().push_back( dstParam ); 120 dstIndex->get_args().push_back( new VariableExpr( index ) ); 152 121 dstParam = dstIndex; 153 122 154 123 // srcParam must keep track of the array indices to build the 155 124 // source parameter and/or array list initializer 156 srcParam.addArrayIndex( new VariableExpr( index ), array-> dimension->clone() );125 srcParam.addArrayIndex( new VariableExpr( index ), array->get_dimension()->clone() ); 157 126 158 127 // for stmt's body, eventually containing call 159 128 CompoundStmt * body = new CompoundStmt( noLabels ); 160 Statement * listInit = genCall( srcParam, dstParam, fname, back_inserter( body-> kids ), array->base, addCast, forward );129 Statement * listInit = genCall( srcParam, dstParam, fname, back_inserter( body->get_kids() ), array->get_base(), addCast, forward ); 161 130 162 131 // block containing for stmt and index variable 163 132 std::list<Statement *> initList; 164 133 CompoundStmt * block = new CompoundStmt( noLabels ); 165 block-> push_back( new DeclStmt( noLabels, index ) );134 block->get_kids().push_back( new DeclStmt( noLabels, index ) ); 166 135 if ( listInit ) block->get_kids().push_back( listInit ); 167 block-> push_back( new ForStmt( noLabels, initList, cond, inc, body ) );136 block->get_kids().push_back( new ForStmt( noLabels, initList, cond, inc, body ) ); 168 137 169 138 *out++ = block; … … 171 140 172 141 template< typename OutputIterator > 173 Statement * genCall( InitTweak::InitExpander & srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, Type * type, bool addCast, bool forward ) {142 Statement * genCall( InitTweak::InitExpander & srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, Type * type, bool addCast, bool forward ) { 174 143 if ( ArrayType * at = dynamic_cast< ArrayType * >( type ) ) { 175 144 genArrayCall( srcParam, dstParam, fname, out, at, addCast, forward ); … … 185 154 /// ImplicitCtorDtorStmt node. 186 155 template< typename OutputIterator > 187 void genImplicitCall( InitTweak::InitExpander & srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, DeclarationWithType * decl, bool forward = true ) {156 void genImplicitCall( InitTweak::InitExpander & srcParam, Expression * dstParam, const std::string & fname, OutputIterator out, DeclarationWithType * decl, bool forward = true ) { 188 157 ObjectDecl *obj = dynamic_cast<ObjectDecl *>( decl ); 189 158 assert( obj ); … … 193 162 bool addCast = (fname == "?{}" || fname == "^?{}") && ( !obj || ( obj && ! obj->get_bitfieldWidth() ) ); 194 163 std::list< Statement * > stmts; 195 genCall( srcParam, dstParam, fname, back_inserter( stmts ), obj-> type, addCast, forward );164 genCall( srcParam, dstParam, fname, back_inserter( stmts ), obj->get_type(), addCast, forward ); 196 165 197 166 // currently genCall should produce at most one element, but if that changes then the next line needs to be updated to grab the statement which contains the call
Note:
See TracChangeset
for help on using the changeset viewer.