Changeset 4e2b9710 for src/ResolvExpr
- Timestamp:
- Aug 25, 2016, 9:14:18 PM (9 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, 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:
- a839867
- Parents:
- c1c1112 (diff), 486341f (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- src/ResolvExpr
- Files:
-
- 5 edited
-
AlternativeFinder.cc (modified) (5 diffs)
-
Resolver.cc (modified) (2 diffs)
-
TypeEnvironment.cc (modified) (2 diffs)
-
TypeEnvironment.h (modified) (4 diffs)
-
Unify.cc (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/AlternativeFinder.cc
rc1c1112 r4e2b9710 244 244 for ( std::list< Declaration* >::const_iterator i = members.begin(); i != members.end(); ++i ) { 245 245 if ( DeclarationWithType *dwt = dynamic_cast< DeclarationWithType* >( *i ) ) { 246 alternatives.push_back( Alternative( new MemberExpr( dwt ->clone(), expr->clone() ), env, newCost ) );246 alternatives.push_back( Alternative( new MemberExpr( dwt, expr->clone() ), env, newCost ) ); 247 247 renameTypes( alternatives.back().expr ); 248 248 } else { … … 418 418 // /// Map of declaration uniqueIds (intended to be the assertions in an AssertionSet) to their parents and the number of times they've been included 419 419 //typedef std::unordered_map< UniqueId, std::unordered_map< UniqueId, unsigned > > AssertionParentSet; 420 420 421 421 static const int recursionLimit = /*10*/ 4; ///< Limit to depth of recursion satisfaction 422 422 //static const unsigned recursionParentLimit = 1; ///< Limit to the number of times an assertion can recursively use itself … … 429 429 } 430 430 } 431 431 432 432 template< typename ForwardIterator, typename OutputIterator > 433 void inferRecursive( ForwardIterator begin, ForwardIterator end, const Alternative &newAlt, OpenVarSet &openVars, const SymTab::Indexer &decls, const AssertionSet &newNeed, /*const AssertionParentSet &needParents,*/ 433 void inferRecursive( ForwardIterator begin, ForwardIterator end, const Alternative &newAlt, OpenVarSet &openVars, const SymTab::Indexer &decls, const AssertionSet &newNeed, /*const AssertionParentSet &needParents,*/ 434 434 int level, const SymTab::Indexer &indexer, OutputIterator out ) { 435 435 if ( begin == end ) { … … 469 469 std::cerr << std::endl; 470 470 ) 471 471 472 472 AssertionSet newHave, newerNeed( newNeed ); 473 473 TypeEnvironment newEnv( newAlt.env ); … … 847 847 for ( std::list< Declaration* >::const_iterator i = members.begin(); i != members.end(); ++i ) { 848 848 if ( DeclarationWithType *dwt = dynamic_cast< DeclarationWithType* >( *i ) ) { 849 alternatives.push_back( Alternative( new OffsetofExpr( aggInst->clone(), dwt ->clone()), env, Cost::zero ) );849 alternatives.push_back( Alternative( new OffsetofExpr( aggInst->clone(), dwt ), env, Cost::zero ) ); 850 850 renameTypes( alternatives.back().expr ); 851 851 } else { -
src/ResolvExpr/Resolver.cc
rc1c1112 r4e2b9710 446 446 } else if ( StructInstType * st = dynamic_cast< StructInstType * >( initContext ) ) { 447 447 resolveAggrInit( st->get_baseStruct(), iter, end ); 448 } else if ( UnionInstType * st = dynamic_cast< UnionInstType * >( initContext ) ) {448 } else if ( UnionInstType * st = dynamic_cast< UnionInstType * >( initContext ) ) { 449 449 resolveAggrInit( st->get_baseUnion(), iter, end ); 450 } else if ( TypeInstType * tt = dynamic_cast< TypeInstType * >( initContext ) ) { 451 Type * base = tt->get_baseType()->get_base(); 452 if ( base ) { 453 // know the implementation type, so try using that as the initContext 454 initContext = base; 455 visit( listInit ); 456 } else { 457 // missing implementation type -- might be an unknown type variable, so try proceeding with the current init context 458 Visitor::visit( listInit ); 459 } 450 460 } else { 461 assert( dynamic_cast< BasicType * >( initContext ) || dynamic_cast< PointerType * >( initContext ) ); 451 462 // basic types are handled here 452 463 Visitor::visit( listInit ); … … 539 550 } 540 551 541 // xxx - todo542 // if ( InitTweak::isIntrinsicCallStmt( ctorInit->get_ctor() ) ) {543 // // can reduce the constructor down to a SingleInit using the544 // // second argument from the ctor call545 // }546 547 552 if ( InitTweak::isIntrinsicSingleArgCallStmt( ctorInit->get_dtor() ) ) { 548 553 delete ctorInit->get_dtor(); 549 554 ctorInit->set_dtor( NULL ); 550 555 } 556 557 // xxx - todo -- what about arrays? 558 // if ( dtor == NULL && InitTweak::isIntrinsicCallStmt( ctorInit->get_ctor() ) ) { 559 // // can reduce the constructor down to a SingleInit using the 560 // // second argument from the ctor call, since 561 // delete ctorInit->get_ctor(); 562 // ctorInit->set_ctor( NULL ); 563 564 // Expression * arg = 565 // ctorInit->set_init( new SingleInit( arg ) ); 566 // } 551 567 } 552 568 } // namespace ResolvExpr -
src/ResolvExpr/TypeEnvironment.cc
rc1c1112 r4e2b9710 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // TypeEnvironment.cc -- 7 // TypeEnvironment.cc -- 8 8 // 9 9 // Author : Richard C. Bilson … … 23 23 24 24 namespace ResolvExpr { 25 // adding this comparison operator significantly improves assertion resolution run time for 26 // some cases. The current resolution algorithm's speed partially depends on the order of 27 // assertions. Assertions which have fewer possible matches should appear before 28 // assertions which have more possible matches. This seems to imply that this could 29 // be further improved by providing an indexer as an additional argument and ordering based 30 // on the number of matches of the same kind (object, function) for the names of the 31 // declarations. 32 // 33 // I've seen a TU go from 54 minutes to 1 minute 34 seconds with the addition of this comparator. 34 bool AssertCompare::operator()( DeclarationWithType * d1, DeclarationWithType * d2 ) { 35 // Objects are always less than functions 36 if ( ObjectDecl * objectDecl1 = dynamic_cast< ObjectDecl * >( d1 ) ) { 37 if ( ObjectDecl * objectDecl2 = dynamic_cast< ObjectDecl * >( d2 ) ) { 38 // objects are ordered by name then type pointer, in that order 39 int cmp = objectDecl1->get_name().compare( objectDecl2->get_name() ); 40 return cmp < 0 || 41 ( cmp == 0 && objectDecl1->get_type() < objectDecl2->get_type() ); 42 } else { 43 return true; 44 } 45 } else if ( FunctionDecl * funcDecl1 = dynamic_cast< FunctionDecl * >( d1 ) ) { 46 if ( FunctionDecl * funcDecl2 = dynamic_cast< FunctionDecl * >( d2 ) ) { 47 // functions are ordered by name, # parameters, # returnVals, type pointer in that order 48 FunctionType * ftype1 = funcDecl1->get_functionType(); 49 FunctionType * ftype2 = funcDecl2->get_functionType(); 50 int numThings1 = ftype1->get_parameters().size() + ftype1->get_returnVals().size(); 51 int numThings2 = ftype2->get_parameters().size() + ftype2->get_returnVals().size(); 52 if ( numThings1 < numThings2 ) return true; 53 if ( numThings1 > numThings2 ) return false; 54 55 // if ( ftype1->get_parameters().size() < ftype2->get_parameters().size() ) return true; 56 // else if ( ftype1->get_parameters().size() > ftype2->get_parameters().size() ) return false; 57 // // same number of parameters 58 // if ( ftype1->get_returnVals().size() < ftype2->get_returnVals().size() ) return true; 59 // else if ( ftype1->get_returnVals().size() > ftype2->get_returnVals().size() ) return false; 60 // same number of return vals 61 // int cmp = funcDecl1->get_name().compare( funcDecl2->get_name() ); 62 // if ( cmp < 0 ) return true; 63 // else if ( cmp > 0 ) return false; 64 // // same name 65 return ftype1 < ftype2; 66 } else { 67 return false; 68 } 69 } else { 70 assert( false ); 71 } 72 } 73 25 74 void printAssertionSet( const AssertionSet &assertions, std::ostream &os, int indent ) { 26 75 for ( AssertionSet::const_iterator i = assertions.begin(); i != assertions.end(); ++i ) { -
src/ResolvExpr/TypeEnvironment.h
rc1c1112 r4e2b9710 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // TypeEnvironment.h -- 7 // TypeEnvironment.h -- 8 8 // 9 9 // Author : Richard C. Bilson … … 28 28 29 29 namespace ResolvExpr { 30 typedef std::map< DeclarationWithType*, bool > AssertionSet; 30 struct AssertCompare { 31 bool operator()( DeclarationWithType * d1, DeclarationWithType * d2 ); 32 }; 33 typedef std::map< DeclarationWithType*, bool, AssertCompare > AssertionSet; 31 34 typedef std::map< std::string, TypeDecl::Kind > OpenVarSet; 32 35 … … 39 42 bool allowWidening; 40 43 TypeDecl::Kind kind; 41 44 42 45 void initialize( const EqvClass &src, EqvClass &dest ); 43 46 EqvClass(); … … 62 65 void extractOpenVars( OpenVarSet &openVars ) const; 63 66 TypeEnvironment *clone() const { return new TypeEnvironment( *this ); } 64 67 65 68 typedef std::list< EqvClass >::iterator iterator; 66 69 iterator begin() { return env.begin(); } -
src/ResolvExpr/Unify.cc
rc1c1112 r4e2b9710 484 484 FunctionType *otherFunction = dynamic_cast< FunctionType* >( type2 ); 485 485 if ( otherFunction && functionType->get_isVarArgs() == otherFunction->get_isVarArgs() ) { 486 487 if ( unifyDeclList( functionType->get_parameters().begin(), functionType->get_parameters().end(), otherFunction->get_parameters().begin(), otherFunction->get_parameters().end(), env, needAssertions, haveAssertions, openVars, indexer ) ) {488 489 if ( unifyDeclList( functionType->get_returnVals().begin(), functionType->get_returnVals().end(), otherFunction->get_returnVals().begin(), otherFunction->get_returnVals().end(), env, needAssertions, haveAssertions, openVars, indexer ) ) { 490 491 markAssertions( haveAssertions, needAssertions, functionType);492 markAssertions( haveAssertions, needAssertions, otherFunction ); 493 494 result = true;486 if ( functionType->get_parameters().size() == otherFunction->get_parameters().size() && functionType->get_returnVals().size() == otherFunction->get_returnVals().size() ) { 487 if ( unifyDeclList( functionType->get_parameters().begin(), functionType->get_parameters().end(), otherFunction->get_parameters().begin(), otherFunction->get_parameters().end(), env, needAssertions, haveAssertions, openVars, indexer ) ) { 488 if ( unifyDeclList( functionType->get_returnVals().begin(), functionType->get_returnVals().end(), otherFunction->get_returnVals().begin(), otherFunction->get_returnVals().end(), env, needAssertions, haveAssertions, openVars, indexer ) ) { 489 490 markAssertions( haveAssertions, needAssertions, functionType ); 491 markAssertions( haveAssertions, needAssertions, otherFunction ); 492 493 result = true; 494 } // if 495 495 } // if 496 496 } // if
Note:
See TracChangeset
for help on using the changeset viewer.