Changeset cf16f94 for src/InitTweak
- Timestamp:
- Dec 15, 2015, 4:09:13 PM (9 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, string, with_gc
- Children:
- 4389966
- Parents:
- b0b958a
- Location:
- src/InitTweak
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
src/InitTweak/RemoveInit.cc
rb0b958a rcf16f94 7 7 // RemoveInit.cc -- 8 8 // 9 // Author : Ro dolfo G. Esteves9 // Author : Rob Schluntz 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue May 19 16:39:32201513 // Update Count : 1 12 // Last Modified On : Tue Dec 15 15:37:26 2015 13 // Update Count : 15 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 }; 28 48 29 49 void tweak( std::list< Declaration * > translationUnit ) { … … 32 52 } 33 53 54 RemoveInit::RemoveInit() : tempNamer( "_retVal" ) {} 55 34 56 void RemoveInit::mutateStatementList( std::list< Statement* > &statements ) { 35 57 for ( std::list< Statement* >::iterator i = statements.begin(); i != statements.end(); ++i ) { … … 38 60 } // if 39 61 *i = (*i)->acceptMutator( *this ); 62 if ( ! stmtsToAddBefore.empty() ) { 63 statements.splice( i, stmtsToAddBefore ); 64 } // if 40 65 } // for 41 66 if ( ! stmtsToAddAfter.empty() ) { … … 49 74 } 50 75 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 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 54 78 ObjectDecl *RemoveInit::mutate( ObjectDecl *objDecl ) { 55 79 if (objDecl->get_init() && dynamic_cast<TypeInstType*>(objDecl->get_type())) { … … 63 87 return objDecl; 64 88 } 89 90 Statement *RemoveInit::mutate( ReturnStmt *returnStmt ) { 91 // update for multiple return values 92 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 address 94 // is being returned 95 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 } // if 106 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 } 65 121 } // namespace InitTweak 66 122 -
src/InitTweak/RemoveInit.h
rb0b958a rcf16f94 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue May 19 16:40:11201513 // Update Count : 112 // Last Modified On : Fri Nov 27 17:00:47 2015 13 // Update Count : 2 14 14 // 15 15 … … 27 27 /// Adds assignment statements for polymorphic type initializers 28 28 void tweak( std::list< Declaration * > translationUnit ); 29 30 class RemoveInit : public Mutator {31 public:32 // RemoveInit();33 virtual ObjectDecl *mutate(ObjectDecl *objDecl);34 virtual CompoundStmt *mutate(CompoundStmt *compoundStmt);35 protected:36 std::list< Statement* > stmtsToAddAfter;37 void mutateStatementList( std::list< Statement* > &statements );38 };39 29 } // namespace 40 30
Note: See TracChangeset
for help on using the changeset viewer.