Update copyright to LGPL on all files
[dyninst.git] / dyninstAPI / h / BPatch_function.h
1 /*
2  * Copyright (c) 1996-2009 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as "Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * By your use of Paradyn, you understand and agree that we (or any
12  * other person or entity with proprietary rights in Paradyn) are
13  * under no obligation to provide either maintenance services,
14  * update services, notices of latent defects, or correction of
15  * defects for Paradyn.
16  * 
17  * This library is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU Lesser General Public
19  * License as published by the Free Software Foundation; either
20  * version 2.1 of the License, or (at your option) any later version.
21  * 
22  * This library is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25  * Lesser General Public License for more details.
26  * 
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30  */
31
32 #ifndef _BPatch_function_h_
33 #define _BPatch_function_h_
34
35 #include "Annotatable.h"
36 #include "BPatch_dll.h"
37 #include "BPatch_Vector.h"
38 #include "BPatch_point.h"
39 #include "BPatch_type.h"
40 #include "BPatch_module.h"
41 #include "BPatch_flowGraph.h"
42 #include "BPatch_eventLock.h"
43 #include "BPatch_memoryAccess_NP.h"
44 //#include "BPatch_dependenceGraphNode.h"
45 // class BPatch_dependenceGraphNode;
46
47 class int_function;
48 class process;
49 class InstrucIter;
50
51 class BPatch_localVarCollection;
52 class BPatch_function;
53 class BPatch_point;
54 class BPatch_flowGraph;
55
56 class BPatchTranslatorBase;
57 class ParameterType;
58 class ReturnParameterType;
59
60 #ifdef DYNINST_CLASS_NAME
61 #undef DYNINST_CLASS_NAME
62 #endif
63 #define DYNINST_CLASS_NAME BPatch_function
64
65 class BPATCH_DLL_EXPORT BPatch_function : 
66    public BPatch_sourceObj, 
67    public BPatch_eventLock,
68    public Dyninst::AnnotatableSparse
69 {
70     friend class BPatch_flowGraph;
71     friend class InstrucIter;
72     friend class BPatch_basicBlock;
73     friend class BPatch_asyncEventHandler;
74     friend class BPatch_image;
75     friend class BPatch_thread;
76     friend class BPatch_process;
77     friend class BPatch_binaryEdit;
78     friend class BPatch_addressSpace;
79     friend class BPatch_point;
80     friend BPatch_Vector<BPatch_point*> *findPoint(
81                      const BPatch_Set<BPatch_opCode>& ops,
82                                                    InstrucIter &ii, 
83                                                    BPatch_process *proc,
84                                                    BPatch_function *bpf);
85
86     //BPatch_process *proc;
87     BPatch_addressSpace *addSpace;
88     AddressSpace *lladdSpace;
89     BPatch_type *retType;
90     BPatch_Vector<BPatch_localVar *> params;
91     std::map<BPatch_localVar *, BPatch_variableExpr *> local_vars;
92     BPatch_module *mod;
93     BPatch_flowGraph* cfg;
94     bool cfgCreated;
95     bool liveInit;
96
97     BPatch_point* createMemInstPoint(void *addr, BPatch_memoryAccess* ma);
98
99     int_function *func;
100     bool varsAndParamsValid;
101
102 private:
103    void constructVarsAndParams();
104
105    void identifyParamDependencies(BPatch_function* callee, void* calleeAddress);
106 public:
107     virtual     ~BPatch_function();
108
109     // The following are for internal use by the library only:
110     int_function *lowlevel_func() const { return func; }
111     BPatch_process *getProc() const;
112     BPatch_addressSpace *getAddSpace() const { return addSpace; }
113
114     BPatch_function(BPatch_addressSpace *_addSpace, int_function *_func, 
115                     BPatch_module *mod = NULL);
116     BPatch_function(BPatch_addressSpace *_addSpace, int_function *_func,
117                     BPatch_type * _retType, 
118                     BPatch_module *);
119     bool getSourceObj(BPatch_Vector<BPatch_sourceObj *> &);
120     BPatch_sourceObj *getObjParent();
121     BPatch_localVarCollection * localVariables;
122     BPatch_localVarCollection * funcParameters;
123     void setReturnType(BPatch_type * _retType){retType = _retType;}
124     void setModule(BPatch_module *module) { if (this->mod == NULL) this->mod = module;}
125
126     void addParam(Dyninst::SymtabAPI::localVar *lvar);
127
128 //    void addParam(const char * _name, BPatch_type *_type, int _linenum,
129 //                  long _frameOffset, int _reg = -1,
130 //                  BPatch_storageClass _sc = BPatch_storageFrameOffset);
131     void fixupUnknown(BPatch_module *);
132     
133
134         // This isn't so much for internal use only, but it *should*
135         // remain undocumented for now.
136     bool containsSharedBlocks();
137
138
139
140     // End of functions for internal use only
141     
142
143     // For users of the library:
144
145         // This function should be deprecated.
146         API_EXPORT(Int, (start, end, filename, max),
147               bool,getLineAndFile,( unsigned int & start, unsigned int & end, 
148                                     char * filename, unsigned int max ));
149         
150         // This function should be deprecated.
151         API_EXPORT(Int, (lineNo, buffer, exactMatch),
152         bool,getLineToAddr,( unsigned short lineNo, BPatch_Vector< unsigned long > & buffer, bool exactMatch = true ));
153
154     //  BPatch_function::getName
155     //  Returns <demangled> name of function
156     API_EXPORT(Buffer, (s, len),     
157
158     char *,getName,(char *s, int len));
159
160
161     //  BPatch_function::getMangledName
162     //  Returns mangled name of function, same as getName for non-c++ mutatees
163     API_EXPORT(Int, (s, len),
164
165     char *,getMangledName,(char *s, int len));
166
167     //  BPatch_function::getTypedName
168     //  Returns demanged name of function (with type string), may be empty
169     API_EXPORT(Int, (s, len),
170
171     char *,getTypedName,(char *s, int len));
172
173     // BPatch_function::getNames
174     // Adds all names of the function (inc. weak symbols) to the
175     // provided vector. Names are represented as const char *s,
176     // and do not require cleanup by the user.
177
178     API_EXPORT(Int, (names),
179     bool, getNames, (BPatch_Vector<const char *> &names));
180
181     // BPatch_function::getMangledNames
182     // Adds all mangled names of the function (inc. weak symbols) to
183     // the provided vector. Names are represented as const char *s,
184     // and do not require cleanup by the user.
185
186     API_EXPORT(Int, (names),
187     bool, getMangledNames, (BPatch_Vector<const char *> &names));
188
189     //  BPatch_function::getBaseAddr
190     //  Returns base address of function
191     API_EXPORT(Int, (),
192
193     void *,getBaseAddr,(void));
194
195     //  BPatch_function::getSize
196     //  Returns the size of the function in bytes (end of last block - start of first block)
197     API_EXPORT(Int, (),
198
199     unsigned int,getSize,());
200
201     //  BPatch_function::getSize
202     //  Returns the number of contiguous bytes a function takes up following its entry point
203     //   This may be different from getSize if the function is disjoint
204     API_EXPORT(Int, (),
205     unsigned int,getContiguousSize,());
206
207     //  BPatch_function::getReturnType
208     //  Returns the <BPatch_type> return type of this function
209
210     API_EXPORT(Int, (),
211
212     BPatch_type *,getReturnType,());
213
214     //  BPatch_function::getModule
215     //  Returns the BPatch_module to which this function belongs
216
217     API_EXPORT(Int, (),
218
219     BPatch_module *,getModule,());
220     
221     //  BPatch_function::getParams
222     //  Returns a vector of BPatch_localVar, representing this function's parameters
223
224     API_EXPORT(Int, (),
225
226     BPatch_Vector<BPatch_localVar *> *,getParams,());
227
228     //  BPatch_function::getVars
229     //  Returns a vector of local variables in this functions
230
231     API_EXPORT(Int, (),
232
233     BPatch_Vector<BPatch_localVar *> *,getVars,());
234
235     //  BPatch_function::findPoint
236     //  Returns a vector of inst points, corresponding to the given BPatch_procedureLocation
237
238     API_EXPORT(Int, (loc),
239
240     BPatch_Vector<BPatch_point *> *,findPoint,(CONST_EXPORT BPatch_procedureLocation loc));
241
242     //  BPatch_function::findPoint
243     //  Returns a vector of inst points, corresponding to the given set of op codes
244
245     API_EXPORT(ByOp, (ops),
246
247     BPatch_Vector<BPatch_point *> *,findPoint,(const BPatch_Set<BPatch_opCode>& ops));
248
249     //  BPatch_function::findLocalVar
250     //  Returns a BPatch_localVar, if a match for <name> is found
251
252     API_EXPORT(Int, (name),
253
254     BPatch_localVar *,findLocalVar,(const char * name));
255
256     //  BPatch_function::findLocalParam
257     //  Returns a BPatch_localVar, if a match for <name> is found
258
259     API_EXPORT(Int, (name),
260
261     BPatch_localVar *,findLocalParam,(const char * name));
262
263     //  BPatch_function::findVariable
264     //  Returns a set of variables matching <name> at the scope of this function
265     //  -- or global scope, if nothing found in this scope 
266
267     API_EXPORT(Int, (name),
268     BPatch_Vector<BPatch_variableExpr *> *,findVariable,(const char *name));
269
270     API_EXPORT(Int, (name, vars),
271     bool, findVariable,(const char *name, BPatch_Vector<BPatch_variableExpr*> &vars));
272
273     //  BPatch_function::getVariables
274     //  This returns false, and should probably not exist.  See getVars.
275     //  is this defined, what variables should be returned??
276     //  FIXME (delete me)
277
278     API_EXPORT(Int, (vect),
279
280     bool,getVariables,(BPatch_Vector<BPatch_variableExpr *> &vect));
281
282     //  BPatch_function::getModuleName
283     //  Returns name of module this function belongs to
284
285     API_EXPORT(Int, (name, maxLen),
286
287     char *,getModuleName,(char *name, int maxLen));
288
289     //  BPatch_function::isInstrumentable
290     //  
291     // Returns true if the function is instrumentable.
292
293
294     API_EXPORT(Int, (),
295
296     bool,isInstrumentable,());
297
298     //  BPatch_function::isSharedLib
299     //  Returns true if this function lives in a shared library
300
301     API_EXPORT(Int, (),
302
303     bool,isSharedLib,());
304
305     //  BPatch_function::getCFG
306     //  
307     //  method to create the control flow graph for the function
308
309     API_EXPORT(Int, (),
310
311     BPatch_flowGraph*,getCFG,());
312
313     API_EXPORT(Int, (name, isPrimary, isMangled),
314     const char *, addName, (const char *name, bool isPrimary = true, bool isMangled = false));           
315
316     //  Return native pointer to the function. 
317     //  Allocates and returns a special type of BPatch_variableExpr.
318     API_EXPORT( Int, (), BPatch_variableExpr *, getFunctionRef, () );
319
320     // Get all functions that share a block (or any code, but it will
321     // always be a block) with this function.
322     API_EXPORT( Int, (funcs), bool, findOverlapping, (BPatch_Vector<BPatch_function *> &funcs));
323
324
325 #ifdef IBM_BPATCH_COMPAT
326     API_EXPORT(Int, (start, end),
327
328     bool,getLineNumbers,(unsigned int &start, unsigned int &end));
329
330     API_EXPORT(Int, (),
331
332     void *,getAddress,());
333
334     API_EXPORT(Int, (start, end),
335
336     bool,getAddressRange,(void * &start, void * &end));
337
338     API_EXPORT(Int, (),
339
340     BPatch_type *,returnType,());
341
342     API_EXPORT_V(Int, (vect),
343
344     void,getIncPoints,(BPatch_Vector<BPatch_point *> &vect));
345
346     API_EXPORT(Int, (),
347
348     int,getMangledNameLen,());
349
350     API_EXPORT_V(Int, (points),
351
352     void,getExcPoints,(BPatch_Vector<BPatch_point*> &points));
353
354
355     API_EXPORT(DPCL, (),
356
357     const char *,getName,());
358
359
360 #endif
361 };
362
363 #endif /* _BPatch_function_h_ */