Changes in src/CodeGen/CodeGenerator.cc [bf2438c:0a81c3f]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
rbf2438c r0a81c3f 14 14 // 15 15 16 #include <cassert> // for assert, assertf 17 #include <list> // for _List_iterator, list, list<>::it... 16 #include <algorithm> 17 #include <iostream> 18 #include <cassert> 19 #include <list> 20 21 #include "Parser/ParseNode.h" 22 23 #include "SynTree/Declaration.h" 24 #include "SynTree/Expression.h" 25 #include "SynTree/Initializer.h" 26 #include "SynTree/Statement.h" 27 #include "SynTree/Type.h" 28 #include "SynTree/Attribute.h" 29 30 #include "Common/utility.h" 31 #include "Common/UnimplementedError.h" 18 32 19 33 #include "CodeGenerator.h" 20 #include "Common/SemanticError.h" // for SemanticError 21 #include "Common/UniqueName.h" // for UniqueName 22 #include "Common/utility.h" // for CodeLocation, toString 23 #include "GenType.h" // for genType 24 #include "InitTweak/InitTweak.h" // for getPointerBase 25 #include "OperatorTable.h" // for OperatorInfo, operatorLookup 26 #include "Parser/LinkageSpec.h" // for Spec, Intrinsic 27 #include "SynTree/Attribute.h" // for Attribute 28 #include "SynTree/BaseSyntaxNode.h" // for BaseSyntaxNode 29 #include "SynTree/Constant.h" // for Constant 30 #include "SynTree/Declaration.h" // for DeclarationWithType, TypeDecl 31 #include "SynTree/Expression.h" // for Expression, UntypedExpr, Applica... 32 #include "SynTree/Initializer.h" // for Initializer, ListInit, Designation 33 #include "SynTree/Label.h" // for Label, operator<< 34 #include "SynTree/Statement.h" // for Statement, AsmStmt, BranchStmt 35 #include "SynTree/Type.h" // for Type, Type::StorageClasses, Func... 34 #include "OperatorTable.h" 35 #include "GenType.h" 36 37 #include "InitTweak/InitTweak.h" 36 38 37 39 using namespace std; … … 63 65 } // if 64 66 } // extension 65 66 ostream & CodeGenerator::Indenter::operator()( ostream & output ) const {67 return output << string( cg.cur_indent, ' ' );68 }69 70 ostream & operator<<( ostream & output, const CodeGenerator::Indenter &indent ) {71 return indent( output );72 }73 67 74 68 CodeGenerator::LabelPrinter & CodeGenerator::LabelPrinter::operator()( std::list< Label > & l ) { … … 109 103 } 110 104 111 CodeGenerator::CodeGenerator( std::ostream & os, bool pretty, bool genC, bool lineMarks ) : indent( *this), cur_indent( 0), insideFunction( false ), output( os ), printLabels( *this ), pretty( pretty ), genC( genC ), lineMarks( lineMarks ) {}105 CodeGenerator::CodeGenerator( std::ostream & os, bool pretty, bool genC, bool lineMarks ) : indent( CodeGenerator::tabsize ), insideFunction( false ), output( os ), printLabels( *this ), pretty( pretty ), genC( genC ), lineMarks( lineMarks ) {} 112 106 113 107 string CodeGenerator::mangleName( DeclarationWithType * decl ) { … … 200 194 output << " {" << endl; 201 195 202 cur_indent += CodeGenerator::tabsize;196 ++indent; 203 197 for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end(); i++ ) { 204 198 output << lineDirective( *i ) << indent; … … 207 201 } // for 208 202 209 cur_indent -= CodeGenerator::tabsize;203 --indent; 210 204 211 205 output << indent << "}"; … … 237 231 output << " {" << endl; 238 232 239 cur_indent += CodeGenerator::tabsize;233 ++indent; 240 234 for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end(); i++) { 241 235 ObjectDecl * obj = dynamic_cast< ObjectDecl* >( *i ); … … 249 243 } // for 250 244 251 cur_indent -= CodeGenerator::tabsize;245 --indent; 252 246 253 247 output << indent << "}"; … … 344 338 if ( varExpr->get_var()->get_linkage() == LinkageSpec::Intrinsic && operatorLookup( varExpr->get_var()->get_name(), opInfo ) ) { 345 339 std::list< Expression* >::iterator arg = applicationExpr->get_args().begin(); 346 switch ( opInfo.type ) {347 case OT_PREFIXASSIGN:348 case OT_POSTFIXASSIGN:349 case OT_INFIXASSIGN:350 case OT_CTOR:351 case OT_DTOR:352 {353 assert( arg != applicationExpr->get_args().end() );354 if ( AddressExpr * addrExpr = dynamic_cast< AddressExpr * >( *arg ) ) {355 // remove & from first assignment/ctor argument356 *arg = addrExpr->get_arg();357 } else {358 // no address-of operator, so must be a pointer - add dereference359 // NOTE: if the assertion starts to trigger, check that the application expr isn't being shared.360 // Since its arguments are modified here, this assertion most commonly triggers when the application361 // is visited multiple times.362 UntypedExpr * newExpr = new UntypedExpr( new NameExpr( "*?" ) );363 newExpr->get_args().push_back( *arg );364 Type * type = InitTweak::getPointerBase( (*arg)->get_result() );365 assertf( type, "First argument to a derefence must be a pointer. Ensure that expressions are not being shared." );366 newExpr->set_result( type->clone() );367 *arg = newExpr;368 } // if369 break;370 }371 372 default:373 // do nothing374 ;375 } // switch376 377 340 switch ( opInfo.type ) { 378 341 case OT_INDEX: … … 753 716 std::list< Statement * > & stmts = stmtExpr->get_statements()->get_kids(); 754 717 output << lineDirective( stmtExpr) << "({" << std::endl; 755 cur_indent += CodeGenerator::tabsize;718 ++indent; 756 719 unsigned int numStmts = stmts.size(); 757 720 unsigned int i = 0; … … 776 739 ++i; 777 740 } 778 cur_indent -= CodeGenerator::tabsize;741 --indent; 779 742 output << indent << "})"; 780 743 } … … 785 748 output << "{" << endl; 786 749 787 cur_indent += CodeGenerator::tabsize;750 ++indent; 788 751 789 752 for ( std::list<Statement *>::iterator i = ks.begin(); i != ks.end(); i++ ) { … … 796 759 } // if 797 760 } // for 798 cur_indent -= CodeGenerator::tabsize;761 --indent; 799 762 800 763 output << indent << "}"; … … 864 827 865 828 output << "{" << std::endl; 866 cur_indent += CodeGenerator::tabsize;829 ++indent; 867 830 acceptAll( switchStmt->get_statements(), *this ); 868 cur_indent -= CodeGenerator::tabsize;831 --indent; 869 832 output << indent << "}"; 870 833 } … … 883 846 std::list<Statement *> sts = caseStmt->get_statements(); 884 847 885 cur_indent += CodeGenerator::tabsize;848 ++indent; 886 849 for ( std::list<Statement *>::iterator i = sts.begin(); i != sts.end(); i++) { 887 850 output << indent << printLabels( (*i)->get_labels() ) ; … … 889 852 output << endl; 890 853 } // for 891 cur_indent -= CodeGenerator::tabsize;854 --indent; 892 855 } 893 856
Note:
See TracChangeset
for help on using the changeset viewer.