Changes in src/CodeGen/CodeGenerator.cc [16ba4a6f:07de76b]
- File:
-
- 1 edited
-
src/CodeGen/CodeGenerator.cc (modified) (25 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
r16ba4a6f r07de76b 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Feb 16 08:32:48 202013 // Update Count : 5 3212 // Last Modified On : Fri Dec 13 23:13:28 2019 13 // Update Count : 508 14 14 // 15 15 #include "CodeGenerator.h" … … 39 39 int CodeGenerator::tabsize = 4; 40 40 41 // The kinds of statements that would ideally be followed by whitespace.41 // the kinds of statements that would ideally be followed by whitespace 42 42 bool wantSpacing( Statement * stmt) { 43 43 return dynamic_cast< IfStmt * >( stmt ) || dynamic_cast< CompoundStmt * >( stmt ) || … … 78 78 } 79 79 80 // Using updateLocation at the beginning of a node and endl within a node should become the method of formating. 80 /* Using updateLocation at the beginning of a node and endl 81 * within a node should become the method of formating. 82 */ 81 83 void CodeGenerator::updateLocation( CodeLocation const & to ) { 82 84 // skip if linemarks shouldn't appear or if codelocation is unset … … 93 95 } else { 94 96 output << "\n# " << to.first_line << " \"" << to.filename 95 << "\"\n" << indent;97 << "\"\n" << indent; 96 98 currentLocation = to; 97 99 } … … 120 122 // GCC builtins should always be printed unmangled 121 123 if ( options.pretty || decl->linkage.is_gcc_builtin ) return decl->name; 122 if ( LinkageSpec::isMangled(decl->linkage) &&decl->mangleName != "" ) {124 if ( decl->mangleName != "" ) { 123 125 // need to incorporate scope level in order to differentiate names for destructors 124 126 return decl->get_scopedMangleName(); … … 129 131 130 132 void CodeGenerator::genAttributes( list< Attribute * > & attributes ) { 131 if ( attributes.empty() ) return;133 if ( attributes.empty() ) return; 132 134 output << "__attribute__ (("; 133 135 for ( list< Attribute * >::iterator attr( attributes.begin() );; ) { … … 138 140 output << ")"; 139 141 } // if 140 if ( ++attr == attributes.end() ) break;142 if ( ++attr == attributes.end() ) break; 141 143 output << ","; // separator 142 144 } // for … … 163 165 previsit( (BaseSyntaxNode *)node ); 164 166 GuardAction( [this, node](){ 165 if ( options.printExprTypes && node->result ) {166 output << " /* " << genType( node->result, "", options ) << " */ ";167 }168 } );167 if ( options.printExprTypes && node->result ) { 168 output << " /* " << genType( node->result, "", options ) << " */ "; 169 } 170 } ); 169 171 } 170 172 … … 397 399 extension( applicationExpr ); 398 400 if ( VariableExpr * varExpr = dynamic_cast< VariableExpr* >( applicationExpr->get_function() ) ) { 399 const OperatorInfo *opInfo;400 if ( varExpr->get_var()->get_linkage() == LinkageSpec::Intrinsic && ( opInfo = operatorLookup( varExpr->get_var()->get_name() )) ) {401 OperatorInfo opInfo; 402 if ( varExpr->get_var()->get_linkage() == LinkageSpec::Intrinsic && operatorLookup( varExpr->get_var()->get_name(), opInfo ) ) { 401 403 std::list< Expression* >::iterator arg = applicationExpr->get_args().begin(); 402 switch ( opInfo ->type ) {404 switch ( opInfo.type ) { 403 405 case OT_INDEX: 404 406 assert( applicationExpr->get_args().size() == 2 ); … … 421 423 output << "("; 422 424 (*arg++)->accept( *visitor ); 423 output << ") /* " << opInfo ->inputName << " */";425 output << ") /* " << opInfo.inputName << " */"; 424 426 } else if ( applicationExpr->get_args().size() == 2 ) { 425 427 // intrinsic two parameter constructors are essentially bitwise assignment 426 428 output << "("; 427 429 (*arg++)->accept( *visitor ); 428 output << opInfo ->symbol;430 output << opInfo.symbol; 429 431 (*arg)->accept( *visitor ); 430 output << ") /* " << opInfo ->inputName << " */";432 output << ") /* " << opInfo.inputName << " */"; 431 433 } else { 432 434 // no constructors with 0 or more than 2 parameters … … 439 441 assert( applicationExpr->get_args().size() == 1 ); 440 442 output << "("; 441 output << opInfo ->symbol;443 output << opInfo.symbol; 442 444 (*arg)->accept( *visitor ); 443 445 output << ")"; … … 448 450 assert( applicationExpr->get_args().size() == 1 ); 449 451 (*arg)->accept( *visitor ); 450 output << opInfo ->symbol;452 output << opInfo.symbol; 451 453 break; 452 454 … … 457 459 output << "("; 458 460 (*arg++)->accept( *visitor ); 459 output << opInfo ->symbol;461 output << opInfo.symbol; 460 462 (*arg)->accept( *visitor ); 461 463 output << ")"; … … 484 486 extension( untypedExpr ); 485 487 if ( NameExpr * nameExpr = dynamic_cast< NameExpr* >( untypedExpr->function ) ) { 486 const OperatorInfo * opInfo = operatorLookup( nameExpr->name );487 if ( op Info) {488 OperatorInfo opInfo; 489 if ( operatorLookup( nameExpr->name, opInfo ) ) { 488 490 std::list< Expression* >::iterator arg = untypedExpr->args.begin(); 489 switch ( opInfo ->type ) {491 switch ( opInfo.type ) { 490 492 case OT_INDEX: 491 493 assert( untypedExpr->args.size() == 2 ); … … 506 508 output << "("; 507 509 (*arg++)->accept( *visitor ); 508 output << ") /* " << opInfo ->inputName << " */";510 output << ") /* " << opInfo.inputName << " */"; 509 511 } else if ( untypedExpr->get_args().size() == 2 ) { 510 512 // intrinsic two parameter constructors are essentially bitwise assignment 511 513 output << "("; 512 514 (*arg++)->accept( *visitor ); 513 output << opInfo ->symbol;515 output << opInfo.symbol; 514 516 (*arg)->accept( *visitor ); 515 output << ") /* " << opInfo ->inputName << " */";517 output << ") /* " << opInfo.inputName << " */"; 516 518 } else { 517 519 // no constructors with 0 or more than 2 parameters … … 519 521 output << "("; 520 522 (*arg++)->accept( *visitor ); 521 output << opInfo ->symbol << "{ ";523 output << opInfo.symbol << "{ "; 522 524 genCommaList( arg, untypedExpr->args.end() ); 523 output << "}) /* " << opInfo ->inputName << " */";525 output << "}) /* " << opInfo.inputName << " */"; 524 526 } // if 525 527 break; … … 530 532 assert( untypedExpr->args.size() == 1 ); 531 533 output << "("; 532 output << opInfo ->symbol;534 output << opInfo.symbol; 533 535 (*arg)->accept( *visitor ); 534 536 output << ")"; … … 539 541 assert( untypedExpr->args.size() == 1 ); 540 542 (*arg)->accept( *visitor ); 541 output << opInfo ->symbol;543 output << opInfo.symbol; 542 544 break; 543 545 … … 547 549 output << "("; 548 550 (*arg++)->accept( *visitor ); 549 output << opInfo ->symbol;551 output << opInfo.symbol; 550 552 (*arg)->accept( *visitor ); 551 553 output << ")"; … … 579 581 void CodeGenerator::postvisit( NameExpr * nameExpr ) { 580 582 extension( nameExpr ); 581 const OperatorInfo * opInfo = operatorLookup( nameExpr->name );582 if ( op Info) {583 if ( opInfo ->type == OT_CONSTANT ) {584 output << opInfo ->symbol;583 OperatorInfo opInfo; 584 if ( operatorLookup( nameExpr->name, opInfo ) ) { 585 if ( opInfo.type == OT_CONSTANT ) { 586 output << opInfo.symbol; 585 587 } else { 586 output << opInfo ->outputName;588 output << opInfo.outputName; 587 589 } 588 590 } else { … … 652 654 void CodeGenerator::postvisit( VariableExpr * variableExpr ) { 653 655 extension( variableExpr ); 654 const OperatorInfo *opInfo;655 if ( variableExpr->get_var()->get_linkage() == LinkageSpec::Intrinsic && (opInfo = operatorLookup( variableExpr->get_var()->get_name() )) && opInfo->type == OT_CONSTANT ) {656 output << opInfo ->symbol;656 OperatorInfo opInfo; 657 if ( variableExpr->get_var()->get_linkage() == LinkageSpec::Intrinsic && operatorLookup( variableExpr->get_var()->get_name(), opInfo ) && opInfo.type == OT_CONSTANT ) { 658 output << opInfo.symbol; 657 659 } else { 658 660 output << mangleName( variableExpr->get_var() ); … … 1009 1011 case BranchStmt::FallThroughDefault: 1010 1012 assertf( ! options.genC, "fallthru should not reach code generation." ); 1011 output << "fallthru";1013 output << "fallthru"; 1012 1014 break; 1013 1015 } // switch … … 1033 1035 1034 1036 output << ((throwStmt->get_kind() == ThrowStmt::Terminate) ? 1035 "throw" : "throwResume");1037 "throw" : "throwResume"); 1036 1038 if (throwStmt->get_expr()) { 1037 1039 output << " "; … … 1048 1050 1049 1051 output << ((stmt->get_kind() == CatchStmt::Terminate) ? 1050 "catch" : "catchResume");1052 "catch" : "catchResume"); 1051 1053 output << "( "; 1052 1054 stmt->decl->accept( *visitor ); … … 1185 1187 1186 1188 std::string genName( DeclarationWithType * decl ) { 1187 const OperatorInfo * opInfo = operatorLookup( decl->get_name() );1188 if ( op Info) {1189 return opInfo ->outputName;1189 CodeGen::OperatorInfo opInfo; 1190 if ( operatorLookup( decl->get_name(), opInfo ) ) { 1191 return opInfo.outputName; 1190 1192 } else { 1191 1193 return decl->get_name();
Note:
See TracChangeset
for help on using the changeset viewer.