source: src/MakeLibCfa.cc @ 83dccdd

ADTaaron-thesisarm-ehast-experimentalcleanup-dtorsctordeferred_resndemanglerenumforall-pointer-decayjacob/cs343-translationjenkins-sandboxmemorynew-astnew-ast-unique-exprnew-envno_listpersistent-indexerpthread-emulationqualifiedEnumresolv-newwith_gc
Last change on this file since 83dccdd was 845cedc, checked in by Rob Schluntz <rschlunt@…>, 9 years ago

don't generate copy constructor calls for arguments to intrinsic functions, copy constructors, assignment operators, and destructors, fix problem with copying result type of ImplicitCopyCtorExpr? which caused expression resolution to fail

  • Property mode set to 100644
File size: 3.9 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 : Rob Schluntz
12// Last Modified On : Fri Apr 22 13:54:15 2016
13// Update Count     : 40
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 "Common/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                if ( origFuncDecl->get_statements() ) return;
46
47                FunctionDecl *funcDecl = origFuncDecl->clone();
48                CodeGen::OperatorInfo opInfo;
49                bool lookResult = CodeGen::operatorLookup( funcDecl->get_name(), opInfo );
50                assert( lookResult );
51                assert( ! funcDecl->get_statements() );
52                UntypedExpr *newExpr = new UntypedExpr( new NameExpr( funcDecl->get_name() ) );
53                UniqueName paramNamer( "_p" );
54                std::list< DeclarationWithType* >::iterator param = funcDecl->get_functionType()->get_parameters().begin();
55                assert( param != funcDecl->get_functionType()->get_parameters().end() );
56
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 );
67
68                switch ( opInfo.type ) {
69                  case CodeGen::OT_INDEX:
70                  case CodeGen::OT_CALL:
71                  case CodeGen::OT_PREFIX:
72                  case CodeGen::OT_POSTFIX:
73                  case CodeGen::OT_INFIX:
74                  case CodeGen::OT_PREFIXASSIGN:
75                  case CodeGen::OT_POSTFIXASSIGN:
76                  case CodeGen::OT_INFIXASSIGN:
77                                funcDecl->get_statements()->get_kids().push_back( new ReturnStmt( std::list< Label >(), newExpr ) );
78                                break;
79                  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;
94                  case CodeGen::OT_DTOR:
95                        // intrinsic destructors should do nothing
96                        // delete newExpr;
97                        break;
98                  case CodeGen::OT_CONSTANT:
99                  case CodeGen::OT_LABELADDRESS:
100                        // there are no intrinsic definitions of 0/1 or label addresses as functions
101                        assert( false );
102                } // switch
103        }
104
105        void MakeLibCfa::visit( ObjectDecl* origObjDecl ) {
106                if ( origObjDecl->get_linkage() != LinkageSpec::Intrinsic ) return;
107
108                ObjectDecl *objDecl = origObjDecl->clone();
109                assert( ! objDecl->get_init() );
110                std::list< Expression* > noDesignators;
111                objDecl->set_init( new SingleInit( new NameExpr( objDecl->get_name() ), noDesignators, false ) ); // cannot be constructed
112                newDecls.push_back( objDecl );
113        }
114} // namespace LibCfa
Note: See TracBrowser for help on using the repository browser.