Made changes for dyninst API to dynamically link libdyninstAPI_RT.so.1.
[dyninst.git] / dyninstAPI_RT / h / rtinst.h
1 /*
2  * Copyright (c) 1996 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 /*
43  * This file contains the standard insrumentation functions that are provied
44  *   by the instrumentation layer.
45  *
46  */
47
48 #ifndef _RTINST_H
49 #define _RTINST_H
50
51 /* We sometimes include this into assembly files, so guard the struct defs. */
52 #if !defined(__ASSEMBLER__)
53
54 /* If we must make up a boolean type, we should make it unique */
55 #define RT_Boolean unsigned char
56 #define RT_TRUE 1
57 #define RT_FALSE 0
58
59 /*typedef void (*instFunc)(void *cdata, int type, char *eventData);*/
60
61 /* parameters to a instremented function */
62 typedef enum { processTime, wallTime } timerType;
63
64 /* 64 bit time values */
65 #if defined(i386_unknown_nt4_0)
66 typedef __int64 time64;
67 typedef __int64 int64;
68 #else
69 typedef long long int time64;
70 typedef long long int int64;
71 #endif
72
73 struct sampleIdRec {
74     unsigned int id;
75     /* formerly an aggregate bit, but that's now obsolete */
76 };
77 typedef struct sampleIdRec sampleId;
78
79 struct endStatsRec {
80     int alarms;
81     int numReported;
82     float instCycles;
83     float instTime;
84     float handlerCost;
85     float totalCpuTime;
86     int samplesReported;
87     float samplingRate;
88     float totalWallTime;
89     int userTicks;
90     int instTicks;
91 };
92
93
94
95 struct intCounterRec {
96    int value;           /* this field must be first for setValue to work -jkh */
97    sampleId id;
98     
99    unsigned char theSpinner;
100    /* mutex serving 2 purposes: (1) so paradynd won't sample while we're in middle of
101       updating and (2) so multiple LWPs or threads won't update at the same time */ 
102 };
103 typedef struct intCounterRec intCounter;
104
105 struct floatCounterRec {
106     float value;
107     sampleId id;
108 };
109 typedef struct floatCounterRec floatCounter;
110
111 #ifdef SHM_SAMPLING
112 struct tTimerRec {
113    volatile time64 total;
114    volatile time64 start;
115    volatile int counter;
116    volatile sampleId id; /* can be made obsolete in the near future */
117
118    /* the following 2 vrbles are used to implement consistent sampling.
119       Updating by rtinst works as follows: bump protector1, do action, then
120       bump protector2.  Shared-memory sampling by paradynd works as follows:
121       read protector2, read the 3 vrbles above, read protector1.  If
122       the 2 protector values differ then try again, else the sample got
123       a good snapshot.  Don't forget to be sure paradynd reads the protector
124       vrbles in the _opposite_ order that rtinst writes them!!! */
125    volatile int protector1;
126    volatile int protector2;
127 };
128 #else
129 struct tTimerRec {
130     volatile int        counter;        /* must be 0 to start; must be 1 to stop */
131     volatile time64     total;
132     volatile time64     start;
133     volatile time64     lastValue;      /* to check for rollback */
134     volatile time64     snapShot;       /* used to get consistant value 
135                                            during st/stp */
136     volatile int        normalize;      /* value to divide total by to 
137                                            get seconds */
138                                         /* always seems to be MILLION; can we get rid
139                                            of this? --ari */
140     volatile timerType  type;
141     volatile sampleId   id;
142     volatile char mutex;
143 /*    volatile char sampled; * is this used? */
144
145 /*   volatile unsigned char theSpinner; */
146    /* mutex serving 2 purposes: (1) so paradynd won't sample while we're in middle of
147       updating and (2) so multiple LWPs or threads won't update at the same time */ 
148 };
149 #endif
150 typedef struct tTimerRec tTimer;
151
152 typedef int traceStream;
153
154 void DYNINSTgenerateTraceRecord(traceStream sid, short type, 
155                                 short length,
156                                 void *eventData, int flush,
157                                 time64 wall_time,time64 process_time);
158 extern time64 DYNINSTgetCPUtime(void);
159 extern time64 DYNINSTgetWalltime(void);
160
161 #if defined(SHM_SAMPLING) && defined(MT_THREAD)
162 #define MAX_NUMBER_OF_THREADS (100)
163 #define MAX_NUMBER_OF_LEVELS (30)
164 extern int DYNINSTthreadPos(void);
165 extern int DYNINSTthreadSelf(void);
166 #endif
167
168 /*
169    The tramp table is used when we need to insert traps in instrumentation
170    points. It is used by the trap handler to lookup the base tramp for
171    an address (point).
172
173    The table is updated by the paradyn daemon.
174 */
175
176 #define TRAMPTABLESZ (4096)
177
178 #define HASH1(x) ((x) % TRAMPTABLESZ)
179 #define HASH2(x) (((x) % TRAMPTABLESZ-1) | 1)
180
181 typedef struct trampTableEntryStruct trampTableEntry;
182 struct trampTableEntryStruct {
183   unsigned key;
184   unsigned val;
185 };
186
187 #endif
188
189 /*
190  * Define the size of the per process data area.
191  *
192  *  This should be a power of two to reduce paging and chacing shifts.
193  */
194
195 /* The only possible problem with 1024*1024 instead of 1024*256 is that
196  * HP needs to handle longjumps in mini-trampolines...sparc doesn't have
197  * this problem until the size gets much bigger...
198  */
199
200 #define SYN_INST_BUF_SIZE       1024*1024*4
201
202 #endif