Update copyright to LGPL on all files
[dyninst.git] / dyninstAPI / src / inst-ia64.h
1 /*
2  * Copyright (c) 1996-2009 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  * By your use of Paradyn, you understand and agree that we (or any
12  * other person or entity with proprietary rights in Paradyn) are
13  * under no obligation to provide either maintenance services,
14  * update services, notices of latent defects, or correction of
15  * defects for Paradyn.
16  * 
17  * This library is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU Lesser General Public
19  * License as published by the Free Software Foundation; either
20  * version 2.1 of the License, or (at your option) any later version.
21  * 
22  * This library is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25  * Lesser General Public License for more details.
26  * 
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30  */
31
32 // $Id: inst-ia64.h,v 1.18 2008/02/23 02:09:05 jaw Exp $
33
34 #ifndef INST_IA64_H
35 #define INST_IA64_H
36
37 #include "common/h/Types.h"     // Address
38 class AddressSpace;
39 class IA64_bundle;
40 class IA64_instruction;
41
42 /* Stores locations of pre-baseTramp registers */
43 #define BP_GR0          0               //   0-127
44 #define BP_GR127                (BP_GR0 + 127)
45 #define BP_BR0          128             // 128-135
46 #define BP_BR7                  (BP_BR0 + 7)
47 #define BP_PR           136             // 136
48 #define BP_AR0          137             // 137-264
49 #define BP_AR63                 (BP_AR0 + 63)
50 #define BP_AR64                 (BP_AR0 + 64)
51 #define BP_AR127                (BP_AR0 + 127)
52 #define BP_R_MAX        (BP_AR0 + 128)
53
54 /* aliases */
55 #define BP_KR0          BP_AR0
56 #define BP_AR_CSD       (BP_AR0 + 25)
57 #define BP_AR_SSD       (BP_AR0 + 26)
58 #define BP_AR_CCV       (BP_AR0 + 32)
59 #define BP_AR_PFS       (BP_AR0 + 64)
60
61 /* Required for ast.C */
62 #define REG_MT_POS      13
63
64 class InsnAddr {
65         public:
66                 /* prefix increment */
67                 InsnAddr operator++ ();
68
69                 /* prefix decrement */
70                 InsnAddr operator-- ();
71
72                 /* postfix increment */
73                 InsnAddr operator++ (int dummy);
74
75                 /* postfix decrement */
76                 InsnAddr operator-- (int dummy);
77
78                 /* sum of two InsnAddrs */
79                 friend InsnAddr operator + ( InsnAddr lhs, InsnAddr rhs );
80
81                 /* difference of two InsnAddrs */
82                 friend InsnAddr operator - ( InsnAddr lhs, InsnAddr rhs );
83
84                 /* Returns the left-aligned instruction at this address. */
85                 uint64_t operator * ();
86
87                 friend bool operator < ( InsnAddr lhs, InsnAddr rhs );
88                 friend bool operator <= ( InsnAddr lhs, InsnAddr rhs );
89                 friend bool operator > ( InsnAddr lhs, InsnAddr rhs );
90                 friend bool operator >= ( InsnAddr lhs, InsnAddr rhs );
91                 friend bool operator == ( InsnAddr lhs, InsnAddr rhs );
92                 friend bool operator != ( InsnAddr lhs, InsnAddr rhs );
93
94                 static InsnAddr generateFromAlignedDataAddress( Address addr, AddressSpace * p );
95                 bool writeMyBundleFrom( const unsigned char * savedCodeBuffer );
96                 bool saveMyBundleTo( unsigned char * savedCodeBuffer );
97                 bool saveBundlesTo( unsigned char * savedCodeBuffer, unsigned int numberOfBundles );
98                 bool writeBundlesFrom( unsigned char * savedCodeBuffer, unsigned int numberOfBundles );
99                 bool replaceBundleWith( const IA64_bundle & bundle );
100                 bool replaceBundlesWith( const IA64_bundle * replacementBundles, unsigned int numberOfReplacementBundles );
101                 bool writeStringAtOffset( unsigned int offsetInBundles, const char * str, unsigned int length );
102
103         private:
104                 InsnAddr( Address addr, AddressSpace * p ) : encodedAddress( addr ), myProc( p ) { }
105                 Address encodedAddress;
106                 AddressSpace * myProc;
107 }; /* end class InsnAddr */
108
109 #include "arch-ia64.h"
110
111 class IA64_iterator {
112         /* FIXME: if/when InsnAddr and/or InstrucIter are implemented, move the
113            address-munging functionality here. */
114         public:
115                 IA64_iterator( Address addr );
116
117                 friend bool operator < ( IA64_iterator lhs, IA64_iterator rhs );
118
119                 /* Returns the left-aligned instruction at this address. */
120                 IA64_instruction * operator * ();
121                 
122                 /* postfix increment */
123                 const IA64_iterator operator++ (int dummy);
124
125                 Address getEncodedAddress() { return encodedAddress; }
126
127         private:
128                 Address encodedAddress;
129                 IA64_bundle currentBundle;
130 }; /* end class IA64_iterator */
131
132 class dyn_lwp;
133 /* Necessary for get and restore registers() to Do The Right Thing
134    for inferior RPCs. */
135 bool needToHandleSyscall( dyn_lwp * lwp, bool * pcMayHaveRewound = NULL );
136
137 /* Handle machine-encoded offsets correctly. */
138 uint64_t signExtend( bool signBit, uint64_t immediate );
139
140 #endif