After tested under windows.
[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
10 namespace Dyninst {
11 namespace PatchAPI {
12
13 /* Relocate the original code and generate snippet binary code in mutatee's
14    address space. */
15
16 class Instrumenter {
17   public:
18     PATCHAPI_EXPORT static InstrumenterPtr create(AddrSpacePtr as);
19     virtual ~Instrumenter() {}
20
21     // Iterate all Objects and call their process method to do instrumentation
22     PATCHAPI_EXPORT virtual bool process();
23
24     // Code Modification interfaces
25
26     // Function Replacement
27     PATCHAPI_EXPORT virtual bool replaceFunction(PatchFunction* oldfunc,
28                                                  PatchFunction* newfunc);
29     PATCHAPI_EXPORT virtual bool revertReplacedFunction(PatchFunction* oldfunc);
30     virtual FuncModMap& funcRepMap() { return functionReplacements_; }
31
32     // Function Wrapping
33     PATCHAPI_EXPORT virtual bool wrapFunction(PatchFunction* oldfunc,
34                                               PatchFunction* newfunc);
35     PATCHAPI_EXPORT virtual bool revertWrappedFunction(PatchFunction* oldfunc);
36     virtual FuncModMap& funcWrapMap() { return functionWraps_; }
37
38     // Call Modification
39     PATCHAPI_EXPORT bool modifyCall(PatchBlock *callBlock, PatchFunction *newCallee,
40                                     PatchFunction *context = NULL);
41     PATCHAPI_EXPORT bool revertModifiedCall(PatchBlock *callBlock, PatchFunction *context = NULL);
42     PATCHAPI_EXPORT bool removeCall(PatchBlock *callBlock, PatchFunction *context = NULL);
43     CallModMap& callModMap() { return callModifications_; }
44
45     // Getters and setters
46     AddrSpacePtr as() const { return as_; }
47     void setAs(AddrSpacePtr as) { as_ = as; }
48   protected:
49     AddrSpacePtr as_;
50     FuncModMap functionReplacements_;
51     FuncModMap functionWraps_;
52     CallModMap callModifications_;
53
54     explicit Instrumenter(AddrSpacePtr as) : as_(as) {}
55     Instrumenter() {}
56 };
57 }
58 }
59 #endif  // PATCHAPI_H_INSTRUMENTOR_H_