Changes in src/CodeGen/CodeGenerator.cc [e45215c:7f5566b]
- File:
-
- 1 edited
-
src/CodeGen/CodeGenerator.cc (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
re45215c r7f5566b 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Wed Jul 15 14:47:42201513 // Update Count : 17711 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Jul 27 14:40:06 2015 13 // Update Count : 218 14 14 // 15 15 … … 52 52 } 53 53 54 CodeGenerator::CodeGenerator( std::ostream &os ) : indent( *this), cur_indent( 0 ), insideFunction( false ), output( os ) { }54 CodeGenerator::CodeGenerator( std::ostream &os ) : indent( *this), cur_indent( 0 ), insideFunction( false ), output( os ) { } 55 55 56 56 CodeGenerator::CodeGenerator( std::ostream &os, std::string init, int indentation, bool infunp ) 57 : indent( *this), cur_indent( indentation ), insideFunction( infunp ), output( os ) {57 : indent( *this), cur_indent( indentation ), insideFunction( infunp ), output( os ) { 58 58 //output << std::string( init ); 59 59 } 60 60 61 61 CodeGenerator::CodeGenerator( std::ostream &os, char *init, int indentation, bool infunp ) 62 : indent( *this), cur_indent( indentation ), insideFunction( infunp ), output( os ) {62 : indent( *this ), cur_indent( indentation ), insideFunction( infunp ), output( os ) { 63 63 //output << std::string( init ); 64 64 } … … 91 91 // acceptAll( functionDecl->get_oldDecls(), *this ); 92 92 if ( functionDecl->get_statements() ) { 93 functionDecl->get_statements()->accept( *this );93 functionDecl->get_statements()->accept( *this ); 94 94 } // if 95 95 } … … 121 121 for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end(); i++) { 122 122 output << indent; 123 (*i)->accept( *this );123 (*i)->accept( *this ); 124 124 output << ";" << endl; 125 125 } … … 159 159 if ( obj->get_init() ) { 160 160 output << " = "; 161 obj->get_init()->accept( *this );161 obj->get_init()->accept( *this ); 162 162 } // if 163 163 output << "," << endl; … … 186 186 } 187 187 188 void CodeGenerator::printDesignators( std::list< Expression * > & designators ) {189 typedef std::list< Expression * > DesignatorList;190 if ( designators.size() == 0 ) return;191 for ( DesignatorList::iterator iter = designators.begin(); iter != designators.end(); ++iter ) {192 // if expression is a name, then initializing aggregate member, if constant expression then array193 if ( NameExpr * nm = dynamic_cast< NameExpr * >( *iter ) ) {194 if ( nm->get_name() == "0" || nm->get_name() == "1" ) {195 // except if name is 0 or 1...196 output << "[";197 nm->accept( *this );198 output << "]";199 } else {200 output << ".";201 nm->accept( *this );202 }203 } else if ( dynamic_cast< ConstantExpr * >( *iter ) ) {204 output << "[";205 (*iter)->accept( *this );206 output << "]";207 } else {208 assert(0);209 }210 }211 output << " = ";212 }213 214 188 void CodeGenerator::visit( SingleInit *init ) { 215 printDesignators( init->get_designators() );216 189 init->get_value()->accept( *this ); 217 190 } 218 191 219 192 void CodeGenerator::visit( ListInit *init ) { 220 printDesignators( init->get_designators() );221 193 output << "{ "; 222 194 genCommaList( init->begin_initializers(), init->end_initializers() ); … … 478 450 void CodeGenerator::visit( TypeExpr *typeExpr ) {} 479 451 452 void CodeGenerator::visit( AsmExpr *asmExpr ) { 453 if ( asmExpr->get_inout() ) { 454 output << "[ "; 455 asmExpr->get_inout()->accept( *this ); 456 output << " ] "; 457 } // if 458 asmExpr->get_constraint()->accept( *this ); 459 output << " ( "; 460 asmExpr->get_operand()->accept( *this ); 461 output << " )"; 462 } 463 480 464 //*** Statements 481 465 void CodeGenerator::visit( CompoundStmt *compoundStmt ) { … … 485 469 cur_indent += CodeGenerator::tabsize; 486 470 487 for ( std::list<Statement *>::iterator i = ks.begin(); i != ks.end(); i++ ) {471 for ( std::list<Statement *>::iterator i = ks.begin(); i != ks.end(); i++ ) { 488 472 output << indent << printLabels( (*i)->get_labels() ); 489 (*i)->accept( *this );473 (*i)->accept( *this ); 490 474 491 475 output << endl; … … 511 495 } 512 496 497 void CodeGenerator::visit( AsmStmt *asmStmt ) { 498 output << "asm "; 499 if ( asmStmt->get_voltile() ) output << "volatile "; 500 if ( ! asmStmt->get_gotolabels().empty() ) output << "goto "; 501 output << "( "; 502 if ( asmStmt->get_instruction() ) asmStmt->get_instruction()->accept( *this ); 503 output << " : "; 504 genCommaList( asmStmt->get_output().begin(), asmStmt->get_output().end() ); 505 output << " : "; 506 genCommaList( asmStmt->get_input().begin(), asmStmt->get_input().end() ); 507 output << " : "; 508 genCommaList( asmStmt->get_clobber().begin(), asmStmt->get_clobber().end() ); 509 if ( ! asmStmt->get_gotolabels().empty() ) { 510 output << " : "; 511 for ( std::list<Label>::iterator begin = asmStmt->get_gotolabels().begin();; ) { 512 output << *begin++; 513 if ( begin == asmStmt->get_gotolabels().end() ) break; 514 output << ", "; 515 } // for 516 } // if 517 output << " );" ; 518 } 519 513 520 void CodeGenerator::visit( IfStmt *ifStmt ) { 514 output << "if ( ";515 ifStmt->get_condition()->accept( *this );516 output << " ) ";517 518 ifStmt->get_thenPart()->accept( *this );521 output << "if ( "; 522 ifStmt->get_condition()->accept( *this ); 523 output << " ) "; 524 525 ifStmt->get_thenPart()->accept( *this ); 519 526 520 527 if ( ifStmt->get_elsePart() != 0) { 521 528 output << " else "; 522 ifStmt->get_elsePart()->accept( *this );529 ifStmt->get_elsePart()->accept( *this ); 523 530 } // if 524 531 } 525 532 526 533 void CodeGenerator::visit( SwitchStmt *switchStmt ) { 527 output << "switch ( " ;528 switchStmt->get_condition()->accept( *this );529 output << " ) ";534 output << "switch ( " ; 535 switchStmt->get_condition()->accept( *this ); 536 output << " ) "; 530 537 531 538 output << "{" << std::endl; … … 545 552 } else { 546 553 output << "case "; 547 caseStmt->get_condition()->accept( *this );554 caseStmt->get_condition()->accept( *this ); 548 555 } // if 549 556 output << ":\n"; … … 554 561 for ( std::list<Statement *>::iterator i = sts.begin(); i != sts.end(); i++) { 555 562 output << indent << printLabels( (*i)->get_labels() ) ; 556 (*i)->accept( *this );563 (*i)->accept( *this ); 557 564 output << endl; 558 565 } … … 598 605 else { 599 606 output << "while (" ; 600 whileStmt->get_condition()->accept( *this );607 whileStmt->get_condition()->accept( *this ); 601 608 output << ")"; 602 609 } // if … … 610 617 if ( whileStmt->get_isDoWhile() ) { 611 618 output << " while (" ; 612 whileStmt->get_condition()->accept( *this );619 whileStmt->get_condition()->accept( *this ); 613 620 output << ");"; 614 621 } // if
Note:
See TracChangeset
for help on using the changeset viewer.