Changeset 3f3bfe5a
- Timestamp:
- Oct 11, 2019, 2:23:30 PM (5 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 396b830
- Parents:
- cf32116 (diff), 70b4ea20 (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
- Files:
-
- 2 deleted
- 21 edited
Legend:
- Unmodified
- Added
- Removed
-
src/AST/CVQualifiers.hpp
rcf32116 r3f3bfe5a 27 27 Restrict = 1 << 1, 28 28 Volatile = 1 << 2, 29 Lvalue = 1 << 3, 30 Mutex = 1 << 4, 31 Atomic = 1 << 5, 32 NumQualifiers = 6 29 Mutex = 1 << 3, 30 Atomic = 1 << 4, 31 NumQualifiers = 5 33 32 }; 34 33 35 34 /// Mask for equivalence-preserving qualfiers 36 enum { EquivQualifiers = ~ (Restrict | Lvalue)};35 enum { EquivQualifiers = ~Restrict }; 37 36 38 37 /// Underlying data for qualifiers … … 44 43 bool is_restrict : 1; 45 44 bool is_volatile : 1; 46 bool is_lvalue : 1;47 45 bool is_mutex : 1; 48 46 bool is_atomic : 1; -
src/AST/Expr.cpp
rcf32116 r3f3bfe5a 10 10 // Created On : Wed May 15 17:00:00 2019 11 11 // Last Modified By : Andrew Beach 12 // Created On : Thr Jun 26 12:12:00 201913 // Update Count : 312 // Created On : Fri Oct 4 15:34:00 2019 13 // Update Count : 4 14 14 // 15 15 … … 82 82 // base type 83 83 ret->result = base; 84 add_qualifiers( ret->result, CV::Lvalue );85 84 } 86 85 } … … 131 130 // lvalue, retains all levels of reference, and gains a pointer inside the references 132 131 Type * res = addrType( arg->result ); 133 res->set_lvalue( false ); // result of & is never an lvalue134 132 result = res; 135 133 } else { … … 138 136 dynamic_cast< const ReferenceType * >( arg->result.get() ) ) { 139 137 Type * res = addrType( refType->base ); 140 res->set_lvalue( false ); // result of & is never an lvalue141 138 result = res; 142 139 } else { … … 230 227 // substitute aggregate generic parameters into member type 231 228 genericSubstitution( aggregate->result ).apply( result ); 232 // ensure lvalue andappropriate restrictions from aggregate type233 add_qualifiers( result, aggregate->result->qualifiers | CV::Lvalue);229 // ensure appropriate restrictions from aggregate type 230 add_qualifiers( result, aggregate->result->qualifiers ); 234 231 } 235 232 … … 257 254 assert( var ); 258 255 assert( var->get_type() ); 259 auto r = shallowCopy( var->get_type() ); 260 r->qualifiers |= CV::Lvalue; 261 result = r; 256 result = shallowCopy( var->get_type() ); 262 257 } 263 258 … … 376 371 assert( t && i ); 377 372 result = t; 378 add_qualifiers( result, CV::Lvalue );379 373 } 380 374 … … 397 391 // like MemberExpr, TupleIndexExpr is always an lvalue 398 392 result = type->types[ index ]; 399 add_qualifiers( result, CV::Lvalue );400 393 } 401 394 -
src/AST/Type.hpp
rcf32116 r3f3bfe5a 51 51 bool is_volatile() const { return qualifiers.is_volatile; } 52 52 bool is_restrict() const { return qualifiers.is_restrict; } 53 bool is_lvalue() const { return qualifiers.is_lvalue; }54 53 bool is_mutex() const { return qualifiers.is_mutex; } 55 54 bool is_atomic() const { return qualifiers.is_atomic; } … … 58 57 Type * set_volatile( bool v ) { qualifiers.is_volatile = v; return this; } 59 58 Type * set_restrict( bool v ) { qualifiers.is_restrict = v; return this; } 60 Type * set_lvalue( bool v ) { qualifiers.is_lvalue = v; return this; }61 59 Type * set_mutex( bool v ) { qualifiers.is_mutex = v; return this; } 62 60 Type * set_atomic( bool v ) { qualifiers.is_atomic = v; return this; } -
src/CodeGen/GenType.cc
rcf32116 r3f3bfe5a 335 335 typeString = "_Atomic " + typeString; 336 336 } // if 337 if ( type->get_lvalue() && ! options.genC ) {338 // when not generating C code, print lvalue for debugging.339 typeString = "lvalue " + typeString;340 }341 337 } 342 338 } // namespace CodeGen -
src/GenPoly/Box.cc
rcf32116 r3f3bfe5a 837 837 deref->args.push_back( new CastExpr( new VariableExpr( param ), new PointerType( Type::Qualifiers(), arg->get_type()->clone() ) ) ); 838 838 deref->result = arg->get_type()->clone(); 839 deref->result->set_lvalue( true );840 839 return deref; 841 840 } // if -
src/GenPoly/Lvalue.cc
rcf32116 r3f3bfe5a 54 54 delete ret->result; 55 55 ret->result = base->clone(); 56 ret->result->set_lvalue( true );57 56 return ret; 58 57 } else { … … 167 166 ReferenceType * result = strict_dynamic_cast< ReferenceType * >( appExpr->result ); 168 167 appExpr->result = result->base->clone(); 169 appExpr->result->set_lvalue( true );170 168 if ( ! inIntrinsic ) { 171 169 // when not in an intrinsic function, add a cast to … … 436 434 delete ret->result; 437 435 ret->result = castExpr->result; 438 ret->result->set_lvalue( true); // ensure result is lvalue436 assert( ret->get_lvalue() ); // ensure result is lvalue 439 437 castExpr->env = nullptr; 440 438 castExpr->arg = nullptr; -
src/Makefile.in
rcf32116 r3f3bfe5a 232 232 SynTree/Initializer.$(OBJEXT) \ 233 233 SynTree/TypeSubstitution.$(OBJEXT) SynTree/Attribute.$(OBJEXT) \ 234 SynTree/DeclReplacer.$(OBJEXT) SynTree/TopLvalue.$(OBJEXT)234 SynTree/DeclReplacer.$(OBJEXT) 235 235 am__objects_8 = CompilationState.$(OBJEXT) $(am__objects_1) \ 236 236 $(am__objects_2) Concurrency/Keywords.$(OBJEXT) \ … … 698 698 SynTree/TypeSubstitution.cc \ 699 699 SynTree/Attribute.cc \ 700 SynTree/DeclReplacer.cc \ 701 SynTree/TopLvalue.cc 700 SynTree/DeclReplacer.cc 702 701 703 702 … … 1030 1029 SynTree/DeclReplacer.$(OBJEXT): SynTree/$(am__dirstamp) \ 1031 1030 SynTree/$(DEPDIR)/$(am__dirstamp) 1032 SynTree/TopLvalue.$(OBJEXT): SynTree/$(am__dirstamp) \1033 SynTree/$(DEPDIR)/$(am__dirstamp)1034 1031 Tuples/$(am__dirstamp): 1035 1032 @$(MKDIR_P) Tuples … … 1343 1340 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/ReferenceType.Po@am__quote@ 1344 1341 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/Statement.Po@am__quote@ 1345 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/TopLvalue.Po@am__quote@1346 1342 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/TupleExpr.Po@am__quote@ 1347 1343 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/TupleType.Po@am__quote@ -
src/ResolvExpr/ResolveAssertions.cc
rcf32116 r3f3bfe5a 156 156 for ( const auto& assn : x.assns ) { 157 157 // compute conversion cost from satisfying decl to assertion 158 assert( !assn.match.adjType->get_lvalue() );159 158 k += computeConversionCost( 160 159 assn.match.adjType, assn.decl->get_type(), false, indexer, x.env ); -
src/SymTab/Autogen.h
rcf32116 r3f3bfe5a 98 98 // type->get_qualifiers() = Type::Qualifiers(); 99 99 Type * castType = addCast->clone(); 100 castType->get_qualifiers() -= Type::Qualifiers( Type:: Lvalue | Type::Const | Type::Volatile | Type::Restrict | Type::Atomic );100 castType->get_qualifiers() -= Type::Qualifiers( Type::Const | Type::Volatile | Type::Restrict | Type::Atomic ); 101 101 // castType->set_lvalue( true ); // xxx - might not need this 102 102 dstParam = new CastExpr( dstParam, new ReferenceType( Type::Qualifiers(), castType ) ); -
src/SymTab/ManglerCommon.cc
rcf32116 r3f3bfe5a 88 88 { Type::Atomic, "DA" }, // A is array, so need something unique for atmoic. For now, go with multiletter DA 89 89 { Type::Mutex, "X" }, 90 { Type::Lvalue, "L" },91 90 }; 92 91 -
src/SymTab/Validate.cc
rcf32116 r3f3bfe5a 81 81 #include "SynTree/Label.h" // for operator==, Label 82 82 #include "SynTree/Mutator.h" // for Mutator 83 #include "SynTree/TopLvalue.h" // for assertTopLvalue, clearInnerLvalue84 83 #include "SynTree/Type.h" // for Type, TypeInstType, EnumInstType 85 84 #include "SynTree/TypeSubstitution.h" // for TypeSubstitution … … 309 308 PassVisitor<FixQualifiedTypes> fixQual; 310 309 311 assertTopLvalue( translationUnit );312 310 { 313 311 Stats::Heap::newPass("validate-A"); … … 318 316 acceptAll( translationUnit, epc ); // must happen before VerifyCtorDtorAssign, because void return objects should not exist; before LinkReferenceToTypes_old because it is an indexer and needs correct types for mangling 319 317 } 320 assertTopLvalue( translationUnit );321 318 { 322 319 Stats::Heap::newPass("validate-B"); 323 320 Stats::Time::BlockGuard guard("validate-B"); 324 assertTopLvalue( translationUnit );325 321 Stats::Time::TimeBlock("Link Reference To Types", [&]() { 326 322 acceptAll( translationUnit, lrt ); // must happen before autogen, because sized flag needs to propagate to generated functions 327 323 }); 328 clearInnerLvalue( translationUnit );329 assertTopLvalue( translationUnit );330 324 Stats::Time::TimeBlock("Fix Qualified Types", [&]() { 331 325 mutateAll( translationUnit, fixQual ); // must happen after LinkReferenceToTypes_old, because aggregate members are accessed 332 326 }); 333 assertTopLvalue( translationUnit );334 327 Stats::Time::TimeBlock("Hoist Structs", [&]() { 335 328 HoistStruct::hoistStruct( translationUnit ); // must happen after EliminateTypedef, so that aggregate typedefs occur in the correct order 336 329 }); 337 assertTopLvalue( translationUnit );338 330 Stats::Time::TimeBlock("Eliminate Typedefs", [&]() { 339 331 EliminateTypedef::eliminateTypedef( translationUnit ); // 340 332 }); 341 333 } 342 assertTopLvalue( translationUnit );343 334 { 344 335 Stats::Heap::newPass("validate-C"); … … 349 340 InitTweak::fixReturnStatements( translationUnit ); // must happen before autogen 350 341 } 351 assertTopLvalue( translationUnit );352 342 { 353 343 Stats::Heap::newPass("validate-D"); 354 344 Stats::Time::BlockGuard guard("validate-D"); 355 assertTopLvalue( translationUnit );356 345 Stats::Time::TimeBlock("Apply Concurrent Keywords", [&]() { 357 346 Concurrency::applyKeywords( translationUnit ); 358 347 }); 359 clearInnerLvalue( translationUnit );360 assertTopLvalue( translationUnit );361 348 Stats::Time::TimeBlock("Forall Pointer Decay", [&]() { 362 349 acceptAll( translationUnit, fpd ); // must happen before autogenerateRoutines, after Concurrency::applyKeywords because uniqueIds must be set on declaration before resolution 363 350 }); 364 assertTopLvalue( translationUnit );365 351 Stats::Time::TimeBlock("Hoist Control Declarations", [&]() { 366 352 ControlStruct::hoistControlDecls( translationUnit ); // hoist initialization out of for statements; must happen before autogenerateRoutines 367 353 }); 368 assertTopLvalue( translationUnit );369 354 Stats::Time::TimeBlock("Generate Autogen routines", [&]() { 370 355 autogenerateRoutines( translationUnit ); // moved up, used to be below compoundLiteral - currently needs EnumAndPointerDecay_old 371 356 }); 372 clearInnerLvalue( translationUnit ); 373 } 374 assertTopLvalue( translationUnit ); 357 } 375 358 { 376 359 Stats::Heap::newPass("validate-E"); 377 360 Stats::Time::BlockGuard guard("validate-E"); 378 assertTopLvalue( translationUnit );379 361 Stats::Time::TimeBlock("Implement Mutex Func", [&]() { 380 362 Concurrency::implementMutexFuncs( translationUnit ); 381 363 }); 382 clearInnerLvalue( translationUnit );383 assertTopLvalue( translationUnit );384 364 Stats::Time::TimeBlock("Implement Thread Start", [&]() { 385 365 Concurrency::implementThreadStarter( translationUnit ); 386 366 }); 387 assertTopLvalue( translationUnit );388 367 Stats::Time::TimeBlock("Compound Literal", [&]() { 389 368 mutateAll( translationUnit, compoundliteral ); 390 369 }); 391 assertTopLvalue( translationUnit );392 370 Stats::Time::TimeBlock("Resolve With Expressions", [&]() { 393 371 ResolvExpr::resolveWithExprs( translationUnit ); // must happen before FixObjectType because user-code is resolved and may contain with variables 394 372 }); 395 clearInnerLvalue( translationUnit ); 396 } 397 assertTopLvalue( translationUnit ); 373 } 398 374 { 399 375 Stats::Heap::newPass("validate-F"); 400 376 Stats::Time::BlockGuard guard("validate-F"); 401 assertTopLvalue( translationUnit );402 377 Stats::Time::TimeBlock("Fix Object Type", [&]() { 403 378 FixObjectType::fix( translationUnit ); 404 379 }); 405 assertTopLvalue( translationUnit );406 380 Stats::Time::TimeBlock("Array Length", [&]() { 407 381 ArrayLength::computeLength( translationUnit ); 408 382 }); 409 clearInnerLvalue( translationUnit );410 assertTopLvalue( translationUnit );411 383 Stats::Time::TimeBlock("Find Special Declarations", [&]() { 412 384 Validate::findSpecialDecls( translationUnit ); 413 385 }); 414 assertTopLvalue( translationUnit );415 386 Stats::Time::TimeBlock("Fix Label Address", [&]() { 416 387 mutateAll( translationUnit, labelAddrFixer ); 417 388 }); 418 assertTopLvalue( translationUnit );419 389 Stats::Time::TimeBlock("Handle Attributes", [&]() { 420 390 Validate::handleAttributes( translationUnit ); 421 391 }); 422 392 } 423 assertTopLvalue( translationUnit );424 393 } 425 394 … … 1334 1303 void FixObjectType::previsit( ObjectDecl * objDecl ) { 1335 1304 Type * new_type = ResolvExpr::resolveTypeof( objDecl->get_type(), indexer ); 1336 new_type->get_qualifiers() -= Type::Lvalue; // even if typeof is lvalue, variable can never have lvalue-qualified type1337 1305 objDecl->set_type( new_type ); 1338 1306 } … … 1340 1308 void FixObjectType::previsit( FunctionDecl * funcDecl ) { 1341 1309 Type * new_type = ResolvExpr::resolveTypeof( funcDecl->type, indexer ); 1342 new_type->get_qualifiers() -= Type::Lvalue; // even if typeof is lvalue, variable can never have lvalue-qualified type1343 1310 funcDecl->set_type( new_type ); 1344 1311 } … … 1347 1314 if ( typeDecl->get_base() ) { 1348 1315 Type * new_type = ResolvExpr::resolveTypeof( typeDecl->get_base(), indexer ); 1349 new_type->get_qualifiers() -= Type::Lvalue; // even if typeof is lvalue, variable can never have lvalue-qualified type1350 1316 typeDecl->set_base( new_type ); 1351 1317 } // if -
src/SynTree/AddressExpr.cc
rcf32116 r3f3bfe5a 53 53 } // if 54 54 } 55 // result of & is never an lvalue56 get_result()->set_lvalue( false );57 55 } 58 56 } -
src/SynTree/ArrayType.cc
rcf32116 r3f3bfe5a 26 26 ArrayType::ArrayType( const Type::Qualifiers &tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic, const std::list< Attribute * > & attributes ) 27 27 : Type( tq, attributes ), base( base ), dimension( dimension ), isVarLen( isVarLen ), isStatic( isStatic ) { 28 base->set_lvalue( false );29 28 } 30 29 -
src/SynTree/CommaExpr.cc
rcf32116 r3f3bfe5a 23 23 CommaExpr::CommaExpr( Expression *arg1, Expression *arg2 ) 24 24 : Expression(), arg1( arg1 ), arg2( arg2 ) { 25 // xxx - result of a comma expression is never an lvalue, so should set lvalue26 // to false on all result types. Actually doing this causes some strange things27 // to happen in later passes (particularly, Specialize, Lvalue, and Box). This needs to be looked into.28 25 set_result( maybeClone( arg2->get_result() ) ); 29 // get_type->set_isLvalue( false );30 26 } 31 27 … … 41 37 bool CommaExpr::get_lvalue() const { 42 38 // This is wrong by C, but the current implementation uses it. 39 // (ex: Specialize, Lvalue and Box) 43 40 return arg2->get_lvalue(); 44 41 } -
src/SynTree/Expression.cc
rcf32116 r3f3bfe5a 115 115 assert( var->get_type() ); 116 116 Type * type = var->get_type()->clone(); 117 type->set_lvalue( true );118 117 119 118 // xxx - doesn't quite work yet - get different alternatives with the same cost … … 125 124 // long long int value; 126 125 // if ( decl->valueOf( var, value ) ) { 127 // type->set_lvalue( false ); 126 // type->set_lvalue( false ); // Would have to move to get_lvalue. 128 127 // } 129 128 // } … … 384 383 sub.apply( res ); 385 384 result = res; 386 result->set_lvalue( true );387 385 result->get_qualifiers() |= aggregate->result->get_qualifiers(); 388 386 } … … 433 431 // if references are still allowed in the AST, dereference returns a reference 434 432 ret->set_result( new ReferenceType( Type::Qualifiers(), ret->get_result() ) ); 435 } else {436 // references have been removed, in which case dereference returns an lvalue of the base type.437 ret->result->set_lvalue( true );438 433 } 439 434 } … … 591 586 CompoundLiteralExpr::CompoundLiteralExpr( Type * type, Initializer * initializer ) : initializer( initializer ) { 592 587 assert( type && initializer ); 593 type->set_lvalue( true );594 588 set_result( type ); 595 589 } -
src/SynTree/TupleExpr.cc
rcf32116 r3f3bfe5a 71 71 assertf( type->size() > index, "TupleIndexExpr index out of bounds: tuple size %d, requested index %d in expr %s", type->size(), index, toString( tuple ).c_str() ); 72 72 set_result( (*std::next( type->get_types().begin(), index ))->clone() ); 73 // like MemberExpr, TupleIndexExpr is always an lvalue74 get_result()->set_lvalue( true );75 73 } 76 74 -
src/SynTree/Type.cc
rcf32116 r3f3bfe5a 85 85 const char * Type::FuncSpecifiersNames[] = { "inline", "_Noreturn", "fortran" }; 86 86 const char * Type::StorageClassesNames[] = { "extern", "static", "auto", "register", "_Thread_local" }; 87 const char * Type::QualifiersNames[] = { "const", "restrict", "volatile", " lvalue", "mutex", "_Atomic" };87 const char * Type::QualifiersNames[] = { "const", "restrict", "volatile", "mutex", "_Atomic" }; 88 88 89 89 Type * Type::stripDeclarator() { -
src/SynTree/Type.h
rcf32116 r3f3bfe5a 102 102 }; // StorageClasses 103 103 104 enum { Const = 1 << 0, Restrict = 1 << 1, Volatile = 1 << 2, Lvalue = 1 << 3, Mutex = 1 << 4, Atomic = 1 << 5, NumTypeQualifier = 6};104 enum { Const = 1 << 0, Restrict = 1 << 1, Volatile = 1 << 2, Mutex = 1 << 3, Atomic = 1 << 4, NumTypeQualifier = 5 }; 105 105 static const char * QualifiersNames[]; 106 106 union Qualifiers { 107 enum { Mask = ~ (Restrict | Lvalue)};107 enum { Mask = ~Restrict }; 108 108 unsigned int val; 109 109 struct { … … 111 111 bool is_restrict : 1; 112 112 bool is_volatile : 1; 113 bool is_lvalue : 1;114 113 bool is_mutex : 1; 115 114 bool is_atomic : 1; … … 153 152 bool get_volatile() const { return tq.is_volatile; } 154 153 bool get_restrict() const { return tq.is_restrict; } 155 bool get_lvalue() const { return tq.is_lvalue; }156 154 bool get_mutex() const { return tq.is_mutex; } 157 155 bool get_atomic() const { return tq.is_atomic; } … … 159 157 void set_volatile( bool newValue ) { tq.is_volatile = newValue; } 160 158 void set_restrict( bool newValue ) { tq.is_restrict = newValue; } 161 void set_lvalue( bool newValue ) { tq.is_lvalue = newValue; }162 159 void set_mutex( bool newValue ) { tq.is_mutex = newValue; } 163 160 void set_atomic( bool newValue ) { tq.is_atomic = newValue; } -
src/SynTree/module.mk
rcf32116 r3f3bfe5a 49 49 SynTree/TypeSubstitution.cc \ 50 50 SynTree/Attribute.cc \ 51 SynTree/DeclReplacer.cc \ 52 SynTree/TopLvalue.cc 51 SynTree/DeclReplacer.cc 53 52 54 53 SRC += $(SRC_SYNTREE) -
src/Tuples/TupleExpansion.cc
rcf32116 r3f3bfe5a 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Fri Jul 19 14:39:00 201913 // Update Count : 2 212 // Last Modified On : Fri Oct 4 15:38:00 2019 13 // Update Count : 23 14 14 // 15 15 … … 304 304 // produce the TupleType which aggregates the types of the exprs 305 305 std::list< Type * > types; 306 Type::Qualifiers qualifiers( Type::Const | Type::Volatile | Type::Restrict | Type:: Lvalue | Type::Atomic | Type::Mutex );306 Type::Qualifiers qualifiers( Type::Const | Type::Volatile | Type::Restrict | Type::Atomic | Type::Mutex ); 307 307 for ( Expression * expr : exprs ) { 308 308 assert( expr->get_result() ); … … 323 323 std::vector<ast::ptr<ast::Type>> types; 324 324 ast::CV::Qualifiers quals{ 325 ast::CV::Const | ast::CV::Volatile | ast::CV::Restrict | ast::CV::Lvalue |325 ast::CV::Const | ast::CV::Volatile | ast::CV::Restrict | 326 326 ast::CV::Atomic | ast::CV::Mutex }; 327 327 -
src/main.cc
rcf32116 r3f3bfe5a 60 60 #include "ResolvExpr/Resolver.h" // for resolve 61 61 #include "SymTab/Validate.h" // for validate 62 #include "SynTree/TopLvalue.h" // for assertTopLvalue, clearInn...63 62 #include "SynTree/Declaration.h" // for Declaration 64 63 #include "SynTree/Visitor.h" // for acceptAll … … 260 259 Stats::Time::StopBlock(); 261 260 262 //std::cerr << "Post-Parse Check" << std::endl;263 clearInnerLvalue( translationUnit );264 assertTopLvalue( translationUnit );265 266 261 // add the assignment statement after the initialization of a type parameter 267 262 PASS( "Validate", SymTab::validate( translationUnit, symtabp ) ); … … 282 277 } // if 283 278 284 assertTopLvalue( translationUnit );285 279 PASS( "Fix Labels", ControlStruct::fixLabels( translationUnit ) ); 286 assertTopLvalue( translationUnit );287 280 PASS( "Fix Names", CodeGen::fixNames( translationUnit ) ); 288 assertTopLvalue( translationUnit );289 281 PASS( "Gen Init", InitTweak::genInit( translationUnit ) ); 290 assertTopLvalue( translationUnit );291 282 PASS( "Expand Member Tuples" , Tuples::expandMemberTuples( translationUnit ) ); 292 assertTopLvalue( translationUnit );293 283 if ( libcfap ) { 294 284 // generate the bodies of cfa library functions … … 326 316 } // if 327 317 328 clearInnerLvalue( translationUnit );329 assertTopLvalue( translationUnit );330 331 318 // fix ObjectDecl - replaces ConstructorInit nodes 332 319 PASS( "Fix Init", InitTweak::fix( translationUnit, buildingLibrary() ) ); 333 clearInnerLvalue( translationUnit );334 assertTopLvalue( translationUnit );335 320 if ( ctorinitp ) { 336 321 dump ( translationUnit ); … … 339 324 340 325 PASS( "Expand Unique Expr", Tuples::expandUniqueExpr( translationUnit ) ); // xxx - is this the right place for this? want to expand ASAP so tha, sequent passes don't need to worry about double-visiting a unique expr - needs to go after InitTweak::fix so that copy constructed return declarations are reused 341 assertTopLvalue( translationUnit );342 326 343 327 PASS( "Translate EHM" , ControlStruct::translateEHM( translationUnit ) ); 344 assertTopLvalue( translationUnit );345 328 346 329 PASS( "Gen Waitfor" , Concurrency::generateWaitFor( translationUnit ) ); 347 clearInnerLvalue( translationUnit );348 assertTopLvalue( translationUnit );349 330 350 331 PASS( "Convert Specializations", GenPoly::convertSpecializations( translationUnit ) ); // needs to happen before tuple types are expanded 351 clearInnerLvalue( translationUnit );352 assertTopLvalue( translationUnit );353 332 354 333 PASS( "Expand Tuples", Tuples::expandTuples( translationUnit ) ); // xxx - is this the right place for this? 355 assertTopLvalue( translationUnit );356 334 357 335 if ( tuplep ) { … … 361 339 362 340 PASS( "Virtual Expand Casts", Virtual::expandCasts( translationUnit ) ); // Must come after translateEHM 363 assertTopLvalue( translationUnit );364 341 365 342 PASS( "Instantiate Generics", GenPoly::instantiateGeneric( translationUnit ) ); … … 368 345 return EXIT_SUCCESS; 369 346 } // if 370 clearInnerLvalue( translationUnit ); 371 assertTopLvalue( translationUnit ); 347 372 348 PASS( "Convert L-Value", GenPoly::convertLvalue( translationUnit ) ); 373 clearInnerLvalue( translationUnit );374 assertTopLvalue( translationUnit );375 349 376 350 if ( bboxp ) { … … 379 353 } // if 380 354 PASS( "Box", GenPoly::box( translationUnit ) ); 381 clearInnerLvalue( translationUnit );382 assertTopLvalue( translationUnit );383 355 384 356 if ( bcodegenp ) { … … 392 364 393 365 CodeTools::fillLocations( translationUnit ); 394 assertTopLvalue( translationUnit );395 366 PASS( "Code Gen", CodeGen::generate( translationUnit, *output, ! genproto, prettycodegenp, true, linemarks ) ); 396 367
Note: See TracChangeset
for help on using the changeset viewer.