Changes in / [5da9d6a:3d560060]
- Location:
- src
- Files:
-
- 4 added
- 33 edited
-
CodeGen/FixNames.cc (modified) (5 diffs)
-
CodeGen/FixNames.h (modified) (2 diffs)
-
Common/PassVisitor.impl.h (modified) (4 diffs)
-
Concurrency/Keywords.cc (modified) (13 diffs)
-
Concurrency/Waitfor.cc (modified) (18 diffs)
-
ControlStruct/ExceptTranslate.cc (modified) (23 diffs)
-
ControlStruct/ForExprMutator.cc (modified) (1 diff)
-
ControlStruct/LabelFixer.cc (modified) (3 diffs)
-
ControlStruct/LabelFixer.h (modified) (3 diffs)
-
ControlStruct/MLEMutator.cc (modified) (3 diffs)
-
ControlStruct/Mutate.cc (modified) (2 diffs)
-
GenPoly/Box.cc (modified) (14 diffs)
-
GenPoly/InstantiateGeneric.cc (modified) (1 diff)
-
GenPoly/Specialize.cc (modified) (3 diffs)
-
InitTweak/FixGlobalInit.cc (modified) (6 diffs)
-
InitTweak/FixInit.cc (modified) (6 diffs)
-
InitTweak/InitTweak.cc (modified) (12 diffs)
-
MakeLibCfa.cc (modified) (2 diffs)
-
Makefile.in (modified) (5 diffs)
-
Parser/StatementNode.cc (modified) (15 diffs)
-
SymTab/AddVisit.h (modified) (2 diffs)
-
SymTab/Autogen.cc (modified) (6 diffs)
-
SymTab/Autogen.h (modified) (2 diffs)
-
SymTab/ImplementationType.cc (added)
-
SymTab/ImplementationType.h (added)
-
SymTab/TypeEquality.cc (added)
-
SymTab/TypeEquality.h (added)
-
SymTab/Validate.cc (modified) (3 diffs)
-
SymTab/module.mk (modified) (1 diff)
-
SynTree/CompoundStmt.cc (modified) (1 diff)
-
SynTree/DeclStmt.cc (modified) (1 diff)
-
SynTree/Statement.cc (modified) (19 diffs)
-
SynTree/Statement.h (modified) (18 diffs)
-
SynTree/TupleExpr.cc (modified) (2 diffs)
-
Tuples/TupleAssignment.cc (modified) (16 diffs)
-
Tuples/TupleExpansion.cc (modified) (3 diffs)
-
tests/except-mac.h (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/FixNames.cc
r5da9d6a r3d560060 19 19 #include <string> // for string, operator!=, operator== 20 20 21 #include "Common/PassVisitor.h"22 21 #include "Common/SemanticError.h" // for SemanticError 23 22 #include "FixMain.h" // for FixMain … … 33 32 34 33 namespace CodeGen { 35 class FixNames : public WithGuards{34 class FixNames : public Visitor { 36 35 public: 37 v oid postvisit( ObjectDecl *objectDecl );38 v oid postvisit( FunctionDecl *functionDecl );36 virtual void visit( ObjectDecl *objectDecl ); 37 virtual void visit( FunctionDecl *functionDecl ); 39 38 40 v oid previsit( CompoundStmt *compoundStmt );39 virtual void visit( CompoundStmt *compoundStmt ); 41 40 private: 42 41 int scopeLevel = 1; … … 94 93 } 95 94 96 void fixNames( std::list< Declaration* > &translationUnit ) {97 PassVisitor<FixNames>fixer;95 void fixNames( std::list< Declaration* > translationUnit ) { 96 FixNames fixer; 98 97 acceptAll( translationUnit, fixer ); 99 98 } 100 99 101 void FixNames::fixDWT( DeclarationWithType * dwt ) {100 void FixNames::fixDWT( DeclarationWithType *dwt ) { 102 101 if ( dwt->get_name() != "" ) { 103 102 if ( LinkageSpec::isMangled( dwt->get_linkage() ) ) { … … 108 107 } 109 108 110 void FixNames::postvisit( ObjectDecl * objectDecl ) { 109 void FixNames::visit( ObjectDecl *objectDecl ) { 110 Visitor::visit( objectDecl ); 111 111 fixDWT( objectDecl ); 112 112 } 113 113 114 void FixNames::postvisit( FunctionDecl * functionDecl ) { 114 void FixNames::visit( FunctionDecl *functionDecl ) { 115 Visitor::visit( functionDecl ); 115 116 fixDWT( functionDecl ); 116 117 … … 120 121 throw SemanticError("Main expected to have 0, 2 or 3 arguments\n", functionDecl); 121 122 } 122 functionDecl->get_statements()->get_kids().push_back( new ReturnStmt( n ew ConstantExpr( Constant::from_int( 0 ) ) ) );123 functionDecl->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, new ConstantExpr( Constant::from_int( 0 ) ) ) ); 123 124 CodeGen::FixMain::registerMain( functionDecl ); 124 125 } 125 126 } 126 127 127 void FixNames:: previsit( CompoundStmt *) {128 void FixNames::visit( CompoundStmt *compoundStmt ) { 128 129 scopeLevel++; 129 GuardAction( [this](){ scopeLevel--; } ); 130 Visitor::visit( compoundStmt ); 131 scopeLevel--; 130 132 } 131 133 } // namespace CodeGen -
src/CodeGen/FixNames.h
r5da9d6a r3d560060 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // FixNames.h -- 7 // FixNames.h -- 8 8 // 9 9 // Author : Richard C. Bilson … … 22 22 namespace CodeGen { 23 23 /// mangles object and function names 24 void fixNames( std::list< Declaration* > &translationUnit );24 void fixNames( std::list< Declaration* > translationUnit ); 25 25 } // namespace CodeGen 26 26 -
src/Common/PassVisitor.impl.h
r5da9d6a r3d560060 55 55 it, 56 56 [](Declaration * decl) -> auto { 57 return new DeclStmt( decl );57 return new DeclStmt( noLabels, decl ); 58 58 } 59 59 ); … … 251 251 || ( empty( beforeDecls ) && empty( afterDecls )) ); 252 252 253 CompoundStmt *compound = new CompoundStmt( );253 CompoundStmt *compound = new CompoundStmt( noLabels ); 254 254 if( !empty(beforeDecls) ) { splice( std::back_inserter( compound->get_kids() ), beforeDecls ); } 255 255 if( !empty(beforeStmts) ) { compound->get_kids().splice( compound->get_kids().end(), *beforeStmts ); } … … 400 400 { 401 401 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 402 // implicit add __func__ identifier as specified in the C manual 6.4.2.2403 static ObjectDecl func(404 "__func__", noStorageClasses, LinkageSpec::C, nullptr,405 new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ), nullptr, true, false ),406 nullptr407 );408 indexerAddId( &func );409 402 maybeAccept_impl( node->type, *this ); 410 403 maybeAccept_impl( node->statements, *this ); … … 425 418 { 426 419 auto guard = makeFuncGuard( [this]() { indexerScopeEnter(); }, [this]() { indexerScopeLeave(); } ); 427 // implicit add __func__ identifier as specified in the C manual 6.4.2.2428 static ObjectDecl func(429 "__func__", noStorageClasses, LinkageSpec::C, nullptr,430 new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ), nullptr, true, false ),431 nullptr432 );433 indexerAddId( &func );434 420 maybeMutate_impl( node->type, *this ); 435 421 maybeMutate_impl( node->statements, *this ); -
src/Concurrency/Keywords.cc
r5da9d6a r3d560060 38 38 39 39 namespace Concurrency { 40 41 namespace { 42 const std::list<Label> noLabels; 43 const std::list< Attribute * > noAttributes; 44 Type::StorageClasses noStorage; 45 Type::Qualifiers noQualifiers; 46 } 47 40 48 //============================================================================================= 41 49 // Pass declarations … … 288 296 ObjectDecl * this_decl = new ObjectDecl( 289 297 "this", 290 noStorage Classes,298 noStorage, 291 299 LinkageSpec::Cforall, 292 300 nullptr, … … 305 313 new ObjectDecl( 306 314 "ret", 307 noStorage Classes,315 noStorage, 308 316 LinkageSpec::Cforall, 309 317 nullptr, … … 338 346 main_decl = new FunctionDecl( 339 347 "main", 340 noStorage Classes,348 noStorage, 341 349 LinkageSpec::Cforall, 342 350 main_type, … … 355 363 ObjectDecl * field = new ObjectDecl( 356 364 field_name, 357 noStorage Classes,365 noStorage, 358 366 LinkageSpec::Cforall, 359 367 nullptr, … … 371 379 372 380 void ConcurrentSueKeyword::addRoutines( ObjectDecl * field, FunctionDecl * func ) { 373 CompoundStmt * statement = new CompoundStmt( );381 CompoundStmt * statement = new CompoundStmt( noLabels ); 374 382 statement->push_back( 375 383 new ReturnStmt( 384 noLabels, 376 385 new AddressExpr( 377 386 new MemberExpr( … … 479 488 ObjectDecl * monitors = new ObjectDecl( 480 489 "__monitor", 481 noStorage Classes,490 noStorage, 482 491 LinkageSpec::Cforall, 483 492 nullptr, … … 500 509 // monitor_guard_t __guard = { __monitors, #, func }; 501 510 body->push_front( 502 new DeclStmt( n ew ObjectDecl(511 new DeclStmt( noLabels, new ObjectDecl( 503 512 "__guard", 504 noStorage Classes,513 noStorage, 505 514 LinkageSpec::Cforall, 506 515 nullptr, … … 521 530 522 531 //monitor_desc * __monitors[] = { get_monitor(a), get_monitor(b) }; 523 body->push_front( new DeclStmt( monitors) );532 body->push_front( new DeclStmt( noLabels, monitors) ); 524 533 } 525 534 … … 527 536 ObjectDecl * monitors = new ObjectDecl( 528 537 "__monitors", 529 noStorage Classes,538 noStorage, 530 539 LinkageSpec::Cforall, 531 540 nullptr, … … 560 569 // monitor_guard_t __guard = { __monitors, #, func }; 561 570 body->push_front( 562 new DeclStmt( n ew ObjectDecl(571 new DeclStmt( noLabels, new ObjectDecl( 563 572 "__guard", 564 noStorage Classes,573 noStorage, 565 574 LinkageSpec::Cforall, 566 575 nullptr, … … 582 591 583 592 //monitor_desc * __monitors[] = { get_monitor(a), get_monitor(b) }; 584 body->push_front( new DeclStmt( monitors) );593 body->push_front( new DeclStmt( noLabels, monitors) ); 585 594 } 586 595 … … 622 631 stmt->push_back( 623 632 new ExprStmt( 633 noLabels, 624 634 new UntypedExpr( 625 635 new NameExpr( "__thrd_start" ), -
src/Concurrency/Waitfor.cc
r5da9d6a r3d560060 100 100 101 101 namespace Concurrency { 102 103 namespace { 104 const std::list<Label> noLabels; 105 const std::list< Attribute * > noAttributes; 106 Type::StorageClasses noStorage; 107 Type::Qualifiers noQualifiers; 108 } 109 102 110 //============================================================================================= 103 111 // Pass declarations … … 195 203 ResolvExpr::findVoidExpression( expr, indexer ); 196 204 197 return new ExprStmt( expr );205 return new ExprStmt( noLabels, expr ); 198 206 } 199 207 … … 251 259 if( !decl_monitor || !decl_acceptable || !decl_mask ) throw SemanticError( "waitfor keyword requires monitors to be in scope, add #include <monitor>", waitfor ); 252 260 253 CompoundStmt * stmt = new CompoundStmt( );261 CompoundStmt * stmt = new CompoundStmt( noLabels ); 254 262 255 263 ObjectDecl * acceptables = declare( waitfor->clauses.size(), stmt ); … … 273 281 ); 274 282 275 CompoundStmt * compound = new CompoundStmt( );283 CompoundStmt * compound = new CompoundStmt( noLabels ); 276 284 stmt->push_back( new IfStmt( 285 noLabels, 277 286 safeCond( new VariableExpr( flag ) ), 278 287 compound, … … 304 313 ); 305 314 306 stmt->push_back( new DeclStmt( acceptables) );315 stmt->push_back( new DeclStmt( noLabels, acceptables) ); 307 316 308 317 Expression * set = new UntypedExpr( … … 317 326 ResolvExpr::findVoidExpression( set, indexer ); 318 327 319 stmt->push_back( new ExprStmt( set ) );328 stmt->push_back( new ExprStmt( noLabels, set ) ); 320 329 321 330 return acceptables; … … 332 341 ); 333 342 334 stmt->push_back( new DeclStmt( flag) );343 stmt->push_back( new DeclStmt( noLabels, flag) ); 335 344 336 345 return flag; … … 348 357 ResolvExpr::findVoidExpression( expr, indexer ); 349 358 350 return new ExprStmt( expr );359 return new ExprStmt( noLabels, expr ); 351 360 } 352 361 … … 390 399 ); 391 400 392 stmt->push_back( new DeclStmt( mon) );401 stmt->push_back( new DeclStmt( noLabels, mon) ); 393 402 394 403 return mon; … … 402 411 403 412 stmt->push_back( new IfStmt( 413 noLabels, 404 414 safeCond( clause.condition ), 405 415 new CompoundStmt({ … … 437 447 ); 438 448 439 stmt->push_back( new DeclStmt( timeout ) );449 stmt->push_back( new DeclStmt( noLabels, timeout ) ); 440 450 441 451 if( time ) { 442 452 stmt->push_back( new IfStmt( 453 noLabels, 443 454 safeCond( time_cond ), 444 455 new CompoundStmt({ 445 456 new ExprStmt( 457 noLabels, 446 458 makeOpAssign( 447 459 new VariableExpr( timeout ), … … 459 471 if( has_else ) { 460 472 stmt->push_back( new IfStmt( 473 noLabels, 461 474 safeCond( else_cond ), 462 475 new CompoundStmt({ 463 476 new ExprStmt( 477 noLabels, 464 478 makeOpAssign( 465 479 new VariableExpr( timeout ), … … 497 511 ); 498 512 499 stmt->push_back( new DeclStmt( index ) );513 stmt->push_back( new DeclStmt( noLabels, index ) ); 500 514 501 515 ObjectDecl * mask = ObjectDecl::newObject( … … 512 526 ); 513 527 514 stmt->push_back( new DeclStmt( mask ) );528 stmt->push_back( new DeclStmt( noLabels, mask ) ); 515 529 516 530 stmt->push_back( new ExprStmt( 531 noLabels, 517 532 new ApplicationExpr( 518 533 VariableExpr::functionPointer( decl_waitfor ), … … 542 557 ) { 543 558 SwitchStmt * swtch = new SwitchStmt( 559 noLabels, 544 560 result, 545 561 std::list<Statement *>() … … 550 566 swtch->statements.push_back( 551 567 new CaseStmt( 568 noLabels, 552 569 new ConstantExpr( Constant::from_ulong( i++ ) ), 553 570 { 554 571 clause.statement, 555 572 new BranchStmt( 573 noLabels, 556 574 "", 557 575 BranchStmt::Break … … 565 583 swtch->statements.push_back( 566 584 new CaseStmt( 585 noLabels, 567 586 new ConstantExpr( Constant::from_int( -2 ) ), 568 587 { 569 588 waitfor->timeout.statement, 570 589 new BranchStmt( 590 noLabels, 571 591 "", 572 592 BranchStmt::Break … … 580 600 swtch->statements.push_back( 581 601 new CaseStmt( 602 noLabels, 582 603 new ConstantExpr( Constant::from_int( -1 ) ), 583 604 { 584 605 waitfor->orelse.statement, 585 606 new BranchStmt( 607 noLabels, 586 608 "", 587 609 BranchStmt::Break -
src/ControlStruct/ExceptTranslate.cc
r5da9d6a r3d560060 30 30 #include "SynTree/Expression.h" // for UntypedExpr, ConstantExpr, Name... 31 31 #include "SynTree/Initializer.h" // for SingleInit, ListInit 32 #include "SynTree/Label.h" // for Label 32 #include "SynTree/Label.h" // for Label, noLabels 33 33 #include "SynTree/Mutator.h" // for mutateAll 34 34 #include "SynTree/Statement.h" // for CompoundStmt, CatchStmt, ThrowStmt … … 57 57 58 58 void appendDeclStmt( CompoundStmt * block, Declaration * item ) { 59 block->push_back(new DeclStmt( item));59 block->push_back(new DeclStmt(noLabels, item)); 60 60 } 61 61 … … 205 205 throwStmt->set_expr( nullptr ); 206 206 delete throwStmt; 207 return new ExprStmt( call );207 return new ExprStmt( noLabels, call ); 208 208 } 209 209 … … 220 220 assert( handler_except_decl ); 221 221 222 CompoundStmt * result = new CompoundStmt(); 223 result->labels = throwStmt->labels; 224 result->push_back( new ExprStmt( UntypedExpr::createAssign( 222 CompoundStmt * result = new CompoundStmt( throwStmt->get_labels() ); 223 result->push_back( new ExprStmt( noLabels, UntypedExpr::createAssign( 225 224 nameOf( handler_except_decl ), 226 225 new ConstantExpr( Constant::null( … … 232 231 ) ) ); 233 232 result->push_back( new ExprStmt( 233 noLabels, 234 234 new UntypedExpr( new NameExpr( "__cfaabi_ehm__rethrow_terminate" ) ) 235 235 ) ); … … 248 248 // return false; 249 249 Statement * result = new ReturnStmt( 250 throwStmt->get_labels(), 250 251 new ConstantExpr( Constant::from_bool( false ) ) 251 252 ); 252 result->labels = throwStmt->labels;253 253 delete throwStmt; 254 254 return result; … … 291 291 // } 292 292 // return; 293 CompoundStmt * block = new CompoundStmt( );293 CompoundStmt * block = new CompoundStmt( noLabels ); 294 294 295 295 // Just copy the exception value. (Post Validation) … … 304 304 ) }) 305 305 ); 306 block->push_back( new DeclStmt( local_except ) );306 block->push_back( new DeclStmt( noLabels, local_except ) ); 307 307 308 308 // Add the cleanup attribute. … … 324 324 325 325 std::list<Statement *> caseBody 326 { block, new ReturnStmt( n ullptr ) };326 { block, new ReturnStmt( noLabels, nullptr ) }; 327 327 handler_wrappers.push_back( new CaseStmt( 328 noLabels, 328 329 new ConstantExpr( Constant::from_int( index ) ), 329 330 caseBody … … 339 340 340 341 SwitchStmt * handler_lookup = new SwitchStmt( 342 noLabels, 341 343 nameOf( index_obj ), 342 344 stmt_handlers 343 345 ); 344 CompoundStmt * body = new CompoundStmt( );346 CompoundStmt * body = new CompoundStmt( noLabels ); 345 347 body->push_back( handler_lookup ); 346 348 … … 361 363 // } 362 364 363 CompoundStmt * block = new CompoundStmt( );365 CompoundStmt * block = new CompoundStmt( noLabels ); 364 366 365 367 // Local Declaration … … 367 369 dynamic_cast<ObjectDecl *>( modded_handler->get_decl() ); 368 370 assert( local_except ); 369 block->push_back( new DeclStmt( local_except ) );371 block->push_back( new DeclStmt( noLabels, local_except ) ); 370 372 371 373 // Check for type match. … … 379 381 } 380 382 // Construct the match condition. 381 block->push_back( new IfStmt( 383 block->push_back( new IfStmt( noLabels, 382 384 cond, modded_handler->get_body(), nullptr ) ); 383 385 … … 395 397 // } 396 398 397 CompoundStmt * body = new CompoundStmt( );399 CompoundStmt * body = new CompoundStmt( noLabels ); 398 400 399 401 FunctionType * func_type = match_func_t.clone(); … … 411 413 412 414 // Create new body. 413 handler->set_body( new ReturnStmt( 415 handler->set_body( new ReturnStmt( noLabels, 414 416 new ConstantExpr( Constant::from_int( index ) ) ) ); 415 417 … … 419 421 } 420 422 421 body->push_back( new ReturnStmt( 423 body->push_back( new ReturnStmt( noLabels, 422 424 new ConstantExpr( Constant::from_int( 0 ) ) ) ); 423 425 … … 439 441 args.push_back( nameOf( terminate_match ) ); 440 442 441 CompoundStmt * callStmt = new CompoundStmt( );442 callStmt->push_back( new ExprStmt( caller ) );443 CompoundStmt * callStmt = new CompoundStmt( noLabels ); 444 callStmt->push_back( new ExprStmt( noLabels, caller ) ); 443 445 return callStmt; 444 446 } … … 449 451 // HANDLER WRAPPERS { `hander->body`; return true; } 450 452 // } 451 CompoundStmt * body = new CompoundStmt( );453 CompoundStmt * body = new CompoundStmt( noLabels ); 452 454 453 455 FunctionType * func_type = handle_func_t.clone(); … … 462 464 dynamic_cast<CompoundStmt*>( handler->get_body() ); 463 465 if ( ! handling_code ) { 464 handling_code = new CompoundStmt( );466 handling_code = new CompoundStmt( noLabels ); 465 467 handling_code->push_back( handler->get_body() ); 466 468 } 467 handling_code->push_back( new ReturnStmt( 469 handling_code->push_back( new ReturnStmt( noLabels, 468 470 new ConstantExpr( Constant::from_bool( true ) ) ) ); 469 471 handler->set_body( handling_code ); … … 474 476 } 475 477 476 body->push_back( new ReturnStmt( 478 body->push_back( new ReturnStmt( noLabels, 477 479 new ConstantExpr( Constant::from_bool( false ) ) ) ); 478 480 … … 484 486 Statement * wraps, 485 487 FunctionDecl * resume_handler ) { 486 CompoundStmt * body = new CompoundStmt( );488 CompoundStmt * body = new CompoundStmt( noLabels ); 487 489 488 490 // struct __try_resume_node __resume_node … … 519 521 setup->get_args().push_back( nameOf( resume_handler ) ); 520 522 521 body->push_back( new ExprStmt( setup ) );523 body->push_back( new ExprStmt( noLabels, setup ) ); 522 524 523 525 body->push_back( wraps ); … … 644 646 // Generate a prefix for the function names? 645 647 646 CompoundStmt * block = new CompoundStmt( );648 CompoundStmt * block = new CompoundStmt( noLabels ); 647 649 CompoundStmt * inner = take_try_block( tryStmt ); 648 650 -
src/ControlStruct/ForExprMutator.cc
r5da9d6a r3d560060 29 29 // Create compound statement, move initializers outside, 30 30 // the resut of the original stays as is. 31 CompoundStmt *block = new CompoundStmt( );31 CompoundStmt *block = new CompoundStmt( std::list< Label >() ); 32 32 std::list<Statement *> &stmts = block->get_kids(); 33 33 stmts.splice( stmts.end(), init ); -
src/ControlStruct/LabelFixer.cc
r5da9d6a r3d560060 37 37 } 38 38 39 void LabelFixer:: previsit( FunctionDecl *) {39 void LabelFixer::visit( FunctionDecl *functionDecl ) { 40 40 // need to go into a nested function in a fresh state 41 GuardValue( labelTable );41 std::map < Label, Entry *> oldLabelTable = labelTable; 42 42 labelTable.clear(); 43 }44 43 45 void LabelFixer::postvisit( FunctionDecl * functionDecl ) { 44 maybeAccept( functionDecl->get_statements(), *this ); 45 46 46 MLEMutator mlemut( resolveJumps(), generator ); 47 47 functionDecl->acceptMutator( mlemut ); 48 49 // and remember the outer function's labels when 50 // returning to it 51 labelTable = oldLabelTable; 48 52 } 49 53 50 54 // prune to at most one label definition for each statement 51 void LabelFixer:: previsit( Statement *stmt ) {55 void LabelFixer::visit( Statement *stmt ) { 52 56 std::list< Label > &labels = stmt->get_labels(); 53 57 … … 58 62 } 59 63 60 void LabelFixer:: previsit( BranchStmt *branchStmt ) {61 previsit( ( Statement *)branchStmt );64 void LabelFixer::visit( BranchStmt *branchStmt ) { 65 visit ( ( Statement * )branchStmt ); 62 66 63 67 // for labeled branches, add an entry to the label table … … 68 72 } 69 73 70 void LabelFixer::previsit( LabelAddressExpr * addrExpr ) { 71 Label & target = addrExpr->arg; 72 assert( target != "" ); 73 setLabelsUsg( target, addrExpr ); 74 void LabelFixer::visit( UntypedExpr *untyped ) { 75 if ( NameExpr * func = dynamic_cast< NameExpr * >( untyped->get_function() ) ) { 76 if ( func->get_name() == "&&" ) { 77 NameExpr * arg = dynamic_cast< NameExpr * >( untyped->get_args().front() ); 78 Label target = arg->get_name(); 79 assert( target != "" ); 80 setLabelsUsg( target, untyped ); 81 } else { 82 Visitor::visit( untyped ); 83 } 84 } 74 85 } 75 86 -
src/ControlStruct/LabelFixer.h
r5da9d6a r3d560060 19 19 #include <map> // for map 20 20 21 #include "Common/PassVisitor.h"22 21 #include "Common/SemanticError.h" // for SemanticError 23 22 #include "SynTree/Label.h" // for Label … … 27 26 namespace ControlStruct { 28 27 /// normalizes label definitions and generates multi-level exit labels 29 class LabelGenerator;28 class LabelGenerator; 30 29 31 class LabelFixer final : public WithGuards { 30 class LabelFixer final : public Visitor { 31 typedef Visitor Parent; 32 32 public: 33 33 LabelFixer( LabelGenerator *gen = 0 ); … … 35 35 std::map < Label, Statement * > *resolveJumps() throw ( SemanticError ); 36 36 37 using Visitor::visit; 38 37 39 // Declarations 38 void previsit( FunctionDecl *functionDecl ); 39 void postvisit( FunctionDecl *functionDecl ); 40 virtual void visit( FunctionDecl *functionDecl ) override; 40 41 41 42 // Statements 42 void previsit( Statement *stmt ); 43 void previsit( BranchStmt *branchStmt ); 43 void visit( Statement *stmt ); 44 44 45 // Expressions 46 void previsit( LabelAddressExpr *addrExpr ); 45 virtual void visit( CompoundStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); } 46 virtual void visit( NullStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); } 47 virtual void visit( ExprStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); } 48 virtual void visit( IfStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); } 49 virtual void visit( WhileStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); } 50 virtual void visit( ForStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); } 51 virtual void visit( SwitchStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); } 52 virtual void visit( CaseStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); } 53 virtual void visit( ReturnStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); } 54 virtual void visit( TryStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); } 55 virtual void visit( CatchStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); } 56 virtual void visit( DeclStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); } 57 virtual void visit( BranchStmt *branchStmt ) override; 58 virtual void visit( UntypedExpr *untyped ) override; 47 59 48 60 Label setLabelsDef( std::list< Label > &, Statement *definition ); -
src/ControlStruct/MLEMutator.cc
r5da9d6a r3d560060 149 149 150 150 if ( CaseStmt * c = dynamic_cast< CaseStmt * >( statements.back() ) ) { 151 Statement * stmt = new BranchStmt( Label("brkLabel"), BranchStmt::Break ); 152 stmt->labels.push_back( brkLabel ); 153 c->get_statements().push_back( stmt ); 151 std::list<Label> temp; temp.push_back( brkLabel ); 152 c->get_statements().push_back( new BranchStmt( temp, Label("brkLabel"), BranchStmt::Break ) ); 154 153 } else assert(0); // as of this point, all statements of a switch are still CaseStmts 155 154 } // if … … 233 232 // transform break/continue statements into goto to simplify later handling of branches 234 233 delete branchStmt; 235 return new BranchStmt( exitLabel, BranchStmt::Goto );234 return new BranchStmt( std::list<Label>(), exitLabel, BranchStmt::Goto ); 236 235 } 237 236 … … 240 239 CompoundStmt *newBody; 241 240 if ( ! (newBody = dynamic_cast<CompoundStmt *>( bodyLoop )) ) { 242 newBody = new CompoundStmt( );241 newBody = new CompoundStmt( std::list< Label >() ); 243 242 newBody->get_kids().push_back( bodyLoop ); 244 243 } // if -
src/ControlStruct/Mutate.cc
r5da9d6a r3d560060 24 24 #include "SynTree/Declaration.h" // for Declaration 25 25 #include "SynTree/Mutator.h" // for mutateAll 26 //#include "ExceptMutator.h" 26 27 27 28 #include "Common/PassVisitor.h" // for PassVisitor … … 36 37 37 38 // normalizes label definitions and generates multi-level exit labels 38 PassVisitor<LabelFixer> lfix; 39 LabelFixer lfix; 40 41 //ExceptMutator exc; 39 42 40 43 mutateAll( translationUnit, formut ); 41 44 acceptAll( translationUnit, lfix ); 45 //mutateAll( translationUnit, exc ); 42 46 } 43 47 } // namespace CodeGen -
src/GenPoly/Box.cc
r5da9d6a r3d560060 49 49 #include "SynTree/Expression.h" // for ApplicationExpr, UntypedExpr 50 50 #include "SynTree/Initializer.h" // for SingleInit, Initializer, Lis... 51 #include "SynTree/Label.h" // for Label 51 #include "SynTree/Label.h" // for Label, noLabels 52 52 #include "SynTree/Mutator.h" // for maybeMutate, Mutator, mutateAll 53 53 #include "SynTree/Statement.h" // for ExprStmt, DeclStmt, ReturnStmt … … 293 293 FunctionDecl *layoutDecl = new FunctionDecl( layoutofName( typeDecl ), 294 294 functionNesting > 0 ? Type::StorageClasses() : Type::StorageClasses( Type::Static ), 295 LinkageSpec::AutoGen, layoutFnType, new CompoundStmt( ),295 LinkageSpec::AutoGen, layoutFnType, new CompoundStmt( noLabels ), 296 296 std::list< Attribute * >(), Type::FuncSpecifiers( Type::Inline ) ); 297 297 layoutDecl->fixUniqueId(); … … 321 321 /// makes an if-statement with a single-expression if-block and no then block 322 322 Statement *makeCond( Expression *cond, Expression *ifPart ) { 323 return new IfStmt( cond, new ExprStmt(ifPart ), 0 );323 return new IfStmt( noLabels, cond, new ExprStmt( noLabels, ifPart ), 0 ); 324 324 } 325 325 … … 340 340 /// adds an expression to a compound statement 341 341 void addExpr( CompoundStmt *stmts, Expression *expr ) { 342 stmts->get_kids().push_back( new ExprStmt( expr ) );342 stmts->get_kids().push_back( new ExprStmt( noLabels, expr ) ); 343 343 } 344 344 … … 629 629 ObjectDecl *Pass1::makeTemporary( Type *type ) { 630 630 ObjectDecl *newObj = new ObjectDecl( tempNamer.newName(), Type::StorageClasses(), LinkageSpec::C, 0, type, 0 ); 631 stmtsToAddBefore.push_back( new DeclStmt( n ewObj ) );631 stmtsToAddBefore.push_back( new DeclStmt( noLabels, newObj ) ); 632 632 return newObj; 633 633 } … … 740 740 ObjectDecl *newObj = ObjectDecl::newObject( tempNamer.newName(), newType, nullptr ); 741 741 newObj->get_type()->get_qualifiers() = Type::Qualifiers(); // TODO: is this right??? 742 stmtsToAddBefore.push_back( new DeclStmt( n ewObj ) );742 stmtsToAddBefore.push_back( new DeclStmt( noLabels, newObj ) ); 743 743 UntypedExpr *assign = new UntypedExpr( new NameExpr( "?=?" ) ); // TODO: why doesn't this just use initialization syntax? 744 744 assign->get_args().push_back( new VariableExpr( newObj ) ); 745 745 assign->get_args().push_back( arg ); 746 stmtsToAddBefore.push_back( new ExprStmt( assign ) );746 stmtsToAddBefore.push_back( new ExprStmt( noLabels, assign ) ); 747 747 arg = new AddressExpr( new VariableExpr( newObj ) ); 748 748 } // if … … 888 888 // void return 889 889 addAdapterParams( adapteeApp, arg, param, adapterType->get_parameters().end(), realParam, tyVars ); 890 bodyStmt = new ExprStmt( adapteeApp );890 bodyStmt = new ExprStmt( noLabels, adapteeApp ); 891 891 } else if ( isDynType( adaptee->get_returnVals().front()->get_type(), tyVars ) ) { 892 892 // return type T … … 900 900 addAdapterParams( adapteeApp, arg, param, adapterType->get_parameters().end(), realParam, tyVars ); 901 901 assign->get_args().push_back( adapteeApp ); 902 bodyStmt = new ExprStmt( assign );902 bodyStmt = new ExprStmt( noLabels, assign ); 903 903 } else { 904 904 // adapter for a function that returns a monomorphic value 905 905 addAdapterParams( adapteeApp, arg, param, adapterType->get_parameters().end(), realParam, tyVars ); 906 bodyStmt = new ReturnStmt( adapteeApp );906 bodyStmt = new ReturnStmt( noLabels, adapteeApp ); 907 907 } // if 908 CompoundStmt *adapterBody = new CompoundStmt( );908 CompoundStmt *adapterBody = new CompoundStmt( noLabels ); 909 909 adapterBody->get_kids().push_back( bodyStmt ); 910 910 std::string adapterName = makeAdapterName( mangleName ); … … 952 952 std::pair< AdapterIter, bool > answer = adapters.insert( std::pair< std::string, DeclarationWithType *>( mangleName, newAdapter ) ); 953 953 adapter = answer.first; 954 stmtsToAddBefore.push_back( new DeclStmt( n ewAdapter ) );954 stmtsToAddBefore.push_back( new DeclStmt( noLabels, newAdapter ) ); 955 955 } // if 956 956 assert( adapter != adapters.end() ); … … 1279 1279 retval->set_name( "_retval" ); 1280 1280 } 1281 functionDecl->get_statements()->get_kids().push_front( new DeclStmt( retval ) );1281 functionDecl->get_statements()->get_kids().push_front( new DeclStmt( noLabels, retval ) ); 1282 1282 DeclarationWithType * newRet = retval->clone(); // for ownership purposes 1283 1283 ftype->get_returnVals().front() = newRet; … … 1519 1519 // (alloca was previously used, but can't be safely used in loops) 1520 1520 ObjectDecl *newBuf = ObjectDecl::newObject( bufNamer.newName(), polyToMonoType( objectDecl->type ), nullptr ); 1521 stmtsToAddBefore.push_back( new DeclStmt( n ewBuf ) );1521 stmtsToAddBefore.push_back( new DeclStmt( noLabels, newBuf ) ); 1522 1522 1523 1523 delete objectDecl->get_init(); … … 1598 1598 ObjectDecl *PolyGenericCalculator::makeVar( const std::string &name, Type *type, Initializer *init ) { 1599 1599 ObjectDecl *newObj = new ObjectDecl( name, Type::StorageClasses(), LinkageSpec::C, 0, type, init ); 1600 stmtsToAddBefore.push_back( new DeclStmt( n ewObj ) );1600 stmtsToAddBefore.push_back( new DeclStmt( noLabels, newObj ) ); 1601 1601 return newObj; 1602 1602 } … … 1677 1677 addOtypeParamsToLayoutCall( layoutCall, otypeParams ); 1678 1678 1679 stmtsToAddBefore.push_back( new ExprStmt( layoutCall ) );1679 stmtsToAddBefore.push_back( new ExprStmt( noLabels, layoutCall ) ); 1680 1680 } 1681 1681 … … 1703 1703 addOtypeParamsToLayoutCall( layoutCall, otypeParams ); 1704 1704 1705 stmtsToAddBefore.push_back( new ExprStmt( layoutCall ) );1705 stmtsToAddBefore.push_back( new ExprStmt( noLabels, layoutCall ) ); 1706 1706 1707 1707 return true; -
src/GenPoly/InstantiateGeneric.cc
r5da9d6a r3d560060 526 526 Expression * init = new CastExpr( new AddressExpr( memberExpr ), new PointerType( Type::Qualifiers(), concType->clone() ) ); 527 527 ObjectDecl * tmp = ObjectDecl::newObject( tmpNamer.newName(), new ReferenceType( Type::Qualifiers(), concType ), new SingleInit( init ) ); 528 stmtsToAddBefore.push_back( new DeclStmt( tmp ) );528 stmtsToAddBefore.push_back( new DeclStmt( noLabels, tmp ) ); 529 529 return new VariableExpr( tmp ); 530 530 } else { -
src/GenPoly/Specialize.cc
r5da9d6a r3d560060 35 35 #include "SynTree/Declaration.h" // for FunctionDecl, DeclarationWit... 36 36 #include "SynTree/Expression.h" // for ApplicationExpr, Expression 37 #include "SynTree/Label.h" // for Label 37 #include "SynTree/Label.h" // for Label, noLabels 38 38 #include "SynTree/Mutator.h" // for mutateAll 39 39 #include "SynTree/Statement.h" // for CompoundStmt, DeclStmt, Expr... … … 234 234 } // if 235 235 // create new thunk with same signature as formal type (C linkage, empty body) 236 FunctionDecl *thunkFunc = new FunctionDecl( thunkNamer.newName(), Type::StorageClasses(), LinkageSpec::C, newType, new CompoundStmt( ) );236 FunctionDecl *thunkFunc = new FunctionDecl( thunkNamer.newName(), Type::StorageClasses(), LinkageSpec::C, newType, new CompoundStmt( noLabels ) ); 237 237 thunkFunc->fixUniqueId(); 238 238 … … 287 287 Statement *appStmt; 288 288 if ( funType->returnVals.empty() ) { 289 appStmt = new ExprStmt( appExpr );290 } else { 291 appStmt = new ReturnStmt( appExpr );289 appStmt = new ExprStmt( noLabels, appExpr ); 290 } else { 291 appStmt = new ReturnStmt( noLabels, appExpr ); 292 292 } // if 293 293 thunkFunc->statements->kids.push_back( appStmt ); 294 294 295 295 // add thunk definition to queue of statements to add 296 stmtsToAddBefore.push_back( new DeclStmt( thunkFunc ) );296 stmtsToAddBefore.push_back( new DeclStmt( noLabels, thunkFunc ) ); 297 297 // return address of thunk function as replacement expression 298 298 return new AddressExpr( new VariableExpr( thunkFunc ) ); -
src/InitTweak/FixGlobalInit.cc
r5da9d6a r3d560060 20 20 #include <algorithm> // for replace_if 21 21 22 #include "Common/PassVisitor.h"23 22 #include "Common/SemanticError.h" // for SemanticError 24 23 #include "Common/UniqueName.h" // for UniqueName … … 30 29 #include "SynTree/Expression.h" // for ConstantExpr, Expression (ptr only) 31 30 #include "SynTree/Initializer.h" // for ConstructorInit, Initializer 32 #include "SynTree/Label.h" // for Label 31 #include "SynTree/Label.h" // for Label, noLabels 33 32 #include "SynTree/Statement.h" // for CompoundStmt, Statement (ptr only) 34 33 #include "SynTree/Type.h" // for Type, Type::StorageClasses, Functi... … … 36 35 37 36 namespace InitTweak { 38 class GlobalFixer : public WithShortCircuiting{37 class GlobalFixer : public Visitor { 39 38 public: 40 39 GlobalFixer( const std::string & name, bool inLibrary ); 41 40 42 v oid previsit( ObjectDecl *objDecl );43 v oid previsit( FunctionDecl *functionDecl );44 v oid previsit( StructDecl *aggregateDecl );45 v oid previsit( UnionDecl *aggregateDecl );46 v oid previsit( EnumDecl *aggregateDecl );47 v oid previsit( TraitDecl *aggregateDecl );48 v oid previsit( TypeDecl *typeDecl );41 virtual void visit( ObjectDecl *objDecl ); 42 virtual void visit( FunctionDecl *functionDecl ); 43 virtual void visit( StructDecl *aggregateDecl ); 44 virtual void visit( UnionDecl *aggregateDecl ); 45 virtual void visit( EnumDecl *aggregateDecl ); 46 virtual void visit( TraitDecl *aggregateDecl ); 47 virtual void visit( TypeDecl *typeDecl ); 49 48 50 49 UniqueName tempNamer; … … 54 53 55 54 void fixGlobalInit( std::list< Declaration * > & translationUnit, const std::string & name, bool inLibrary ) { 56 PassVisitor<GlobalFixer> visitor( name, inLibrary ); 57 acceptAll( translationUnit, visitor ); 58 GlobalFixer & fixer = visitor.pass; 55 GlobalFixer fixer( name, inLibrary ); 56 acceptAll( translationUnit, fixer ); 59 57 // don't need to include function if it's empty 60 58 if ( fixer.initFunction->get_statements()->get_kids().empty() ) { … … 94 92 dtorParameters.push_back( new ConstantExpr( Constant::from_int( 102 ) ) ); 95 93 } 96 initFunction = new FunctionDecl( "_init_" + fixedName, Type::StorageClasses( Type::Static ), LinkageSpec::C, new FunctionType( Type::Qualifiers(), false ), new CompoundStmt( ) );94 initFunction = new FunctionDecl( "_init_" + fixedName, Type::StorageClasses( Type::Static ), LinkageSpec::C, new FunctionType( Type::Qualifiers(), false ), new CompoundStmt( noLabels ) ); 97 95 initFunction->get_attributes().push_back( new Attribute( "constructor", ctorParameters ) ); 98 destroyFunction = new FunctionDecl( "_destroy_" + fixedName, Type::StorageClasses( Type::Static ), LinkageSpec::C, new FunctionType( Type::Qualifiers(), false ), new CompoundStmt( ) );96 destroyFunction = new FunctionDecl( "_destroy_" + fixedName, Type::StorageClasses( Type::Static ), LinkageSpec::C, new FunctionType( Type::Qualifiers(), false ), new CompoundStmt( noLabels ) ); 99 97 destroyFunction->get_attributes().push_back( new Attribute( "destructor", dtorParameters ) ); 100 98 } 101 99 102 void GlobalFixer:: previsit( ObjectDecl *objDecl ) {100 void GlobalFixer::visit( ObjectDecl *objDecl ) { 103 101 std::list< Statement * > & initStatements = initFunction->get_statements()->get_kids(); 104 102 std::list< Statement * > & destroyStatements = destroyFunction->get_statements()->get_kids(); … … 136 134 137 135 // only modify global variables 138 void GlobalFixer:: previsit( FunctionDecl * ) { visit_children = false;}139 void GlobalFixer:: previsit( StructDecl * ) { visit_children = false;}140 void GlobalFixer:: previsit( UnionDecl * ) { visit_children = false;}141 void GlobalFixer:: previsit( EnumDecl * ) { visit_children = false;}142 void GlobalFixer:: previsit( TraitDecl * ) { visit_children = false;}143 void GlobalFixer:: previsit( TypeDecl * ) { visit_children = false;}136 void GlobalFixer::visit( __attribute__((unused)) FunctionDecl *functionDecl ) {} 137 void GlobalFixer::visit( __attribute__((unused)) StructDecl *aggregateDecl ) {} 138 void GlobalFixer::visit( __attribute__((unused)) UnionDecl *aggregateDecl ) {} 139 void GlobalFixer::visit( __attribute__((unused)) EnumDecl *aggregateDecl ) {} 140 void GlobalFixer::visit( __attribute__((unused)) TraitDecl *aggregateDecl ) {} 141 void GlobalFixer::visit( __attribute__((unused)) TypeDecl *typeDecl ) {} 144 142 145 143 } // namespace InitTweak -
src/InitTweak/FixInit.cc
r5da9d6a r3d560060 49 49 #include "SynTree/Expression.h" // for UniqueExpr, VariableExpr, Unty... 50 50 #include "SynTree/Initializer.h" // for ConstructorInit, SingleInit 51 #include "SynTree/Label.h" // for Label, operator<51 #include "SynTree/Label.h" // for Label, noLabels, operator< 52 52 #include "SynTree/Mutator.h" // for mutateAll, Mutator, maybeMutate 53 53 #include "SynTree/Statement.h" // for ExprStmt, CompoundStmt, Branch... … … 544 544 // add all temporary declarations and their constructors 545 545 for ( ObjectDecl * obj : tempDecls ) { 546 stmtsToAddBefore.push_back( new DeclStmt( obj ) );546 stmtsToAddBefore.push_back( new DeclStmt( noLabels, obj ) ); 547 547 } // for 548 548 for ( ObjectDecl * obj : returnDecls ) { 549 stmtsToAddBefore.push_back( new DeclStmt( obj ) );549 stmtsToAddBefore.push_back( new DeclStmt( noLabels, obj ) ); 550 550 } // for 551 551 552 552 // add destructors after current statement 553 553 for ( Expression * dtor : dtors ) { 554 stmtsToAddAfter.push_back( new ExprStmt( dtor ) );554 stmtsToAddAfter.push_back( new ExprStmt( noLabels, dtor ) ); 555 555 } // for 556 556 … … 598 598 if ( ! result->isVoid() ) { 599 599 for ( ObjectDecl * obj : stmtExpr->get_returnDecls() ) { 600 stmtsToAddBefore.push_back( new DeclStmt( obj ) );600 stmtsToAddBefore.push_back( new DeclStmt( noLabels, obj ) ); 601 601 } // for 602 602 // add destructors after current statement 603 603 for ( Expression * dtor : stmtExpr->get_dtors() ) { 604 stmtsToAddAfter.push_back( new ExprStmt( dtor ) );604 stmtsToAddAfter.push_back( new ExprStmt( noLabels, dtor ) ); 605 605 } // for 606 606 // must have a non-empty body, otherwise it wouldn't have a result 607 607 assert( ! stmts.empty() ); 608 608 assert( ! stmtExpr->get_returnDecls().empty() ); 609 stmts.push_back( new ExprStmt( n ew VariableExpr( stmtExpr->get_returnDecls().front() ) ) );609 stmts.push_back( new ExprStmt( noLabels, new VariableExpr( stmtExpr->get_returnDecls().front() ) ) ); 610 610 stmtExpr->get_returnDecls().clear(); 611 611 stmtExpr->get_dtors().clear(); … … 685 685 686 686 // generate body of if 687 CompoundStmt * initStmts = new CompoundStmt( );687 CompoundStmt * initStmts = new CompoundStmt( noLabels ); 688 688 std::list< Statement * > & body = initStmts->get_kids(); 689 689 body.push_back( ctor ); 690 body.push_back( new ExprStmt( setTrue ) );690 body.push_back( new ExprStmt( noLabels, setTrue ) ); 691 691 692 692 // put it all together 693 IfStmt * ifStmt = new IfStmt( n ew VariableExpr( isUninitializedVar ), initStmts, 0 );694 stmtsToAddAfter.push_back( new DeclStmt( isUninitializedVar ) );693 IfStmt * ifStmt = new IfStmt( noLabels, new VariableExpr( isUninitializedVar ), initStmts, 0 ); 694 stmtsToAddAfter.push_back( new DeclStmt( noLabels, isUninitializedVar ) ); 695 695 stmtsToAddAfter.push_back( ifStmt ); 696 696 … … 707 707 708 708 // void __objName_dtor_atexitN(...) {...} 709 FunctionDecl * dtorCaller = new FunctionDecl( objDecl->get_mangleName() + dtorCallerNamer.newName(), Type::StorageClasses( Type::Static ), LinkageSpec::C, new FunctionType( Type::Qualifiers(), false ), new CompoundStmt( ) );709 FunctionDecl * dtorCaller = new FunctionDecl( objDecl->get_mangleName() + dtorCallerNamer.newName(), Type::StorageClasses( Type::Static ), LinkageSpec::C, new FunctionType( Type::Qualifiers(), false ), new CompoundStmt( noLabels ) ); 710 710 dtorCaller->fixUniqueId(); 711 711 dtorCaller->get_statements()->push_back( dtorStmt ); … … 715 715 callAtexit->get_args().push_back( new VariableExpr( dtorCaller ) ); 716 716 717 body.push_back( new ExprStmt( callAtexit ) );717 body.push_back( new ExprStmt( noLabels, callAtexit ) ); 718 718 719 719 // hoist variable and dtor caller decls to list of decls that will be added into global scope -
src/InitTweak/InitTweak.cc
r5da9d6a r3d560060 5 5 #include <memory> // for __shared_ptr 6 6 7 #include "Common/PassVisitor.h"8 7 #include "Common/SemanticError.h" // for SemanticError 9 8 #include "Common/UniqueName.h" // for UniqueName … … 20 19 #include "SynTree/Expression.h" // for Expression, UntypedExpr, Applicati... 21 20 #include "SynTree/Initializer.h" // for Initializer, ListInit, Designation 22 #include "SynTree/Label.h" // for Label 21 #include "SynTree/Label.h" // for Label, noLabels 23 22 #include "SynTree/Statement.h" // for CompoundStmt, ExprStmt, BranchStmt 24 23 #include "SynTree/Type.h" // for FunctionType, ArrayType, PointerType … … 30 29 namespace InitTweak { 31 30 namespace { 32 struct HasDesignations : public WithShortCircuiting { 31 class HasDesignations : public Visitor { 32 public: 33 33 bool hasDesignations = false; 34 35 void previsit( BaseSyntaxNode * ) { 36 // short circuit if we already know there are designations 37 if ( hasDesignations ) visit_children = false; 38 } 39 40 void previsit( Designation * des ) { 41 // short circuit if we already know there are designations 42 if ( hasDesignations ) visit_children = false; 43 else if ( ! des->get_designators().empty() ) { 44 hasDesignations = true; 45 visit_children = false; 46 } 34 virtual void visit( Designation * des ) { 35 if ( ! des->get_designators().empty() ) hasDesignations = true; 36 else Visitor::visit( des ); 47 37 } 48 38 }; 49 39 50 struct InitDepthChecker : public WithGuards { 40 class InitDepthChecker : public Visitor { 41 public: 51 42 bool depthOkay = true; 52 43 Type * type; … … 60 51 maxDepth++; 61 52 } 62 v oid previsit( ListInit *) {53 virtual void visit( ListInit * listInit ) { 63 54 curDepth++; 64 GuardAction( [this]() { curDepth--; } );65 55 if ( curDepth > maxDepth ) depthOkay = false; 56 Visitor::visit( listInit ); 57 curDepth--; 66 58 } 67 59 }; 68 60 69 struct InitFlattener : public WithShortCircuiting { 70 void previsit( SingleInit * singleInit ) { 71 visit_children = false; 72 argList.push_back( singleInit->value->clone() ); 73 } 61 class InitFlattener : public Visitor { 62 public: 63 virtual void visit( SingleInit * singleInit ); 64 virtual void visit( ListInit * listInit ); 74 65 std::list< Expression * > argList; 75 66 }; 76 67 68 void InitFlattener::visit( SingleInit * singleInit ) { 69 argList.push_back( singleInit->get_value()->clone() ); 70 } 71 72 void InitFlattener::visit( ListInit * listInit ) { 73 // flatten nested list inits 74 std::list<Initializer*>::iterator it = listInit->begin(); 75 for ( ; it != listInit->end(); ++it ) { 76 (*it)->accept( *this ); 77 } 78 } 77 79 } 78 80 79 81 std::list< Expression * > makeInitList( Initializer * init ) { 80 PassVisitor<InitFlattener>flattener;82 InitFlattener flattener; 81 83 maybeAccept( init, flattener ); 82 return flattener. pass.argList;84 return flattener.argList; 83 85 } 84 86 85 87 bool isDesignated( Initializer * init ) { 86 PassVisitor<HasDesignations>finder;88 HasDesignations finder; 87 89 maybeAccept( init, finder ); 88 return finder. pass.hasDesignations;90 return finder.hasDesignations; 89 91 } 90 92 91 93 bool checkInitDepth( ObjectDecl * objDecl ) { 92 PassVisitor<InitDepthChecker> checker( objDecl->type);93 maybeAccept( objDecl-> init, checker );94 return checker. pass.depthOkay;94 InitDepthChecker checker( objDecl->get_type() ); 95 maybeAccept( objDecl->get_init(), checker ); 96 return checker.depthOkay; 95 97 } 96 98 … … 193 195 callExpr->get_args().splice( callExpr->get_args().end(), args ); 194 196 195 *out++ = new IfStmt( cond, new ExprStmt(callExpr ), nullptr );197 *out++ = new IfStmt( noLabels, cond, new ExprStmt( noLabels, callExpr ), nullptr ); 196 198 197 199 UntypedExpr * increment = new UntypedExpr( new NameExpr( "++?" ) ); 198 200 increment->get_args().push_back( index->clone() ); 199 *out++ = new ExprStmt( increment );201 *out++ = new ExprStmt( noLabels, increment ); 200 202 } 201 203 … … 242 244 std::list< Statement * > stmts; 243 245 build( callExpr, idx, idxEnd, init, back_inserter( stmts ) ); 244 stmts.push_back( new BranchStmt( switchLabel, BranchStmt::Break ) );245 CaseStmt * caseStmt = new CaseStmt( condition, stmts );246 stmts.push_back( new BranchStmt( noLabels, switchLabel, BranchStmt::Break ) ); 247 CaseStmt * caseStmt = new CaseStmt( noLabels, condition, stmts ); 246 248 branches.push_back( caseStmt ); 247 249 } 248 *out++ = new SwitchStmt( index->clone(), branches );249 *out++ = new NullStmt( { switchLabel } );250 *out++ = new SwitchStmt( noLabels, index->clone(), branches ); 251 *out++ = new NullStmt( std::list<Label>{ switchLabel } ); 250 252 } 251 253 } … … 260 262 Statement * InitImpl::buildListInit( UntypedExpr * dst, std::list< Expression * > & indices ) { 261 263 if ( ! init ) return nullptr; 262 CompoundStmt * block = new CompoundStmt( );264 CompoundStmt * block = new CompoundStmt( noLabels ); 263 265 build( dst, indices.begin(), indices.end(), init, back_inserter( block->get_kids() ) ); 264 266 if ( block->get_kids().empty() ) { … … 307 309 } 308 310 309 struct CallFinder { 311 class CallFinder : public Visitor { 312 public: 313 typedef Visitor Parent; 310 314 CallFinder( const std::list< std::string > & names ) : names( names ) {} 311 315 312 v oid postvisit( ApplicationExpr * appExpr ) {316 virtual void visit( ApplicationExpr * appExpr ) { 313 317 handleCallExpr( appExpr ); 314 318 } 315 319 316 v oid postvisit( UntypedExpr * untypedExpr ) {320 virtual void visit( UntypedExpr * untypedExpr ) { 317 321 handleCallExpr( untypedExpr ); 318 322 } … … 324 328 template< typename CallExpr > 325 329 void handleCallExpr( CallExpr * expr ) { 330 Parent::visit( expr ); 326 331 std::string fname = getFunctionName( expr ); 327 332 if ( std::find( names.begin(), names.end(), fname ) != names.end() ) { … … 332 337 333 338 void collectCtorDtorCalls( Statement * stmt, std::list< Expression * > & matches ) { 334 static PassVisitor<CallFinder>finder( std::list< std::string >{ "?{}", "^?{}" } );335 finder. pass.matches = &matches;339 static CallFinder finder( std::list< std::string >{ "?{}", "^?{}" } ); 340 finder.matches = &matches; 336 341 maybeAccept( stmt, finder ); 337 342 } … … 539 544 } 540 545 541 struct ConstExprChecker : public WithShortCircuiting { 542 // most expressions are not const expr 543 void previsit( Expression * ) { isConstExpr = false; visit_children = false; } 544 545 void previsit( AddressExpr *addressExpr ) { 546 visit_children = false; 547 546 class ConstExprChecker : public Visitor { 547 public: 548 ConstExprChecker() : isConstExpr( true ) {} 549 550 using Visitor::visit; 551 552 virtual void visit( ApplicationExpr * ) { isConstExpr = false; } 553 virtual void visit( UntypedExpr * ) { isConstExpr = false; } 554 virtual void visit( NameExpr * ) { isConstExpr = false; } 555 // virtual void visit( CastExpr *castExpr ) { isConstExpr = false; } 556 virtual void visit( AddressExpr *addressExpr ) { 548 557 // address of a variable or member expression is constexpr 549 558 Expression * arg = addressExpr->get_arg(); 550 559 if ( ! dynamic_cast< NameExpr * >( arg) && ! dynamic_cast< VariableExpr * >( arg ) && ! dynamic_cast< MemberExpr * >( arg ) && ! dynamic_cast< UntypedMemberExpr * >( arg ) ) isConstExpr = false; 551 560 } 552 553 // these expressions may be const expr, depending on their children 554 void previsit( SizeofExpr * ) {} 555 void previsit( AlignofExpr * ) {} 556 void previsit( UntypedOffsetofExpr * ) {} 557 void previsit( OffsetofExpr * ) {} 558 void previsit( OffsetPackExpr * ) {} 559 void previsit( AttrExpr * ) {} 560 void previsit( CommaExpr * ) {} 561 void previsit( LogicalExpr * ) {} 562 void previsit( ConditionalExpr * ) {} 563 void previsit( CastExpr * ) {} 564 void previsit( ConstantExpr * ) {} 565 566 bool isConstExpr = true; 561 virtual void visit( UntypedMemberExpr * ) { isConstExpr = false; } 562 virtual void visit( MemberExpr * ) { isConstExpr = false; } 563 virtual void visit( VariableExpr * ) { isConstExpr = false; } 564 // these might be okay? 565 // virtual void visit( SizeofExpr *sizeofExpr ); 566 // virtual void visit( AlignofExpr *alignofExpr ); 567 // virtual void visit( UntypedOffsetofExpr *offsetofExpr ); 568 // virtual void visit( OffsetofExpr *offsetofExpr ); 569 // virtual void visit( OffsetPackExpr *offsetPackExpr ); 570 // virtual void visit( AttrExpr *attrExpr ); 571 // virtual void visit( CommaExpr *commaExpr ); 572 // virtual void visit( LogicalExpr *logicalExpr ); 573 // virtual void visit( ConditionalExpr *conditionalExpr ); 574 virtual void visit( TypeExpr * ) { isConstExpr = false; } 575 virtual void visit( AsmExpr * ) { isConstExpr = false; } 576 virtual void visit( UntypedValofExpr * ) { isConstExpr = false; } 577 virtual void visit( CompoundLiteralExpr * ) { isConstExpr = false; } 578 virtual void visit( UntypedTupleExpr * ) { isConstExpr = false; } 579 virtual void visit( TupleExpr * ) { isConstExpr = false; } 580 virtual void visit( TupleAssignExpr * ) { isConstExpr = false; } 581 582 bool isConstExpr; 567 583 }; 568 584 569 585 bool isConstExpr( Expression * expr ) { 570 586 if ( expr ) { 571 PassVisitor<ConstExprChecker>checker;587 ConstExprChecker checker; 572 588 expr->accept( checker ); 573 return checker. pass.isConstExpr;589 return checker.isConstExpr; 574 590 } 575 591 return true; … … 578 594 bool isConstExpr( Initializer * init ) { 579 595 if ( init ) { 580 PassVisitor<ConstExprChecker>checker;596 ConstExprChecker checker; 581 597 init->accept( checker ); 582 return checker. pass.isConstExpr;598 return checker.isConstExpr; 583 599 } // if 584 600 // for all intents and purposes, no initializer means const expr -
src/MakeLibCfa.cc
r5da9d6a r3d560060 116 116 } // for 117 117 118 funcDecl->set_statements( new CompoundStmt( ) );118 funcDecl->set_statements( new CompoundStmt( std::list< Label >() ) ); 119 119 newDecls.push_back( funcDecl ); 120 120 … … 130 130 case CodeGen::OT_INFIXASSIGN: 131 131 // return the recursive call 132 stmt = new ReturnStmt( n ewExpr );132 stmt = new ReturnStmt( noLabels, newExpr ); 133 133 break; 134 134 case CodeGen::OT_CTOR: 135 135 case CodeGen::OT_DTOR: 136 136 // execute the recursive call 137 stmt = new ExprStmt( n ewExpr );137 stmt = new ExprStmt( noLabels, newExpr ); 138 138 break; 139 139 case CodeGen::OT_CONSTANT: -
src/Makefile.in
r5da9d6a r3d560060 215 215 SymTab/driver_cfa_cpp-Validate.$(OBJEXT) \ 216 216 SymTab/driver_cfa_cpp-FixFunction.$(OBJEXT) \ 217 SymTab/driver_cfa_cpp-ImplementationType.$(OBJEXT) \ 218 SymTab/driver_cfa_cpp-TypeEquality.$(OBJEXT) \ 217 219 SymTab/driver_cfa_cpp-Autogen.$(OBJEXT) \ 218 220 SynTree/driver_cfa_cpp-Type.$(OBJEXT) \ … … 512 514 ResolvExpr/CurrentObject.cc ResolvExpr/ExplodedActual.cc \ 513 515 SymTab/Indexer.cc SymTab/Mangler.cc SymTab/Validate.cc \ 514 SymTab/FixFunction.cc SymTab/Autogen.cc SynTree/Type.cc \ 516 SymTab/FixFunction.cc SymTab/ImplementationType.cc \ 517 SymTab/TypeEquality.cc SymTab/Autogen.cc SynTree/Type.cc \ 515 518 SynTree/VoidType.cc SynTree/BasicType.cc \ 516 519 SynTree/PointerType.cc SynTree/ArrayType.cc \ … … 841 844 SymTab/driver_cfa_cpp-FixFunction.$(OBJEXT): SymTab/$(am__dirstamp) \ 842 845 SymTab/$(DEPDIR)/$(am__dirstamp) 846 SymTab/driver_cfa_cpp-ImplementationType.$(OBJEXT): \ 847 SymTab/$(am__dirstamp) SymTab/$(DEPDIR)/$(am__dirstamp) 848 SymTab/driver_cfa_cpp-TypeEquality.$(OBJEXT): SymTab/$(am__dirstamp) \ 849 SymTab/$(DEPDIR)/$(am__dirstamp) 843 850 SymTab/driver_cfa_cpp-Autogen.$(OBJEXT): SymTab/$(am__dirstamp) \ 844 851 SymTab/$(DEPDIR)/$(am__dirstamp) … … 1033 1040 @AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-Autogen.Po@am__quote@ 1034 1041 @AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-FixFunction.Po@am__quote@ 1042 @AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-ImplementationType.Po@am__quote@ 1035 1043 @AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-Indexer.Po@am__quote@ 1036 1044 @AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-Mangler.Po@am__quote@ 1045 @AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-TypeEquality.Po@am__quote@ 1037 1046 @AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-Validate.Po@am__quote@ 1038 1047 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-AddressExpr.Po@am__quote@ … … 2030 2039 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 2031 2040 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SymTab/driver_cfa_cpp-FixFunction.obj `if test -f 'SymTab/FixFunction.cc'; then $(CYGPATH_W) 'SymTab/FixFunction.cc'; else $(CYGPATH_W) '$(srcdir)/SymTab/FixFunction.cc'; fi` 2041 2042 SymTab/driver_cfa_cpp-ImplementationType.o: SymTab/ImplementationType.cc 2043 @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SymTab/driver_cfa_cpp-ImplementationType.o -MD -MP -MF SymTab/$(DEPDIR)/driver_cfa_cpp-ImplementationType.Tpo -c -o SymTab/driver_cfa_cpp-ImplementationType.o `test -f 'SymTab/ImplementationType.cc' || echo '$(srcdir)/'`SymTab/ImplementationType.cc 2044 @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) SymTab/$(DEPDIR)/driver_cfa_cpp-ImplementationType.Tpo SymTab/$(DEPDIR)/driver_cfa_cpp-ImplementationType.Po 2045 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SymTab/ImplementationType.cc' object='SymTab/driver_cfa_cpp-ImplementationType.o' libtool=no @AMDEPBACKSLASH@ 2046 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 2047 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SymTab/driver_cfa_cpp-ImplementationType.o `test -f 'SymTab/ImplementationType.cc' || echo '$(srcdir)/'`SymTab/ImplementationType.cc 2048 2049 SymTab/driver_cfa_cpp-ImplementationType.obj: SymTab/ImplementationType.cc 2050 @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SymTab/driver_cfa_cpp-ImplementationType.obj -MD -MP -MF SymTab/$(DEPDIR)/driver_cfa_cpp-ImplementationType.Tpo -c -o SymTab/driver_cfa_cpp-ImplementationType.obj `if test -f 'SymTab/ImplementationType.cc'; then $(CYGPATH_W) 'SymTab/ImplementationType.cc'; else $(CYGPATH_W) '$(srcdir)/SymTab/ImplementationType.cc'; fi` 2051 @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) SymTab/$(DEPDIR)/driver_cfa_cpp-ImplementationType.Tpo SymTab/$(DEPDIR)/driver_cfa_cpp-ImplementationType.Po 2052 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SymTab/ImplementationType.cc' object='SymTab/driver_cfa_cpp-ImplementationType.obj' libtool=no @AMDEPBACKSLASH@ 2053 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 2054 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SymTab/driver_cfa_cpp-ImplementationType.obj `if test -f 'SymTab/ImplementationType.cc'; then $(CYGPATH_W) 'SymTab/ImplementationType.cc'; else $(CYGPATH_W) '$(srcdir)/SymTab/ImplementationType.cc'; fi` 2055 2056 SymTab/driver_cfa_cpp-TypeEquality.o: SymTab/TypeEquality.cc 2057 @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SymTab/driver_cfa_cpp-TypeEquality.o -MD -MP -MF SymTab/$(DEPDIR)/driver_cfa_cpp-TypeEquality.Tpo -c -o SymTab/driver_cfa_cpp-TypeEquality.o `test -f 'SymTab/TypeEquality.cc' || echo '$(srcdir)/'`SymTab/TypeEquality.cc 2058 @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) SymTab/$(DEPDIR)/driver_cfa_cpp-TypeEquality.Tpo SymTab/$(DEPDIR)/driver_cfa_cpp-TypeEquality.Po 2059 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SymTab/TypeEquality.cc' object='SymTab/driver_cfa_cpp-TypeEquality.o' libtool=no @AMDEPBACKSLASH@ 2060 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 2061 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SymTab/driver_cfa_cpp-TypeEquality.o `test -f 'SymTab/TypeEquality.cc' || echo '$(srcdir)/'`SymTab/TypeEquality.cc 2062 2063 SymTab/driver_cfa_cpp-TypeEquality.obj: SymTab/TypeEquality.cc 2064 @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SymTab/driver_cfa_cpp-TypeEquality.obj -MD -MP -MF SymTab/$(DEPDIR)/driver_cfa_cpp-TypeEquality.Tpo -c -o SymTab/driver_cfa_cpp-TypeEquality.obj `if test -f 'SymTab/TypeEquality.cc'; then $(CYGPATH_W) 'SymTab/TypeEquality.cc'; else $(CYGPATH_W) '$(srcdir)/SymTab/TypeEquality.cc'; fi` 2065 @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) SymTab/$(DEPDIR)/driver_cfa_cpp-TypeEquality.Tpo SymTab/$(DEPDIR)/driver_cfa_cpp-TypeEquality.Po 2066 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='SymTab/TypeEquality.cc' object='SymTab/driver_cfa_cpp-TypeEquality.obj' libtool=no @AMDEPBACKSLASH@ 2067 @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ 2068 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SymTab/driver_cfa_cpp-TypeEquality.obj `if test -f 'SymTab/TypeEquality.cc'; then $(CYGPATH_W) 'SymTab/TypeEquality.cc'; else $(CYGPATH_W) '$(srcdir)/SymTab/TypeEquality.cc'; fi` 2032 2069 2033 2070 SymTab/driver_cfa_cpp-Autogen.o: SymTab/Autogen.cc -
src/Parser/StatementNode.cc
r5da9d6a r3d560060 37 37 DeclarationNode *agg = decl->extractAggregate(); 38 38 if ( agg ) { 39 StatementNode *nextStmt = new StatementNode( new DeclStmt( maybeBuild< Declaration >( decl ) ) );39 StatementNode *nextStmt = new StatementNode( new DeclStmt( noLabels, maybeBuild< Declaration >( decl ) ) ); 40 40 set_next( nextStmt ); 41 41 if ( decl->get_next() ) { … … 50 50 agg = decl; 51 51 } // if 52 stmt.reset( new DeclStmt( maybeMoveBuild< Declaration >(agg) ) );52 stmt.reset( new DeclStmt( noLabels, maybeMoveBuild< Declaration >(agg) ) ); 53 53 } // StatementNode::StatementNode 54 54 … … 75 75 76 76 if ( e ) 77 return new ExprStmt( e );77 return new ExprStmt( noLabels, e ); 78 78 else 79 return new NullStmt( );79 return new NullStmt( noLabels ); 80 80 } 81 81 … … 113 113 } 114 114 delete ctl; 115 return new IfStmt( cond, thenb, elseb, init );115 return new IfStmt( noLabels, cond, thenb, elseb, init ); 116 116 } 117 117 … … 120 120 buildMoveList< Statement, StatementNode >( stmt, branches ); 121 121 // branches.size() == 0 for switch (...) {}, i.e., no declaration or statements 122 return new SwitchStmt( maybeMoveBuild< Expression >(ctl), branches );122 return new SwitchStmt( noLabels, maybeMoveBuild< Expression >(ctl), branches ); 123 123 } 124 124 Statement *build_case( ExpressionNode *ctl ) { 125 125 std::list< Statement * > branches; 126 return new CaseStmt( maybeMoveBuild< Expression >(ctl), branches );126 return new CaseStmt( noLabels, maybeMoveBuild< Expression >(ctl), branches ); 127 127 } 128 128 Statement *build_default() { 129 129 std::list< Statement * > branches; 130 return new CaseStmt( n ullptr, branches, true );130 return new CaseStmt( noLabels, nullptr, branches, true ); 131 131 } 132 132 … … 135 135 buildMoveList< Statement, StatementNode >( stmt, branches ); 136 136 assert( branches.size() == 1 ); 137 return new WhileStmt( no tZeroExpr( maybeMoveBuild< Expression >(ctl) ), branches.front(), kind );137 return new WhileStmt( noLabels, notZeroExpr( maybeMoveBuild< Expression >(ctl) ), branches.front(), kind ); 138 138 } 139 139 … … 157 157 158 158 delete forctl; 159 return new ForStmt( init, cond, incr, branches.front() );159 return new ForStmt( noLabels, init, cond, incr, branches.front() ); 160 160 } 161 161 162 162 Statement *build_branch( BranchStmt::Type kind ) { 163 Statement * ret = new BranchStmt( "", kind );163 Statement * ret = new BranchStmt( noLabels, "", kind ); 164 164 return ret; 165 165 } 166 166 Statement *build_branch( std::string *identifier, BranchStmt::Type kind ) { 167 Statement * ret = new BranchStmt( *identifier, kind );167 Statement * ret = new BranchStmt( noLabels, *identifier, kind ); 168 168 delete identifier; // allocated by lexer 169 169 return ret; 170 170 } 171 171 Statement *build_computedgoto( ExpressionNode *ctl ) { 172 return new BranchStmt( maybeMoveBuild< Expression >(ctl), BranchStmt::Goto );172 return new BranchStmt( noLabels, maybeMoveBuild< Expression >(ctl), BranchStmt::Goto ); 173 173 } 174 174 … … 176 176 std::list< Expression * > exps; 177 177 buildMoveList( ctl, exps ); 178 return new ReturnStmt( exps.size() > 0 ? exps.back() : nullptr );178 return new ReturnStmt( noLabels, exps.size() > 0 ? exps.back() : nullptr ); 179 179 } 180 180 … … 183 183 buildMoveList( ctl, exps ); 184 184 assertf( exps.size() < 2, "This means we are leaking memory"); 185 return new ThrowStmt( ThrowStmt::Terminate, !exps.empty() ? exps.back() : nullptr );185 return new ThrowStmt( noLabels, ThrowStmt::Terminate, !exps.empty() ? exps.back() : nullptr ); 186 186 } 187 187 … … 190 190 buildMoveList( ctl, exps ); 191 191 assertf( exps.size() < 2, "This means we are leaking memory"); 192 return new ThrowStmt( ThrowStmt::Resume, !exps.empty() ? exps.back() : nullptr );192 return new ThrowStmt( noLabels, ThrowStmt::Resume, !exps.empty() ? exps.back() : nullptr ); 193 193 } 194 194 … … 204 204 CompoundStmt *tryBlock = strict_dynamic_cast< CompoundStmt * >(maybeMoveBuild< Statement >(try_stmt)); 205 205 FinallyStmt *finallyBlock = dynamic_cast< FinallyStmt * >(maybeMoveBuild< Statement >(finally_stmt) ); 206 return new TryStmt( tryBlock, branches, finallyBlock );206 return new TryStmt( noLabels, tryBlock, branches, finallyBlock ); 207 207 } 208 208 Statement *build_catch( CatchStmt::Kind kind, DeclarationNode *decl, ExpressionNode *cond, StatementNode *body ) { … … 210 210 buildMoveList< Statement, StatementNode >( body, branches ); 211 211 assert( branches.size() == 1 ); 212 return new CatchStmt( kind, maybeMoveBuild< Declaration >(decl), maybeMoveBuild< Expression >(cond), branches.front() );212 return new CatchStmt( noLabels, kind, maybeMoveBuild< Declaration >(decl), maybeMoveBuild< Expression >(cond), branches.front() ); 213 213 } 214 214 Statement *build_finally( StatementNode *stmt ) { … … 216 216 buildMoveList< Statement, StatementNode >( stmt, branches ); 217 217 assert( branches.size() == 1 ); 218 return new FinallyStmt( dynamic_cast< CompoundStmt * >( branches.front() ) );218 return new FinallyStmt( noLabels, dynamic_cast< CompoundStmt * >( branches.front() ) ); 219 219 } 220 220 … … 289 289 290 290 Statement *build_compound( StatementNode *first ) { 291 CompoundStmt *cs = new CompoundStmt( );291 CompoundStmt *cs = new CompoundStmt( noLabels ); 292 292 buildMoveList( first, cs->get_kids() ); 293 293 return cs; … … 301 301 buildMoveList( input, in ); 302 302 buildMoveList( clobber, clob ); 303 return new AsmStmt( voltile, instruction, out, in, clob, gotolabels ? gotolabels->labels : noLabels );303 return new AsmStmt( noLabels, voltile, instruction, out, in, clob, gotolabels ? gotolabels->labels : noLabels ); 304 304 } 305 305 -
src/SymTab/AddVisit.h
r5da9d6a r3d560060 24 24 // add any new declarations after the previous statement 25 25 for ( std::list< Declaration* >::iterator decl = visitor.declsToAddAfter.begin(); decl != visitor.declsToAddAfter.end(); ++decl ) { 26 DeclStmt *declStmt = new DeclStmt( *decl );26 DeclStmt *declStmt = new DeclStmt( noLabels, *decl ); 27 27 stmts.insert( stmt, declStmt ); 28 28 } … … 36 36 // add any new declarations before the statement 37 37 for ( std::list< Declaration* >::iterator decl = visitor.declsToAdd.begin(); decl != visitor.declsToAdd.end(); ++decl ) { 38 DeclStmt *declStmt = new DeclStmt( *decl );38 DeclStmt *declStmt = new DeclStmt( noLabels, *decl ); 39 39 stmts.insert( stmt, declStmt ); 40 40 } -
src/SymTab/Autogen.cc
r5da9d6a r3d560060 264 264 Type::StorageClasses scs = functionNesting > 0 ? Type::StorageClasses() : Type::StorageClasses( Type::Static ); 265 265 LinkageSpec::Spec spec = isIntrinsic ? LinkageSpec::Intrinsic : LinkageSpec::AutoGen; 266 FunctionDecl * decl = new FunctionDecl( fname, scs, spec, ftype, new CompoundStmt( ),266 FunctionDecl * decl = new FunctionDecl( fname, scs, spec, ftype, new CompoundStmt( noLabels ), 267 267 std::list< Attribute * >(), Type::FuncSpecifiers( Type::Inline ) ); 268 268 decl->fixUniqueId(); … … 299 299 assert( assignType->returnVals.size() == 1 ); 300 300 ObjectDecl * dstParam = strict_dynamic_cast< ObjectDecl * >( assignType->parameters.front() ); 301 dcl->statements->push_back( new ReturnStmt( n ew VariableExpr( dstParam ) ) );301 dcl->statements->push_back( new ReturnStmt( noLabels, new VariableExpr( dstParam ) ) ); 302 302 } 303 303 resolve( dcl ); … … 468 468 copy->args.push_back( new AddressExpr( new VariableExpr( srcParam ) ) ); 469 469 copy->args.push_back( new SizeofExpr( srcParam->get_type()->clone() ) ); 470 *out++ = new ExprStmt( copy );470 *out++ = new ExprStmt( noLabels, copy ); 471 471 } 472 472 … … 544 544 callExpr->get_args().push_back( new VariableExpr( dstParam ) ); 545 545 callExpr->get_args().push_back( new VariableExpr( srcParam ) ); 546 funcDecl->statements->push_back( new ExprStmt( callExpr ) );546 funcDecl->statements->push_back( new ExprStmt( noLabels, callExpr ) ); 547 547 } else { 548 548 // default ctor/dtor body is empty - add unused attribute to parameter to silence warnings … … 569 569 expr->args.push_back( new CastExpr( new VariableExpr( dst ), new ReferenceType( Type::Qualifiers(), typeDecl->base->clone() ) ) ); 570 570 if ( src ) expr->args.push_back( new CastExpr( new VariableExpr( src ), typeDecl->base->clone() ) ); 571 dcl->statements->kids.push_back( new ExprStmt( expr ) );571 dcl->statements->kids.push_back( new ExprStmt( noLabels, expr ) ); 572 572 }; 573 573 … … 664 664 untyped->get_args().push_back( new VariableExpr( ftype->get_parameters().back() ) ); 665 665 } 666 function->get_statements()->get_kids().push_back( new ExprStmt( untyped ) );667 function->get_statements()->get_kids().push_back( new ReturnStmt( UntypedExpr::createDeref( new VariableExpr( ftype->get_parameters().front() ) ) ) );666 function->get_statements()->get_kids().push_back( new ExprStmt( noLabels, untyped ) ); 667 function->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, UntypedExpr::createDeref( new VariableExpr( ftype->get_parameters().front() ) ) ) ); 668 668 } 669 669 -
src/SymTab/Autogen.h
r5da9d6a r3d560060 104 104 fExpr->args.splice( fExpr->args.end(), args ); 105 105 106 *out++ = new ExprStmt( fExpr );106 *out++ = new ExprStmt( noLabels, fExpr ); 107 107 108 108 srcParam.clearArrayIndices(); … … 162 162 163 163 // for stmt's body, eventually containing call 164 CompoundStmt * body = new CompoundStmt( );164 CompoundStmt * body = new CompoundStmt( noLabels ); 165 165 Statement * listInit = genCall( srcParam, dstParam, fname, back_inserter( body->kids ), array->base, addCast, forward ); 166 166 167 167 // block containing for stmt and index variable 168 168 std::list<Statement *> initList; 169 CompoundStmt * block = new CompoundStmt( );170 block->push_back( new DeclStmt( index ) );169 CompoundStmt * block = new CompoundStmt( noLabels ); 170 block->push_back( new DeclStmt( noLabels, index ) ); 171 171 if ( listInit ) block->get_kids().push_back( listInit ); 172 block->push_back( new ForStmt( initList, cond, inc, body ) );172 block->push_back( new ForStmt( noLabels, initList, cond, inc, body ) ); 173 173 174 174 *out++ = block; -
src/SymTab/Validate.cc
r5da9d6a r3d560060 81 81 82 82 namespace SymTab { 83 struct HoistStruct final : public WithDeclsToAdd, public WithGuards { 83 class HoistStruct final : public Visitor { 84 template< typename Visitor > 85 friend void acceptAndAdd( std::list< Declaration * > &translationUnit, Visitor &visitor ); 86 template< typename Visitor > 87 friend void addVisitStatementList( std::list< Statement* > &stmts, Visitor &visitor ); 88 public: 84 89 /// Flattens nested struct types 85 90 static void hoistStruct( std::list< Declaration * > &translationUnit ); 86 91 87 void previsit( EnumInstType * enumInstType ); 88 void previsit( StructInstType * structInstType ); 89 void previsit( UnionInstType * unionInstType ); 90 void previsit( StructDecl * aggregateDecl ); 91 void previsit( UnionDecl * aggregateDecl ); 92 92 std::list< Declaration * > &get_declsToAdd() { return declsToAdd; } 93 94 virtual void visit( EnumInstType *enumInstType ); 95 virtual void visit( StructInstType *structInstType ); 96 virtual void visit( UnionInstType *unionInstType ); 97 virtual void visit( StructDecl *aggregateDecl ); 98 virtual void visit( UnionDecl *aggregateDecl ); 99 100 virtual void visit( CompoundStmt *compoundStmt ); 101 virtual void visit( SwitchStmt *switchStmt ); 93 102 private: 103 HoistStruct(); 104 94 105 template< typename AggDecl > void handleAggregate( AggDecl *aggregateDecl ); 95 106 96 bool inStruct = false; 107 std::list< Declaration * > declsToAdd, declsToAddAfter; 108 bool inStruct; 97 109 }; 98 110 … … 293 305 294 306 void HoistStruct::hoistStruct( std::list< Declaration * > &translationUnit ) { 295 PassVisitor<HoistStruct> hoister; 296 acceptAll( translationUnit, hoister ); 307 HoistStruct hoister; 308 acceptAndAdd( translationUnit, hoister ); 309 } 310 311 HoistStruct::HoistStruct() : inStruct( false ) { 297 312 } 298 313 … … 305 320 if ( inStruct ) { 306 321 // Add elements in stack order corresponding to nesting structure. 307 declsToAddBefore.push_front( aggregateDecl ); 322 declsToAdd.push_front( aggregateDecl ); 323 Visitor::visit( aggregateDecl ); 308 324 } else { 309 GuardValue( inStruct );310 325 inStruct = true; 326 Visitor::visit( aggregateDecl ); 327 inStruct = false; 311 328 } // if 312 329 // Always remove the hoisted aggregate from the inner structure. 313 GuardAction( [this, aggregateDecl]() { filter( aggregateDecl->members, isStructOrUnion, false ); });314 } 315 316 void HoistStruct:: previsit( EnumInstType * inst) {317 if ( inst->baseEnum) {318 declsToAdd Before.push_front( inst->baseEnum);319 } 320 } 321 322 void HoistStruct:: previsit( StructInstType * inst) {323 if ( inst->baseStruct) {324 declsToAdd Before.push_front( inst->baseStruct);325 } 326 } 327 328 void HoistStruct:: previsit( UnionInstType * inst) {329 if ( inst->baseUnion) {330 declsToAdd Before.push_front( inst->baseUnion);331 } 332 } 333 334 void HoistStruct:: previsit( StructDecl *aggregateDecl ) {330 filter( aggregateDecl->get_members(), isStructOrUnion, false ); 331 } 332 333 void HoistStruct::visit( EnumInstType *structInstType ) { 334 if ( structInstType->get_baseEnum() ) { 335 declsToAdd.push_front( structInstType->get_baseEnum() ); 336 } 337 } 338 339 void HoistStruct::visit( StructInstType *structInstType ) { 340 if ( structInstType->get_baseStruct() ) { 341 declsToAdd.push_front( structInstType->get_baseStruct() ); 342 } 343 } 344 345 void HoistStruct::visit( UnionInstType *structInstType ) { 346 if ( structInstType->get_baseUnion() ) { 347 declsToAdd.push_front( structInstType->get_baseUnion() ); 348 } 349 } 350 351 void HoistStruct::visit( StructDecl *aggregateDecl ) { 335 352 handleAggregate( aggregateDecl ); 336 353 } 337 354 338 void HoistStruct:: previsit( UnionDecl *aggregateDecl ) {355 void HoistStruct::visit( UnionDecl *aggregateDecl ) { 339 356 handleAggregate( aggregateDecl ); 357 } 358 359 void HoistStruct::visit( CompoundStmt *compoundStmt ) { 360 addVisit( compoundStmt, *this ); 361 } 362 363 void HoistStruct::visit( SwitchStmt *switchStmt ) { 364 addVisit( switchStmt, *this ); 340 365 } 341 366 -
src/SymTab/module.mk
r5da9d6a r3d560060 19 19 SymTab/Validate.cc \ 20 20 SymTab/FixFunction.cc \ 21 SymTab/ImplementationType.cc \ 22 SymTab/TypeEquality.cc \ 21 23 SymTab/Autogen.cc -
src/SynTree/CompoundStmt.cc
r5da9d6a r3d560060 28 28 using std::endl; 29 29 30 CompoundStmt::CompoundStmt( ) : Statement() {30 CompoundStmt::CompoundStmt( std::list<Label> labels ) : Statement( labels ) { 31 31 } 32 32 33 CompoundStmt::CompoundStmt( std::list<Statement *> stmts ) : Statement( ), kids( stmts ) {33 CompoundStmt::CompoundStmt( std::list<Statement *> stmts ) : Statement( noLabels ), kids( stmts ) { 34 34 } 35 35 -
src/SynTree/DeclStmt.cc
r5da9d6a r3d560060 23 23 #include "SynTree/Label.h" // for Label 24 24 25 DeclStmt::DeclStmt( Declaration *decl ) : Statement(), decl( decl ) {25 DeclStmt::DeclStmt( std::list<Label> labels, Declaration *decl ) : Statement( labels ), decl( decl ) { 26 26 } 27 27 -
src/SynTree/Statement.cc
r5da9d6a r3d560060 32 32 using std::endl; 33 33 34 Statement::Statement( const std::list<Label> &labels ) : labels( labels ) {}34 Statement::Statement( std::list<Label> labels ) : labels( labels ) {} 35 35 36 36 void Statement::print( std::ostream & os, Indenter ) const { … … 46 46 Statement::~Statement() {} 47 47 48 ExprStmt::ExprStmt( Expression *expr ) : Statement(), expr( expr ) {}48 ExprStmt::ExprStmt( std::list<Label> labels, Expression *expr ) : Statement( labels ), expr( expr ) {} 49 49 50 50 ExprStmt::ExprStmt( const ExprStmt &other ) : Statement( other ), expr( maybeClone( other.expr ) ) {} … … 60 60 61 61 62 AsmStmt::AsmStmt( bool voltile, Expression *instruction, std::list<Expression *> output, std::list<Expression *> input, std::list<ConstantExpr *> clobber, std::list<Label> gotolabels ) : Statement(), voltile( voltile ), instruction( instruction ), output( output ), input( input ), clobber( clobber ), gotolabels( gotolabels ) {}62 AsmStmt::AsmStmt( std::list<Label> labels, bool voltile, Expression *instruction, std::list<Expression *> output, std::list<Expression *> input, std::list<ConstantExpr *> clobber, std::list<Label> gotolabels ) : Statement( labels ), voltile( voltile ), instruction( instruction ), output( output ), input( input ), clobber( clobber ), gotolabels( gotolabels ) {} 63 63 64 64 AsmStmt::AsmStmt( const AsmStmt & other ) : Statement( other ), voltile( other.voltile ), instruction( maybeClone( other.instruction ) ), gotolabels( other.gotolabels ) { … … 96 96 const char *BranchStmt::brType[] = { "Goto", "Break", "Continue" }; 97 97 98 BranchStmt::BranchStmt( Label target, Type type ) throw ( SemanticError ) :99 Statement( ), originalTarget( target ), target( target ), computedTarget( nullptr ), type( type ) {98 BranchStmt::BranchStmt( std::list<Label> labels, Label target, Type type ) throw ( SemanticError ) : 99 Statement( labels ), originalTarget( target ), target( target ), computedTarget( nullptr ), type( type ) { 100 100 //actually this is a syntactic error signaled by the parser 101 101 if ( type == BranchStmt::Goto && target.empty() ) { … … 104 104 } 105 105 106 BranchStmt::BranchStmt( Expression *computedTarget, Type type ) throw ( SemanticError ) :107 Statement( ), computedTarget( computedTarget ), type( type ) {106 BranchStmt::BranchStmt( std::list<Label> labels, Expression *computedTarget, Type type ) throw ( SemanticError ) : 107 Statement( labels ), computedTarget( computedTarget ), type( type ) { 108 108 if ( type != BranchStmt::Goto || computedTarget == nullptr ) { 109 109 throw SemanticError("Computed target not valid in branch statement"); … … 118 118 } 119 119 120 ReturnStmt::ReturnStmt( Expression *expr ) : Statement(), expr( expr ) {}120 ReturnStmt::ReturnStmt( std::list<Label> labels, Expression *expr ) : Statement( labels ), expr( expr ) {} 121 121 122 122 ReturnStmt::ReturnStmt( const ReturnStmt & other ) : Statement( other ), expr( maybeClone( other.expr ) ) {} … … 135 135 } 136 136 137 IfStmt::IfStmt( Expression *condition, Statement *thenPart, Statement *elsePart, std::list<Statement *> initialization ):138 Statement( ), condition( condition ), thenPart( thenPart ), elsePart( elsePart ), initialization( initialization ) {}137 IfStmt::IfStmt( std::list<Label> labels, Expression *condition, Statement *thenPart, Statement *elsePart, std::list<Statement *> initialization ): 138 Statement( labels ), condition( condition ), thenPart( thenPart ), elsePart( elsePart ), initialization( initialization ) {} 139 139 140 140 IfStmt::IfStmt( const IfStmt & other ) : … … 176 176 } 177 177 178 SwitchStmt::SwitchStmt( Expression * condition, const std::list<Statement *> &statements ):179 Statement( ), condition( condition ), statements( statements ) {178 SwitchStmt::SwitchStmt( std::list<Label> labels, Expression * condition, const std::list<Statement *> &statements ): 179 Statement( labels ), condition( condition ), statements( statements ) { 180 180 } 181 181 … … 201 201 } 202 202 203 CaseStmt::CaseStmt( Expression *condition, const std::list<Statement *> &statements, bool deflt ) throw ( SemanticError ) :204 Statement( ), condition( condition ), stmts( statements ), _isDefault( deflt ) {203 CaseStmt::CaseStmt( std::list<Label> labels, Expression *condition, const std::list<Statement *> &statements, bool deflt ) throw ( SemanticError ) : 204 Statement( labels ), condition( condition ), stmts( statements ), _isDefault( deflt ) { 205 205 if ( isDefault() && condition != 0 ) throw SemanticError("default case with condition: ", condition); 206 206 } … … 216 216 } 217 217 218 CaseStmt * CaseStmt::makeDefault( const std::list<Label> & labels, std::list<Statement *> stmts ) { 219 CaseStmt * stmt = new CaseStmt( nullptr, stmts, true ); 220 stmt->labels = labels; 221 return stmt; 218 CaseStmt * CaseStmt::makeDefault( std::list<Label> labels, std::list<Statement *> stmts ) { 219 return new CaseStmt( labels, 0, stmts, true ); 222 220 } 223 221 … … 235 233 } 236 234 237 WhileStmt::WhileStmt( Expression *condition, Statement *body, bool isDoWhile ):238 Statement( ), condition( condition), body( body), isDoWhile( isDoWhile) {235 WhileStmt::WhileStmt( std::list<Label> labels, Expression *condition, Statement *body, bool isDoWhile ): 236 Statement( labels ), condition( condition), body( body), isDoWhile( isDoWhile) { 239 237 } 240 238 … … 257 255 } 258 256 259 ForStmt::ForStmt( std::list< Statement *> initialization, Expression *condition, Expression *increment, Statement *body ):260 Statement( ), initialization( initialization ), condition( condition ), increment( increment ), body( body ) {257 ForStmt::ForStmt( std::list<Label> labels, std::list<Statement *> initialization, Expression *condition, Expression *increment, Statement *body ): 258 Statement( labels ), initialization( initialization ), condition( condition ), increment( increment ), body( body ) { 261 259 } 262 260 … … 304 302 } 305 303 306 ThrowStmt::ThrowStmt( Kind kind, Expression * expr, Expression * target ) :307 Statement( ), kind(kind), expr(expr), target(target) {304 ThrowStmt::ThrowStmt( std::list<Label> labels, Kind kind, Expression * expr, Expression * target ) : 305 Statement( labels ), kind(kind), expr(expr), target(target) { 308 306 assertf(Resume == kind || nullptr == target, "Non-local termination throw is not accepted." ); 309 307 } … … 328 326 } 329 327 330 TryStmt::TryStmt( CompoundStmt *tryBlock, std::list<CatchStmt *> &handlers, FinallyStmt *finallyBlock ) :331 Statement( ), block( tryBlock ), handlers( handlers ), finallyBlock( finallyBlock ) {328 TryStmt::TryStmt( std::list<Label> labels, CompoundStmt *tryBlock, std::list<CatchStmt *> &handlers, FinallyStmt *finallyBlock ) : 329 Statement( labels ), block( tryBlock ), handlers( handlers ), finallyBlock( finallyBlock ) { 332 330 } 333 331 … … 361 359 } 362 360 363 CatchStmt::CatchStmt( Kind kind, Declaration *decl, Expression *cond, Statement *body ) :364 Statement( ), kind ( kind ), decl ( decl ), cond ( cond ), body( body ) {361 CatchStmt::CatchStmt( std::list<Label> labels, Kind kind, Declaration *decl, Expression *cond, Statement *body ) : 362 Statement( labels ), kind ( kind ), decl ( decl ), cond ( cond ), body( body ) { 365 363 assertf( decl, "Catch clause must have a declaration." ); 366 364 } … … 393 391 394 392 395 FinallyStmt::FinallyStmt( CompoundStmt *block ) : Statement(), block( block ) { 393 FinallyStmt::FinallyStmt( std::list<Label> labels, CompoundStmt *block ) : Statement( labels ), block( block ) { 394 assert( labels.empty() ); // finally statement cannot be labeled 396 395 } 397 396 … … 409 408 } 410 409 411 WaitForStmt::WaitForStmt( ) : Statement() {410 WaitForStmt::WaitForStmt( std::list<Label> labels ) : Statement( labels ) { 412 411 timeout.time = nullptr; 413 412 timeout.statement = nullptr; … … 456 455 } 457 456 458 NullStmt::NullStmt( const std::list<Label> & labels ) : Statement( labels ) {459 }457 NullStmt::NullStmt( std::list<Label> labels ) : Statement( labels ) {} 458 NullStmt::NullStmt() : Statement( std::list<Label>() ) {} 460 459 461 460 void NullStmt::print( std::ostream &os, Indenter ) const { … … 463 462 } 464 463 465 ImplicitCtorDtorStmt::ImplicitCtorDtorStmt( Statement * callStmt ) : Statement( ), callStmt( callStmt ) {464 ImplicitCtorDtorStmt::ImplicitCtorDtorStmt( Statement * callStmt ) : Statement( std::list<Label>() ), callStmt( callStmt ) { 466 465 assert( callStmt ); 467 466 } -
src/SynTree/Statement.h
r5da9d6a r3d560060 37 37 std::list<Label> labels; 38 38 39 Statement( const std::list<Label> & labels = {});39 Statement( std::list<Label> labels ); 40 40 virtual ~Statement(); 41 41 … … 53 53 std::list<Statement*> kids; 54 54 55 CompoundStmt( );55 CompoundStmt( std::list<Label> labels ); 56 56 CompoundStmt( std::list<Statement *> stmts ); 57 57 CompoundStmt( const CompoundStmt &other ); … … 70 70 class NullStmt : public Statement { 71 71 public: 72 NullStmt( const std::list<Label> & labels = {} ); 72 NullStmt(); 73 NullStmt( std::list<Label> labels ); 73 74 74 75 virtual NullStmt *clone() const override { return new NullStmt( *this ); } … … 82 83 Expression *expr; 83 84 84 ExprStmt( Expression *expr );85 ExprStmt( std::list<Label> labels, Expression *expr ); 85 86 ExprStmt( const ExprStmt &other ); 86 87 virtual ~ExprStmt(); … … 103 104 std::list<Label> gotolabels; 104 105 105 AsmStmt( bool voltile, Expression *instruction, std::list<Expression *> output, std::list<Expression *> input, std::list<ConstantExpr *> clobber, std::list<Label> gotolabels );106 AsmStmt( std::list<Label> labels, bool voltile, Expression *instruction, std::list<Expression *> output, std::list<Expression *> input, std::list<ConstantExpr *> clobber, std::list<Label> gotolabels ); 106 107 AsmStmt( const AsmStmt &other ); 107 108 virtual ~AsmStmt(); … … 133 134 std::list<Statement *> initialization; 134 135 135 IfStmt( Expression *condition, Statement *thenPart, Statement *elsePart,136 IfStmt( std::list<Label> labels, Expression *condition, Statement *thenPart, Statement *elsePart, 136 137 std::list<Statement *> initialization = std::list<Statement *>() ); 137 138 IfStmt( const IfStmt &other ); … … 157 158 std::list<Statement *> statements; 158 159 159 SwitchStmt( Expression *condition, const std::list<Statement *> &statements );160 SwitchStmt( std::list<Label> labels, Expression *condition, const std::list<Statement *> &statements ); 160 161 SwitchStmt( const SwitchStmt &other ); 161 162 virtual ~SwitchStmt(); … … 179 180 std::list<Statement *> stmts; 180 181 181 CaseStmt( Expression *conditions, const std::list<Statement *> &stmts, bool isdef = false ) throw(SemanticError);182 CaseStmt( std::list<Label> labels, Expression *conditions, const std::list<Statement *> &stmts, bool isdef = false ) throw(SemanticError); 182 183 CaseStmt( const CaseStmt &other ); 183 184 virtual ~CaseStmt(); 184 185 185 static CaseStmt * makeDefault( const std::list<Label> & labels = {}, std::list<Statement *> stmts = std::list<Statement *>() );186 static CaseStmt * makeDefault( std::list<Label> labels = std::list<Label>(), std::list<Statement *> stmts = std::list<Statement *>() ); 186 187 187 188 bool isDefault() const { return _isDefault; } … … 209 210 bool isDoWhile; 210 211 211 WhileStmt( Expression *condition,212 WhileStmt( std::list<Label> labels, Expression *condition, 212 213 Statement *body, bool isDoWhile = false ); 213 214 WhileStmt( const WhileStmt &other ); … … 234 235 Statement *body; 235 236 236 ForStmt( std::list< Statement *> initialization,237 ForStmt( std::list<Label> labels, std::list<Statement *> initialization, 237 238 Expression *condition = 0, Expression *increment = 0, Statement *body = 0 ); 238 239 ForStmt( const ForStmt &other ); … … 263 264 Type type; 264 265 265 BranchStmt( Label target, Type ) throw (SemanticError);266 BranchStmt( Expression *computedTarget, Type ) throw (SemanticError);266 BranchStmt( std::list<Label> labels, Label target, Type ) throw (SemanticError); 267 BranchStmt( std::list<Label> labels, Expression *computedTarget, Type ) throw (SemanticError); 267 268 268 269 Label get_originalTarget() { return originalTarget; } … … 288 289 Expression *expr; 289 290 290 ReturnStmt( Expression *expr );291 ReturnStmt( std::list<Label> labels, Expression *expr ); 291 292 ReturnStmt( const ReturnStmt &other ); 292 293 virtual ~ReturnStmt(); … … 309 310 Expression * target; 310 311 311 ThrowStmt( Kind kind, Expression * expr, Expression * target = nullptr );312 ThrowStmt( std::list<Label> labels, Kind kind, Expression * expr, Expression * target = nullptr ); 312 313 ThrowStmt( const ThrowStmt &other ); 313 314 virtual ~ThrowStmt(); … … 331 332 FinallyStmt * finallyBlock; 332 333 333 TryStmt( CompoundStmt *tryBlock, std::list<CatchStmt *> &handlers, FinallyStmt *finallyBlock = 0 );334 TryStmt( std::list<Label> labels, CompoundStmt *tryBlock, std::list<CatchStmt *> &handlers, FinallyStmt *finallyBlock = 0 ); 334 335 TryStmt( const TryStmt &other ); 335 336 virtual ~TryStmt(); … … 357 358 Statement *body; 358 359 359 CatchStmt( Kind kind, Declaration *decl,360 CatchStmt( std::list<Label> labels, Kind kind, Declaration *decl, 360 361 Expression *cond, Statement *body ); 361 362 CatchStmt( const CatchStmt &other ); … … 380 381 CompoundStmt *block; 381 382 382 FinallyStmt( CompoundStmt *block );383 FinallyStmt( std::list<Label> labels, CompoundStmt *block ); 383 384 FinallyStmt( const FinallyStmt &other ); 384 385 virtual ~FinallyStmt(); … … 407 408 }; 408 409 409 WaitForStmt( );410 WaitForStmt( std::list<Label> labels = noLabels ); 410 411 WaitForStmt( const WaitForStmt & ); 411 412 virtual ~WaitForStmt(); … … 437 438 Declaration *decl; 438 439 439 DeclStmt( Declaration *decl );440 DeclStmt( std::list<Label> labels, Declaration *decl ); 440 441 DeclStmt( const DeclStmt &other ); 441 442 virtual ~DeclStmt(); -
src/SynTree/TupleExpr.cc
r5da9d6a r3d560060 23 23 #include "Declaration.h" // for ObjectDecl 24 24 #include "Expression.h" // for Expression, TupleExpr, TupleIndexExpr 25 #include "SynTree/Label.h" // for Label 25 #include "SynTree/Label.h" // for Label, noLabels 26 26 #include "SynTree/Statement.h" // for CompoundStmt, DeclStmt, ExprStmt, Sta... 27 27 #include "Tuples/Tuples.h" // for makeTupleType … … 89 89 // convert internally into a StmtExpr which contains the declarations and produces the tuple of the assignments 90 90 set_result( Tuples::makeTupleType( assigns ) ); 91 CompoundStmt * compoundStmt = new CompoundStmt( );91 CompoundStmt * compoundStmt = new CompoundStmt( noLabels ); 92 92 std::list< Statement * > & stmts = compoundStmt->get_kids(); 93 93 for ( ObjectDecl * obj : tempDecls ) { 94 stmts.push_back( new DeclStmt( obj ) );94 stmts.push_back( new DeclStmt( noLabels, obj ) ); 95 95 } 96 96 TupleExpr * tupleExpr = new TupleExpr( assigns ); 97 97 assert( tupleExpr->get_result() ); 98 stmts.push_back( new ExprStmt( tupleExpr ) );98 stmts.push_back( new ExprStmt( noLabels, tupleExpr ) ); 99 99 stmtExpr = new StmtExpr( compoundStmt ); 100 100 } -
src/Tuples/TupleAssignment.cc
r5da9d6a r3d560060 23 23 24 24 #include "CodeGen/OperatorTable.h" 25 #include "Common/PassVisitor.h"26 25 #include "Common/UniqueName.h" // for UniqueName 27 26 #include "Common/utility.h" // for zipWith … … 62 61 struct Matcher { 63 62 public: 64 Matcher( TupleAssignSpotter &spotter, const ResolvExpr::AltList& lhs, const 63 Matcher( TupleAssignSpotter &spotter, const ResolvExpr::AltList& lhs, const 65 64 ResolvExpr::AltList& rhs ); 66 65 virtual ~Matcher() {} … … 76 75 struct MassAssignMatcher : public Matcher { 77 76 public: 78 MassAssignMatcher( TupleAssignSpotter &spotter, const ResolvExpr::AltList& lhs, 77 MassAssignMatcher( TupleAssignSpotter &spotter, const ResolvExpr::AltList& lhs, 79 78 const ResolvExpr::AltList& rhs ) : Matcher(spotter, lhs, rhs) {} 80 79 virtual void match( std::list< Expression * > &out ); … … 83 82 struct MultipleAssignMatcher : public Matcher { 84 83 public: 85 MultipleAssignMatcher( TupleAssignSpotter &spotter, const ResolvExpr::AltList& lhs, 84 MultipleAssignMatcher( TupleAssignSpotter &spotter, const ResolvExpr::AltList& lhs, 86 85 const ResolvExpr::AltList& rhs ) : Matcher(spotter, lhs, rhs) {} 87 86 virtual void match( std::list< Expression * > &out ); … … 120 119 } 121 120 122 void handleTupleAssignment( ResolvExpr::AlternativeFinder & currentFinder, UntypedExpr * expr, 121 void handleTupleAssignment( ResolvExpr::AlternativeFinder & currentFinder, UntypedExpr * expr, 123 122 std::vector<ResolvExpr::AlternativeFinder> &args ) { 124 123 TupleAssignSpotter spotter( currentFinder ); … … 129 128 : currentFinder(f) {} 130 129 131 void TupleAssignSpotter::spot( UntypedExpr * expr, 130 void TupleAssignSpotter::spot( UntypedExpr * expr, 132 131 std::vector<ResolvExpr::AlternativeFinder> &args ) { 133 132 if ( NameExpr *op = dynamic_cast< NameExpr * >(expr->get_function()) ) { … … 138 137 if ( args.size() == 0 ) return; 139 138 140 // if an assignment only takes 1 argument, that's odd, but maybe someone wrote 139 // if an assignment only takes 1 argument, that's odd, but maybe someone wrote 141 140 // the function, in which case AlternativeFinder will handle it normally 142 141 if ( args.size() == 1 && CodeGen::isAssignment( fname ) ) return; … … 147 146 if ( ! refToTuple(lhsAlt.expr) ) continue; 148 147 149 // explode is aware of casts - ensure every LHS expression is sent into explode 148 // explode is aware of casts - ensure every LHS expression is sent into explode 150 149 // with a reference cast 151 // xxx - this seems to change the alternatives before the normal 150 // xxx - this seems to change the alternatives before the normal 152 151 // AlternativeFinder flow; maybe this is desired? 153 152 if ( ! dynamic_cast<CastExpr*>( lhsAlt.expr ) ) { 154 lhsAlt.expr = new CastExpr( lhsAlt.expr, 155 new ReferenceType( Type::Qualifiers(), 153 lhsAlt.expr = new CastExpr( lhsAlt.expr, 154 new ReferenceType( Type::Qualifiers(), 156 155 lhsAlt.expr->get_result()->clone() ) ); 157 156 } … … 161 160 explode( lhsAlt, currentFinder.get_indexer(), back_inserter(lhs), true ); 162 161 for ( ResolvExpr::Alternative& alt : lhs ) { 163 // each LHS value must be a reference - some come in with a cast expression, 162 // each LHS value must be a reference - some come in with a cast expression, 164 163 // if not just cast to reference here 165 164 if ( ! dynamic_cast<ReferenceType*>( alt.expr->get_result() ) ) { 166 alt.expr = new CastExpr( alt.expr, 167 new ReferenceType( Type::Qualifiers(), 165 alt.expr = new CastExpr( alt.expr, 166 new ReferenceType( Type::Qualifiers(), 168 167 alt.expr->get_result()->clone() ) ); 169 168 } … … 179 178 // TODO build iterative version of this instead of using combos 180 179 std::vector< ResolvExpr::AltList > rhsAlts; 181 combos( std::next(args.begin(), 1), args.end(), 180 combos( std::next(args.begin(), 1), args.end(), 182 181 std::back_inserter( rhsAlts ) ); 183 182 for ( const ResolvExpr::AltList& rhsAlt : rhsAlts ) { 184 183 // multiple assignment 185 184 ResolvExpr::AltList rhs; 186 explode( rhsAlt, currentFinder.get_indexer(), 185 explode( rhsAlt, currentFinder.get_indexer(), 187 186 std::back_inserter(rhs), true ); 188 187 matcher.reset( new MultipleAssignMatcher( *this, lhs, rhs ) ); … … 194 193 if ( isTuple(rhsAlt.expr) ) { 195 194 // multiple assignment 196 explode( rhsAlt, currentFinder.get_indexer(), 195 explode( rhsAlt, currentFinder.get_indexer(), 197 196 std::back_inserter(rhs), true ); 198 197 matcher.reset( new MultipleAssignMatcher( *this, lhs, rhs ) ); … … 223 222 ResolvExpr::AltList current; 224 223 // now resolve new assignments 225 for ( std::list< Expression * >::iterator i = new_assigns.begin(); 224 for ( std::list< Expression * >::iterator i = new_assigns.begin(); 226 225 i != new_assigns.end(); ++i ) { 227 226 PRINT( … … 230 229 ) 231 230 232 ResolvExpr::AlternativeFinder finder{ currentFinder.get_indexer(), 231 ResolvExpr::AlternativeFinder finder{ currentFinder.get_indexer(), 233 232 currentFinder.get_environ() }; 234 233 try { … … 254 253 // xxx -- was push_front 255 254 currentFinder.get_alternatives().push_back( ResolvExpr::Alternative( 256 new TupleAssignExpr(solved_assigns, matcher->tmpDecls), matcher->compositeEnv, 255 new TupleAssignExpr(solved_assigns, matcher->tmpDecls), matcher->compositeEnv, 257 256 ResolvExpr::sumCost( current ) + matcher->baseCost ) ); 258 257 } 259 258 260 TupleAssignSpotter::Matcher::Matcher( TupleAssignSpotter &spotter, 261 const ResolvExpr::AltList &lhs, const ResolvExpr::AltList &rhs ) 262 : lhs(lhs), rhs(rhs), spotter(spotter), 259 TupleAssignSpotter::Matcher::Matcher( TupleAssignSpotter &spotter, 260 const ResolvExpr::AltList &lhs, const ResolvExpr::AltList &rhs ) 261 : lhs(lhs), rhs(rhs), spotter(spotter), 263 262 baseCost( ResolvExpr::sumCost( lhs ) + ResolvExpr::sumCost( rhs ) ) { 264 263 simpleCombineEnvironments( lhs.begin(), lhs.end(), compositeEnv ); … … 278 277 // xxx - maybe this should happen in alternative finder for every StmtExpr? 279 278 // xxx - it's possible that these environments could contain some useful information. Maybe the right thing to do is aggregate the environments and pass the aggregate back to be added into the compositeEnv 280 struct EnvRemover { 281 void previsit( ExprStmt * stmt ) { 282 delete stmt->expr->env; 283 stmt->expr->env = nullptr; 279 struct EnvRemover : public Visitor { 280 virtual void visit( ExprStmt * stmt ) { 281 delete stmt->get_expr()->get_env(); 282 stmt->get_expr()->set_env( nullptr ); 283 Visitor::visit( stmt ); 284 284 } 285 285 }; … … 293 293 ret->set_init( ctorInit ); 294 294 ResolvExpr::resolveCtorInit( ctorInit, spotter.currentFinder.get_indexer() ); // resolve ctor/dtors for the new object 295 PassVisitor<EnvRemover>rm; // remove environments from subexpressions of StmtExprs295 EnvRemover rm; // remove environments from subexpressions of StmtExprs 296 296 ctorInit->accept( rm ); 297 297 } -
src/Tuples/TupleExpansion.cc
r5da9d6a r3d560060 315 315 namespace { 316 316 /// determines if impurity (read: side-effects) may exist in a piece of code. Currently gives a very crude approximation, wherein any function call expression means the code may be impure 317 struct ImpurityDetector : public WithShortCircuiting { 317 class ImpurityDetector : public Visitor { 318 public: 318 319 ImpurityDetector( bool ignoreUnique ) : ignoreUnique( ignoreUnique ) {} 319 320 320 void previsit( ApplicationExpr * appExpr ) {321 visit_children = false;321 typedef Visitor Parent; 322 virtual void visit( ApplicationExpr * appExpr ) { 322 323 if ( DeclarationWithType * function = InitTweak::getFunction( appExpr ) ) { 323 324 if ( function->get_linkage() == LinkageSpec::Intrinsic ) { 324 325 if ( function->get_name() == "*?" || function->get_name() == "?[?]" ) { 325 326 // intrinsic dereference, subscript are pure, but need to recursively look for impurity 326 visit_children = true;327 Parent::visit( appExpr ); 327 328 return; 328 329 } … … 331 332 maybeImpure = true; 332 333 } 333 v oid previsit( UntypedExpr * ) { maybeImpure = true; visit_children = false; }334 v oid previsit( UniqueExpr *) {334 virtual void visit( UntypedExpr * ) { maybeImpure = true; } 335 virtual void visit( UniqueExpr * unq ) { 335 336 if ( ignoreUnique ) { 336 337 // bottom out at unique expression. 337 338 // The existence of a unique expression doesn't change the purity of an expression. 338 339 // That is, even if the wrapped expression is impure, the wrapper protects the rest of the expression. 339 visit_children = false;340 340 return; 341 341 } 342 maybeAccept( unq->expr, *this ); 342 343 } 343 344 … … 348 349 349 350 bool maybeImpure( Expression * expr ) { 350 PassVisitor<ImpurityDetector>detector( false );351 ImpurityDetector detector( false ); 351 352 expr->accept( detector ); 352 return detector. pass.maybeImpure;353 return detector.maybeImpure; 353 354 } 354 355 355 356 bool maybeImpureIgnoreUnique( Expression * expr ) { 356 PassVisitor<ImpurityDetector>detector( true );357 ImpurityDetector detector( true ); 357 358 expr->accept( detector ); 358 return detector. pass.maybeImpure;359 return detector.maybeImpure; 359 360 } 360 361 } // namespace Tuples -
src/tests/except-mac.h
r5da9d6a r3d560060 30 30 size_t size; \ 31 31 void (*copy)(except_name *this, except_name * other); \ 32 void (*free)(except_name &this); \32 void (*free)(except_name *this); \ 33 33 const char * (*msg)(except_name *this); \ 34 34 __VA_ARGS__ \ … … 42 42 // In each constructor the vtable must be initialized. 43 43 #define VTABLE_INIT(this_name,except_name) \ 44 this_name .virtual_table = &INSTANCE(except_name)44 this_name->virtual_table = &INSTANCE(except_name) 45 45 46 46 // Declare the vtable instance. This should end an exception declaration. … … 73 73 this->virtual_table = other->virtual_table; \ 74 74 } \ 75 void ?{}(name &this) { \75 void ?{}(name * this) { \ 76 76 VTABLE_INIT(this,name); \ 77 77 } \
Note:
See TracChangeset
for help on using the changeset viewer.