Changes in src/CodeGen/FixNames.cc [61efa42:2fd0de0]
- File:
-
- 1 edited
-
src/CodeGen/FixNames.cc (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/FixNames.cc
r61efa42 r2fd0de0 22 22 #include "AST/Expr.hpp" 23 23 #include "AST/Pass.hpp" 24 #include "Common/PassVisitor.h" 24 25 #include "Common/SemanticError.h" // for SemanticError 25 26 #include "FixMain.h" // for FixMain 26 27 #include "SymTab/Mangler.h" // for Mangler 28 #include "SynTree/LinkageSpec.h" // for Cforall, isMangled 29 #include "SynTree/Constant.h" // for Constant 30 #include "SynTree/Declaration.h" // for FunctionDecl, ObjectDecl, Declarat... 31 #include "SynTree/Expression.h" // for ConstantExpr 32 #include "SynTree/Label.h" // for Label, noLabels 33 #include "SynTree/Statement.h" // for ReturnStmt, CompoundStmt 34 #include "SynTree/Type.h" // for Type, BasicType, Type::Qualifiers 35 #include "SynTree/Visitor.h" // for Visitor, acceptAll 27 36 #include "CompilationState.h" 28 37 29 38 namespace CodeGen { 39 class FixNames : public WithGuards { 40 public: 41 void postvisit( ObjectDecl *objectDecl ); 42 void postvisit( FunctionDecl *functionDecl ); 30 43 31 namespace { 44 void previsit( CompoundStmt *compoundStmt ); 45 private: 46 int scopeLevel = 1; 47 48 void fixDWT( DeclarationWithType *dwt ); 49 }; 50 51 void fixNames( std::list< Declaration* > & translationUnit ) { 52 PassVisitor<FixNames> fixer; 53 acceptAll( translationUnit, fixer ); 54 } 55 56 void FixNames::fixDWT( DeclarationWithType * dwt ) { 57 if ( dwt->get_name() != "" ) { 58 if ( LinkageSpec::isMangled( dwt->get_linkage() ) ) { 59 if (!useNewAST) { 60 dwt->set_mangleName( SymTab::Mangler::mangle( dwt ) ); 61 } 62 dwt->set_scopeLevel( scopeLevel ); 63 } // if 64 } // if 65 } 66 67 void FixNames::postvisit( ObjectDecl * objectDecl ) { 68 fixDWT( objectDecl ); 69 } 70 71 void FixNames::postvisit( FunctionDecl * functionDecl ) { 72 fixDWT( functionDecl ); 73 74 if ( FixMain::isMain( functionDecl ) ) { 75 int nargs = functionDecl->get_functionType()->get_parameters().size(); 76 if( !(nargs == 0 || nargs == 2 || nargs == 3) ) { 77 SemanticError(functionDecl, "Main expected to have 0, 2 or 3 arguments\n"); 78 } 79 functionDecl->get_statements()->get_kids().push_back( new ReturnStmt( new ConstantExpr( Constant::from_int( 0 ) ) ) ); 80 } 81 } 82 83 void FixNames::previsit( CompoundStmt * ) { 84 scopeLevel++; 85 GuardAction( [this](){ scopeLevel--; } ); 86 } 32 87 33 88 /// Does work with the main function and scopeLevels. 34 class FixNames final {89 class FixNames_new final { 35 90 int scopeLevel = 1; 36 91 … … 48 103 49 104 const ast::FunctionDecl *postvisit( const ast::FunctionDecl *functionDecl ) { 50 if ( isMain( functionDecl ) ) {105 if ( FixMain::isMain( functionDecl ) ) { 51 106 auto mutDecl = ast::mutate( functionDecl ); 52 107 … … 83 138 }; 84 139 85 } // namespace86 87 140 void fixNames( ast::TranslationUnit & translationUnit ) { 88 ast::Pass<FixNames >::run( translationUnit );141 ast::Pass<FixNames_new>::run( translationUnit ); 89 142 } 90 143
Note:
See TracChangeset
for help on using the changeset viewer.