Update copyright to LGPL on all files
[dyninst.git] / instructionAPI / h / RegisterIDs-x86.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 #if !defined(REGISTER_IDS_X86_H)
33 #define REGISTER_IDS_X86_H
34
35 #include <vector>
36 #include <map>
37 #include "util.h"
38 #include "Result.h"
39 #include <dyntypes.h>
40 namespace Dyninst
41 {
42   namespace InstructionAPI
43   {
44     /// \enum Dyninst::InstructionAPI::IA32Regs
45     /// \brief Registers for IA32 and AMD64 processors.
46     ///
47     // We REALLY REALLY NEED these definitions to stay aligned as given,
48     // so (e.g.) (r_EAX - r_AH) == (r_EDX - r_DH). We use that later
49     // for upconverting overlapping/aliased registers.
50     enum IA32Regs { r_AH=0, r_BH, r_CH, r_DH, 
51                     r_AL=10, r_BL, r_CL, r_DL,
52                     r_AX=20, r_BX, r_CX, r_DX, r_SI, r_DI,
53                     r_eAX=30, r_eBX, r_eCX, r_eDX, r_eSI, r_eDI,
54                     r_EAX=40, r_EBX, r_ECX, r_EDX, r_ESI, r_EDI,
55                     r_eSP=50, r_eBP,
56                     r_ESP=60, r_EBP,
57                     r_EDXEAX=70, r_ECXEBX, //133
58                     r_OF=80, r_SF, r_ZF, r_AF, r_PF, r_CF, r_TF, r_IF, r_DF, r_NT, r_RF, // NOTE: 11 of these!
59                     r_EFLAGS=100,
60                     r_CS=110, r_DS, r_ES, r_FS, r_GS, r_SS,
61                     r_EIP=120,
62                     // flags need to be separate registers for proper liveness analysis
63                     r_DummyFPR=130, r_Reserved,
64                     // and we have a dummy register to make liveness consistent since floating point saves are all/none at present
65                     r_rAX=140, r_rBX, r_rCX, r_rDX, r_rSI, r_rDI,
66                     r_RAX=150, r_RBX, r_RCX, r_RDX, r_RSI, r_RDI,
67                     r_rSP=160, r_rBP,
68                     r_RSP=170, r_RBP,
69                     r_R8=180, r_R9, r_R10, r_R11, r_R12, r_R13, r_R14, r_R15,
70                     // AMD64 GPRs
71                     r_RIP=190,
72                     r_XMM0=200, r_XMM1, r_XMM2, r_XMM3, r_XMM4, r_XMM5, r_XMM6, r_XMM7,
73                     r_MM0, r_MM1, r_MM2, r_MM3, r_MM4, r_MM5, r_MM6, r_MM7,
74                     r_CR0, r_CR1, r_CR2, r_CR3, r_CR4, r_CR5, r_CR6, r_CR7,
75                     r_DR0, r_DR1, r_DR2, r_DR3, r_DR4, r_DR5, r_DR6, r_DR7,
76                     r_TR0, r_TR1, r_TR2, r_TR3, r_TR4, r_TR5, r_TR6, r_TR7,
77                     r_SPL, r_BPL, r_SIL, r_DIL,
78                     // FP Stack
79                     r_ST0, r_ST1, r_ST2, r_ST3, r_ST4, r_ST5, r_ST6, r_ST7,
80                     r_ALLGPRS
81     };
82           
83     /// The %RegInfo struct associates a register ID with its size and name.
84     struct RegInfo
85     {
86       RegInfo(Result_Type t, std::string n) :
87         regSize(t), regName(n) 
88       {
89       }
90       RegInfo() :
91         regSize(u8), regName("*** UNDEFINED REGISTER ***")
92       {
93       }
94             
95       Result_Type regSize;
96       std::string regName;
97     };
98   };
99 };
100           
101 #if defined(__GNUC__)
102 #if !defined(cap_tr1)
103 namespace __gnu_cxx 
104 {
105   template<> struct hash<Dyninst::InstructionAPI::IA32Regs> {
106     hash<unsigned int> h;
107     unsigned operator()(const Dyninst::InstructionAPI::IA32Regs &e) const 
108     {
109       return h(static_cast<unsigned int>(e));
110     };
111   };
112 }
113 #else
114 namespace std 
115 {
116   namespace tr1
117   {
118     template <>
119     struct hash<Dyninst::InstructionAPI::IA32Regs>
120     {
121       size_t operator()(const Dyninst::InstructionAPI::IA32Regs &e) const
122       {
123         return static_cast<size_t>(e);
124       };
125     };
126   }   
127 }
128 #endif
129 #endif
130           
131           
132 namespace Dyninst
133 {
134   namespace InstructionAPI
135   {
136     typedef dyn_hash_map<IA32Regs, RegInfo> RegTable;
137     /// \brief Register names for disassembly and debugging
138     struct IA32RegTable
139     {
140       IA32RegTable();
141       RegTable IA32_register_names;
142       Result_Type getSize(int id) 
143       {
144         RegTable::const_iterator found = IA32_register_names.find((IA32Regs)(id));
145         if(found != IA32_register_names.end()) {
146           return found->second.regSize;
147         }
148         // Sane default
149         return u32;
150       }
151       
152     };
153
154   };
155 };
156
157
158
159 #endif //!defined(REGISTER_IDS_X86_H)