source: translator/MakeLibCfa.cc@ 643a2e1

ADT aaron-thesis arm-eh ast-experimental cleanup-dtors ctor deferred_resn demangler enum forall-pointer-decay gc_noraii jacob/cs343-translation jenkins-sandbox memory new-ast new-ast-unique-expr new-env no_list persistent-indexer pthread-emulation qualifiedEnum resolv-new string with_gc
Last change on this file since 643a2e1 was 51b73452, checked in by Peter A. Buhr <pabuhr@…>, 11 years ago

initial commit

  • Property mode set to 100644
File size: 3.1 KB
Line 
1/*
2 * This file is part of the Cforall project
3 *
4 * $Id: MakeLibCfa.cc,v 1.6 2005/08/29 20:14:14 rcbilson Exp $
5 *
6 */
7
8#include "MakeLibCfa.h"
9#include "SynTree/Declaration.h"
10#include "SynTree/Type.h"
11#include "SynTree/Expression.h"
12#include "SynTree/Statement.h"
13#include "SynTree/Initializer.h"
14#include "SynTree/Visitor.h"
15#include "CodeGen/OperatorTable.h"
16#include "UniqueName.h"
17
18
19namespace LibCfa {
20
21class MakeLibCfa : public Visitor
22{
23public:
24 void visit( FunctionDecl* funcDecl );
25 void visit( ObjectDecl* objDecl );
26
27 std::list< Declaration* > &get_newDecls() { return newDecls; }
28
29private:
30 std::list< Declaration* > newDecls;
31};
32
33void
34makeLibCfa( std::list< Declaration* > &prelude )
35{
36 MakeLibCfa maker;
37 acceptAll( prelude, maker );
38 prelude.splice( prelude.end(), maker.get_newDecls() );
39}
40
41void
42MakeLibCfa::visit( FunctionDecl* origFuncDecl )
43{
44 if( origFuncDecl->get_linkage() != LinkageSpec::Intrinsic ) return;
45
46 FunctionDecl *funcDecl = origFuncDecl->clone();
47 CodeGen::OperatorInfo opInfo;
48 bool lookResult = CodeGen::operatorLookup( funcDecl->get_name(), opInfo );
49 assert( lookResult );
50 assert( !funcDecl->get_statements() );
51 UntypedExpr *newExpr = new UntypedExpr( new NameExpr( funcDecl->get_name() ) );
52 UniqueName paramNamer( "_p" );
53 std::list< DeclarationWithType* >::iterator param = funcDecl->get_functionType()->get_parameters().begin();
54 assert( param != funcDecl->get_functionType()->get_parameters().end() );
55 if( (*param)->get_name() == "" ) {
56 (*param)->set_name( paramNamer.newName() );
57 (*param)->set_linkage( LinkageSpec::C );
58 }
59 switch( opInfo.type ) {
60 case CodeGen::OT_INDEX:
61 case CodeGen::OT_CALL:
62 case CodeGen::OT_PREFIX:
63 case CodeGen::OT_POSTFIX:
64 case CodeGen::OT_INFIX:
65 newExpr->get_args().push_back( new VariableExpr( *param ) );
66 break;
67
68 case CodeGen::OT_PREFIXASSIGN:
69 case CodeGen::OT_POSTFIXASSIGN:
70 case CodeGen::OT_INFIXASSIGN:
71 {
72 newExpr->get_args().push_back( new VariableExpr( *param ) );
73/// UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) );
74/// deref->get_args().push_back( new VariableExpr( *param ) );
75/// newExpr->get_args().push_back( deref );
76 break;
77 }
78
79 case CodeGen::OT_CONSTANT:
80 assert( false );
81 }
82 for( param++; param != funcDecl->get_functionType()->get_parameters().end(); ++param ) {
83 if( (*param)->get_name() == "" ) {
84 (*param)->set_name( paramNamer.newName() );
85 (*param)->set_linkage( LinkageSpec::C );
86 }
87 newExpr->get_args().push_back( new VariableExpr( *param ) );
88 }
89 funcDecl->set_statements( new CompoundStmt( std::list< Label >() ) );
90 funcDecl->get_statements()->get_kids().push_back( new ReturnStmt( std::list< Label >(), newExpr ) );
91 newDecls.push_back( funcDecl );
92}
93
94void
95MakeLibCfa::visit( ObjectDecl* origObjDecl )
96{
97 if( origObjDecl->get_linkage() != LinkageSpec::Intrinsic ) return;
98
99 ObjectDecl *objDecl = origObjDecl->clone();
100 assert( !objDecl->get_init() );
101 std::list< Expression* > noDesignators;
102 objDecl->set_init( new SingleInit( new NameExpr( objDecl->get_name() ), noDesignators ) );
103 newDecls.push_back( objDecl );
104}
105
106} // namespace LibCfa
Note: See TracBrowser for help on using the repository browser.