Changes in src/GenPoly/Box.cc [c29d9ce:82dd287]
- File:
-
- 1 edited
-
src/GenPoly/Box.cc (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/GenPoly/Box.cc
rc29d9ce r82dd287 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Aug 11 16:22:35201513 // Update Count : 8912 // Last Modified On : Wed Jun 24 16:19:07 2015 13 // Update Count : 10 14 14 // 15 15 … … 77 77 Expression *handleIntrinsics( ApplicationExpr *appExpr ); 78 78 ObjectDecl *makeTemporary( Type *type ); 79 79 80 std::map< std::string, DeclarationWithType *> assignOps; 80 81 typedef std::map< std::string, FunctionDecl *> AdapterMap; 81 std::map< std::string, DeclarationWithType *> assignOps;82 82 std::stack< AdapterMap > adapters; 83 83 DeclarationWithType *retval; … … 168 168 TyVarMap dummyTyVars; 169 169 return isPolyRet( function, name, dummyTyVars ); 170 }171 172 bool isPolyRet( FunctionType *function, const TyVarMap &otherTyVars ) {173 std::string dummyString;174 return isPolyRet( function, dummyString, otherTyVars );175 170 } 176 171 … … 531 526 } 532 527 533 void Pass1::passAdapters( ApplicationExpr * appExpr, FunctionType * functionType, const TyVarMap & exprTyVars ) { 534 // collect a list of function types passed as parameters or implicit parameters (assertions) 528 void Pass1::passAdapters( ApplicationExpr *appExpr, FunctionType *functionType, const TyVarMap &exprTyVars ) { 535 529 std::list< DeclarationWithType *> ¶mList = functionType->get_parameters(); 536 530 std::list< FunctionType *> functions; … … 543 537 findFunction( (*arg)->get_type(), functions, exprTyVars, needsAdapter ); 544 538 } // for 545 546 // parameter function types for which an appropriate adapter has been generated.547 // we cannot use the types after applying substitutions, since two different548 // parameter types may be unified to the same type549 539 std::set< std::string > adaptersDone; 550 551 540 for ( std::list< FunctionType *>::iterator funType = functions.begin(); funType != functions.end(); ++funType ) { 552 FunctionType *originalFunction = (*funType)->clone();553 541 FunctionType *realFunction = (*funType)->clone(); 542 assert( env ); 543 env->apply( realFunction ); 544 554 545 std::string mangleName = SymTab::Mangler::mangle( realFunction ); 555 556 // only attempt to create an adapter or pass one as a parameter if we haven't557 // already done so for this pre-substitution parameter function type.558 546 if ( adaptersDone.find( mangleName ) == adaptersDone.end() ) { 559 std::string mangleName = SymTab::Mangler::mangle( realFunction ); 560 adaptersDone.insert( adaptersDone.begin(), mangleName ); 561 562 // apply substitution to type variables to figure out what the 563 // adapter's type should look like 564 assert( env ); 565 env->apply( realFunction ); 566 mangleName = SymTab::Mangler::mangle( realFunction ); 547 AdapterMap & adapters = Pass1::adapters.top(); 548 AdapterMap::iterator adapter = adapters.find( mangleName ); 567 549 568 550 if ( needsAdapter( realFunction, exprTyVars, true ) ) { … … 571 553 // create a new adapter. 572 554 appExpr->get_args().push_front( new NameExpr( makeAdapterName ( mangleName ) ) ); 573 } else { 574 if ( isPolyRet( originalFunction, exprTyVars ) ) { 575 // if the return type involved polymorphic types, then 576 // the adapter will need to take those polymorphic types 577 // as pointers. Therefore, there can be two different 578 // functions with the same mangled name, so we need two adapter map 579 // stacks and also we need the mangled names to be different. 580 mangleName += "polyret_"; 581 } 582 583 AdapterMap & adapters = Pass1::adapters.top(); 584 AdapterMap::iterator adapter = adapters.find( mangleName ); 585 if ( adapter == adapters.end() ) { 586 // adapter has not been created yet in the current scope, so define it 587 FunctionDecl *newAdapter = makeAdapter( *funType, realFunction, mangleName, exprTyVars ); 588 adapter = adapters.insert( adapters.begin(), std::pair< std::string, FunctionDecl *>( mangleName, newAdapter ) ); 589 stmtsToAdd.push_back( new DeclStmt( noLabels, newAdapter ) ); 590 } // if 591 assert( adapter != adapters.end() ); 592 593 // add the appropriate adapter as a parameter 594 appExpr->get_args().push_front( new VariableExpr( adapter->second ) ); 595 } // if 555 continue; 556 } else if ( adapter == adapters.end() ) { 557 FunctionDecl *newAdapter = makeAdapter( *funType, realFunction, mangleName, exprTyVars ); 558 adapter = adapters.insert( adapters.begin(), std::pair< std::string, FunctionDecl *>( mangleName, newAdapter ) ); 559 stmtsToAdd.push_back( new DeclStmt( noLabels, newAdapter ) ); 560 } // if 561 assert( adapter != adapters.end() ); 562 appExpr->get_args().push_front( new VariableExpr( adapter->second ) ); 563 // appExpr->get_args().push_front( new NameExpr( makeAdapterName ( mangleName ) ) ); 564 adaptersDone.insert( adaptersDone.begin(), mangleName ); 596 565 } // if 597 566 } // for … … 911 880 912 881 void Pass1::doBeginScope() { 913 // actually, maybe this could (should?) push914 // a copy of the current map915 882 adapters.push(AdapterMap()); 916 883 } … … 1084 1051 if ( ObjectDecl *objectDecl = dynamic_cast< ObjectDecl *>( declStmt->get_decl() ) ) { 1085 1052 if ( isPolyVal( objectDecl->get_type(), scopeTyVars ) ) { 1086 // change initialization of a polymorphic value object1087 // to allocate storage with alloca1088 1053 TypeInstType *typeInst = dynamic_cast< TypeInstType *>( objectDecl->get_type() ); 1089 1054 assert( typeInst ); 1090 1055 UntypedExpr *alloc = new UntypedExpr( new NameExpr( "__builtin_alloca" ) ); 1091 1056 alloc->get_args().push_back( new NameExpr( typeInst->get_name() ) ); 1092 1093 delete objectDecl->get_init(); 1094 1095 std::list<Expression*> designators; 1096 objectDecl->set_init( new SingleInit( alloc, designators ) ); 1057 UntypedExpr *assign = new UntypedExpr( new NameExpr( "?=?" ) ); 1058 assign->get_args().push_back( new VariableExpr( objectDecl ) ); 1059 assign->get_args().push_back( alloc ); 1060 stmtsToAddAfter.push_back( new ExprStmt( noLabels, assign ) ); 1097 1061 } 1098 1062 }
Note:
See TracChangeset
for help on using the changeset viewer.