Added some more #ifdef BPATCH_LIBRARYs to eliminate some Dyninst API
[dyninst.git] / dyninstAPI / src / inst-pvm.C
1
2 /*
3  * Copyright (c) 1996 Barton P. Miller
4  * 
5  * We provide the Paradyn Parallel Performance Tools (below
6  * described as Paradyn") on an AS IS basis, and do not warrant its
7  * validity or performance.  We reserve the right to update, modify,
8  * or discontinue this software at any time.  We shall have no
9  * obligation to supply such updates or modifications or any other
10  * form of support to you.
11  * 
12  * This license is for research uses.  For such uses, there is no
13  * charge. We define "research use" to mean you may freely use it
14  * inside your organization for whatever purposes you see fit. But you
15  * may not re-distribute Paradyn or parts of Paradyn, in any form
16  * source or binary (including derivatives), electronic or otherwise,
17  * to any other organization or entity without our permission.
18  * 
19  * (for other uses, please contact us at paradyn@cs.wisc.edu)
20  * 
21  * All warranties, including without limitation, any warranty of
22  * merchantability or fitness for a particular purpose, are hereby
23  * excluded.
24  * 
25  * By your use of Paradyn, you understand and agree that we (or any
26  * other person or entity with proprietary rights in Paradyn) are
27  * under no obligation to provide either maintenance services,
28  * update services, notices of latent defects, or correction of
29  * defects for Paradyn.
30  * 
31  * Even if advised of the possibility of such damages, under no
32  * circumstances shall we (or any other person or entity with
33  * proprietary rights in the software licensed hereunder) be liable
34  * to you or any third party for direct, indirect, or consequential
35  * damages of any character regardless of type of action, including,
36  * without limitation, loss of profits, loss of use, loss of good
37  * will, or computer failure or malfunction.  You agree to indemnify
38  * us (and any other person or entity with proprietary rights in the
39  * software licensed hereunder) for any and all liability it may
40  * incur to third parties resulting from your use of Paradyn.
41  */
42
43 /*
44  * inst-pvm.C - sunos specifc code for paradynd.
45  *
46  * $Log: inst-pvm.C,v $
47  * Revision 1.27  1997/09/28 22:22:30  buck
48  * Added some more #ifdef BPATCH_LIBRARYs to eliminate some Dyninst API
49  * library dependencies on files in rtinst.
50  *
51  * Revision 1.26  1997/02/21 20:13:28  naim
52  * Moving files from paradynd to dyninstAPI + moving references to dataReqNode
53  * out of the ast class. The is the first pre-dyninstAPI commit! - naim
54  *
55  * Revision 1.25  1997/01/16 22:04:34  tamches
56  * removed flushPtrace
57  *
58  * Revision 1.24  1996/10/31 08:48:12  tamches
59  * removed forkNodeProcess
60  *
61  * Revision 1.23  1996/08/16 21:18:57  tamches
62  * updated copyright for release 1.1
63  *
64  * Revision 1.22  1996/04/29 03:36:22  tamches
65  * computePauseTimeMetric now takes in a metric (but doesn't use it)
66  *
67  * Revision 1.21  1995/08/24 15:03:59  hollings
68  * AIX/SP-2 port (including option for split instruction/data heaps)
69  * Tracing of rexec (correctly spawns a paradynd if needed)
70  * Added rtinst function to read getrusage stats (can now be used in metrics)
71  * Critical Path
72  * Improved Error reporting in MDL sematic checks
73  * Fixed MDL Function call statement
74  * Fixed bugs in TK usage (strings passed where UID expected)
75  *
76  * Revision 1.20  1995/05/18  10:35:23  markc
77  * Removed tag dictionary
78  *
79  * Revision 1.19  1995/02/26  22:45:36  markc
80  * Updated to compile under new system.
81  *
82  * Revision 1.18  1995/02/16  08:33:24  markc
83  * Changed igen interfaces to use strings/vectors rather than char* igen-arrays
84  * Changed igen interfaces to use bool, not Boolean.
85  * Cleaned up symbol table parsing - favor properly labeled symbol table objects
86  * Updated binary search for modules
87  * Moved machine dependnent ptrace code to architecture specific files.
88  * Moved machine dependent code out of class process.
89  * Removed almost all compiler warnings.
90  * Use "posix" like library to remove compiler warnings
91  *
92  * Revision 1.17  1994/11/10  18:58:01  jcargill
93  * The "Don't Blame Me Either" commit
94  *
95  * Revision 1.16  1994/11/09  18:40:08  rbi
96  * the "Don't Blame Me" commit
97  *
98  * Revision 1.15  1994/11/02  11:06:18  markc
99  * Removed redundant code into inst.C
100  * Provide "tag" dictionary for known functions.
101  *
102  */
103
104 extern "C" {
105 #include "pvm3.h"
106 }
107
108 #include "dyninstAPI/src/dyninst.h"
109 #ifndef BPATCH_LIBRARY
110 #include "rtinst/h/trace.h"
111 #endif
112 #include "dyninstAPI/src/symtab.h"
113 #include "dyninstAPI/src/process.h"
114 #include "dyninstAPI/src/inst.h"
115 #include "dyninstAPI/src/instP.h"
116 #include "dyninstAPI/src/ast.h"
117 #include "dyninstAPI/src/util.h"
118 #include "util/h/String.h"
119 #include "util/h/Dictionary.h"
120 #include "paradynd/src/context.h"
121 #include "paradynd/src/perfStream.h"
122 #include "paradynd/src/metric.h"
123 #include "dyninstAPI/src/os.h"
124
125 string process::getProcessStatus() const
126 {
127    char ret[80];
128
129    switch (status()) {
130         case running:
131             sprintf(ret, "%d running", pid);
132             break;
133         case neonatal:
134             sprintf(ret, "%d neonatal", pid);
135             break;
136         case stopped:
137             sprintf(ret, "%d stopped", pid);
138             break;
139         case exited:
140             sprintf(ret, "%d exited", pid);
141             break;
142         default:
143             sprintf(ret, "%d UNKNOWN State", pid);
144             break;
145     }
146     return(ret);
147 }
148
149 /*
150  * machine specific init for PVM.
151  *
152  */
153 void machineInit()
154 {
155
156 }
157
158 //
159 // All costs are based on Measurements on a SPARC station 10/40.
160 //
161 void initPrimitiveCost()
162 {
163     /* Need to add code here to collect values for other machines */
164
165     // these happen async of the rest of the system.
166     primitiveCosts["DYNINSTalarmExpire"] = 1;
167     primitiveCosts["DYNINSTsampleValues"] = 1;
168     primitiveCosts["DYNINSTreportTimer"] = 1;
169     primitiveCosts["DYNINSTreportCounter"] = 1;
170     primitiveCosts["DYNINSTreportCost"] = 1;
171     primitiveCosts["DYNINSTreportNewTags"] = 1;
172     primitiveCosts["DYNINSTprintCost"] = 1;
173
174     // this doesn't really take any time
175     primitiveCosts["DYNINSTbreakPoint"] = 1;
176
177     // this happens before we start keeping time.
178     primitiveCosts["DYNINSTinit"] = 1;
179
180     // isthmus acutal numbers from 7/3/94 -- jkh
181     // 240 ns
182     primitiveCosts["DYNINSTincrementCounter"] = 16;
183     // 240 ns
184     primitiveCosts["DYNINSTdecrementCounter"] = 16;
185
186     // 23.39 usec * 85 mhz (SS-5)
187     // 20 cycles (DYNINSTstartWallTimer) +  17+8 (getWallTime)
188     primitiveCosts["DYNINSTstartWallTimer"] = 45;
189     // 42 cycles (DYNINSTstopWallTimer) +  2(17+8) (getWallTime)
190     primitiveCosts["DYNINSTstopWallTimer"] = 92;
191     // 1.61 usec * 85 Mhz (measured on a SS-5)
192     // 25 cycles (read clock) +  26 (startProcessTimer)
193     primitiveCosts["DYNINSTstartProcessTimer"] = 51;
194      // 3.38 usec * 85 mhz (measured on a SS-5)
195     // 61 cycles + 2*25 cycles to read clock
196     primitiveCosts["DYNINSTstopProcessTimer"] = 111;
197 }
198
199 /*
200  * Define the various classes of library functions to inst. 
201  *
202  */
203 void initLibraryFunctions()
204 {
205     machineInit();
206
207     /* should record waiting time in read/write, but have a conflict with
208      *   use of these functions by our inst code.
209      *   This happens when a CPUtimer that is stopped is stopped again by the
210      *   write.  It is then started again at the end of the write and should
211      *   not be running then.  We could let timers go negative, but this
212      *   causes a problem when inst is inserted into already running code.
213      *   Not sure what the best fix is - jkh 10/4/93
214      *
215      */
216 }
217
218 void instCleanup()
219 {
220     pvm_exit();
221 }
222
223
224 // 
225 // this has been copied from inst-sunos.C
226 //
227 float computePauseTimeMetric(const metricDefinitionNode *) {
228     // we don't need to use the metricDefinitionNode
229     timeStamp now;
230     timeStamp elapsed=0.0;
231
232     now = getCurrentTime(false);
233     if (firstRecordTime) {
234         elapsed = elapsedPauseTime;
235         if (isApplicationPaused())
236             elapsed += now - startPause;
237
238         assert(elapsed >= 0.0); 
239         return(elapsed);
240     } else {
241         return(0.0);
242     }
243 }