Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/MakeLibCfa.cc

    r845cedc r2794fff  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // MakeLibCfa.cc --
     7// MakeLibCfa.cc -- 
    88//
    99// Author           : Richard C. Bilson
    1010// Created On       : Sat May 16 10:33:33 2015
    1111// Last Modified By : Rob Schluntz
    12 // Last Modified On : Fri Apr 22 13:54:15 2016
    13 // Update Count     : 40
    14 //
     12// Last Modified On : Fri Jul 03 18:11:37 2015
     13// Update Count     : 18
     14// 
    1515
    1616#include "MakeLibCfa.h"
     
    2222#include "SynTree/Initializer.h"
    2323#include "CodeGen/OperatorTable.h"
    24 #include "Common/UniqueName.h"
     24#include "UniqueName.h"
    2525
    2626namespace LibCfa {
     
    2929                void visit( FunctionDecl* funcDecl );
    3030                void visit( ObjectDecl* objDecl );
    31 
     31 
    3232                std::list< Declaration* > &get_newDecls() { return newDecls; }
    3333          private:
     
    4343        void MakeLibCfa::visit( FunctionDecl* origFuncDecl ) {
    4444                if ( origFuncDecl->get_linkage() != LinkageSpec::Intrinsic ) return;
    45                 if ( origFuncDecl->get_statements() ) return;
    46 
     45 
    4746                FunctionDecl *funcDecl = origFuncDecl->clone();
    4847                CodeGen::OperatorInfo opInfo;
     
    5554                assert( param != funcDecl->get_functionType()->get_parameters().end() );
    5655
    57                 for ( ; param != funcDecl->get_functionType()->get_parameters().end(); ++param ) {
    58                         if ( (*param)->get_name() == "" ) {
    59                                 (*param)->set_name( paramNamer.newName() );
    60                                 (*param)->set_linkage( LinkageSpec::C );
    61                         }
    62                         newExpr->get_args().push_back( new VariableExpr( *param ) );
    63                 } // for
    64 
    65                 funcDecl->set_statements( new CompoundStmt( std::list< Label >() ) );
    66                 newDecls.push_back( funcDecl );
     56                if ( (*param)->get_name() == "" ) {
     57                        (*param)->set_name( paramNamer.newName() );
     58                        (*param)->set_linkage( LinkageSpec::C );
     59                } // if
    6760
    6861                switch ( opInfo.type ) {
     
    7265                  case CodeGen::OT_POSTFIX:
    7366                  case CodeGen::OT_INFIX:
     67                        newExpr->get_args().push_back( new VariableExpr( *param ) );
     68                        break;
    7469                  case CodeGen::OT_PREFIXASSIGN:
    7570                  case CodeGen::OT_POSTFIXASSIGN:
    7671                  case CodeGen::OT_INFIXASSIGN:
    77                                 funcDecl->get_statements()->get_kids().push_back( new ReturnStmt( std::list< Label >(), newExpr ) );
     72                        {
     73                                newExpr->get_args().push_back( new VariableExpr( *param ) );
     74                                // UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) );
     75                                // deref->get_args().push_back( new VariableExpr( *param ) );
     76                                // newExpr->get_args().push_back( deref );
    7877                                break;
     78                        }
    7979                  case CodeGen::OT_CTOR:
    80                         // ctors don't return a value
    81                         if ( funcDecl->get_functionType()->get_parameters().size() == 1 ) {
    82                                 // intrinsic default constructors should do nothing
    83                                 // delete newExpr;
    84                                 break;
    85                         } else {
    86                                 assert( funcDecl->get_functionType()->get_parameters().size() == 2 );
    87                                 // anything else is a single parameter constructor that is effectively a C-style assignment
    88                                 // delete newExpr->get_function();
    89                                 assert(newExpr->get_args().size()==2);
    90                                 newExpr->set_function( new NameExpr( "?=?" ) );
    91                                 funcDecl->get_statements()->get_kids().push_back( new ExprStmt( std::list< Label >(), newExpr ) );
    92                         }
    93                         break;
    9480                  case CodeGen::OT_DTOR:
    95                         // intrinsic destructors should do nothing
    96                         // delete newExpr;
    97                         break;
    9881                  case CodeGen::OT_CONSTANT:
    9982                  case CodeGen::OT_LABELADDRESS:
     
    10184                        assert( false );
    10285                } // switch
     86
     87                for ( param++; param != funcDecl->get_functionType()->get_parameters().end(); ++param ) {
     88                        if ( (*param)->get_name() == "" ) {
     89                                (*param)->set_name( paramNamer.newName() );
     90                                (*param)->set_linkage( LinkageSpec::C );
     91                        }
     92                        newExpr->get_args().push_back( new VariableExpr( *param ) );
     93                } // for
     94                funcDecl->set_statements( new CompoundStmt( std::list< Label >() ) );
     95                funcDecl->get_statements()->get_kids().push_back( new ReturnStmt( std::list< Label >(), newExpr ) );
     96                newDecls.push_back( funcDecl );
    10397        }
    10498
    10599        void MakeLibCfa::visit( ObjectDecl* origObjDecl ) {
    106100                if ( origObjDecl->get_linkage() != LinkageSpec::Intrinsic ) return;
    107 
     101 
    108102                ObjectDecl *objDecl = origObjDecl->clone();
    109103                assert( ! objDecl->get_init() );
    110104                std::list< Expression* > noDesignators;
    111                 objDecl->set_init( new SingleInit( new NameExpr( objDecl->get_name() ), noDesignators, false ) ); // cannot be constructed
     105                objDecl->set_init( new SingleInit( new NameExpr( objDecl->get_name() ), noDesignators ) );
    112106                newDecls.push_back( objDecl );
    113107        }
    114108} // namespace LibCfa
     109
     110// Local Variables: //
     111// tab-width: 4 //
     112// mode: c++ //
     113// compile-command: "make install" //
     114// End: //
Note: See TracChangeset for help on using the changeset viewer.