source: src/MakeLibCfa.cc@ f48ed47

ADT aaron-thesis arm-eh ast-experimental cleanup-dtors ctor deferred_resn demangler enum forall-pointer-decay jacob/cs343-translation jenkins-sandbox memory new-ast new-ast-unique-expr new-env no_list persistent-indexer pthread-emulation qualifiedEnum resolv-new with_gc
Last change on this file since f48ed47 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.