Introduction of the x86_64-unknown-linux2.4 platform. - - - - - - - - -
[dyninst.git] / dyninstAPI / src / BPatch_edge.C
1 /*
2  * Copyright (c) 1996-2004 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  * This license is for research uses.  For such uses, there is no
12  * charge. We define "research use" to mean you may freely use it
13  * inside your organization for whatever purposes you see fit. But you
14  * may not re-distribute Paradyn or parts of Paradyn, in any form
15  * source or binary (including derivatives), electronic or otherwise,
16  * to any other organization or entity without our permission.
17  * 
18  * (for other uses, please contact us at paradyn@cs.wisc.edu)
19  * 
20  * All warranties, including without limitation, any warranty of
21  * merchantability or fitness for a particular purpose, are hereby
22  * excluded.
23  * 
24  * By your use of Paradyn, you understand and agree that we (or any
25  * other person or entity with proprietary rights in Paradyn) are
26  * under no obligation to provide either maintenance services,
27  * update services, notices of latent defects, or correction of
28  * defects for Paradyn.
29  * 
30  * Even if advised of the possibility of such damages, under no
31  * circumstances shall we (or any other person or entity with
32  * proprietary rights in the software licensed hereunder) be liable
33  * to you or any third party for direct, indirect, or consequential
34  * damages of any character regardless of type of action, including,
35  * without limitation, loss of profits, loss of use, loss of good
36  * will, or computer failure or malfunction.  You agree to indemnify
37  * us (and any other person or entity with proprietary rights in the
38  * software licensed hereunder) for any and all liability it may
39  * incur to third parties resulting from your use of Paradyn.
40  */
41
42 #define BPATCH_FILE
43
44 #include "util.h"
45 #include "symtab.h"
46
47 #include "BPatch_edge.h"
48 #include "BPatch_flowGraph.h"
49 #include "BPatch_basicBlock.h"
50
51 // for setting instPoint->addrInFuc
52 #include "instPoint.h" 
53
54 pdstring 
55 edge_type_string(BPatch_edgeType t)
56
57     pdstring ts = "Invalid Edge Type";
58     switch (t) {
59     case CondJumpTaken: { ts = "CondJumpTaken"; break; }
60     case CondJumpNottaken: { ts = "CondJumpNottaken"; break; }
61     case UncondJump: { ts = "UncondJump"; break; } 
62     case NonJump: { ts = "NonJump"; break; }
63     }
64     return ts;
65 }
66
67
68 #if defined(arch_x86) || defined(arch_x86_64)
69 BPatch_edgeType 
70 BPatch_edge::getType()
71 {
72     unsigned itype;
73
74     get_instruction(relocationPointer, itype);
75
76     // XXX indirect jumps not handled  (itype & INDIR)
77
78     if ((itype & IS_JUMP) || (itype & IS_JCC)) 
79         if (itype & IS_JCC) 
80             if (source->getRelEnd() == target->getRelStart()) 
81                 return CondJumpNottaken;
82             else 
83                 return CondJumpTaken;
84         else 
85             return UncondJump;
86     else 
87         return NonJump;
88 }
89 #else
90 //XXX loop port
91 BPatch_edgeType
92 BPatch_edge::getType()
93 {
94     return NonJump;
95 }
96 #endif
97
98
99 void BPatch_edge::BPatch_edgeInt(BPatch_basicBlock *s, 
100                          BPatch_basicBlock *t, 
101                          BPatch_flowGraph *fg,
102                          const unsigned char *rp)
103
104 {
105     assert(s != NULL);
106     assert(t != NULL);
107     
108     source = s;
109     target = t;
110     flowGraph = fg;
111     relocationPointer = rp;
112     // point is set when this edge is instrumented. instAddr is set
113     // when either this edge or its conditional buddy is instrumented
114     point = NULL;    
115     instAddr = NULL; 
116     conditionalBuddy = NULL;
117
118     type = getType();
119
120     Address addrInFunc = 0;
121 }
122
123  
124 void BPatch_edge::BPatch_edge_dtor()
125 {
126     fprintf(stderr,"~BPatch_edge\n");
127 }
128
129
130 void BPatch_edge::dumpInt()
131 {
132     pdstring ts = edge_type_string(type);
133
134 //     fprintf(stderr," %3u --> %3u\n",
135 //             source->blockNo(),
136 //             target->blockNo());
137
138 //     fprintf(stderr,"  (b%u 0x%x 0x%x) --> (b%u 0x%x 0x%x)\n",
139 //             source->blockNo(),
140 //             source->getRelStart(),
141 //             source->getRelLast(),
142 //             target->blockNo(),
143 //             target->getRelStart(),
144 //             target->getRelLast());
145
146     fprintf(stderr," 0x%x, 0x%x --> 0x%x, 0x%x %s\n",
147             source->getRelStart(),
148             source->getRelLast(),
149             target->getRelStart(),
150             target->getRelLast(),
151             edge_type_string(type).c_str());
152
153 }
154
155
156 // Only edges created by conditional jumps need edge trampolines
157 bool BPatch_edge::needsEdgeTrampInt()
158 {
159     return type == CondJumpNottaken || type == CondJumpTaken;
160 }
161
162
163 BPatch_point *
164 BPatch_edge::instPoint()
165 {
166     if (!point)
167         point = flowGraph->createInstPointAtEdge(this);
168     // the above may fail
169     if (point)
170         // set instPoint's addrInFunc field for catchup to use
171         (point->getPoint())->addrInFunc = addrInFunc;
172     return point;
173 }
174