Enables support for mutatees built with the Intel Compiler on IA-64.
[dyninst.git] / dyninstAPI / src / inst-ia64.h
1 /* -*- Mode: C; indent-tabs-mode: true -*-; tab-width: 4 */
2
3 /*
4  * Copyright (c) 1996-2004 Barton P. Miller
5  * 
6  * We provide the Paradyn Parallel Performance Tools (below
7  * described as "Paradyn") on an AS IS basis, and do not warrant its
8  * validity or performance.  We reserve the right to update, modify,
9  * or discontinue this software at any time.  We shall have no
10  * obligation to supply such updates or modifications or any other
11  * form of support to you.
12  * 
13  * This license is for research uses.  For such uses, there is no
14  * charge. We define "research use" to mean you may freely use it
15  * inside your organization for whatever purposes you see fit. But you
16  * may not re-distribute Paradyn or parts of Paradyn, in any form
17  * source or binary (including derivatives), electronic or otherwise,
18  * to any other organization or entity without our permission.
19  * 
20  * (for other uses, please contact us at paradyn@cs.wisc.edu)
21  * 
22  * All warranties, including without limitation, any warranty of
23  * merchantability or fitness for a particular purpose, are hereby
24  * excluded.
25  * 
26  * By your use of Paradyn, you understand and agree that we (or any
27  * other person or entity with proprietary rights in Paradyn) are
28  * under no obligation to provide either maintenance services,
29  * update services, notices of latent defects, or correction of
30  * defects for Paradyn.
31  * 
32  * Even if advised of the possibility of such damages, under no
33  * circumstances shall we (or any other person or entity with
34  * proprietary rights in the software licensed hereunder) be liable
35  * to you or any third party for direct, indirect, or consequential
36  * damages of any character regardless of type of action, including,
37  * without limitation, loss of profits, loss of use, loss of good
38  * will, or computer failure or malfunction.  You agree to indemnify
39  * us (and any other person or entity with proprietary rights in the
40  * software licensed hereunder) for any and all liability it may
41  * incur to third parties resulting from your use of Paradyn.
42  */
43
44 // $Id: inst-ia64.h,v 1.14 2004/08/16 04:33:26 rchen Exp $
45
46 #ifndef INST_IA64_H
47 #define INST_IA64_H
48
49 #include "common/h/Types.h"     // Address
50 class process;
51 class IA64_bundle;
52 class IA64_instruction;
53
54 /* Stores locations of pre-baseTramp registers */
55 #define BP_GR0          0               //   0-127
56 #define BP_BR0          128             // 128-135
57 #define BP_PR           136             // 136
58 #define BP_AR0          137             // 137-264
59 #define BP_R_MAX        (BP_AR0 + 128)
60
61 /* aliases */
62 #define BP_KR0          BP_AR0
63 #define BP_AR_CSD       (BP_AR0 + 25)
64 #define BP_AR_SSD       (BP_AR0 + 26)
65 #define BP_AR_CCV       (BP_AR0 + 32)
66 #define BP_AR_PFS       (BP_AR0 + 64)
67
68 /* Required for ast.C */
69 #define REG_MT_POS      13
70
71 class InsnAddr {
72         public:
73                 /* prefix increment */
74                 InsnAddr operator++ ();
75
76                 /* prefix decrement */
77                 InsnAddr operator-- ();
78
79                 /* postfix increment */
80                 InsnAddr operator++ (int dummy);
81
82                 /* postfix decrement */
83                 InsnAddr operator-- (int dummy);
84
85                 /* sum of two InsnAddrs */
86                 friend InsnAddr operator + ( InsnAddr lhs, InsnAddr rhs );
87
88                 /* difference of two InsnAddrs */
89                 friend InsnAddr operator - ( InsnAddr lhs, InsnAddr rhs );
90
91                 /* Returns the left-aligned instruction at this address. */
92                 uint64_t operator * ();
93
94                 friend bool operator < ( InsnAddr lhs, InsnAddr rhs );
95                 friend bool operator <= ( InsnAddr lhs, InsnAddr rhs );
96                 friend bool operator > ( InsnAddr lhs, InsnAddr rhs );
97                 friend bool operator >= ( InsnAddr lhs, InsnAddr rhs );
98                 friend bool operator == ( InsnAddr lhs, InsnAddr rhs );
99                 friend bool operator != ( InsnAddr lhs, InsnAddr rhs );
100
101                 static InsnAddr generateFromAlignedDataAddress( Address addr, process * p );
102                 bool writeMyBundleFrom( const unsigned char * savedCodeBuffer );
103                 bool saveMyBundleTo( unsigned char * savedCodeBuffer );
104                 bool saveBundlesTo( unsigned char * savedCodeBuffer, unsigned int numberOfBundles );
105                 bool writeBundlesFrom( unsigned char * savedCodeBuffer, unsigned int numberOfBundles );
106                 bool replaceBundleWith( const IA64_bundle & bundle );
107                 bool replaceBundlesWith( const IA64_bundle * replacementBundles, unsigned int numberOfReplacementBundles );
108                 bool writeStringAtOffset( unsigned int offsetInBundles, const char * pdstring, unsigned int length );
109
110         private:
111                 InsnAddr( Address addr, process * p ) : encodedAddress( addr ), myProc( p ) { }
112                 Address encodedAddress;
113                 process * myProc;
114 }; /* end class InsnAddr */
115
116 #include "arch-ia64.h"
117
118 class IA64_iterator {
119         /* FIXME: if/when InsnAddr and/or InstrucIter are implemented, move the
120            address-munging functionality here. */
121         public:
122                 IA64_iterator( Address addr );
123
124                 friend bool operator < ( IA64_iterator lhs, IA64_iterator rhs );
125
126                 /* Returns the left-aligned instruction at this address. */
127                 IA64_instruction * operator * ();
128                 
129                 /* postfix increment */
130                 const IA64_iterator operator++ (int dummy);
131
132                 Address getEncodedAddress() { return encodedAddress; }
133
134         private:
135                 Address encodedAddress;
136                 IA64_bundle currentBundle;
137 }; /* end class IA64_iterator */
138
139 /* Necessary for get and restore registers() to Do The Right Thing
140    for inferior RPCs. */
141 bool needToHandleSyscall( process * proc, bool * pcMayHaveRewound = NULL );
142
143 /* Handle machine-encoded offsets correctly. */
144 uint64_t signExtend( bool signBit, uint64_t immediate );
145
146 #endif