Function wrapping implementation and Symtab extensions for undefined symbols
[dyninst.git] / patchAPI / h / Instrumenter.h
1 /* Plugin Interface */
2
3 #ifndef PATCHAPI_H_INSTRUMENTOR_H_
4 #define PATCHAPI_H_INSTRUMENTOR_H_
5
6 #include "common.h"
7 #include "Point.h"
8 #include "AddrSpace.h"
9 #include "Command.h"
10
11 namespace Dyninst {
12 namespace PatchAPI {
13
14 /* Relocate the original code and generate snippet binary code in mutatee's
15    address space. */
16
17 class Instrumenter : public BatchCommand {
18   public:
19     friend class Patcher;
20     PATCHAPI_EXPORT static InstrumenterPtr create(AddrSpacePtr as);
21     virtual ~Instrumenter() {}
22     /*
23     // Iterate all Objects and call their process method to do instrumentation
24     PATCHAPI_EXPORT virtual bool process();
25     */
26     // Code Modification interfaces
27
28     // Function Replacement
29     PATCHAPI_EXPORT virtual bool replaceFunction(PatchFunction* oldfunc,
30                                                  PatchFunction* newfunc);
31     PATCHAPI_EXPORT virtual bool revertReplacedFunction(PatchFunction* oldfunc);
32     virtual FuncModMap& funcRepMap() { return functionReplacements_; }
33
34     // Function Wrapping
35     PATCHAPI_EXPORT virtual bool wrapFunction(PatchFunction* oldfunc,
36                                               PatchFunction* newfunc,
37                                               std::string name);
38     PATCHAPI_EXPORT virtual bool revertWrappedFunction(PatchFunction* oldfunc);
39     virtual FuncWrapMap& funcWrapMap() { return functionWraps_; }
40
41     // Call Modification
42     PATCHAPI_EXPORT virtual bool modifyCall(PatchBlock *callBlock, PatchFunction *newCallee,
43                                     PatchFunction *context = NULL);
44     PATCHAPI_EXPORT virtual bool revertModifiedCall(PatchBlock *callBlock, PatchFunction *context = NULL);
45     PATCHAPI_EXPORT virtual bool removeCall(PatchBlock *callBlock, PatchFunction *context = NULL);
46     virtual CallModMap& callModMap() { return callModifications_; }
47
48     // Getters and setters
49     AddrSpacePtr as() const { return as_; }
50     void setAs(AddrSpacePtr as) { as_ = as; }
51
52   protected:
53     AddrSpacePtr as_;
54     CommandList user_commands_;
55     FuncModMap functionReplacements_;
56     FuncWrapMap functionWraps_;
57     CallModMap callModifications_;
58
59     explicit Instrumenter(AddrSpacePtr as) : as_(as) {}
60     Instrumenter() {}
61 };
62 }
63 }
64 #endif  // PATCHAPI_H_INSTRUMENTOR_H_