Changes in src/InitTweak/RemoveInit.cc [cf16f94:7cd23d5]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/InitTweak/RemoveInit.cc
rcf16f94 r7cd23d5 7 7 // RemoveInit.cc -- 8 8 // 9 // Author : Ro b Schluntz9 // Author : Rodolfo G. Esteves 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Dec 15 15:37:26201513 // Update Count : 1 512 // Last Modified On : Tue May 19 16:39:32 2015 13 // Update Count : 1 14 14 // 15 15 … … 26 26 const std::list<Label> noLabels; 27 27 } 28 29 class RemoveInit : public Mutator {30 public:31 RemoveInit();32 virtual ObjectDecl * mutate(ObjectDecl *objDecl);33 virtual DeclarationWithType * mutate( FunctionDecl *functionDecl );34 35 virtual Statement * mutate( ReturnStmt * returnStmt );36 37 virtual CompoundStmt * mutate(CompoundStmt * compoundStmt);38 39 protected:40 std::list< Statement* > stmtsToAddBefore;41 std::list< Statement* > stmtsToAddAfter;42 void mutateStatementList( std::list< Statement* > &statements );43 44 std::list<DeclarationWithType*> returnVals;45 UniqueName tempNamer;46 std::string funcName;47 };48 28 49 29 void tweak( std::list< Declaration * > translationUnit ) { … … 52 32 } 53 33 54 RemoveInit::RemoveInit() : tempNamer( "_retVal" ) {}55 56 34 void RemoveInit::mutateStatementList( std::list< Statement* > &statements ) { 57 35 for ( std::list< Statement* >::iterator i = statements.begin(); i != statements.end(); ++i ) { … … 60 38 } // if 61 39 *i = (*i)->acceptMutator( *this ); 62 if ( ! stmtsToAddBefore.empty() ) {63 statements.splice( i, stmtsToAddBefore );64 } // if65 40 } // for 66 41 if ( ! stmtsToAddAfter.empty() ) { … … 74 49 } 75 50 76 // in the case where an object has an initializer and a polymorphic type, insert an assignment immediately after the 77 // declaration. This will (seemingly) cause the later phases to do the right thing with the assignment 51 // in the case where an object has an initializer and a polymorphic type, insert an assignment 52 // immediately after the declaration. This will (seemingly) cause the later phases to do the right 53 // thing with the assignment 78 54 ObjectDecl *RemoveInit::mutate( ObjectDecl *objDecl ) { 79 55 if (objDecl->get_init() && dynamic_cast<TypeInstType*>(objDecl->get_type())) { … … 87 63 return objDecl; 88 64 } 89 90 Statement *RemoveInit::mutate( ReturnStmt *returnStmt ) {91 // update for multiple return values92 assert( returnVals.size() == 0 || returnVals.size() == 1 );93 // hands off if the function returns an lvalue - we don't want to allocate a temporary if a variable's address94 // is being returned95 if ( returnStmt->get_expr() && returnVals.size() == 1 && funcName != "?=?" && ! returnVals.front()->get_type()->get_isLvalue() ) {96 ObjectDecl *newObj = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, 0, returnVals.front()->get_type()->clone(), 0 );97 stmtsToAddBefore.push_back( new DeclStmt( noLabels, newObj ) );98 99 UntypedExpr *assign = new UntypedExpr( new NameExpr( "?=?" ) );100 assign->get_args().push_back( new AddressExpr (new NameExpr( newObj->get_name() ) ) );101 assign->get_args().push_back( returnStmt->get_expr() );102 stmtsToAddBefore.push_back(new ExprStmt(noLabels, assign));103 104 returnStmt->set_expr( new VariableExpr( newObj ) );105 } // if106 return returnStmt;107 }108 109 DeclarationWithType* RemoveInit::mutate( FunctionDecl *functionDecl ) {110 std::list<DeclarationWithType*> oldReturnVals = returnVals;111 std::string oldFuncName = funcName;112 113 FunctionType * type = functionDecl->get_functionType();114 returnVals = type->get_returnVals();115 funcName = functionDecl->get_name();116 DeclarationWithType * decl = Mutator::mutate( functionDecl );117 returnVals = oldReturnVals;118 funcName = oldFuncName;119 return decl;120 }121 65 } // namespace InitTweak 122 66
Note:
See TracChangeset
for help on using the changeset viewer.