Changeset 0270824


Ignore:
Timestamp:
Jan 12, 2017, 11:31:57 AM (5 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
aaron-thesis, arm-eh, cleanup-dtors, deferred_resn, demangler, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, resolv-new, with_gc
Children:
3fe34ae
Parents:
075734f
Message:

Replace user main with custom main, prototype

Location:
src
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • src/CodeGen/FixNames.cc

    r075734f r0270824  
    1414//
    1515
     16#include <memory>
     17
    1618#include "FixNames.h"
    1719#include "SynTree/Declaration.h"
     
    2022#include "SymTab/Mangler.h"
    2123#include "OperatorTable.h"
     24
     25extern std::unique_ptr<FunctionDecl> translation_unit_main_signature;
    2226
    2327namespace CodeGen {
     
    2832
    2933                virtual void visit( CompoundStmt *compoundStmt );
    30 
    3134          private:
    3235                int scopeLevel = 1;
     
    3437                void fixDWT( DeclarationWithType *dwt );
    3538        };
     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        }
    3696
    3797        void fixNames( std::list< Declaration* > translationUnit ) {
     
    57117                Visitor::visit( functionDecl );
    58118                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                }
    59128        }
    60129
  • src/SymTab/Mangler.h

    r075734f r0270824  
    2727                /// Mangle syntax tree object; primary interface to clients
    2828                template< typename SynTreeClass >
    29             static std::string mangle( SynTreeClass *decl, bool mangleOverridable = true );
     29            static std::string mangle( SynTreeClass *decl, bool mangleOverridable = true, bool typeMode = false );
    3030                /// Mangle a type name; secondary interface
    3131                static std::string mangleType( Type* ty );
     
    7070
    7171        template< typename SynTreeClass >
    72         std::string Mangler::mangle( SynTreeClass *decl, bool mangleOverridable ) {
    73                 Mangler mangler( mangleOverridable, false );
     72        std::string Mangler::mangle( SynTreeClass *decl, bool mangleOverridable, bool typeMode ) {
     73                Mangler mangler( mangleOverridable, typeMode );
    7474                maybeAccept( decl, mangler );
    7575                return mangler.get_mangleName();
  • src/SynTree/FunctionDecl.cc

    r075734f r0270824  
    2727        set_isInline( isInline );
    2828        set_isNoreturn( isNoreturn );
    29         // this is a brazen hack to force the function "main" to have C linkage
     29        // this is a brazen hack to force the function "main" to have Cforall linkage
     30        // because we want to replace the main even if it is inside an extern
    3031        if ( name == "main" ) {
    31                 set_linkage( LinkageSpec::C );
     32                set_linkage( LinkageSpec::Cforall );
    3233        } // if
    3334}
  • src/main.cc

    r075734f r0270824  
    1414//
    1515
     16#include <memory>
    1617#include <iostream>
    1718#include <fstream>
     
    7879static void dump( list< Declaration * > & translationUnit, ostream & out = cout );
    7980
     81std::unique_ptr<FunctionDecl> translation_unit_main_signature = nullptr;
     82
    8083static void backtrace( int start ) {                                    // skip first N stack frames
    8184        enum { Frames = 50 };
     
    299302
    300303                CodeGen::generate( translationUnit, *output, ! noprotop );
     304
     305                if( translation_unit_main_signature ) {
     306                        *output << "int main(int argc, char** argv) { return ";
     307
     308                        *output << translation_unit_main_signature->get_scopedMangleName() << "(";
     309                        if(translation_unit_main_signature->get_functionType()->get_parameters().size() != 0){
     310                                *output << "argc, argv";
     311                        }
     312                        *output << ");";
     313
     314                        *output << " }\n";
     315                }
    301316
    302317                if ( output != &cout ) {
  • src/tests/.expect/32/declarationSpecifier.txt

    r075734f r0270824  
    621621static inline volatile const short __f47__FCVs___1();
    622622static inline volatile const short __f48__FCVs___1();
    623 int main(int __argc__i_1, const char **__argv__PPCc_1){
     623int __main__Fi_iPPCc__1(int __argc__i_1, const char **__argv__PPCc_1){
    624624    int ___retval_main__i_1;
    625625    ((void)(___retval_main__i_1=((int )0)) /* ?{} */);
    626626    return ((int )___retval_main__i_1);
    627 }
     627    ((void)(___retval_main__i_1=0) /* ?{} */);
     628    return ((int )___retval_main__i_1);
     629}
     630int main(int argc, char** argv) { return __main__Fi_iPPCc__1(argc, argv); }
     631
  • src/tests/.expect/32/gccExtensions.txt

    r075734f r0270824  
    66extern int printf(const char *__restrict __format, ...);
    77extern int __x__i_1 asm ( "xx" );
    8 int main(int __argc__i_1, const char **__argv__PPCc_1){
     8int __main__Fi_iPPCc__1(int __argc__i_1, const char **__argv__PPCc_1){
    99    int ___retval_main__i_1;
    1010    asm ( "nop" :  :  :  );
     
    162162    ((void)(___retval_main__i_1=((int )0)) /* ?{} */);
    163163    return ((int )___retval_main__i_1);
     164    ((void)(___retval_main__i_1=0) /* ?{} */);
     165    return ((int )___retval_main__i_1);
    164166}
     167int main(int argc, char** argv) { return __main__Fi_iPPCc__1(argc, argv); }
  • src/tests/.expect/64/declarationSpecifier.txt

    r075734f r0270824  
    621621static inline volatile const short __f47__FCVs___1();
    622622static inline volatile const short __f48__FCVs___1();
    623 int main(int __argc__i_1, const char **__argv__PPCc_1){
     623int __main__Fi_iPPCc__1(int __argc__i_1, const char **__argv__PPCc_1){
    624624    int ___retval_main__i_1;
    625625    ((void)(___retval_main__i_1=((int )0)) /* ?{} */);
    626626    return ((int )___retval_main__i_1);
    627 }
     627    ((void)(___retval_main__i_1=0) /* ?{} */);
     628    return ((int )___retval_main__i_1);
     629}
     630int main(int argc, char** argv) { return __main__Fi_iPPCc__1(argc, argv); }
  • src/tests/.expect/64/gccExtensions.txt

    r075734f r0270824  
    66extern int printf(const char *__restrict __format, ...);
    77extern int __x__i_1 asm ( "xx" );
    8 int main(int __argc__i_1, const char **__argv__PPCc_1){
     8int __main__Fi_iPPCc__1(int __argc__i_1, const char **__argv__PPCc_1){
    99    int ___retval_main__i_1;
    1010    asm ( "nop" :  :  :  );
     
    162162    ((void)(___retval_main__i_1=((int )0)) /* ?{} */);
    163163    return ((int )___retval_main__i_1);
     164    ((void)(___retval_main__i_1=0) /* ?{} */);
     165    return ((int )___retval_main__i_1);
    164166}
     167int main(int argc, char** argv) { return __main__Fi_iPPCc__1(argc, argv); }
Note: See TracChangeset for help on using the changeset viewer.