Documentation update for 10.2 Release (#788)
[dyninst.git] / dyninstAPI / src / BPatch_edge.C
1 /*
2  * See the dyninst/COPYRIGHT file for copyright information.
3  * 
4  * We provide the Paradyn Tools (below described as "Paradyn")
5  * on an AS IS basis, and do not warrant its validity or performance.
6  * We reserve the right to update, modify, or discontinue this
7  * software at any time.  We shall have no obligation to supply such
8  * updates or modifications or any other form of support to you.
9  * 
10  * By your use of Paradyn, you understand and agree that we (or any
11  * other person or entity with proprietary rights in Paradyn) are
12  * under no obligation to provide either maintenance services,
13  * update services, notices of latent defects, or correction of
14  * defects for Paradyn.
15  * 
16  * This library is free software; you can redistribute it and/or
17  * modify it under the terms of the GNU Lesser General Public
18  * License as published by the Free Software Foundation; either
19  * version 2.1 of the License, or (at your option) any later version.
20  * 
21  * This library is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
24  * Lesser General Public License for more details.
25  * 
26  * You should have received a copy of the GNU Lesser General Public
27  * License along with this library; if not, write to the Free Software
28  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29  */
30
31 #define BPATCH_FILE
32
33 #include "util.h"
34 #include "function.h"
35 #include "BPatch_edge.h"
36 #include "BPatch_flowGraph.h"
37 #include "BPatch_basicBlock.h"
38 #include "instPoint.h"
39 #include "BPatch_process.h"
40 #include "BPatch_point.h"
41
42 #include "Parsing.h"
43
44 using namespace Dyninst;
45
46 string 
47 edge_type_string(BPatch_edgeType t)
48
49     string ts = "Invalid Edge Type";
50     switch (t) {
51     case CondJumpTaken: { ts = "CondJumpTaken"; break; }
52     case CondJumpNottaken: { ts = "CondJumpNottaken"; break; }
53     case UncondJump: { ts = "UncondJump"; break; } 
54     case NonJump: { ts = "NonJump"; break; }
55     }
56     return ts;
57 }
58
59
60 BPatch_edgeType 
61 BPatch_edge::getType()
62 {
63    switch(edge->type()) {
64    case ParseAPI::NOEDGE:
65          return NonJump;
66    case ParseAPI::COND_TAKEN:
67          return CondJumpTaken;
68    case ParseAPI::COND_NOT_TAKEN:
69          return CondJumpNottaken;
70    case ParseAPI::DIRECT:
71    case ParseAPI::INDIRECT:
72          return UncondJump;
73       default:
74          return NonJump;
75    }
76 }
77
78
79 BPatch_edge::BPatch_edge(edge_instance *e, 
80    BPatch_flowGraph *FG)
81 {
82    assert(e);
83    edge = e;
84    fg = FG;
85    
86    // point is set when this edge is instrumented. instAddr is set
87    // when either this edge or its conditional buddy is instrumented
88    point = NULL;    
89 }
90
91  
92 BPatch_edge::~BPatch_edge()
93 {
94     //fprintf(stderr,"~BPatch_edge\n");
95 }
96
97
98 void BPatch_edge::dump()
99 {
100 }
101
102 BPatch_basicBlock *BPatch_edge::getSource() {
103    return fg->findBlock(edge->src());
104 }
105
106 BPatch_basicBlock *BPatch_edge::getTarget() {
107    return fg->findBlock(edge->trg());
108 }
109
110 BPatch_flowGraph *BPatch_edge::getFlowGraph() {
111    return fg;
112 }
113
114 BPatch_point *BPatch_edge::getPoint()
115 {
116    if (!point) {
117       BPatch_flowGraph *cfg = getFlowGraph();
118       instPoint *ip = instPoint::edge(cfg->ll_func(),
119                                       edge);
120       AddressSpace *as = cfg->getllAddSpace();
121       assert(as);
122       
123       BPatch_point *newPoint = new BPatch_point(cfg->getAddSpace(),
124                                                 cfg->getFunction(),
125                                                 this,
126                                                 ip,
127                                                 as);
128       if (newPoint) {
129          point = newPoint;
130       }
131    }
132    return point;
133 }
134
135 PatchAPI::PatchEdge *PatchAPI::convert(const BPatch_edge *e) {
136    return e->edge;
137 }
138
139 ParseAPI::Edge *ParseAPI::convert(const BPatch_edge *e) {
140    return e->edge->edge();
141 }