Changeset 0c577f7


Ignore:
Timestamp:
Oct 29, 2021, 4:03:07 PM (3 years ago)
Author:
Andrew Beach <ajbeach@…>
Branches:
ADT, ast-experimental, enum, forall-pointer-decay, master, pthread-emulation, qualifiedEnum
Children:
8e48fca4
Parents:
f42fc13
Message:

Implemented new AST version of the Fix Names pass.

Location:
src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • src/CodeGen/FixMain.cc

    rf42fc13 r0c577f7  
    2222#include <string>                  // for operator<<
    2323
     24#include "AST/Decl.hpp"
     25#include "AST/Type.hpp"
    2426#include "Common/PassVisitor.h"
    2527#include "Common/SemanticError.h"  // for SemanticError
     
    105107}
    106108
     109bool is_main( const std::string & mangled_name ) {
     110        // This breaks if you move it out of the function.
     111        static const std::string mangled_mains[] = {
     112                mangled_0_argument_main(),
     113                mangled_2_argument_main(),
     114                //mangled_3_argument_main(),
     115        };
     116
     117        for ( auto main_name : mangled_mains ) {
     118                if ( main_name == mangled_name ) return true;
     119        }
     120        return false;
     121}
     122
    107123struct FindMainCore {
    108124        void previsit( FunctionDecl * decl ) {
     
    116132
    117133bool FixMain::isMain( FunctionDecl * decl ) {
    118         // This breaks if you move it out of the function.
    119         static const std::string mangled_mains[] = {
    120                 mangled_0_argument_main(),
    121                 mangled_2_argument_main(),
    122                 //mangled_3_argument_main(),
    123         };
    124 
    125134        if ( std::string("main") != decl->name ) {
    126135                return false;
    127136        }
    128         auto mangled_name = SymTab::Mangler::mangle( decl, true, true );
    129         for ( auto main_name : mangled_mains ) {
    130                 if ( main_name == mangled_name ) return true;
     137        return is_main( SymTab::Mangler::mangle( decl, true, true ) );
     138}
     139
     140bool FixMain::isMain( const ast::FunctionDecl * decl ) {
     141        if ( std::string("main") != decl->name ) {
     142                return false;
    131143        }
    132         return false;
     144        return is_main( Mangle::mangle( decl, Mangle::Type ) );
    133145}
    134146
  • src/CodeGen/FixMain.h

    rf42fc13 r0c577f7  
    1010// Created On       : Thr Jan 12 14:11:09 2017
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Fri Oct 29 11:07:00 2021
    13 // Update Count     : 6
     12// Last Modified On : Fri Oct 29 14:49:00 2021
     13// Update Count     : 7
    1414//
    1515
     
    2424class Declaration;
    2525class FunctionDecl;
     26namespace ast {
     27        class FunctionDecl;
     28}
    2629
    2730namespace CodeGen {
     
    3134                        return replace_main ? LinkageSpec::Cforall : LinkageSpec::C;
    3235                }
    33                
     36
    3437                static inline void setReplaceMain(bool val) {
    3538                        replace_main = val;
     
    3841                static void registerMain(FunctionDecl* val);
    3942                static bool isMain(FunctionDecl* decl);
     43                static bool isMain(const ast::FunctionDecl * decl);
    4044
    4145                static void fix(std::ostream &os, const char* bootloader_filename);
  • src/CodeGen/FixNames.cc

    rf42fc13 r0c577f7  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Fri Oct 29 14:06:00 2021
    13 // Update Count     : 22
     12// Last Modified On : Fri Oct 29 15:49:00 2021
     13// Update Count     : 23
    1414//
    1515
     
    1919#include <string>                  // for string, operator!=, operator==
    2020
     21#include "AST/Chain.hpp"
     22#include "AST/Expr.hpp"
     23#include "AST/Pass.hpp"
    2124#include "Common/PassVisitor.h"
    2225#include "Common/SemanticError.h"  // for SemanticError
     
    8285                GuardAction( [this](){ scopeLevel--; } );
    8386        }
     87
     88/// Does work with the main function and scopeLevels.
     89class FixNames_new : public ast::WithGuards {
     90        int scopeLevel = 1;
     91
     92        bool shouldSetScopeLevel( const ast::DeclWithType * dwt ) {
     93                return !dwt->name.empty() && dwt->linkage.is_mangled
     94                        && dwt->scopeLevel != scopeLevel;
     95        }
     96public:
     97        const ast::ObjectDecl *postvisit( const ast::ObjectDecl *objectDecl ) {
     98                if ( shouldSetScopeLevel( objectDecl ) ) {
     99                        return ast::mutate_field( objectDecl, &ast::ObjectDecl::scopeLevel, scopeLevel );
     100                }
     101                return objectDecl;
     102        }
     103
     104        const ast::FunctionDecl *postvisit( const ast::FunctionDecl *functionDecl ) {
     105                // This store is used to ensure a maximum of one call to mutate.
     106                ast::FunctionDecl * mutDecl = nullptr;
     107
     108                if ( shouldSetScopeLevel( functionDecl ) ) {
     109                        mutDecl = ast::mutate( functionDecl );
     110                        mutDecl->scopeLevel = scopeLevel;
     111                }
     112
     113                if ( FixMain::isMain( functionDecl ) ) {
     114                        if ( !mutDecl ) { mutDecl = ast::mutate( functionDecl ); }
     115
     116                        int nargs = mutDecl->params.size();
     117                        if ( 0 != nargs && 2 != nargs && 3 != nargs ) {
     118                                SemanticError( functionDecl, "Main expected to have 0, 2 or 3 arguments\n" );
     119                        }
     120                        ast::chain_mutate( mutDecl->stmts )->kids.push_back(
     121                                new ast::ReturnStmt(
     122                                        mutDecl->location,
     123                                        ast::ConstantExpr::from_int( mutDecl->location, 0 )
     124                                )
     125                        );
     126                }
     127                return mutDecl ? mutDecl : functionDecl;
     128        }
     129
     130        void previsit( const ast::CompoundStmt * ) {
     131                GuardValue( scopeLevel ) += 1;
     132        }
     133};
     134
     135void fixNames( ast::TranslationUnit & translationUnit ) {
     136        ast::Pass<FixNames_new>::run( translationUnit );
     137}
     138
    84139} // namespace CodeGen
    85140
  • src/CodeGen/FixNames.h

    rf42fc13 r0c577f7  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jul 21 22:17:33 2017
    13 // Update Count     : 3
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Tue Oct 26 13:47:00 2021
     13// Update Count     : 4
    1414//
    1515
     
    1919
    2020class Declaration;
     21namespace ast {
     22        struct TranslationUnit;
     23}
    2124
    2225namespace CodeGen {
    2326        /// mangles object and function names
    2427        void fixNames( std::list< Declaration* > & translationUnit );
     28        void fixNames( ast::TranslationUnit & translationUnit );
    2529} // namespace CodeGen
    2630
  • src/main.cc

    rf42fc13 r0c577f7  
    335335                PASS( "Translate Throws", ControlStruct::translateThrows( translationUnit ) );
    336336                PASS( "Fix Labels", ControlStruct::fixLabels( translationUnit ) );
    337                 PASS( "Fix Names", CodeGen::fixNames( translationUnit ) );
    338337
    339338                CodeTools::fillLocations( translationUnit );
     
    348347                        forceFillCodeLocations( transUnit );
    349348
     349                        PASS( "Fix Names", CodeGen::fixNames( transUnit ) );
    350350                        PASS( "Gen Init", InitTweak::genInit( transUnit ) );
    351351                        PASS( "Expand Member Tuples" , Tuples::expandMemberTuples( transUnit ) );
     
    383383                        translationUnit = convert( move( transUnit ) );
    384384                } else {
     385                        PASS( "Fix Names", CodeGen::fixNames( translationUnit ) );
    385386                        PASS( "Gen Init", InitTweak::genInit( translationUnit ) );
    386387                        PASS( "Expand Member Tuples" , Tuples::expandMemberTuples( translationUnit ) );
Note: See TracChangeset for help on using the changeset viewer.