Changes in src/main.cc [3c0d4cd:ebcc940]
- File:
-
- 1 edited
-
src/main.cc (modified) (16 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/main.cc
r3c0d4cd rebcc940 65 65 using namespace std; 66 66 67 68 void NewPass(const char * const name) { 69 Stats::Heap::newPass(name); 70 using namespace Stats::Counters; 71 static auto pass_visitor_group = build<CounterGroup>("Pass Visitor"); 72 auto pass = build<CounterGroup>(name, pass_visitor_group); 73 pass_visitor_stats.depth = 0; 74 pass_visitor_stats.avg = build<AverageCounter<double>>("Average Depth", pass); 75 pass_visitor_stats.max = build<MaxCounter<double>>("Max Depth", pass); 76 } 77 78 #define PASS(name, pass) \ 67 #define PASS(name, pass) \ 79 68 if ( errorp ) { cerr << name << endl; } \ 80 NewPass(name); \ 81 Stats::Time::StartBlock(name); \ 82 pass; \ 83 Stats::Time::StopBlock(); 69 Stats::Heap::newPass(name); \ 70 pass; 84 71 85 72 LinkageSpec::Spec linkage = LinkageSpec::Cforall; … … 155 142 backtrace( 6 ); // skip first 6 stack frames 156 143 signal( SIGABRT, SIG_DFL); // reset default signal handler 157 raise( SIGABRT ); // reraise SIGABRT144 raise( SIGABRT ); // reraise SIGABRT 158 145 } // sigAbortHandler 159 146 … … 194 181 } // if 195 182 196 Stats::Time::StartGlobal();197 NewPass("Parse");198 Stats::Time::StartBlock("Parse");199 200 183 // read in the builtins, extras, and the prelude 201 184 if ( ! nopreludep ) { // include gcc builtins … … 248 231 // works okay for now. 249 232 CodeTools::fillLocations( translationUnit ); 250 Stats::Time::StopBlock();251 233 252 234 // add the assignment statement after the initialization of a type parameter 253 PASS( " Validate", SymTab::validate( translationUnit, symtabp ) );235 PASS( "validate", SymTab::validate( translationUnit, symtabp ) ); 254 236 if ( symtabp ) { 255 237 deleteAll( translationUnit ); … … 268 250 } // if 269 251 270 PASS( " FixLabels", ControlStruct::fixLabels( translationUnit ) );271 PASS( " FixNames", CodeGen::fixNames( translationUnit ) );272 PASS( " GenInit", InitTweak::genInit( translationUnit ) );273 PASS( " Expand MemberTuples" , Tuples::expandMemberTuples( translationUnit ) );252 PASS( "fixLabels", ControlStruct::fixLabels( translationUnit ) ); 253 PASS( "fixNames", CodeGen::fixNames( translationUnit ) ); 254 PASS( "genInit", InitTweak::genInit( translationUnit ) ); 255 PASS( "expandMemberTuples" , Tuples::expandMemberTuples( translationUnit ) ); 274 256 if ( libcfap ) { 275 257 // generate the bodies of cfa library functions … … 295 277 } 296 278 297 PASS( " Resolve", ResolvExpr::resolve( translationUnit ) );279 PASS( "resolve", ResolvExpr::resolve( translationUnit ) ); 298 280 if ( exprp ) { 299 281 dump( translationUnit ); … … 302 284 303 285 // fix ObjectDecl - replaces ConstructorInit nodes 304 PASS( " FixInit", InitTweak::fix( translationUnit, buildingLibrary() ) );286 PASS( "fixInit", InitTweak::fix( translationUnit, buildingLibrary() ) ); 305 287 if ( ctorinitp ) { 306 288 dump ( translationUnit ); … … 308 290 } // if 309 291 310 PASS( " Expand UniqueExpr", Tuples::expandUniqueExpr( translationUnit ) ); // xxx - is this the right place for this? want to expand ASAP so tha, sequent passes don't need to worry about double-visiting a unique expr - needs to go after InitTweak::fix so that copy constructed return declarations are reused311 312 PASS( " TranslateEHM" , ControlStruct::translateEHM( translationUnit ) );313 314 PASS( " GenWaitfor" , Concurrency::generateWaitFor( translationUnit ) );315 316 PASS( " ConvertSpecializations", GenPoly::convertSpecializations( translationUnit ) ); // needs to happen before tuple types are expanded317 318 PASS( " ExpandTuples", Tuples::expandTuples( translationUnit ) ); // xxx - is this the right place for this?292 PASS( "expandUniqueExpr", Tuples::expandUniqueExpr( translationUnit ) ); // xxx - is this the right place for this? want to expand ASAP so tha, sequent passes don't need to worry about double-visiting a unique expr - needs to go after InitTweak::fix so that copy constructed return declarations are reused 293 294 PASS( "translateEHM" , ControlStruct::translateEHM( translationUnit ) ); 295 296 PASS( "generateWaitfor" , Concurrency::generateWaitFor( translationUnit ) ); 297 298 PASS( "convertSpecializations", GenPoly::convertSpecializations( translationUnit ) ); // needs to happen before tuple types are expanded 299 300 PASS( "expandTuples", Tuples::expandTuples( translationUnit ) ); // xxx - is this the right place for this? 319 301 320 302 if ( tuplep ) { … … 323 305 } 324 306 325 PASS( " Virtual ExpandCasts", Virtual::expandCasts( translationUnit ) ); // Must come after translateEHM326 327 PASS( " InstantiateGenerics", GenPoly::instantiateGeneric( translationUnit ) );307 PASS( "virtual expandCasts", Virtual::expandCasts( translationUnit ) ); // Must come after translateEHM 308 309 PASS( "instantiateGenerics", GenPoly::instantiateGeneric( translationUnit ) ); 328 310 if ( genericsp ) { 329 311 dump( translationUnit ); 330 312 return 0; 331 313 } 332 PASS( " Convert L-Value", GenPoly::convertLvalue( translationUnit ) );314 PASS( "convertLvalue", GenPoly::convertLvalue( translationUnit ) ); 333 315 334 316 … … 337 319 return 0; 338 320 } // if 339 PASS( " Box", GenPoly::box( translationUnit ) );321 PASS( "box", GenPoly::box( translationUnit ) ); 340 322 341 323 if ( bcodegenp ) { … … 349 331 350 332 CodeTools::fillLocations( translationUnit ); 351 PASS( " Code Gen", CodeGen::generate( translationUnit, *output, ! noprotop, prettycodegenp, true, linemarks ) );333 PASS( "codegen", CodeGen::generate( translationUnit, *output, ! noprotop, prettycodegenp, true, linemarks ) ); 352 334 353 335 CodeGen::FixMain::fix( *output, (PreludeDirector + "/bootloader.c").c_str() ); … … 395 377 396 378 deleteAll( translationUnit ); 397 Stats::print(); 379 if(!libcfap && !treep) { 380 if(stats_counters) Stats::Counters::print(); 381 if(stats_heap) Stats::Heap::print(); 382 } 398 383 399 384 return 0; … … 436 421 while ( (c = getopt_long( argc, argv, "abBcCdefgGlLmnNpqrRstTvwW:yzZD:F:", long_opts, &long_index )) != -1 ) { 437 422 switch ( c ) { 438 case Ast:439 case 'a': // dump AST423 case Ast: 424 case 'a': // dump AST 440 425 astp = true; 441 426 break; 442 case Bresolver:443 case 'b': // print before resolver steps427 case Bresolver: 428 case 'b': // print before resolver steps 444 429 bresolvep = true; 445 430 break; 446 case 'B': // print before box steps431 case 'B': // print before box steps 447 432 bboxp = true; 448 433 break; 449 case CtorInitFix:450 case 'c': // print after constructors and destructors are replaced434 case CtorInitFix: 435 case 'c': // print after constructors and destructors are replaced 451 436 ctorinitp = true; 452 437 break; 453 case 'C': // print before code generation438 case 'C': // print before code generation 454 439 bcodegenp = true; 455 440 break; 456 case DeclStats:457 case 'd':458 declstatsp = true;459 break; 460 case Expr:461 case 'e': // dump AST after expression analysis441 case DeclStats: 442 case 'd': 443 declstatsp = true; 444 break; 445 case Expr: 446 case 'e': // dump AST after expression analysis 462 447 exprp = true; 463 448 break; 464 case ExprAlt:465 case 'f': // print alternatives for expressions449 case ExprAlt: 450 case 'f': // print alternatives for expressions 466 451 expraltp = true; 467 452 break; 468 case Grammar:469 case 'g': // bison debugging info (grammar rules)453 case Grammar: 454 case 'g': // bison debugging info (grammar rules) 470 455 yydebug = true; 471 456 break; 472 case 'G': // dump AST after instantiate generics457 case 'G': // dump AST after instantiate generics 473 458 genericsp = true; 474 459 break; 475 case LibCFA:476 case 'l': // generate libcfa.c460 case LibCFA: 461 case 'l': // generate libcfa.c 477 462 libcfap = true; 478 463 break; 479 case Linemarks:480 case 'L': // print lines marks464 case Linemarks: 465 case 'L': // print lines marks 481 466 linemarks = true; 482 467 break; 483 case Nopreamble:484 case 'n': // do not read preamble468 case Nopreamble: 469 case 'n': // do not read preamble 485 470 nopreludep = true; 486 471 break; 487 case Nolinemarks:488 case 'N': // suppress line marks472 case Nolinemarks: 473 case 'N': // suppress line marks 489 474 linemarks = false; 490 475 break; 491 case Prototypes:492 case 'p': // generate prototypes for preamble functions476 case Prototypes: 477 case 'p': // generate prototypes for preamble functions 493 478 noprotop = true; 494 479 break; 495 case PreludeDir:496 PreludeDirector = optarg;497 break; 498 case 'm': // don't replace the main499 nomainp = true;500 break; 501 case Parse:502 case 'q': // dump parse tree480 case PreludeDir: 481 PreludeDirector = optarg; 482 break; 483 case 'm': // don't replace the main 484 nomainp = true; 485 break; 486 case Parse: 487 case 'q': // dump parse tree 503 488 parsep = true; 504 489 break; 505 case Resolver:506 case 'r': // print resolver steps490 case Resolver: 491 case 'r': // print resolver steps 507 492 resolvep = true; 508 493 break; 509 case 'R': // dump resolv-proto instance494 case 'R': // dump resolv-proto instance 510 495 resolvprotop = true; 511 496 break; 512 case Stats: 513 Stats::parse_params(optarg); 514 break; 515 case Symbol: 516 case 's': // print symbol table events 497 case Stats: 498 { 499 std::stringstream ss(optarg); 500 while(ss.good()) { 501 std::string substr; 502 getline( ss, substr, ',' ); 503 if(substr == "counters") { 504 stats_counters = true; 505 } else if(substr == "heap") { 506 stats_heap = true; 507 } else if(substr == "none") { 508 stats_counters = false; 509 stats_heap = false; 510 } else { 511 std::cerr << "Ignoring unknown statistic " << substr << std::endl; 512 } 513 } 514 515 } 516 break; 517 case Symbol: 518 case 's': // print symbol table events 517 519 symtabp = true; 518 520 break; 519 case Tree:520 case 't': // build in tree521 case Tree: 522 case 't': // build in tree 521 523 treep = true; 522 524 break; 523 case TupleExpansion:524 case 'T': // print after tuple expansion525 case TupleExpansion: 526 case 'T': // print after tuple expansion 525 527 tuplep = true; 526 528 break; 527 case 'v': // dump AST after decl validation pass529 case 'v': // dump AST after decl validation pass 528 530 validp = true; 529 531 break; 530 case 'w':532 case 'w': 531 533 Wsuppress = true; 532 534 break; 533 case 'W':535 case 'W': 534 536 if ( strcmp( optarg, "all" ) == 0 ) { 535 537 SemanticWarning_EnableAll(); … … 548 550 } // if 549 551 break; 550 case 'y': // dump AST on error552 case 'y': // dump AST on error 551 553 errorp = true; 552 554 break; 553 case 'z': // dump as codegen rather than AST555 case 'z': // dump as codegen rather than AST 554 556 codegenp = true; 555 557 break; … … 557 559 prettycodegenp = true; 558 560 break; 559 case 'D': // ignore -Dxxx560 break; 561 case 'F': // source file-name without suffix561 case 'D': // ignore -Dxxx 562 break; 563 case 'F': // source file-name without suffix 562 564 filename = optarg; 563 565 break; 564 case '?':566 case '?': 565 567 if ( optopt ) { // short option ? 566 568 assertf( false, "Unknown option: -%c\n", (char)optopt ); … … 571 573 __attribute__((fallthrough)); 572 574 #endif 573 default:575 default: 574 576 abort(); 575 577 } // switch
Note:
See TracChangeset
for help on using the changeset viewer.