Update copyright to LGPL on all files
[dyninst.git] / dyninstAPI / src / inst-sparc.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-sparc.h,v 1.70 2008/06/19 22:13:42 jaw Exp $
33
34 #if !defined(sparc_sun_sunos4_1_3) && !defined(sparc_sun_solaris2_4)
35 #error "invalid architecture-os inclusion"
36 #endif
37
38 #ifndef INST_SPARC_H
39 #define INST_SPARC_H
40
41 #include "common/h/headers.h"
42 #include "dyninstAPI/src/symtab.h"
43 #include "dyninstAPI/src/process.h"
44 #include "dyninstAPI/src/inst.h"
45
46 #include "dyninstAPI/src/arch-sparc.h"
47 #include "dyninstAPI/src/util.h"
48 #include "common/h/stats.h"
49 #include "dyninstAPI/src/os.h"
50 #include "dyninstAPI/src/debug.h"
51 #include "dyninstAPI/src/as-sparc.h"
52 #include "dyninstAPI/src/instP.h"
53
54 /****************************************************************************/
55 /****************************************************************************/
56 /****************************************************************************/
57
58 #define INSN_SIZE ( sizeof( instruction ) )
59
60 // some macros for helping code which contains register symbolic names
61 #define REG_I(x) (x + 24)
62 #define REG_L(x) (x + 16) 
63 #define REG_O(x) (x + 8)
64 #define REG_G(x) (x)
65
66
67 #define REG_MT_POS           REG_G(6)   /* Register which contains the current POS
68                                            value (for caching) */
69 #define NUM_INSN_MT_PREAMBLE 27   /* number of instructions required for   */
70                                   /* the MT preamble.                      */ 
71
72 #define RECURSIVE_GUARD_ON_CODE_SIZE   7
73 #define RECURSIVE_GUARD_OFF_CODE_SIZE  3
74
75 // NOTE: LOW() and HIGH() can return ugly values if x is negative, because in
76 // that case, 2's complement has really changed the bitwise representation!
77 // Perhaps an assert should be done!
78 #define LOW10(x) ((x) & 0x3ff)
79 #define LOW13(x) ((x) & 0x1fff)
80 #define HIGH22(x) ((x) >> 10)
81
82 inline Address ABS(int x) {
83    if (x < 0) return -x;
84    return x;
85 }
86 //#define ABS(x)                ((x) > 0 ? x : -x)
87
88 //#define MAX_BRANCH    (0x1<<23)
89
90 #define MAX_IMM13       (4095)
91 #define MIN_IMM13       (-4096)
92
93 #define REG_SPTR          14
94 #define REG_FPTR          30
95
96 extern Register deadList[];
97 class AstNode;
98
99 bool processOptimaRet(instPoint *location, AstNode *&ast);
100
101 extern bool isPowerOf2(int value, int &result);
102 extern void generateNoOp(process *proc, Address addr);
103 extern void changeBranch(process *proc, Address fromAddr, Address newAddr,
104                   instruction originalBranch);
105
106 extern void generateBranch(process *proc, Address fromAddr, Address newAddr);
107 extern void generateCall(process *proc, Address fromAddr, Address newAddr);
108 extern void generateBranchOrCallNoSaveRestore(process *proc,Address fromAddr, Address toAddr);
109 extern void genImm(process *proc, Address fromAddr, int op, Register rs1, 
110                    int immd, Register rd);
111
112 extern int getInsnCost(opCode op);
113 extern bool isReturnInsn(const image *owner, Address adr, bool &lastOne, 
114                          std::string name); 
115 extern bool isReturnInsn(instruction i, Address adr, std::string name);
116 extern bool isBranchInsn(instruction i);
117 extern bool branchInsideRange(instruction i, Address branchAddress, 
118       Address firstAddress, Address lastAddress); 
119 extern bool trueCallInsideRange(instruction instr, Address callAddress, 
120       Address firstAddress, Address lastAddress);
121
122 #endif