Changeset 77971f6
- Timestamp:
- Oct 27, 2016, 3:24:02 PM (8 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 3f0c6a5
- Parents:
- a1e67dd
- git-author:
- Rob Schluntz <rschlunt@…> (10/27/16 15:11:00)
- git-committer:
- Rob Schluntz <rschlunt@…> (10/27/16 15:24:02)
- Location:
- src
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/AlternativeFinder.cc
ra1e67dd r77971f6 41 41 #include "Common/utility.h" 42 42 #include "InitTweak/InitTweak.h" 43 #include "InitTweak/GenInit.h" 43 44 #include "ResolveTypeof.h" 44 45 … … 207 208 } 208 209 210 // std::unordered_map< Expression *, UniqueExpr * > ; 211 209 212 template< typename StructOrUnionType > 210 213 void AlternativeFinder::addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member ) { 211 212 214 // by this point, member must be a name expr 213 215 NameExpr * nameExpr = safe_dynamic_cast< NameExpr * >( member ); … … 434 436 // flatten actuals so that each actual has an atomic (non-tuple) type 435 437 AltList exploded; 436 Tuples::explode( actuals, back_inserter( exploded ) );438 Tuples::explode( actuals, indexer, back_inserter( exploded ) ); 437 439 438 440 AltList::iterator actualExpr = exploded.begin(); … … 1055 1057 1056 1058 void AlternativeFinder::visit( UniqueExpr *unqExpr ) { 1059 // this won't work because the unqExprs wont share an expression anymore... 1057 1060 AlternativeFinder finder( indexer, env ); 1058 1061 finder.findWithAdjustment( unqExpr->get_expr() ); 1059 1062 for ( Alternative & alt : finder.alternatives ) { 1060 // xxx - it's possible that this won't always do the right thing, i.e. two UniqueExprs 1061 // with the same ID may resolve to different expressions. If this ever happens, it might be necessary 1062 // to try to select an alternative here (i.e. error is there is not a unique min-cost expression). 1063 // One other thought is to to resolve each ID once and map the IDs to resolved expressions, 1064 // but this isn't as simple as it sounds since the alternative is not selected here, meaning it might 1065 // require complicated tracking throughout the system. 1066 1067 // brand the new UniqueExprs with the same id so that they are recognized as the same expression by the expansion pass 1068 alternatives.push_back( Alternative( new UniqueExpr( alt.expr->clone(), unqExpr->get_id() ), env, Cost::zero ) ); 1063 // xxx - attach a resolved ConstructorInit node? 1064 // xxx - is it possible to make the objDecl's type const? 1065 static UniqueName tempNamer( "_unq_expr_" ); 1066 ObjectDecl * objDecl = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, nullptr, alt.expr->get_result()->clone(), nullptr ); 1067 // must be done on two lines because genCtorInit accesses objDecl's fields 1068 objDecl->set_init( InitTweak::genCtorInit( objDecl ) ); 1069 1070 UniqueExpr * newUnqExpr = new UniqueExpr( alt.expr->clone(), unqExpr->get_id() ); 1071 newUnqExpr->set_object( objDecl ); 1072 1073 resolveObject( indexer, objDecl ); 1074 1075 alternatives.push_back( Alternative( newUnqExpr, env, Cost::zero ) ); 1069 1076 } 1070 1077 } -
src/ResolvExpr/AlternativeFinder.h
ra1e67dd r77971f6 95 95 Expression *resolveInVoidContext( Expression *expr, const SymTab::Indexer &indexer, TypeEnvironment &env ); 96 96 97 void resolveObject( const SymTab::Indexer & indexer, ObjectDecl * objectDecl ); 98 97 99 template< typename InputIterator, typename OutputIterator > 98 100 void findMinCost( InputIterator begin, InputIterator end, OutputIterator out ) { -
src/ResolvExpr/Resolver.cc
ra1e67dd r77971f6 35 35 class Resolver : public SymTab::Indexer { 36 36 public: 37 Resolver() : SymTab::Indexer( false ), switchType( 0 ) {} 37 Resolver() : SymTab::Indexer( false ) {} 38 Resolver( const SymTab::Indexer & indexer ) : SymTab::Indexer( indexer ) {} 38 39 39 40 virtual void visit( FunctionDecl *functionDecl ); … … 68 69 void resolveSingleAggrInit( Declaration *, InitIterator &, InitIterator & ); 69 70 void fallbackInit( ConstructorInit * ctorInit ); 70 Type * functionReturn ;71 Type *initContext ;72 Type *switchType ;71 Type * functionReturn = nullptr; 72 Type *initContext = nullptr; 73 Type *switchType = nullptr; 73 74 bool inEnumDecl = false; 74 75 }; … … 532 533 } 533 534 535 void resolveObject( const SymTab::Indexer & indexer, ObjectDecl * objectDecl ) { 536 Resolver resolver( indexer ); 537 objectDecl->accept( resolver ); 538 } 539 534 540 void Resolver::visit( ConstructorInit *ctorInit ) { 535 541 // xxx - fallback init has been removed => remove fallbackInit function and remove complexity from FixInit and remove C-init from ConstructorInit -
src/SynTree/Expression.cc
ra1e67dd r77971f6 581 581 582 582 long long UniqueExpr::count = 0; 583 UniqueExpr::UniqueExpr( Expression *expr, long long idVal ) : expr( new Expression* ), id( idVal ) {583 UniqueExpr::UniqueExpr( Expression *expr, long long idVal ) : expr( new Expression* ), object( new ObjectDecl* ), id( idVal ) { 584 584 assert( count != -1 ); 585 585 if ( id == -1 ) id = count++; … … 589 589 set_result( expr->get_result()->clone() ); 590 590 } 591 } 592 UniqueExpr::UniqueExpr( const UniqueExpr &other ) : Expression( other ), expr( other.expr ), id( other.id ) { 591 set_object( nullptr ); 592 } 593 UniqueExpr::UniqueExpr( const UniqueExpr &other ) : Expression( other ), expr( other.expr ), object( other.object ), id( other.id ) { 593 594 } 594 595 UniqueExpr::~UniqueExpr() { … … 596 597 delete *expr; 597 598 } 599 if ( object.unique() ) { 600 delete *object; 601 } 598 602 } 599 603 void UniqueExpr::print( std::ostream &os, int indent ) const { 600 604 os << "Unique Expression with id:" << id << std::endl << std::string( indent+2, ' ' ); 601 605 get_expr()->print( os, indent+2 ); 606 if ( get_object() ) { 607 os << " with decl: "; 608 get_object()->printShort( os, indent+2 ); 609 } 602 610 } 603 611 -
src/SynTree/Expression.h
ra1e67dd r77971f6 742 742 UniqueExpr * set_expr( Expression * newValue ) { *expr = newValue; return this; } 743 743 744 ObjectDecl * get_object() const { return *object; } 745 UniqueExpr * set_object( ObjectDecl * newValue ) { *object = newValue; return this; } 746 744 747 int get_id() const { return id; } 745 748 … … 750 753 private: 751 754 std::shared_ptr< Expression * > expr; 755 std::shared_ptr< ObjectDecl * > object; 752 756 int id; 753 757 static long long count; -
src/Tuples/TupleAssignment.cc
ra1e67dd r77971f6 179 179 180 180 // explode the lhs so that each field of the tuple-valued-expr is assigned. 181 explode( lhsAlt, back_inserter(lhs) );181 explode( lhsAlt, spotter.currentFinder.get_indexer(), back_inserter(lhs) ); 182 182 // and finally, re-add the cast to each lhs expr, so that qualified tuple fields can be constructed 183 183 if ( isCast ) { … … 204 204 TupleAssignSpotter::MultipleAssignMatcher::MultipleAssignMatcher( TupleAssignSpotter &spotter, const ResolvExpr::AltList & alts ) : Matcher( spotter, alts ) { 205 205 // explode the rhs so that each field of the tuple-valued-expr is assigned. 206 explode( std::next(alts.begin(), 1), alts.end(), back_inserter(rhs) );206 explode( std::next(alts.begin(), 1), alts.end(), spotter.currentFinder.get_indexer(), back_inserter(rhs) ); 207 207 } 208 208 -
src/Tuples/TupleExpansion.cc
ra1e67dd r77971f6 141 141 142 142 Expression * UniqueExprExpander::mutate( UniqueExpr * unqExpr ) { 143 static UniqueName tempNamer( "_unq_expr_" );144 143 unqExpr = safe_dynamic_cast< UniqueExpr * > ( Parent::mutate( unqExpr ) ); 145 144 if ( ! decls.count( unqExpr->get_id() ) ) { … … 160 159 // } 161 160 162 // xxx - attach a resolved ConstructorInit node? 163 // xxx - is it possible to make the objDecl's type const? 164 ObjectDecl * objDecl = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, nullptr, unqExpr->get_result()->clone(), nullptr ); 165 // must be done on two lines because genCtorInit accesses objDecl's fields 166 objDecl->set_init( InitTweak::genCtorInit( objDecl ) ); 167 161 ObjectDecl * objDecl = unqExpr->get_object(); 162 unqExpr->set_object( nullptr ); 168 163 decls[unqExpr->get_id()] = objDecl; 169 164 addDeclaration( objDecl ); -
src/Tuples/Tuples.h
ra1e67dd r77971f6 20 20 #include <vector> 21 21 #include "ResolvExpr/AlternativeFinder.h" 22 #include "ResolvExpr/Resolver.h" 22 23 23 24 #include "SynTree/Expression.h" … … 48 49 /// helper function used by explode 49 50 template< typename OutputIterator > 50 void explodeUnique( Expression * expr, const ResolvExpr::Alternative & alt, OutputIterator out ) {51 void explodeUnique( Expression * expr, const ResolvExpr::Alternative & alt, const SymTab::Indexer & indexer, OutputIterator out ) { 51 52 Type * res = expr->get_result(); 52 53 if ( AddressExpr * addrExpr = dynamic_cast< AddressExpr * >( expr ) ) { 53 54 ResolvExpr::AltList alts; 54 explodeUnique( addrExpr->get_arg(), alt, back_inserter( alts ) );55 explodeUnique( addrExpr->get_arg(), alt, indexer, back_inserter( alts ) ); 55 56 for ( ResolvExpr::Alternative & alt : alts ) { 56 57 // distribute '&' over all components … … 62 63 // can open tuple expr and dump its exploded components 63 64 for ( Expression * expr : tupleExpr->get_exprs() ) { 64 explodeUnique( expr, alt, out );65 explodeUnique( expr, alt, indexer, out ); 65 66 } 66 67 } else { … … 68 69 Expression * arg = expr->clone(); 69 70 if ( Tuples::maybeImpure( arg ) ) { 70 // expressions which may contain side effects require a single unique instance of the expression 71 // expressions which may contain side effects require a single unique instance of the expression. 72 // resolve the UniqueExpr (which should be relatively cheap, since the argument is already resolved) 73 // so that its accompanying object is properly constructed and destructed. 71 74 arg = new UniqueExpr( arg ); 75 arg = ResolvExpr::resolveInVoidContext( arg, indexer ); 72 76 } 73 77 for ( unsigned int i = 0; i < tupleType->size(); i++ ) { 74 78 TupleIndexExpr * idx = new TupleIndexExpr( arg->clone(), i ); 75 explodeUnique( idx, alt, out );79 explodeUnique( idx, alt, indexer, out ); 76 80 delete idx; 77 81 } … … 86 90 /// expands a tuple-valued alternative into multiple alternatives, each with a non-tuple-type 87 91 template< typename OutputIterator > 88 void explode( const ResolvExpr::Alternative &alt, OutputIterator out ) {89 explodeUnique( alt.expr, alt, out );92 void explode( const ResolvExpr::Alternative &alt, const SymTab::Indexer & indexer, OutputIterator out ) { 93 explodeUnique( alt.expr, alt, indexer, out ); 90 94 } 91 95 92 96 // explode list of alternatives 93 97 template< typename AltIterator, typename OutputIterator > 94 void explode( AltIterator altBegin, AltIterator altEnd, OutputIterator out ) {98 void explode( AltIterator altBegin, AltIterator altEnd, const SymTab::Indexer & indexer, OutputIterator out ) { 95 99 for ( ; altBegin != altEnd; ++altBegin ) { 96 explode( *altBegin, out );100 explode( *altBegin, indexer, out ); 97 101 } 98 102 } 99 103 100 104 template< typename OutputIterator > 101 void explode( const ResolvExpr::AltList & alts, OutputIterator out ) {102 explode( alts.begin(), alts.end(), out );105 void explode( const ResolvExpr::AltList & alts, const SymTab::Indexer & indexer, OutputIterator out ) { 106 explode( alts.begin(), alts.end(), indexer, out ); 103 107 } 104 108 } // namespace Tuples
Note: See TracChangeset
for help on using the changeset viewer.