Changeset 692be4e
- Timestamp:
- Jan 29, 2019, 1:49:06 PM (6 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, persistent-indexer, pthread-emulation, qualifiedEnum
- Children:
- 72514aa
- Parents:
- 528ccc8 (diff), 8f99233 (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. - Files:
-
- 3 added
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
Jenkinsfile
r528ccc8 r692be4e 7 7 node('master') { 8 8 // Globals 9 BuildDir = null10 SrcDir = null9 BuildDir = pwd tmp: true 10 SrcDir = pwd tmp: false 11 11 Settings = null 12 12 StageName = '' … … 46 46 publish() 47 47 } 48 49 // Update the build directories when exiting the node 50 BuildDir = pwd tmp: true 51 SrcDir = pwd tmp: false 48 52 49 53 notify_server(45) … … 149 153 dir (BuildDir) { 150 154 //Append bench results 151 sh " make --no-print-directory -C benchmark jenkins githash=${Settings.GitNewRef} arch=${Settings.Architecture} | tee ${SrcDir}/bench.json"155 sh "${SrcDir}/jenkins.sh ${GitNewRef} ${Architecture} ${BuildDir}/bench.json" 152 156 } 153 157 } … … 175 179 176 180 //Then publish the results 177 sh 'curl --silent --show-error -H \'Content-Type: application/json\' --data @ bench.json https://cforall.uwaterloo.ca:8082/jenkins/publish > /dev/null || true'181 sh 'curl --silent --show-error -H \'Content-Type: application/json\' --data @${BuildDir}/bench.json https://cforall.uwaterloo.ca:8082/jenkins/publish > /dev/null || true' 178 182 } 179 183 } … … 185 189 if (!Settings || !Settings.GitOldRef || !Settings.GitNewRef) return "\nERROR retrieveing git information!\n" 186 190 187 sh "${SrcDir}/tools/PrettyGitLogs.sh ${ BuildDir} ${Settings.GitOldRef} ${Settings.GitNewRef}"191 sh "${SrcDir}/tools/PrettyGitLogs.sh ${SrcDir} ${BuildDir} ${Settings.GitOldRef} ${Settings.GitNewRef}" 188 192 189 193 def gitUpdate = readFile("${BuildDir}/GIT_UPDATE") … … 377 381 ]]) 378 382 383 // It's unfortunate but it looks like we need to checkout the entire repo just to get the pretty git printer 384 checkout scm 385 379 386 final settings = new BuildSettings(params, env.BRANCH_NAME) 380 387 … … 404 411 catch (Exception caughtError) { 405 412 err = caughtError //rethrow error later 406 sh 'cat *.log'413 sh 'cat build/*.log' 407 414 } 408 415 finally { -
doc/theses/aaron_moss_PhD/phd/background.tex
r528ccc8 r692be4e 213 213 The ability of types to begin or cease to satisfy traits when declarations go into or out of scope makes caching of trait satisfaction judgements difficult, and the ability of traits to take multiple type parameters can lead to a combinatorial explosion of work in any attempt to pre-compute trait satisfaction relationships. 214 214 215 \subsection{Implicit Conversions} 215 \subsection{Implicit Conversions} \label{implicit-conv-sec} 216 216 217 217 In addition to the multiple interpretations of an expression produced by name overloading and polymorphic functions, for backward compatibility \CFA{} must support all of the implicit conversions present in C, producing further candidate interpretations for expressions. -
doc/theses/aaron_moss_PhD/phd/resolution-heuristics.tex
r528ccc8 r692be4e 2 2 \label{resolution-chap} 3 3 4 Talk about the resolution heuristics. This is the bulk of the thesis. 4 The main task of the \CFACC{} type-checker is \emph{expression resolution}, determining which declarations the identifiers in each expression correspond to. 5 Resolution is a straightforward task in C, as each declaration has a unique identifier, but in \CFA{} the name overloading features discussed in Section~\ref{overloading-sec} generate multiple candidate declarations for each identifier. 6 I refer to a given matching between identifiers and declarations in an expression as an \emph{interpretation}; an interpretation also includes information about polymorphic type bindings and implicit casts to support the \CFA{} features discussed in Sections~\ref{poly-func-sec} and~\ref{implicit-conv-sec}, each of which increase the proportion of feasible candidate interpretations. 7 To choose between feasible interpretations, \CFA{} defines a \emph{conversion cost} to rank interpretations; the expression resolution problem is thus to find the unique minimal-cost interpretation for an expression, reporting an error if no such interpretation exists. 8 9 \section{Conversion Cost} 10 11 5 12 6 13 % Discuss changes to cost model, as promised in Ch. 2 14 15 % Mention relevance of work to C++20 concepts -
driver/cfa.cc
r528ccc8 r692be4e 10 10 // Created On : Tue Aug 20 13:44:49 2002 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Sep 14 23:02:59 201813 // Update Count : 2 7712 // Last Modified On : Tue Jan 15 20:56:03 2019 13 // Update Count : 280 14 14 // 15 15 … … 384 384 nargs += 1; 385 385 386 for ( int i = 0; i < nlibs; i += 1 ) { // copy non-user libraries after all user libraries 387 args[nargs] = libs[i]; 388 nargs += 1; 389 } // for 390 386 391 if ( link ) { 387 392 args[nargs] = "-Xlinker"; … … 414 419 nargs += 1; 415 420 args[nargs] = "-lrt"; 421 nargs += 1; 422 args[nargs] = "-lm"; 416 423 nargs += 1; 417 424 } // if … … 498 505 args[nargs] = ( *new string( string("-B") + Bprefix ) ).c_str(); 499 506 nargs += 1; 500 args[nargs] = "-lm";501 nargs += 1;502 507 } else { 503 508 cerr << argv[0] << " error, compiler \"" << compiler_name << "\" unsupported." << endl; 504 509 exit( EXIT_FAILURE ); 505 510 } // if 506 507 for ( int i = 0; i < nlibs; i += 1 ) { // copy non-user libraries after all user libraries508 args[nargs] = libs[i];509 nargs += 1;510 } // for511 511 512 512 args[nargs] = NULL; // terminate with NULL -
src/ResolvExpr/AlternativeFinder.cc
r528ccc8 r692be4e 474 474 } 475 475 476 // mark specialization cost of return types 477 for ( DeclarationWithType* returnVal : function->returnVals ) { 478 convCost.decSpec( specCost( returnVal->get_type() ) ); 479 } 476 // specialization cost of return types can't be accounted for directly, it disables 477 // otherwise-identical calls, like this example based on auto-newline in the I/O lib: 478 // 479 // forall(otype OS) { 480 // void ?|?(OS&, int); // with newline 481 // OS& ?|?(OS&, int); // no newline, always chosen due to more specialization 482 // } 480 483 481 484 // mark type variable and specialization cost of forall clause … … 483 486 for ( TypeDecl* td : function->forall ) { 484 487 convCost.decSpec( td->assertions.size() ); 485 }486 487 // xxx -- replace with new costs in resolver488 for ( InferredParams::const_iterator assert = appExpr->inferParams.begin(); assert != appExpr->inferParams.end(); ++assert ) {489 convCost += computeConversionCost( assert->second.actualType, assert->second.formalType, indexer, alt.env );490 488 } 491 489 … … 1229 1227 Alternative newAlt{ 1230 1228 restructureCast( alt.expr->clone(), toType, castExpr->isGenerated ), 1231 alt.env, openVars, needAssertions, alt.cost + thisCost,thisCost };1229 alt.env, openVars, needAssertions, alt.cost, alt.cost + thisCost }; 1232 1230 inferParameters( newAlt, back_inserter( candidates ) ); 1233 1231 } // if -
src/ResolvExpr/ResolveAssertions.cc
r528ccc8 r692be4e 20 20 #include <list> // for list 21 21 #include <memory> // for unique_ptr 22 #include <string> 22 23 #include <unordered_map> // for unordered_map, unordered_multimap 23 24 #include <utility> // for move … … 55 56 using CandidateList = std::vector<AssnCandidate>; 56 57 58 /// Unique identifier for a yet-to-be-resolved assertion 59 struct AssnId { 60 DeclarationWithType* decl; ///< Declaration of assertion 61 AssertionSetValue info; ///< Information about assertion 62 63 AssnId(DeclarationWithType* decl, const AssertionSetValue& info) : decl(decl), info(info) {} 64 }; 65 66 /// Cached assertion items 67 struct AssnCacheItem { 68 CandidateList matches; ///< Possible matches for this assertion 69 std::vector<AssnId> deferIds; ///< Deferred assertions which resolve to this item 70 71 AssnCacheItem( CandidateList&& m ) : matches(std::move(m)), deferIds() {} 72 }; 73 74 /// Cache of resolved assertions 75 using AssnCache = std::unordered_map<std::string, AssnCacheItem>; 76 57 77 /// Reference to single deferred item 58 78 struct DeferRef { 59 const DeclarationWithType* decl; 60 const AssertionSetValue& info; 79 const AssnCacheItem& item; 61 80 const AssnCandidate& match; 62 81 }; … … 65 84 /// Acts like indexed list of DeferRef 66 85 struct DeferItem { 67 DeclarationWithType* decl; 68 AssertionSetValue info; 69 CandidateList matches; 70 71 DeferItem( DeclarationWithType* decl, const AssertionSetValue& info, 72 CandidateList&& matches ) 73 : decl(decl), info(info), matches(std::move(matches)) {} 74 75 bool empty() const { return matches.empty(); } 76 77 CandidateList::size_type size() const { return matches.size(); } 78 79 DeferRef operator[] ( unsigned i ) const { return { decl, info, matches[i] }; } 86 const AssnCache* cache; ///< Cache storing assertion item 87 std::string key; ///< Key into cache 88 89 DeferItem( const AssnCache& cache, const std::string& key ) : cache(&cache), key(key) {} 90 91 bool empty() const { return cache->at(key).matches.empty(); } 92 93 CandidateList::size_type size() const { return cache->at(key).matches.size(); } 94 95 DeferRef operator[] ( unsigned i ) const { 96 const AssnCacheItem& item = cache->at(key); 97 return { item, item.matches[i] }; 98 } 99 100 // sortable by key 101 // TODO look into optimizing combination process with other sort orders (e.g. by number 102 // of matches in candidate) 103 bool operator< ( const DeferItem& o ) const { return key < o.key; } 104 bool operator== ( const DeferItem& o ) const { return key == o.key; } 80 105 }; 81 106 … … 152 177 for ( const auto& assn : x.assns ) { 153 178 k += computeConversionCost( 154 assn.match.adjType, assn.decl->get_type(), indexer, x.env ); 179 assn.match.adjType, assn.item.deferIds[0].decl->get_type(), indexer, 180 x.env ); 155 181 } 156 182 it = cache.emplace_hint( it, &x, k ); … … 208 234 candidate->get_uniqueId(), match.adjType->clone(), decl->get_type()->clone(), 209 235 varExpr }; 210 211 // // follow the current assertion's ID chain to find the correct set of inferred parameters212 // // to add the candidate o (i.e. the set of inferred parameters belonging to the entity213 // // which requested the assertion parameter)214 // InferredParams* inferParams = &alt.expr->inferParams;215 // for ( UniqueId id : info.idChain ) {216 // inferParams = (*inferParams)[ id ].inferParams.get();217 // }218 219 // (*inferParams)[ decl->get_uniqueId() ] = ParamEntry{220 // candidate->get_uniqueId(), match.adjType, decl->get_type()->clone(), varExpr };221 236 } 222 237 223 238 /// Adds a captured assertion to the symbol table 224 239 void addToIndexer( AssertionSet &assertSet, SymTab::Indexer &indexer ) { 225 for ( AssertionSet::iterator i = assertSet.begin(); i != assertSet.end(); ++i) {226 if ( i ->second.isUsed ) {227 indexer.addId( i ->first );240 for ( auto& i : assertSet ) { 241 if ( i.second.isUsed ) { 242 indexer.addId( i.first ); 228 243 } 229 244 } … … 234 249 235 250 /// Resolve a single assertion, in context 236 bool resolveAssertion( AssertionItem& assn, ResnState& resn ) {251 bool resolveAssertion( AssertionItem& assn, ResnState& resn, AssnCache& cache ) { 237 252 // skip unused assertions 238 253 if ( ! assn.info.isUsed ) return true; 239 254 240 // lookup candidates for this assertion 241 std::list< SymTab::Indexer::IdData > candidates; 242 resn.indexer.lookupId( assn.decl->name, candidates ); 243 244 // find the candidates that unify with the desired type 245 CandidateList matches; 246 for ( const auto& cdata : candidates ) { 247 DeclarationWithType* candidate = cdata.id; 248 249 // build independent unification context for candidate 250 AssertionSet have, newNeed; 251 TypeEnvironment newEnv{ resn.alt.env }; 252 OpenVarSet newOpenVars{ resn.alt.openVars }; 253 Type* adjType = candidate->get_type()->clone(); 254 adjustExprType( adjType, newEnv, resn.indexer ); 255 renameTyVars( adjType ); 256 257 // keep unifying candidates 258 if ( unify( assn.decl->get_type(), adjType, newEnv, newNeed, have, newOpenVars, 259 resn.indexer ) ) { 260 // set up binding slot for recursive assertions 261 UniqueId crntResnSlot = 0; 262 if ( ! newNeed.empty() ) { 263 crntResnSlot = ++globalResnSlot; 264 for ( auto& a : newNeed ) { 265 a.second.resnSlot = crntResnSlot; 255 // check cache for this assertion 256 std::string assnKey = SymTab::Mangler::mangleAssnKey( assn.decl, resn.alt.env ); 257 auto it = cache.find( assnKey ); 258 259 // attempt to resolve assertion if this is the first time seen 260 if ( it == cache.end() ) { 261 // lookup candidates for this assertion 262 std::list< SymTab::Indexer::IdData > candidates; 263 resn.indexer.lookupId( assn.decl->name, candidates ); 264 265 // find the candidates that unify with the desired type 266 CandidateList matches; 267 for ( const auto& cdata : candidates ) { 268 DeclarationWithType* candidate = cdata.id; 269 270 // build independent unification context for candidate 271 AssertionSet have, newNeed; 272 TypeEnvironment newEnv{ resn.alt.env }; 273 OpenVarSet newOpenVars{ resn.alt.openVars }; 274 Type* adjType = candidate->get_type()->clone(); 275 adjustExprType( adjType, newEnv, resn.indexer ); 276 renameTyVars( adjType ); 277 278 // keep unifying candidates 279 if ( unify( assn.decl->get_type(), adjType, newEnv, newNeed, have, newOpenVars, 280 resn.indexer ) ) { 281 // set up binding slot for recursive assertions 282 UniqueId crntResnSlot = 0; 283 if ( ! newNeed.empty() ) { 284 crntResnSlot = ++globalResnSlot; 285 for ( auto& a : newNeed ) { 286 a.second.resnSlot = crntResnSlot; 287 } 266 288 } 267 } 268 // // set up idChain on new assertions 269 // for ( auto& a : newNeed ) { 270 // a.second.idChain = assn.info.idChain; 271 // a.second.idChain.push_back( assn.decl->get_uniqueId() ); 272 // } 273 274 matches.emplace_back( cdata, adjType, std::move(newEnv), std::move(have), 275 std::move(newNeed), std::move(newOpenVars), crntResnSlot ); 276 } else { 277 delete adjType; 289 290 matches.emplace_back( cdata, adjType, std::move(newEnv), std::move(have), 291 std::move(newNeed), std::move(newOpenVars), crntResnSlot ); 292 } else { 293 delete adjType; 294 } 278 295 } 279 } 296 297 it = cache.emplace_hint( it, assnKey, AssnCacheItem{ std::move(matches) } ); 298 } 299 300 CandidateList& matches = it->second.matches; 280 301 281 302 // break if no suitable assertion … … 284 305 // defer if too many suitable assertions 285 306 if ( matches.size() > 1 ) { 286 resn.deferred.emplace_back( assn.decl, assn.info, std::move(matches) ); 307 it->second.deferIds.emplace_back( assn.decl, assn.info ); 308 resn.deferred.emplace_back( cache, assnKey ); 287 309 return true; 288 310 } … … 292 314 addToIndexer( match.have, resn.indexer ); 293 315 resn.newNeed.insert( match.need.begin(), match.need.end() ); 294 resn.alt.env = std::move(match.env);295 resn.alt.openVars = std::move(match.openVars);316 resn.alt.env = match.env; 317 resn.alt.openVars = match.openVars; 296 318 297 319 bindAssertion( assn.decl, assn.info, resn.alt, match, resn.inferred ); … … 354 376 ResnList resns{ ResnState{ alt, root_indexer } }; 355 377 ResnList new_resns{}; 378 AssnCache assnCache; 356 379 357 380 // resolve assertions in breadth-first-order up to a limited number of levels deep … … 362 385 for ( auto& assn : resn.need ) { 363 386 // fail early if any assertion is not resolvable 364 if ( ! resolveAssertion( assn, resn ) ) goto nextResn;387 if ( ! resolveAssertion( assn, resn, assnCache ) ) goto nextResn; 365 388 } 366 389 … … 373 396 } 374 397 } else { 398 // only resolve each deferred assertion once 399 std::sort( resn.deferred.begin(), resn.deferred.end() ); 400 auto last = std::unique( resn.deferred.begin(), resn.deferred.end() ); 401 resn.deferred.erase( last, resn.deferred.end() ); 375 402 // resolve deferred assertions by mutual compatibility 376 403 std::vector<CandidateEnvMerger::OutType> compatible = filterCombos( … … 380 407 CandidateCost coster{ resn.indexer }; 381 408 std::sort( compatible.begin(), compatible.end(), coster ); 382 // // sort by cost if pruning383 // if ( pruneAssertions ) {384 // auto lmin = sort_mins( compatible.begin(), compatible.end(),385 // CandidateCost{resn.indexer} );386 // compatible.erase( lmin, compatible.end() );387 // }388 409 389 410 // keep map of detected options … … 408 429 new_resn.newNeed.insert( match.need.begin(), match.need.end() ); 409 430 410 bindAssertion( r.decl, r.info, new_resn.alt, match, new_resn.inferred ); 431 // for each deferred assertion with the same form 432 for ( AssnId id : r.item.deferIds ) { 433 bindAssertion( 434 id.decl, id.info, new_resn.alt, match, new_resn.inferred ); 435 } 411 436 } 412 437 -
src/SymTab/Mangler.cc
r528ccc8 r692be4e 15 15 #include "Mangler.h" 16 16 17 #include <algorithm> // for copy, transform18 #include <cassert> // for assert, assertf19 #include <functional> // for const_mem_fun_t, mem_fun20 #include <iterator> // for ostream_iterator, back_insert_ite...21 #include <list> // for _List_iterator, list, _List_const...22 #include <string> // for string, char_traits, operator<<23 24 #include "CodeGen/OperatorTable.h" // for OperatorInfo, operatorLookup17 #include <algorithm> // for copy, transform 18 #include <cassert> // for assert, assertf 19 #include <functional> // for const_mem_fun_t, mem_fun 20 #include <iterator> // for ostream_iterator, back_insert_ite... 21 #include <list> // for _List_iterator, list, _List_const... 22 #include <string> // for string, char_traits, operator<< 23 24 #include "CodeGen/OperatorTable.h" // for OperatorInfo, operatorLookup 25 25 #include "Common/PassVisitor.h" 26 #include "Common/SemanticError.h" // for SemanticError 27 #include "Common/utility.h" // for toString 28 #include "Parser/LinkageSpec.h" // for Spec, isOverridable, AutoGen, Int... 29 #include "SynTree/Declaration.h" // for TypeDecl, DeclarationWithType 30 #include "SynTree/Expression.h" // for TypeExpr, Expression, operator<< 31 #include "SynTree/Type.h" // for Type, ReferenceToType, Type::Fora... 26 #include "Common/SemanticError.h" // for SemanticError 27 #include "Common/utility.h" // for toString 28 #include "Parser/LinkageSpec.h" // for Spec, isOverridable, AutoGen, Int... 29 #include "ResolvExpr/TypeEnvironment.h" // for TypeEnvironment 30 #include "SynTree/Declaration.h" // for TypeDecl, DeclarationWithType 31 #include "SynTree/Expression.h" // for TypeExpr, Expression, operator<< 32 #include "SynTree/Type.h" // for Type, ReferenceToType, Type::Fora... 32 33 33 34 namespace SymTab { … … 37 38 struct Mangler : public WithShortCircuiting, public WithVisitorRef<Mangler>, public WithGuards { 38 39 Mangler( bool mangleOverridable, bool typeMode, bool mangleGenericParams ); 40 Mangler( const ResolvExpr::TypeEnvironment& env ); 39 41 Mangler( const Mangler & ) = delete; 40 42 … … 65 67 private: 66 68 std::ostringstream mangleName; ///< Mangled name being constructed 67 typedef std::map< std::string, std::pair< int, int > > VarMapType;69 typedef std::map< std::string, std::pair< std::string, int > > VarMapType; 68 70 VarMapType varNums; ///< Map of type variables to indices 69 71 int nextVarNum; ///< Next type variable index 72 const ResolvExpr::TypeEnvironment* env; ///< optional environment for substitutions 70 73 bool isTopLevel; ///< Is the Mangler at the top level 71 74 bool mangleOverridable; ///< Specially mangle overridable built-in methods … … 75 78 bool inQualifiedType = false; ///< Add start/end delimiters around qualified type 76 79 80 public: 81 Mangler( bool mangleOverridable, bool typeMode, bool mangleGenericParams, 82 int nextVarNum, const ResolvExpr::TypeEnvironment* env, 83 const VarMapType& varNums ); 84 85 private: 77 86 void mangleDecl( DeclarationWithType *declaration ); 78 87 void mangleRef( ReferenceToType *refType, std::string prefix ); … … 100 109 } 101 110 111 std::string mangleAssnKey( DeclarationWithType* decl, 112 const ResolvExpr::TypeEnvironment& env ) { 113 PassVisitor<Mangler> mangler( env ); 114 maybeAccept( decl, mangler ); 115 return mangler.pass.get_mangleName(); 116 } 117 102 118 namespace { 103 119 Mangler::Mangler( bool mangleOverridable, bool typeMode, bool mangleGenericParams ) 104 : nextVarNum( 0 ), isTopLevel( true ), mangleOverridable( mangleOverridable ), typeMode( typeMode ), mangleGenericParams( mangleGenericParams ) {} 120 : nextVarNum( 0 ), env(nullptr), isTopLevel( true ), 121 mangleOverridable( mangleOverridable ), typeMode( typeMode ), 122 mangleGenericParams( mangleGenericParams ) {} 123 124 Mangler::Mangler( const ResolvExpr::TypeEnvironment& env ) 125 : nextVarNum( 0 ), env( &env ), isTopLevel( true ), mangleOverridable( false ), 126 typeMode( false ), mangleGenericParams( true ) {} 127 128 Mangler::Mangler( bool mangleOverridable, bool typeMode, bool mangleGenericParams, 129 int nextVarNum, const ResolvExpr::TypeEnvironment* env, 130 const VarMapType& varNums ) 131 : varNums( varNums ), nextVarNum( nextVarNum ), env( env ), isTopLevel( false ), 132 mangleOverridable( mangleOverridable ), typeMode( typeMode ), 133 mangleGenericParams( mangleGenericParams ) {} 105 134 106 135 void Mangler::mangleDecl( DeclarationWithType * declaration ) { … … 329 358 assert( false ); 330 359 } // switch 331 varNums[ (*i)->name ] = std::pair< int, int >( nextVarNum++, (int)(*i)->get_kind() ); 360 std::string varName; 361 // replace type with substitution name if environment is available and bound 362 if ( env ) { 363 const ResolvExpr::EqvClass* varClass = env->lookup( (*i)->name ); 364 if ( varClass && varClass->type ) { 365 PassVisitor<Mangler> sub_mangler( 366 mangleOverridable, typeMode, mangleGenericParams, nextVarNum, 367 env, varNums ); 368 varClass->type->accept( sub_mangler ); 369 varName = std::string{"%"} + sub_mangler.pass.get_mangleName(); 370 } 371 } 372 // otherwise just give type numeric name 373 if ( varName.empty() ) { 374 varName = std::to_string( nextVarNum++ ); 375 } 376 varNums[ (*i)->name ] = std::make_pair( varName, (int)(*i)->get_kind() ); 332 377 for ( std::list< DeclarationWithType* >::iterator assert = (*i)->assertions.begin(); assert != (*i)->assertions.end(); ++assert ) { 333 PassVisitor<Mangler> sub_mangler( mangleOverridable, typeMode, mangleGenericParams ); 334 sub_mangler.pass.nextVarNum = nextVarNum; 335 sub_mangler.pass.isTopLevel = false; 336 sub_mangler.pass.varNums = varNums; 378 PassVisitor<Mangler> sub_mangler( 379 mangleOverridable, typeMode, mangleGenericParams, nextVarNum, env, 380 varNums ); 337 381 (*assert)->accept( sub_mangler ); 338 assertionNames.push_back( sub_mangler.pass. mangleName.str() );382 assertionNames.push_back( sub_mangler.pass.get_mangleName() ); 339 383 acount++; 340 384 } // for -
src/SymTab/Mangler.h
r528ccc8 r692be4e 31 31 // * Currently name compression is not implemented. 32 32 33 namespace ResolvExpr { 34 class TypeEnvironment; 35 } 36 33 37 namespace SymTab { 34 38 namespace Mangler { … … 40 44 /// Mangle ignoring generic type parameters 41 45 std::string mangleConcrete( Type* ty ); 46 /// Mangle for assertion key 47 std::string mangleAssnKey( DeclarationWithType* decl, 48 const ResolvExpr::TypeEnvironment& env ); 42 49 43 50 namespace Encoding { -
src/main.cc
r528ccc8 r692be4e 10 10 // Created On : Fri May 15 23:12:02 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Jun 6 15:51:47201813 // Update Count : 49 812 // Last Modified On : Wed Dec 26 08:11:19 2018 13 // Update Count : 499 14 14 // 15 15 … … 371 371 } 372 372 } catch(const std::exception& e) { 373 std::cerr << "Un aught Exception \"" << e.what() << "\"\n";373 std::cerr << "Uncaught Exception \"" << e.what() << "\"\n"; 374 374 } 375 375 return 1; -
tests/pybin/tools.py
r528ccc8 r692be4e 3 3 import __main__ 4 4 import argparse 5 import fileinput 5 6 import multiprocessing 6 7 import os 7 8 import re 9 import resource 8 10 import signal 9 11 import stat 10 12 import sys 11 import fileinput13 import time 12 14 13 15 from pybin import settings … … 131 133 132 134 return None 135 136 def run(exe, output, input): 137 ret, _ = sh("timeout %d %s > %s 2>&1" % (settings.timeout.single, exe, output), input = input) 138 return ret 139 133 140 ################################################################################ 134 141 # file handling 135 142 ################################################################################ 143 # move a file 144 def mv(source, dest): 145 ret, _ = sh("mv %s %s" % (source, dest)) 146 return ret 147 148 # cat one file into the other 149 def cat(source, dest): 150 ret, _ = sh("cat %s > %s" % (source, dest)) 151 return ret 136 152 137 153 # helper function to replace patterns in a file … … 230 246 signal.signal(signal.SIGINT, signal.SIG_IGN) 231 247 248 249 # enable core dumps for all the test children 250 resource.setrlimit(resource.RLIMIT_CORE, (resource.RLIM_INFINITY, resource.RLIM_INFINITY)) 251 232 252 ################################################################################ 233 253 # misc … … 251 271 else: 252 272 print(text) 273 274 275 def coreInfo(path): 276 cmd = os.path.join(settings.SRCDIR, "pybin/print-core.gdb") 277 if not os.path.isfile(cmd): 278 return 1, "ERR Printing format for core dumps not found" 279 280 dname = os.path.dirname(path) 281 core = os.path.join(dname, "core" ) 282 if not os.path.isfile(path): 283 return 1, "ERR Executable path is wrong" 284 285 if not os.path.isfile(core): 286 return 1, "ERR No core dump" 287 288 return sh("gdb -n %s %s -batch -x %s" % (path, core, cmd), print2stdout=False) 289 290 class Timed: 291 def __enter__(self): 292 self.start = time.time() 293 return self 294 295 def __exit__(self, *args): 296 self.end = time.time() 297 self.duration = self.end - self.start -
tests/test.py
r528ccc8 r692be4e 121 121 # running test functions 122 122 ################################################################################ 123 # fix the absolute paths in the output 124 def fixoutput( fname ): 125 if not is_ascii(fname): 126 return 127 128 file_replace(fname, "%s/" % settings.SRCDIR, "") 129 123 def success(val): 124 return val == 0 or settings.dry_run 125 126 def isExe(file): 127 return settings.dry_run or fileIsExecutable(file) 128 129 def noRule(file, target): 130 return not settings.dry_run and fileContainsOnly(file, "make: *** No rule to make target `%s'. Stop." % target) 130 131 131 132 # logic to run a single test and return the result (No handling of printing or other test framework logic) … … 143 144 144 145 # build, skipping to next test on error 145 before = time.time() 146 make_ret, _ = make( test.target(), 147 redirects = "2> %s 1> /dev/null" % out_file, 148 error_file = err_file 149 ) 150 after = time.time() 151 152 comp_dur = after - before 153 146 with Timed() as comp_dur: 147 make_ret, _ = make( test.target(), redirects = ("2> %s 1> /dev/null" % out_file), error_file = err_file ) 148 149 # if the make command succeds continue otherwise skip to diff 154 150 run_dur = None 155 156 # if the make command succeds continue otherwise skip to diff 157 if make_ret == 0 or settings.dry_run: 158 before = time.time() 159 if settings.dry_run or fileIsExecutable(exe_file) : 160 # run test 161 retcode, _ = sh("timeout %d %s > %s 2>&1" % (settings.timeout.single, exe_file, out_file), input = in_file) 162 else : 163 # simply cat the result into the output 164 retcode, _ = sh("cat %s > %s" % (exe_file, out_file)) 165 166 after = time.time() 167 run_dur = after - before 151 if success(make_ret): 152 with Timed() as run_dur: 153 if isExe(exe_file): 154 # run test 155 retcode = run(exe_file, out_file, in_file) 156 else : 157 # simply cat the result into the output 158 retcode = cat(exe_file, out_file) 168 159 else: 169 retcode, _ = sh("mv %s %s" % (err_file, out_file)) 170 171 172 if retcode == 0: 173 # fixoutput(out_file) 160 retcode = mv(err_file, out_file) 161 162 if success(retcode): 174 163 if settings.generating : 175 164 # if we are ounly generating the output we still need to check that the test actually exists 176 if no t settings.dry_run and fileContainsOnly(out_file, "make: *** No rule to make target `%s'. Stop." %test.target()) :177 retcode = 1 ;165 if noRule(out_file, test.target()) : 166 retcode = 1 178 167 error = "\t\tNo make target for test %s!" % test.target() 179 sh("rm %s" % out_file, False)168 rm(out_file) 180 169 else: 181 170 error = None … … 188 177 error = myfile.read() 189 178 179 ret, info = coreInfo(exe_file) 180 error = error + info 181 182 190 183 191 184 # clean the executable 192 sh("rm -f %s > /dev/null 2>&1" % test.target())193 194 return retcode, error, [comp_dur , run_dur]185 rm(exe_file) 186 187 return retcode, error, [comp_dur.duration, run_dur.duration if run_dur else None] 195 188 196 189 # run a single test and handle the errors, outputs, printing, exception handling, etc. … … 199 192 with SignalHandling(): 200 193 # print formated name 201 name_txt = "%2 0s " % t.name194 name_txt = "%24s " % t.name 202 195 203 196 retcode, error, duration = run_single_test(t) … … 263 256 allTests = listTests( options.include, options.exclude ) 264 257 258 265 259 # if user wants all tests than no other treatement of the test list is required 266 260 if options.all or options.list or options.list_comp or options.include : -
tools/PrettyGitLogs.sh
r528ccc8 r692be4e 3 3 set -e 4 4 5 GIT_UPDATE="$1/GIT_UPDATE" 6 GIT_LOG="$1/GIT_LOG" 7 GIT_DIFF="$1/GIT_DIFF" 5 GIT="git --git-dir=$1/.git" 6 7 GIT_UPDATE="$2/GIT_UPDATE" 8 GIT_LOG="$2/GIT_LOG" 9 GIT_DIFF="$2/GIT_DIFF" 8 10 9 11 rm -f ${GIT_UPDATE} ${GIT_LOG} ${GIT_DIFF} 10 12 11 GitOldRef=$ 212 GitNewRef=$ 313 GitOldRef=$3 14 GitNewRef=$4 13 15 14 16
Note: See TracChangeset
for help on using the changeset viewer.