fix warning defines
[dyninst.git] / dyninstAPI / src / RegisterConversion-aarch64.C
1 /*
2  * See the dyninst/COPYRIGHT file for copyright information.
3  *
4  * We provide the Paradyn Tools (below described as "Paradyn")
5  * on an AS IS basis, and do not warrant its validity or performance.
6  * We reserve the right to update, modify, or discontinue this
7  * software at any time.  We shall have no obligation to supply such
8  * updates or modifications or any other form of support to you.
9  *
10  * By your use of Paradyn, you understand and agree that we (or any
11  * other person or entity with proprietary rights in Paradyn) are
12  * under no obligation to provide either maintenance services,
13  * update services, notices of latent defects, or correction of
14  * defects for Paradyn.
15  *
16  * This library is free software; you can redistribute it and/or
17  * modify it under the terms of the GNU Lesser General Public
18  * License as published by the Free Software Foundation; either
19  * version 2.1 of the License, or (at your option) any later version.
20  *
21  * This library is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
24  * Lesser General Public License for more details.
25  *
26  * You should have received a copy of the GNU Lesser General Public
27  * License along with this library; if not, write to the Free Software
28  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29  */
30
31 #include "RegisterConversion.h"
32 #include "registerSpace.h"
33
34 #include <map>
35 #include <boost/assign/list_of.hpp>
36 #include "Register.h"
37 #include "dyn_regs.h"
38 #include "registerSpace.h"
39
40 using namespace Dyninst;
41 using namespace Dyninst::InstructionAPI;
42 using namespace std;
43 using namespace boost::assign;
44
45 //#warning "This file is not verified yet!"
46 multimap<Register, MachRegister> regToMachReg64 = map_list_of
47   (registerSpace::r0,           aarch64::x0)
48   (registerSpace::r1,           aarch64::x1)
49   (registerSpace::r2,           aarch64::x2)
50   (registerSpace::r3,           aarch64::x3)
51   (registerSpace::r4,           aarch64::x4)
52   (registerSpace::r5,           aarch64::x5)
53   (registerSpace::r6,           aarch64::x6)
54   (registerSpace::r7,           aarch64::x7)
55   (registerSpace::r8,           aarch64::x8)
56   (registerSpace::r9,           aarch64::x9)
57   (registerSpace::r10,          aarch64::x10)
58   (registerSpace::r11,          aarch64::x11)
59   (registerSpace::r12,          aarch64::x12)
60   (registerSpace::r13,          aarch64::x13)
61   (registerSpace::r14,          aarch64::x14)
62   (registerSpace::r15,          aarch64::x15)
63   (registerSpace::r16,          aarch64::x16)
64   (registerSpace::r17,          aarch64::x17)
65   (registerSpace::r18,          aarch64::x18)
66   (registerSpace::r19,          aarch64::x19)
67   (registerSpace::r20,          aarch64::x20)
68   (registerSpace::r21,          aarch64::x21)
69   (registerSpace::r22,          aarch64::x22)
70   (registerSpace::r23,          aarch64::x23)
71   (registerSpace::r24,          aarch64::x24)
72   (registerSpace::r25,          aarch64::x25)
73   (registerSpace::r26,          aarch64::x26)
74   (registerSpace::r27,          aarch64::x27)
75   (registerSpace::r28,          aarch64::x28)
76   (registerSpace::r29,          aarch64::x29)
77   (registerSpace::r30,          aarch64::x30)
78   (registerSpace::fpr0,         aarch64::q0)
79   (registerSpace::fpr1,         aarch64::q1)
80   (registerSpace::fpr2,         aarch64::q2)
81   (registerSpace::fpr3,         aarch64::q3)
82   (registerSpace::fpr4,         aarch64::q4)
83   (registerSpace::fpr5,         aarch64::q5)
84   (registerSpace::fpr6,         aarch64::q6)
85   (registerSpace::fpr7,         aarch64::q7)
86   (registerSpace::fpr8,         aarch64::q8)
87   (registerSpace::fpr9,         aarch64::q9)
88   (registerSpace::fpr10,        aarch64::q10)
89   (registerSpace::fpr11,        aarch64::q11)
90   (registerSpace::fpr12,        aarch64::q12)
91   (registerSpace::fpr13,        aarch64::q13)
92   (registerSpace::fpr14,        aarch64::q14)
93   (registerSpace::fpr15,        aarch64::q15)
94   (registerSpace::fpr16,        aarch64::q16)
95   (registerSpace::fpr17,        aarch64::q17)
96   (registerSpace::fpr18,        aarch64::q18)
97   (registerSpace::fpr19,        aarch64::q19)
98   (registerSpace::fpr20,        aarch64::q20)
99   (registerSpace::fpr21,        aarch64::q21)
100   (registerSpace::fpr22,        aarch64::q22)
101   (registerSpace::fpr23,        aarch64::q23)
102   (registerSpace::fpr24,        aarch64::q24)
103   (registerSpace::fpr25,        aarch64::q25)
104   (registerSpace::fpr26,        aarch64::q26)
105   (registerSpace::fpr27,        aarch64::q27)
106   (registerSpace::fpr28,        aarch64::q28)
107   (registerSpace::fpr29,        aarch64::q29)
108   (registerSpace::fpr30,        aarch64::q30)
109   (registerSpace::fpr31,        aarch64::q31)
110   (registerSpace::lr,           aarch64::x30)
111   (registerSpace::sp,           aarch64::sp)
112   (registerSpace::pc,           aarch64::pc)
113   (registerSpace::pstate,       aarch64::pstate)
114   (registerSpace::fpcr,         aarch64::fpcr)
115   (registerSpace::fpsr,         aarch64::fpsr)
116   ;
117
118 map<MachRegister, Register> reverseRegisterMap = map_list_of
119   (aarch64::x0,  registerSpace::r0)
120   (aarch64::x1,  registerSpace::r1)
121   (aarch64::x2,  registerSpace::r2)
122   (aarch64::x3,  registerSpace::r3)
123   (aarch64::x4,  registerSpace::r4)
124   (aarch64::x5,  registerSpace::r5)
125   (aarch64::x6,  registerSpace::r6)
126   (aarch64::x7,  registerSpace::r7)
127   (aarch64::x8,  registerSpace::r8)
128   (aarch64::x9,  registerSpace::r9)
129   (aarch64::x10, registerSpace::r10)
130   (aarch64::x11, registerSpace::r11)
131   (aarch64::x12, registerSpace::r12)
132   (aarch64::x13, registerSpace::r13)
133   (aarch64::x14, registerSpace::r14)
134   (aarch64::x15, registerSpace::r15)
135   (aarch64::x16, registerSpace::r16)
136   (aarch64::x17, registerSpace::r17)
137   (aarch64::x18, registerSpace::r18)
138   (aarch64::x19, registerSpace::r19)
139   (aarch64::x20, registerSpace::r20)
140   (aarch64::x21, registerSpace::r21)
141   (aarch64::x22, registerSpace::r22)
142   (aarch64::x23, registerSpace::r23)
143   (aarch64::x24, registerSpace::r24)
144   (aarch64::x25, registerSpace::r25)
145   (aarch64::x26, registerSpace::r26)
146   (aarch64::x27, registerSpace::r27)
147   (aarch64::x28, registerSpace::r28)
148   (aarch64::x29, registerSpace::r29)
149   (aarch64::x30, registerSpace::r30)
150   (aarch64::q0,   registerSpace::fpr0)
151   (aarch64::q1,   registerSpace::fpr1)
152   (aarch64::q2,   registerSpace::fpr2)
153   (aarch64::q3,   registerSpace::fpr3)
154   (aarch64::q4,   registerSpace::fpr4)
155   (aarch64::q5,   registerSpace::fpr5)
156   (aarch64::q6,   registerSpace::fpr6)
157   (aarch64::q7,   registerSpace::fpr7)
158   (aarch64::q8,   registerSpace::fpr8)
159   (aarch64::q9,   registerSpace::fpr9)
160   (aarch64::q10,  registerSpace::fpr10)
161   (aarch64::q11,  registerSpace::fpr11)
162   (aarch64::q12,  registerSpace::fpr12)
163   (aarch64::q13,  registerSpace::fpr13)
164   (aarch64::q14,  registerSpace::fpr14)
165   (aarch64::q15,  registerSpace::fpr15)
166   (aarch64::q16,  registerSpace::fpr16)
167   (aarch64::q17,  registerSpace::fpr17)
168   (aarch64::q18,  registerSpace::fpr18)
169   (aarch64::q19,  registerSpace::fpr19)
170   (aarch64::q20,  registerSpace::fpr20)
171   (aarch64::q21,  registerSpace::fpr21)
172   (aarch64::q22,  registerSpace::fpr22)
173   (aarch64::q23,  registerSpace::fpr23)
174   (aarch64::q24,  registerSpace::fpr24)
175   (aarch64::q25,  registerSpace::fpr25)
176   (aarch64::q26,  registerSpace::fpr26)
177   (aarch64::q27,  registerSpace::fpr27)
178   (aarch64::q28,  registerSpace::fpr28)
179   (aarch64::q29,  registerSpace::fpr29)
180   (aarch64::q30,  registerSpace::fpr30)
181   (aarch64::q31,  registerSpace::fpr31)
182   //(aarch64::x30,   registerSpace::lr)
183   (aarch64::sp,   registerSpace::sp)
184   (aarch64::pc,   registerSpace::pc)
185   (aarch64::pstate,   registerSpace::pstate)
186   (aarch64::fpcr,   registerSpace::fpcr)
187   (aarch64::fpsr,   registerSpace::fpsr)
188   ;
189
190 Register convertRegID(MachRegister reg, bool &wasUpcast) {
191     wasUpcast = false;
192
193     MachRegister baseReg = MachRegister((reg.getBaseRegister().val() & ~reg.getArchitecture()) | Arch_aarch64);
194 //    RegisterAST::Ptr debug(new RegisterAST(baseReg));
195 //    fprintf(stderr, "DEBUG: converting %s", toBeConverted->format().c_str());
196 //    fprintf(stderr, " to %s\n", debug->format().c_str());
197     map<MachRegister, Register>::const_iterator found =
198       reverseRegisterMap.find(baseReg);
199     if(found == reverseRegisterMap.end()) {
200       // Yeah, this happens when we analyze trash code. Oops...
201       return registerSpace::ignored;
202     }
203
204     return found->second;
205 }
206
207
208 Register convertRegID(RegisterAST::Ptr toBeConverted, bool& wasUpcast)
209 {
210     return convertRegID(toBeConverted.get(), wasUpcast);
211 }
212
213 Register convertRegID(RegisterAST* toBeConverted, bool& wasUpcast)
214 {
215     if(!toBeConverted) {
216         //assert(0);
217       return registerSpace::ignored;
218     }
219     return convertRegID(toBeConverted->getID(), wasUpcast);
220 }
221
222 MachRegister convertRegID(Register r, Dyninst::Architecture arch) {
223     if( arch == Arch_aarch64 ) {
224         switch(r) {
225             case registerSpace::r0:     return aarch64::x0;
226             case registerSpace::r1:     return aarch64::x1;
227             case registerSpace::r2:     return aarch64::x2;
228             case registerSpace::r3:     return aarch64::x3;
229             case registerSpace::r4:     return aarch64::x4;
230             case registerSpace::r5:     return aarch64::x5;
231             case registerSpace::r6:     return aarch64::x6;
232             case registerSpace::r7:     return aarch64::x7;
233             case registerSpace::r8:     return aarch64::x8;
234             case registerSpace::r9:     return aarch64::x9;
235             case registerSpace::r10:    return aarch64::x10;
236             case registerSpace::r11:    return aarch64::x11;
237             case registerSpace::r12:    return aarch64::x12;
238             case registerSpace::r13:    return aarch64::x13;
239             case registerSpace::r14:    return aarch64::x14;
240             case registerSpace::r15:    return aarch64::x15;
241             case registerSpace::r16:    return aarch64::x16;
242             case registerSpace::r17:    return aarch64::x17;
243             case registerSpace::r18:    return aarch64::x18;
244             case registerSpace::r19:    return aarch64::x19;
245             case registerSpace::r20:    return aarch64::x20;
246             case registerSpace::r21:    return aarch64::x21;
247             case registerSpace::r22:    return aarch64::x22;
248             case registerSpace::r23:    return aarch64::x23;
249             case registerSpace::r24:    return aarch64::x24;
250             case registerSpace::r25:    return aarch64::x25;
251             case registerSpace::r26:    return aarch64::x26;
252             case registerSpace::r27:    return aarch64::x27;
253             case registerSpace::r28:    return aarch64::x28;
254             case registerSpace::r29:    return aarch64::x29;
255             case registerSpace::r30:    return aarch64::x30;
256             case registerSpace::fpr0:  return aarch64::q0;
257             case registerSpace::fpr1:  return aarch64::q1;
258             case registerSpace::fpr2:  return aarch64::q2;
259             case registerSpace::fpr3:  return aarch64::q3;
260             case registerSpace::fpr4:  return aarch64::q4;
261             case registerSpace::fpr5:  return aarch64::q5;
262             case registerSpace::fpr6:  return aarch64::q6;
263             case registerSpace::fpr7:  return aarch64::q7;
264             case registerSpace::fpr8:  return aarch64::q8;
265             case registerSpace::fpr9:  return aarch64::q9;
266             case registerSpace::fpr10: return aarch64::q10;
267             case registerSpace::fpr11: return aarch64::q11;
268             case registerSpace::fpr12: return aarch64::q12;
269             case registerSpace::fpr13: return aarch64::q13;
270             case registerSpace::fpr14: return aarch64::q14;
271             case registerSpace::fpr15: return aarch64::q15;
272             case registerSpace::fpr16: return aarch64::q16;
273             case registerSpace::fpr17: return aarch64::q17;
274             case registerSpace::fpr18: return aarch64::q18;
275             case registerSpace::fpr19: return aarch64::q19;
276             case registerSpace::fpr20: return aarch64::q20;
277             case registerSpace::fpr21: return aarch64::q21;
278             case registerSpace::fpr22: return aarch64::q22;
279             case registerSpace::fpr23: return aarch64::q23;
280             case registerSpace::fpr24: return aarch64::q24;
281             case registerSpace::fpr25: return aarch64::q25;
282             case registerSpace::fpr26: return aarch64::q26;
283             case registerSpace::fpr27: return aarch64::q27;
284             case registerSpace::fpr28: return aarch64::q28;
285             case registerSpace::fpr29: return aarch64::q29;
286             case registerSpace::fpr30: return aarch64::q30;
287             case registerSpace::fpr31: return aarch64::q31;
288             case registerSpace::lr:     return aarch64::x30;
289             case registerSpace::sp:     return aarch64::sp;
290             case registerSpace::pc:     return aarch64::pc;
291             case registerSpace::pstate:         return aarch64::pstate;
292             default:
293                 break;
294         }
295     }else{
296         assert(!"Invalid architecture");
297     }
298
299     assert(!"Register not handled");
300     return InvalidReg;
301 }