Changes in src/InitTweak/InitTweak.h [0bd3faf:e01eb4a]
- File:
-
- 1 edited
-
src/InitTweak/InitTweak.h (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/InitTweak/InitTweak.h
r0bd3faf re01eb4a 22 22 23 23 #include "AST/Fwd.hpp" // for AST nodes 24 #include "SynTree/SynTree.h" // for Visitor Nodes 24 25 25 26 // helper functions for initialization 26 27 namespace InitTweak { 28 const FunctionDecl * isAssignment( const Declaration * decl ); 29 const FunctionDecl * isDestructor( const Declaration * decl ); 30 const FunctionDecl * isDefaultConstructor( const Declaration * decl ); 31 const FunctionDecl * isCopyConstructor( const Declaration * decl ); 32 const FunctionDecl * isCopyFunction( const Declaration * decl, const std::string & fname ); 27 33 bool isAssignment( const ast::FunctionDecl * decl ); 28 34 bool isDestructor( const ast::FunctionDecl * decl ); … … 32 38 33 39 /// returns the base type of the first parameter to a constructor/destructor/assignment function 40 Type * getTypeofThis( FunctionType * ftype ); 34 41 const ast::Type * getTypeofThis( const ast::FunctionType * ftype ); 35 42 36 43 /// returns the first parameter of a constructor/destructor/assignment function 44 ObjectDecl * getParamThis( FunctionType * ftype ); 37 45 const ast::ObjectDecl * getParamThis(const ast::FunctionDecl * func); 38 46 39 47 /// generate a bitwise assignment operation. 48 ApplicationExpr * createBitwiseAssignment( Expression * dst, Expression * src ); 49 40 50 ast::Expr * createBitwiseAssignment( const ast::Expr * dst, const ast::Expr * src); 41 51 42 52 /// transform Initializer into an argument list that can be passed to a call expression 53 std::list< Expression * > makeInitList( Initializer * init ); 43 54 std::vector< ast::ptr< ast::Expr > > makeInitList( const ast::Init * init ); 44 55 45 56 /// True if the resolver should try to construct dwt 57 bool tryConstruct( DeclarationWithType * dwt ); 46 58 bool tryConstruct( const ast::DeclWithType * dwt ); 47 59 48 60 /// True if the type can have a user-defined constructor 61 bool isConstructable( Type * t ); 49 62 bool isConstructable( const ast::Type * t ); 50 63 51 64 /// True if the Initializer contains designations 65 bool isDesignated( Initializer * init ); 52 66 bool isDesignated( const ast::Init * init ); 53 67 54 68 /// True if the ObjectDecl's Initializer nesting level is not deeper than the depth of its 55 69 /// type, where the depth of its type is the number of nested ArrayTypes + 1 70 bool checkInitDepth( ObjectDecl * objDecl ); 56 71 bool checkInitDepth( const ast::ObjectDecl * objDecl ); 72 73 /// returns the declaration of the function called by the expr (must be ApplicationExpr or UntypedExpr) 74 DeclarationWithType * getFunction( Expression * expr ); 75 const DeclarationWithType * getFunction( const Expression * expr ); 76 77 /// Non-Null if expr is a call expression whose target function is intrinsic 78 ApplicationExpr * isIntrinsicCallExpr( Expression * expr ); 57 79 58 80 /// True if stmt is a call statement where the function called is intrinsic and takes one parameter. 59 81 /// Intended to be used for default ctor/dtor calls, but might have use elsewhere. 60 82 /// Currently has assertions that make it less than fully general. 83 bool isIntrinsicSingleArgCallStmt( Statement * stmt ); 61 84 bool isIntrinsicSingleArgCallStmt( const ast::Stmt * stmt ); 62 85 86 /// True if stmt is a call statement where the function called is intrinsic. 87 bool isIntrinsicCallStmt( Statement * stmt ); 88 63 89 /// get all Ctor/Dtor call expressions from a Statement 90 void collectCtorDtorCalls( Statement * stmt, std::list< Expression * > & matches ); 64 91 std::vector< const ast::Expr * > collectCtorDtorCalls( const ast::Stmt * stmt ); 65 92 93 /// get the Ctor/Dtor call expression from a Statement that looks like a generated ctor/dtor call 94 Expression * getCtorDtorCall( Statement * stmt ); 95 96 /// returns the name of the function being called 97 std::string getFunctionName( Expression * expr ); 98 99 /// returns the argument to a call expression in position N indexed from 0 100 Expression *& getCallArg( Expression * callExpr, unsigned int pos ); 101 102 /// returns the base type of a PointerType or ArrayType, else returns NULL 103 Type * getPointerBase( Type * ); 104 105 /// returns the argument if it is a PointerType or ArrayType, else returns NULL 106 Type * isPointerType( Type * ); 107 66 108 /// returns true if expr is trivially a compile-time constant 109 bool isConstExpr( Expression * expr ); 110 bool isConstExpr( Initializer * init ); 111 67 112 bool isConstExpr( const ast::Expr * expr ); 68 113 bool isConstExpr( const ast::Init * init ); … … 77 122 /// .section .data#,"a" 78 123 /// to avoid assembler warning "ignoring changed section attributes for .data" 124 void addDataSectionAttribute( ObjectDecl * objDecl ); 125 79 126 void addDataSectionAttribute( ast::ObjectDecl * objDecl ); 80 127 81 class InitExpander final { 128 class InitExpander_old { 129 public: 130 // expand by stepping through init to get each list of arguments 131 InitExpander_old( Initializer * init ); 132 133 // always expand to expr 134 InitExpander_old( Expression * expr ); 135 136 // iterator-like interface 137 std::list< Expression * > operator*(); 138 InitExpander_old & operator++(); 139 140 // builds statement which has the same semantics as a C-style list initializer 141 // (for array initializers) using callExpr as the base expression to perform initialization 142 Statement * buildListInit( UntypedExpr * callExpr ); 143 void addArrayIndex( Expression * index, Expression * dimension ); 144 void clearArrayIndices(); 145 bool addReference(); 146 147 class ExpanderImpl; 148 149 typedef std::list< Expression * > IndexList; 150 private: 151 std::shared_ptr< ExpanderImpl > expander; 152 std::list< Expression * > cur; 153 154 // invariant: list of size 2N (elements come in pairs [index, dimension]) 155 IndexList indices; 156 }; 157 158 class InitExpander_new { 82 159 public: 83 160 using IndexList = std::vector< ast::ptr< ast::Expr > >; … … 92 169 public: 93 170 /// Expand by stepping through init to get each list of arguments 94 InitExpander ( const ast::Init * init );171 InitExpander_new( const ast::Init * init ); 95 172 96 173 /// Always expand to expression 97 InitExpander ( const ast::Expr * expr );174 InitExpander_new( const ast::Expr * expr ); 98 175 99 176 std::vector< ast::ptr< ast::Expr > > operator* (); 100 InitExpander & operator++ ();177 InitExpander_new & operator++ (); 101 178 102 179 /// builds statement which has the same semantics as a C-style list initializer (for array … … 111 188 bool addReference(); 112 189 }; 113 } // namespace InitTweak190 } // namespace 114 191 115 192 // Local Variables: //
Note:
See TracChangeset
for help on using the changeset viewer.