Changeset b3f252a for src/CodeGen
- Timestamp:
- Sep 7, 2017, 10:36:35 AM (8 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- e0886db
- Parents:
- 871cdb4 (diff), 416cc86 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- src/CodeGen
- Files:
-
- 4 edited
-
CodeGenerator.cc (modified) (7 diffs)
-
CodeGenerator.h (modified) (1 diff)
-
Generate.cc (modified) (3 diffs)
-
OperatorTable.cc (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
r871cdb4 rb3f252a 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Andrew Beach12 // Last Modified On : Fri Aug 18 15:34:00201713 // Update Count : 4 8811 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Sep 3 20:42:52 2017 13 // Update Count : 490 14 14 // 15 15 #include "CodeGenerator.h" … … 59 59 60 60 void CodeGenerator::asmName( DeclarationWithType * decl ) { 61 if ( ConstantExpr * asmName = d ecl->get_asmName() ) {61 if ( ConstantExpr * asmName = dynamic_cast<ConstantExpr *>(decl->get_asmName()) ) { 62 62 output << " asm ( " << asmName->get_constant()->get_value() << " )"; 63 63 } // if … … 195 195 } 196 196 197 output << kind; 198 if ( aggDecl->get_name() != "" ) 199 output << aggDecl->get_name(); 197 output << kind << aggDecl->get_name(); 200 198 201 199 if ( aggDecl->has_body() ) { … … 233 231 genAttributes( enumDecl->get_attributes() ); 234 232 235 if ( enumDecl->get_name() != "" ) 236 output << enumDecl->get_name(); 233 output << enumDecl->get_name(); 237 234 238 235 std::list< Declaration* > &memb = enumDecl->get_members(); … … 260 257 } 261 258 262 void CodeGenerator::visit( __attribute__((unused)) TraitDecl * traitDecl ) {} 259 void CodeGenerator::visit( TraitDecl * traitDecl ) { 260 assertf( ! genC, "TraitDecl nodes should not reach code generation." ); 261 extension( traitDecl ); 262 handleAggregate( traitDecl, "trait " ); 263 } 263 264 264 265 void CodeGenerator::visit( TypedefDecl * typeDecl ) { … … 545 546 extension( addressExpr ); 546 547 output << "(&"; 547 // this hack makes sure that we don't convert "constant_zero" to "0" if we're taking its address 548 if ( VariableExpr * variableExpr = dynamic_cast< VariableExpr* >( addressExpr->get_arg() ) ) { 549 output << mangleName( variableExpr->get_var() ); 550 } else { 551 addressExpr->get_arg()->accept( *this ); 552 } // if 548 addressExpr->arg->accept( *this ); 553 549 output << ")"; 550 } 551 552 void CodeGenerator::visit( LabelAddressExpr *addressExpr ) { 553 extension( addressExpr ); 554 output << "(&&" << addressExpr->arg << ")"; 554 555 } 555 556 … … 760 761 for ( Statement * stmt : stmts ) { 761 762 updateLocation( stmt ); 762 output << printLabels( stmt->get_labels() );763 output << indent << printLabels( stmt->get_labels() ); 763 764 if ( i+1 == numStmts ) { 764 765 // last statement in a statement expression needs to be handled specially - -
src/CodeGen/CodeGenerator.h
r871cdb4 rb3f252a 59 59 virtual void visit( NameExpr *nameExpr ); 60 60 virtual void visit( AddressExpr *addressExpr ); 61 virtual void visit( LabelAddressExpr *addressExpr ); 61 62 virtual void visit( CastExpr *castExpr ); 62 63 virtual void visit( VirtualCastExpr *castExpr ); -
src/CodeGen/Generate.cc
r871cdb4 rb3f252a 21 21 #include "CodeGenerator.h" // for CodeGenerator, doSemicolon, oper... 22 22 #include "GenType.h" // for genPrettyType 23 #include "Common/PassVisitor.h" // for PassVisitor 23 24 #include "Parser/LinkageSpec.h" // for isBuiltin, isGeneratable 24 25 #include "SynTree/BaseSyntaxNode.h" // for BaseSyntaxNode … … 29 30 30 31 namespace CodeGen { 32 namespace { 33 /// Removes misc. nodes that should not exist in CodeGen 34 struct TreeCleaner { 35 void visit( CompoundStmt * stmt ); 36 37 static bool shouldClean( Declaration * ); 38 }; 39 40 void cleanTree( std::list< Declaration * > & translationUnit ) { 41 PassVisitor<TreeCleaner> cleaner; 42 filter( translationUnit, [](Declaration * decl) { return TreeCleaner::shouldClean(decl); }, false ); 43 acceptAll( translationUnit, cleaner ); 44 } // cleanTree 45 } // namespace 46 31 47 void generate( std::list< Declaration* > translationUnit, std::ostream &os, bool doIntrinsics, bool pretty, bool generateC, bool lineMarks ) { 48 cleanTree( translationUnit ); 49 32 50 CodeGen::CodeGenerator cgv( os, pretty, generateC, lineMarks ); 33 51 for ( auto & dcl : translationUnit ) { … … 52 70 os << std::endl; 53 71 } 72 73 namespace { 74 void TreeCleaner::visit( CompoundStmt * cstmt ) { 75 filter( cstmt->kids, [](Statement * stmt) { 76 if ( DeclStmt * declStmt = dynamic_cast< DeclStmt * >( stmt ) ) { 77 return shouldClean( declStmt->decl ); 78 } 79 return false; 80 }, false ); 81 } 82 83 bool TreeCleaner::shouldClean( Declaration * decl ) { 84 return dynamic_cast< TraitDecl * >( decl ); 85 } 86 } // namespace 54 87 } // namespace CodeGen 55 88 -
src/CodeGen/OperatorTable.cc
r871cdb4 rb3f252a 19 19 20 20 #include "OperatorTable.h" 21 #include "Common/utility.h" 21 22 22 23 namespace CodeGen { … … 65 66 { "?^=?", "^=", "_operator_bitxorassign", OT_INFIXASSIGN }, 66 67 { "?|=?", "|=", "_operator_bitorassign", OT_INFIXASSIGN }, 67 { "&&", "&&", "&&", OT_LABELADDRESS },68 { "0", "0", "_constant_zero", OT_CONSTANT },69 { "1", "1", "_constant_one", OT_CONSTANT }70 68 }; 71 69 … … 86 84 initialize(); 87 85 } // if 86 88 87 std::map< std::string, OperatorInfo >::const_iterator i = table.find( funcName ); 89 88 if ( i == table.end() ) { 89 if ( isPrefix( funcName, "?`" ) ) { 90 // handle literal suffixes, which are user-defined postfix operators 91 info.inputName = funcName; 92 info.symbol = funcName.substr(2); 93 info.outputName = toString( "__operator_literal_", info.symbol ); 94 info.type = OT_POSTFIX; 95 return true; 96 } 90 97 return false; 91 98 } else {
Note:
See TracChangeset
for help on using the changeset viewer.