Changes in src/GenPoly/Box.cc [2a7b3ca:8ca3a72]
- File:
-
- 1 edited
-
src/GenPoly/Box.cc (modified) (21 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/Box.cc
r2a7b3ca r8ca3a72 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Jun 21 15:49:59201713 // Update Count : 34 612 // Last Modified On : Sat May 13 09:26:38 2017 13 // Update Count : 341 14 14 // 15 15 … … 101 101 void passTypeVars( ApplicationExpr *appExpr, Type *polyRetType, std::list< Expression *>::iterator &arg, const TyVarMap &exprTyVars ); 102 102 /// wraps a function application with a new temporary for the out-parameter return value 103 Expression *addRetParam( ApplicationExpr *appExpr, Type *retType, std::list< Expression *>::iterator &arg );103 Expression *addRetParam( ApplicationExpr *appExpr, FunctionType *function, Type *retType, std::list< Expression *>::iterator &arg ); 104 104 /// Replaces all the type parameters of a generic type with their concrete equivalents under the current environment 105 105 void replaceParametersWithConcrete( ApplicationExpr *appExpr, std::list< Expression* >& params ); … … 108 108 Type *replaceWithConcrete( ApplicationExpr *appExpr, Type *type, bool doClone = true ); 109 109 /// wraps a function application returning a polymorphic type with a new temporary for the out-parameter return value 110 Expression *addDynRetParam( ApplicationExpr *appExpr, Type *polyType, std::list< Expression *>::iterator &arg );110 Expression *addDynRetParam( ApplicationExpr *appExpr, FunctionType *function, Type *polyType, std::list< Expression *>::iterator &arg ); 111 111 Expression *applyAdapter( ApplicationExpr *appExpr, FunctionType *function, std::list< Expression *>::iterator &arg, const TyVarMap &exprTyVars ); 112 112 void boxParam( Type *formal, Expression *&arg, const TyVarMap &exprTyVars ); … … 134 134 public: 135 135 template< typename DeclClass > 136 DeclClass *handleDecl( DeclClass *decl );136 DeclClass *handleDecl( DeclClass *decl, Type *type ); 137 137 template< typename AggDecl > 138 138 AggDecl * handleAggDecl( AggDecl * aggDecl ); … … 341 341 Statement *makeAlignTo( Expression *lhs, Expression *rhs ) { 342 342 // check that the lhs is zeroed out to the level of rhs 343 Expression *ifCond = makeOp( "?&?", lhs, makeOp( "?-?", rhs, new ConstantExpr( Constant ::from_ulong( 1) ) ) );343 Expression *ifCond = makeOp( "?&?", lhs, makeOp( "?-?", rhs, new ConstantExpr( Constant( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), "1" ) ) ) ); 344 344 // if not aligned, increment to alignment 345 345 Expression *ifExpr = makeOp( "?+=?", lhs->clone(), makeOp( "?-?", rhs->clone(), ifCond->clone() ) ); … … 384 384 385 385 // initialize size and alignment to 0 and 1 (will have at least one member to re-edit size) 386 addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( sizeParam ), new ConstantExpr( Constant ::from_ulong( 0) ) ) );387 addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( alignParam ), new ConstantExpr( Constant ::from_ulong( 1) ) ) );386 addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( sizeParam ), new ConstantExpr( Constant( sizeAlignType->clone(), "0" ) ) ) ); 387 addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( alignParam ), new ConstantExpr( Constant( sizeAlignType->clone(), "1" ) ) ) ); 388 388 unsigned long n_members = 0; 389 389 bool firstMember = true; … … 441 441 442 442 // calculate union layout in function body 443 addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( sizeParam ), new ConstantExpr( Constant ::from_ulong( 1) ) ) );444 addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( alignParam ), new ConstantExpr( Constant ::from_ulong( 1) ) ) );443 addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( sizeParam ), new ConstantExpr( Constant( sizeAlignType->clone(), "1" ) ) ) ); 444 addExpr( layoutDecl->get_statements(), makeOp( "?=?", derefVar( alignParam ), new ConstantExpr( Constant( sizeAlignType->clone(), "1" ) ) ) ); 445 445 for ( std::list< Declaration* >::const_iterator member = unionDecl->get_members().begin(); member != unionDecl->get_members().end(); ++member ) { 446 446 DeclarationWithType *dwt = dynamic_cast< DeclarationWithType * >( *member ); … … 504 504 DeclarationWithType *Pass1::mutate( FunctionDecl *functionDecl ) { 505 505 if ( functionDecl->get_statements() ) { // empty routine body ? 506 // std::cerr << "mutating function: " << functionDecl->get_mangleName() << std::endl;507 506 doBeginScope(); 508 507 scopeTyVars.beginScope(); … … 549 548 retval = oldRetval; 550 549 doEndScope(); 551 // std::cerr << "end function: " << functionDecl->get_mangleName() << std::endl;552 550 } // if 553 551 return functionDecl; … … 665 663 } 666 664 667 Expression *Pass1::addRetParam( ApplicationExpr *appExpr, Type *retType, std::list< Expression *>::iterator &arg ) {665 Expression *Pass1::addRetParam( ApplicationExpr *appExpr, FunctionType *function, Type *retType, std::list< Expression *>::iterator &arg ) { 668 666 // Create temporary to hold return value of polymorphic function and produce that temporary as a result 669 667 // using a comma expression. … … 728 726 } 729 727 730 Expression *Pass1::addDynRetParam( ApplicationExpr *appExpr, Type *dynType, std::list< Expression *>::iterator &arg ) {728 Expression *Pass1::addDynRetParam( ApplicationExpr *appExpr, FunctionType *function, Type *dynType, std::list< Expression *>::iterator &arg ) { 731 729 assert( env ); 732 730 Type *concrete = replaceWithConcrete( appExpr, dynType ); 733 731 // add out-parameter for return value 734 return addRetParam( appExpr, concrete, arg );732 return addRetParam( appExpr, function, concrete, arg ); 735 733 } 736 734 … … 739 737 // if ( ! function->get_returnVals().empty() && isPolyType( function->get_returnVals().front()->get_type(), tyVars ) ) { 740 738 if ( isDynRet( function, tyVars ) ) { 741 ret = addRetParam( appExpr, function ->get_returnVals().front()->get_type(), arg );739 ret = addRetParam( appExpr, function, function->get_returnVals().front()->get_type(), arg ); 742 740 } // if 743 741 std::string mangleName = mangleAdapterName( function, tyVars ); … … 1118 1116 1119 1117 Expression *Pass1::mutate( ApplicationExpr *appExpr ) { 1120 // std::cerr << "mutate appExpr: " << InitTweak::getFunctionName( appExpr ) << std::endl;1118 // std::cerr << "mutate appExpr: "; 1121 1119 // for ( TyVarMap::iterator i = scopeTyVars.begin(); i != scopeTyVars.end(); ++i ) { 1122 1120 // std::cerr << i->first << " "; … … 1143 1141 ReferenceToType *dynRetType = isDynRet( function, exprTyVars ); 1144 1142 1145 // std::cerr << function << std::endl;1146 // std::cerr << "scopeTyVars: ";1147 // printTyVarMap( std::cerr, scopeTyVars );1148 // std::cerr << "exprTyVars: ";1149 // printTyVarMap( std::cerr, exprTyVars );1150 // std::cerr << "env: " << *env << std::endl;1151 // std::cerr << needsAdapter( function, scopeTyVars ) << ! needsAdapter( function, exprTyVars) << std::endl;1152 1153 1143 // NOTE: addDynRetParam needs to know the actual (generated) return type so it can make a temp variable, so pass the result type from the appExpr 1154 1144 // passTypeVars needs to know the program-text return type (i.e. the distinction between _conc_T30 and T3(int)) 1155 1145 // concRetType may not be a good name in one or both of these places. A more appropriate name change is welcome. 1156 1146 if ( dynRetType ) { 1157 // std::cerr << "dynRetType: " << dynRetType << std::endl;1158 1147 Type *concRetType = appExpr->get_result()->isVoid() ? nullptr : appExpr->get_result(); 1159 ret = addDynRetParam( appExpr, concRetType, arg ); // xxx - used to use dynRetType instead of concRetType1148 ret = addDynRetParam( appExpr, function, concRetType, arg ); // xxx - used to use dynRetType instead of concRetType 1160 1149 } else if ( needsAdapter( function, scopeTyVars ) && ! needsAdapter( function, exprTyVars) ) { // xxx - exprTyVars is used above...? 1161 1150 // xxx - the ! needsAdapter check may be incorrect. It seems there is some situation where an adapter is applied where it shouldn't be, and this fixes it for some cases. More investigation is needed. … … 1291 1280 1292 1281 template< typename DeclClass > 1293 DeclClass * Pass2::handleDecl( DeclClass *decl ) {1282 DeclClass * Pass2::handleDecl( DeclClass *decl, Type *type ) { 1294 1283 DeclClass *ret = static_cast< DeclClass *>( Parent::mutate( decl ) ); 1295 1284 … … 1305 1294 1306 1295 DeclarationWithType * Pass2::mutate( FunctionDecl *functionDecl ) { 1307 functionDecl = safe_dynamic_cast< FunctionDecl * > ( handleDecl( functionDecl ) );1296 functionDecl = safe_dynamic_cast< FunctionDecl * > ( handleDecl( functionDecl, functionDecl->get_functionType() ) ); 1308 1297 FunctionType * ftype = functionDecl->get_functionType(); 1309 1298 if ( ! ftype->get_returnVals().empty() && functionDecl->get_statements() ) { … … 1330 1319 1331 1320 ObjectDecl * Pass2::mutate( ObjectDecl *objectDecl ) { 1332 return handleDecl( objectDecl );1321 return handleDecl( objectDecl, objectDecl->get_type() ); 1333 1322 } 1334 1323 … … 1353 1342 addToTyVarMap( typeDecl, scopeTyVars ); 1354 1343 if ( typeDecl->get_base() ) { 1355 return handleDecl( typeDecl );1344 return handleDecl( typeDecl, typeDecl->get_base() ); 1356 1345 } else { 1357 1346 return Parent::mutate( typeDecl ); … … 1360 1349 1361 1350 TypedefDecl * Pass2::mutate( TypedefDecl *typedefDecl ) { 1362 return handleDecl( typedefDecl );1351 return handleDecl( typedefDecl, typedefDecl->get_base() ); 1363 1352 } 1364 1353 … … 1575 1564 /// Returns an index expression into the offset array for a type 1576 1565 Expression *makeOffsetIndex( Type *objectType, long i ) { 1577 ConstantExpr *fieldIndex = new ConstantExpr( Constant::from_ulong( i ) ); 1566 std::stringstream offset_namer; 1567 offset_namer << i; 1568 ConstantExpr *fieldIndex = new ConstantExpr( Constant( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), offset_namer.str() ) ); 1578 1569 UntypedExpr *fieldOffset = new UntypedExpr( new NameExpr( "?[?]" ) ); 1579 1570 fieldOffset->get_args().push_back( new NameExpr( offsetofName( mangleType( objectType ) ) ) ); … … 1788 1779 // all union members are at offset zero 1789 1780 delete offsetofExpr; 1790 return new ConstantExpr( Constant ::from_ulong( 0) );1781 return new ConstantExpr( Constant( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), "0" ) ); 1791 1782 } else return offsetofExpr; 1792 1783 }
Note:
See TracChangeset
for help on using the changeset viewer.