Changeset 0270824 for src/CodeGen
- Timestamp:
- Jan 12, 2017, 11:31:57 AM (9 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:
- 3fe34ae
- Parents:
- 075734f
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/FixNames.cc
r075734f r0270824 14 14 // 15 15 16 #include <memory> 17 16 18 #include "FixNames.h" 17 19 #include "SynTree/Declaration.h" … … 20 22 #include "SymTab/Mangler.h" 21 23 #include "OperatorTable.h" 24 25 extern std::unique_ptr<FunctionDecl> translation_unit_main_signature; 22 26 23 27 namespace CodeGen { … … 28 32 29 33 virtual void visit( CompoundStmt *compoundStmt ); 30 31 34 private: 32 35 int scopeLevel = 1; … … 34 37 void fixDWT( DeclarationWithType *dwt ); 35 38 }; 39 40 std::string mangle_main() { 41 FunctionType* main_type; 42 std::unique_ptr<FunctionDecl> mainDecl { new FunctionDecl( 43 "main", 44 DeclarationNode::NoStorageClass, 45 LinkageSpec::Cforall, 46 main_type = new FunctionType( Type::Qualifiers(), true ), 47 nullptr, false, false 48 ) }; 49 main_type->get_returnVals().push_back( 50 new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), nullptr ) 51 ); 52 53 auto&& name = SymTab::Mangler::mangle( mainDecl.get() ); 54 // std::cerr << name << std::endl; 55 return name; 56 } 57 std::string mangle_main_args() { 58 FunctionType* main_type; 59 std::unique_ptr<FunctionDecl> mainDecl { new FunctionDecl( 60 "main", 61 DeclarationNode::NoStorageClass, 62 LinkageSpec::Cforall, 63 main_type = new FunctionType( Type::Qualifiers(), false ), 64 nullptr, false, false 65 ) }; 66 main_type->get_returnVals().push_back( 67 new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), nullptr ) 68 ); 69 70 mainDecl->get_functionType()->get_parameters().push_back( 71 new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), nullptr ) 72 ); 73 74 mainDecl->get_functionType()->get_parameters().push_back( 75 new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, 76 new PointerType( Type::Qualifiers(), new PointerType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::Char ) ) ), 77 nullptr ) 78 ); 79 80 auto&& name = SymTab::Mangler::mangle( mainDecl.get() ); 81 // std::cerr << name << std::endl; 82 return name; 83 } 84 85 bool is_main(const std::string& name) { 86 static std::string mains[] = { 87 mangle_main(), 88 mangle_main_args() 89 }; 90 91 for(const auto& m : mains) { 92 if( name == m ) return true; 93 } 94 return false; 95 } 36 96 37 97 void fixNames( std::list< Declaration* > translationUnit ) { … … 57 117 Visitor::visit( functionDecl ); 58 118 fixDWT( functionDecl ); 119 120 if(is_main( SymTab::Mangler::mangle(functionDecl, true, true) )) { 121 if(translation_unit_main_signature) { 122 throw SemanticError("Multiple definition of main routine\n", functionDecl); 123 } 124 125 functionDecl->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, new ConstantExpr( Constant( new BasicType( Type::Qualifiers(), BasicType::SignedInt ), "0") ) ) ); 126 translation_unit_main_signature.reset( functionDecl->clone() ); 127 } 59 128 } 60 129
Note:
See TracChangeset
for help on using the changeset viewer.