source: src/MakeLibCfa.cc @ e56cfdb0

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 e56cfdb0 was 721f17a, checked in by Peter A. Buhr <pabuhr@…>, 9 years ago

fix OT_LABELADDRESS warning, parse genric types

  • Property mode set to 100644
File size: 3.7 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
7// MakeLibCfa.cc --
8//
9// Author           : Richard C. Bilson
10// Created On       : Sat May 16 10:33:33 2015
11// Last Modified By : Peter A. Buhr
12// Last Modified On : Fri Jun 26 16:52:59 2015
13// Update Count     : 14
14//
15
16#include "MakeLibCfa.h"
17#include "SynTree/Visitor.h"
18#include "SynTree/Declaration.h"
19#include "SynTree/Type.h"
20#include "SynTree/Expression.h"
21#include "SynTree/Statement.h"
22#include "SynTree/Initializer.h"
23#include "CodeGen/OperatorTable.h"
24#include "UniqueName.h"
25
26namespace LibCfa {
27        class MakeLibCfa : public Visitor {
28          public:
29                void visit( FunctionDecl* funcDecl );
30                void visit( ObjectDecl* objDecl );
31 
32                std::list< Declaration* > &get_newDecls() { return newDecls; }
33          private:
34                std::list< Declaration* > newDecls;
35        };
36
37        void makeLibCfa( std::list< Declaration* > &prelude ) {
38                MakeLibCfa maker;
39                acceptAll( prelude, maker );
40                prelude.splice( prelude.end(), maker.get_newDecls() );
41        }
42
43        void MakeLibCfa::visit( FunctionDecl* origFuncDecl ) {
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
56                if ( (*param)->get_name() == "" ) {
57                        (*param)->set_name( paramNamer.newName() );
58                        (*param)->set_linkage( LinkageSpec::C );
59                } // if
60
61                switch ( opInfo.type ) {
62                  case CodeGen::OT_INDEX:
63                  case CodeGen::OT_CALL:
64                  case CodeGen::OT_PREFIX:
65                  case CodeGen::OT_POSTFIX:
66                  case CodeGen::OT_INFIX:
67                        newExpr->get_args().push_back( new VariableExpr( *param ) );
68                        break;
69                  case CodeGen::OT_PREFIXASSIGN:
70                  case CodeGen::OT_POSTFIXASSIGN:
71                  case CodeGen::OT_INFIXASSIGN:
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 );
77                                break;
78                        }
79                  case CodeGen::OT_CONSTANT:
80                  case CodeGen::OT_LABELADDRESS:
81                        // there are no intrinsic definitions of 0/1 or label addresses as functions
82                        assert( false );
83                } // switch
84
85                for ( param++; param != funcDecl->get_functionType()->get_parameters().end(); ++param ) {
86                        if ( (*param)->get_name() == "" ) {
87                                (*param)->set_name( paramNamer.newName() );
88                                (*param)->set_linkage( LinkageSpec::C );
89                        }
90                        newExpr->get_args().push_back( new VariableExpr( *param ) );
91                } // for
92                funcDecl->set_statements( new CompoundStmt( std::list< Label >() ) );
93                funcDecl->get_statements()->get_kids().push_back( new ReturnStmt( std::list< Label >(), newExpr ) );
94                newDecls.push_back( funcDecl );
95        }
96
97        void MakeLibCfa::visit( ObjectDecl* origObjDecl ) {
98                if ( origObjDecl->get_linkage() != LinkageSpec::Intrinsic ) return;
99 
100                ObjectDecl *objDecl = origObjDecl->clone();
101                assert( ! objDecl->get_init() );
102                std::list< Expression* > noDesignators;
103                objDecl->set_init( new SingleInit( new NameExpr( objDecl->get_name() ), noDesignators ) );
104                newDecls.push_back( objDecl );
105        }
106} // namespace LibCfa
107
108// Local Variables: //
109// tab-width: 4 //
110// mode: c++ //
111// compile-command: "make install" //
112// End: //
Note: See TracBrowser for help on using the repository browser.