After tested under windows.
[dyninst.git] / dyninstAPI / src / Relocation / Transformers / Instrumenter.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 #if !defined(_R_T_INSTRUMENTER_H_)
33 #define _R_T_INSTRUMENTER_H_
34
35 #include "Transformer.h"
36 #include "dyninstAPI/src/instPoint.h"
37
38 class edge_instance;
39
40 namespace Dyninst {
41 namespace Relocation {
42
43 class Instrumenter : public Transformer {
44  public:
45
46   virtual bool process(RelocBlock *cur, RelocGraph *);
47   
48   Instrumenter() {};
49   
50   virtual ~Instrumenter() {};
51   
52  private:
53   typedef enum {
54     Before,
55     After } When;
56     
57   typedef std::pair<RelocBlock *, When> InsertPoint;  
58   typedef std::map<InsertPoint, std::list<RelocBlock *> > EdgeRelocBlocks;
59   typedef dyn_detail::boost::shared_ptr<CFWidget> CFWidgetPtr;
60
61   // The instrumenters that can add new RelocBlocks have the CFG as an
62   // argument
63   bool funcEntryInstrumentation(RelocBlock *trace, RelocGraph *cfg);
64   bool edgeInstrumentation(RelocBlock *trace, RelocGraph *cfg);
65   bool postCallInstrumentation(RelocBlock *trace, RelocGraph *cfg);
66
67   bool funcExitInstrumentation(RelocBlock *trace);
68   bool blockEntryInstrumentation(RelocBlock *trace);
69   bool preCallInstrumentation(RelocBlock *trace);
70   bool insnInstrumentation(RelocBlock *trace);
71
72   WidgetPtr makeInstrumentation(instPoint *point);
73
74   struct CallFallthroughPredicate {
75      bool operator()(RelocEdge *e);
76   };
77
78   struct EdgePredicate {
79
80         EdgePredicate(edge_instance *e) : e_(e) {}
81     bool operator()(RelocEdge *e);
82     edge_instance *e_;
83   };
84
85 };
86
87 };
88 };
89
90
91 #endif