source: translator/MakeLibCfa.cc @ ea3eb06

ADTaaron-thesisarm-ehast-experimentalcleanup-dtorsctordeferred_resndemanglerenumforall-pointer-decaygc_noraiijacob/cs343-translationjenkins-sandboxmemorynew-astnew-ast-unique-exprnew-envno_listpersistent-indexerpthread-emulationqualifiedEnumresolv-newstringwith_gc
Last change on this file since ea3eb06 was 51b7345, checked in by Peter A. Buhr <pabuhr@…>, 10 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.