Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/CodeGen/FixNames.cc

    r61efa42 r2fd0de0  
    2222#include "AST/Expr.hpp"
    2323#include "AST/Pass.hpp"
     24#include "Common/PassVisitor.h"
    2425#include "Common/SemanticError.h"  // for SemanticError
    2526#include "FixMain.h"               // for FixMain
    2627#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
    2736#include "CompilationState.h"
    2837
    2938namespace CodeGen {
     39        class FixNames : public WithGuards {
     40          public:
     41                void postvisit( ObjectDecl *objectDecl );
     42                void postvisit( FunctionDecl *functionDecl );
    3043
    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        }
    3287
    3388/// Does work with the main function and scopeLevels.
    34 class FixNames final {
     89class FixNames_new final {
    3590        int scopeLevel = 1;
    3691
     
    48103
    49104        const ast::FunctionDecl *postvisit( const ast::FunctionDecl *functionDecl ) {
    50                 if ( isMain( functionDecl ) ) {
     105                if ( FixMain::isMain( functionDecl ) ) {
    51106                        auto mutDecl = ast::mutate( functionDecl );
    52107
     
    83138};
    84139
    85 } // namespace
    86 
    87140void fixNames( ast::TranslationUnit & translationUnit ) {
    88         ast::Pass<FixNames>::run( translationUnit );
     141        ast::Pass<FixNames_new>::run( translationUnit );
    89142}
    90143
Note: See TracChangeset for help on using the changeset viewer.