blob: a2986d3ac5155c0c977e7ad21c77517f2778e4fc [file] [log] [blame]
sewardj35421a32004-07-05 13:12:34 +00001
2/*---------------------------------------------------------------*/
3/*--- ---*/
sewardjc0ee2ed2004-07-27 10:29:41 +00004/*--- This file (main/vex_main.c) is ---*/
sewardjdbcfae72005-08-02 11:14:04 +00005/*--- Copyright (C) OpenWorks LLP. All rights reserved. ---*/
sewardj35421a32004-07-05 13:12:34 +00006/*--- ---*/
7/*---------------------------------------------------------------*/
8
sewardjf8ed9d82004-11-12 17:40:23 +00009/*
10 This file is part of LibVEX, a library for dynamic binary
11 instrumentation and translation.
12
sewardj7bd6ffe2005-08-03 16:07:36 +000013 Copyright (C) 2004-2005 OpenWorks LLP. All rights reserved.
sewardjf8ed9d82004-11-12 17:40:23 +000014
sewardj7bd6ffe2005-08-03 16:07:36 +000015 This library is made available under a dual licensing scheme.
sewardjf8ed9d82004-11-12 17:40:23 +000016
sewardj7bd6ffe2005-08-03 16:07:36 +000017 If you link LibVEX against other code all of which is itself
18 licensed under the GNU General Public License, version 2 dated June
19 1991 ("GPL v2"), then you may use LibVEX under the terms of the GPL
20 v2, as appearing in the file LICENSE.GPL. If the file LICENSE.GPL
21 is missing, you can obtain a copy of the GPL v2 from the Free
22 Software Foundation Inc., 51 Franklin St, Fifth Floor, Boston, MA
23 02110-1301, USA.
24
25 For any other uses of LibVEX, you must first obtain a commercial
26 license from OpenWorks LLP. Please contact info@open-works.co.uk
27 for information about commercial licensing.
28
29 This software is provided by OpenWorks LLP "as is" and any express
30 or implied warranties, including, but not limited to, the implied
31 warranties of merchantability and fitness for a particular purpose
32 are disclaimed. In no event shall OpenWorks LLP be liable for any
33 direct, indirect, incidental, special, exemplary, or consequential
34 damages (including, but not limited to, procurement of substitute
35 goods or services; loss of use, data, or profits; or business
36 interruption) however caused and on any theory of liability,
37 whether in contract, strict liability, or tort (including
38 negligence or otherwise) arising in any way out of the use of this
39 software, even if advised of the possibility of such damage.
sewardjf8ed9d82004-11-12 17:40:23 +000040
41 Neither the names of the U.S. Department of Energy nor the
42 University of California nor the names of its contributors may be
43 used to endorse or promote products derived from this software
44 without prior written permission.
sewardjf8ed9d82004-11-12 17:40:23 +000045*/
46
sewardj887a11a2004-07-05 17:26:47 +000047#include "libvex.h"
sewardj893aada2004-11-29 19:57:54 +000048#include "libvex_emwarn.h"
sewardj81ec4182004-10-25 23:15:52 +000049#include "libvex_guest_x86.h"
sewardj44d494d2005-01-20 20:26:33 +000050#include "libvex_guest_amd64.h"
sewardj2a9ad022004-11-25 02:46:58 +000051#include "libvex_guest_arm.h"
cerionaabdfbf2005-01-29 12:56:15 +000052#include "libvex_guest_ppc32.h"
cerionf0de28c2005-12-13 20:21:11 +000053#include "libvex_guest_ppc64.h"
sewardjf13a16a2004-07-05 17:10:14 +000054
sewardjc0ee2ed2004-07-27 10:29:41 +000055#include "main/vex_globals.h"
56#include "main/vex_util.h"
57#include "host-generic/h_generic_regs.h"
sewardjedf4d692004-08-17 13:52:58 +000058#include "ir/iropt.h"
sewardj35421a32004-07-05 13:12:34 +000059
sewardj2a9ad022004-11-25 02:46:58 +000060#include "host-x86/hdefs.h"
sewardjc33671d2005-02-01 20:30:00 +000061#include "host-amd64/hdefs.h"
ceriond0eae2d2005-12-23 11:43:01 +000062#include "host-ppc/hdefs.h"
sewardj2a9ad022004-11-25 02:46:58 +000063
sewardj9e6491a2005-07-02 19:24:10 +000064#include "guest-generic/bb_to_IR.h"
sewardj2a9ad022004-11-25 02:46:58 +000065#include "guest-x86/gdefs.h"
sewardj44d494d2005-01-20 20:26:33 +000066#include "guest-amd64/gdefs.h"
sewardj2a9ad022004-11-25 02:46:58 +000067#include "guest-arm/gdefs.h"
ceriond0eae2d2005-12-23 11:43:01 +000068#include "guest-ppc/gdefs.h"
sewardj2a9ad022004-11-25 02:46:58 +000069
sewardj35421a32004-07-05 13:12:34 +000070
71/* This file contains the top level interface to the library. */
72
73/* --------- Initialise the library. --------- */
74
75/* Exported to library client. */
76
sewardjd887b862005-01-17 18:34:34 +000077const HChar* LibVEX_Version ( void )
sewardj80f5fce2004-12-20 04:37:50 +000078{
79return
80#include "main/vex_svnversion.h"
81 ;
82}
83
84
85/* Exported to library client. */
86
sewardj08613742004-10-25 13:01:45 +000087void LibVEX_default_VexControl ( /*OUT*/ VexControl* vcon )
88{
89 vcon->iropt_verbosity = 0;
90 vcon->iropt_level = 2;
91 vcon->iropt_precise_memory_exns = False;
92 vcon->iropt_unroll_thresh = 120;
sewardj18b4bb72005-03-29 21:32:41 +000093 vcon->guest_max_insns = 60;
sewardj08613742004-10-25 13:01:45 +000094 vcon->guest_chase_thresh = 10;
95}
96
97
98/* Exported to library client. */
99
sewardj887a11a2004-07-05 17:26:47 +0000100void LibVEX_Init (
sewardj35421a32004-07-05 13:12:34 +0000101 /* failure exit function */
sewardj2b515872004-07-05 20:50:45 +0000102 __attribute__ ((noreturn))
sewardj35421a32004-07-05 13:12:34 +0000103 void (*failure_exit) ( void ),
104 /* logging output function */
sewardjd9763622005-02-07 03:12:19 +0000105 void (*log_bytes) ( HChar*, Int nbytes ),
sewardj35421a32004-07-05 13:12:34 +0000106 /* debug paranoia level */
107 Int debuglevel,
sewardj35421a32004-07-05 13:12:34 +0000108 /* Are we supporting valgrind checking? */
109 Bool valgrind_support,
sewardj08613742004-10-25 13:01:45 +0000110 /* Control ... */
111 /*READONLY*/VexControl* vcon
sewardj35421a32004-07-05 13:12:34 +0000112)
113{
sewardj08613742004-10-25 13:01:45 +0000114 /* First off, do enough minimal setup so that the following
115 assertions can fail in a sane fashion, if need be. */
sewardjea602bc2004-10-14 21:40:12 +0000116 vex_failure_exit = failure_exit;
117 vex_log_bytes = log_bytes;
118
119 /* Now it's safe to check parameters for sanity. */
sewardj35421a32004-07-05 13:12:34 +0000120 vassert(!vex_initdone);
121 vassert(failure_exit);
sewardj35421a32004-07-05 13:12:34 +0000122 vassert(log_bytes);
sewardj35421a32004-07-05 13:12:34 +0000123 vassert(debuglevel >= 0);
sewardj08613742004-10-25 13:01:45 +0000124
125 vassert(vcon->iropt_verbosity >= 0);
126 vassert(vcon->iropt_level >= 0);
127 vassert(vcon->iropt_level <= 2);
128 vassert(vcon->iropt_unroll_thresh >= 0);
129 vassert(vcon->iropt_unroll_thresh <= 400);
130 vassert(vcon->guest_max_insns >= 1);
131 vassert(vcon->guest_max_insns <= 100);
132 vassert(vcon->guest_chase_thresh >= 0);
133 vassert(vcon->guest_chase_thresh < vcon->guest_max_insns);
sewardj443cd9d2004-07-18 23:06:45 +0000134
sewardjea602bc2004-10-14 21:40:12 +0000135 /* Check that Vex has been built with sizes of basic types as
136 stated in priv/libvex_basictypes.h. Failure of any of these is
137 a serious configuration error and should be corrected
138 immediately. If any of these assertions fail you can fully
139 expect Vex not to work properly, if at all. */
140
141 vassert(1 == sizeof(UChar));
142 vassert(1 == sizeof(Char));
143 vassert(2 == sizeof(UShort));
144 vassert(2 == sizeof(Short));
145 vassert(4 == sizeof(UInt));
146 vassert(4 == sizeof(Int));
147 vassert(8 == sizeof(ULong));
148 vassert(8 == sizeof(Long));
149 vassert(4 == sizeof(Float));
150 vassert(8 == sizeof(Double));
151 vassert(1 == sizeof(Bool));
152 vassert(4 == sizeof(Addr32));
153 vassert(8 == sizeof(Addr64));
sewardjc9a43662004-11-30 18:51:59 +0000154 vassert(16 == sizeof(U128));
sewardjea602bc2004-10-14 21:40:12 +0000155
156 vassert(sizeof(void*) == 4 || sizeof(void*) == 8);
157 vassert(sizeof(void*) == sizeof(int*));
158 vassert(sizeof(void*) == sizeof(HWord));
159
sewardj97e87932005-02-07 00:00:50 +0000160 vassert(VEX_HOST_WORDSIZE == sizeof(void*));
161 vassert(VEX_HOST_WORDSIZE == sizeof(HWord));
162
sewardjea602bc2004-10-14 21:40:12 +0000163 /* Really start up .. */
sewardj443cd9d2004-07-18 23:06:45 +0000164 vex_debuglevel = debuglevel;
sewardj443cd9d2004-07-18 23:06:45 +0000165 vex_valgrind_support = valgrind_support;
sewardj08613742004-10-25 13:01:45 +0000166 vex_control = *vcon;
sewardj443cd9d2004-07-18 23:06:45 +0000167 vex_initdone = True;
sewardjd887b862005-01-17 18:34:34 +0000168 vexSetAllocMode ( VexAllocModeTEMP );
sewardj35421a32004-07-05 13:12:34 +0000169}
170
171
172/* --------- Make a translation. --------- */
173
174/* Exported to library client. */
175
sewardj17c7f952005-12-15 14:02:34 +0000176VexTranslateResult LibVEX_Translate ( VexTranslateArgs* vta )
sewardj35421a32004-07-05 13:12:34 +0000177{
sewardj81bd5502004-07-21 18:49:27 +0000178 /* This the bundle of functions we need to do the back-end stuff
179 (insn selection, reg-alloc, assembly) whilst being insulated
180 from the target instruction set. */
sewardjf13a16a2004-07-05 17:10:14 +0000181 HReg* available_real_regs;
182 Int n_available_real_regs;
cerion92b64362005-12-13 12:02:26 +0000183 Bool (*isMove) ( HInstr*, HReg*, HReg* );
184 void (*getRegUsage) ( HRegUsage*, HInstr*, Bool );
185 void (*mapRegs) ( HRegRemap*, HInstr*, Bool );
186 HInstr* (*genSpill) ( HReg, Int, Bool );
187 HInstr* (*genReload) ( HReg, Int, Bool );
188 void (*ppInstr) ( HInstr*, Bool );
sewardj443cd9d2004-07-18 23:06:45 +0000189 void (*ppReg) ( HReg );
sewardj27e1dd62005-06-30 11:49:14 +0000190 HInstrArray* (*iselBB) ( IRBB*, VexArchInfo* );
sewardj17c7f952005-12-15 14:02:34 +0000191 Int (*emit) ( UChar*, Int, HInstr*, Bool, void* );
sewardjd9763622005-02-07 03:12:19 +0000192 IRExpr* (*specHelper) ( HChar*, IRExpr** );
sewardj8d2291c2004-10-25 14:50:21 +0000193 Bool (*preciseMemExnsFn) ( Int, Int );
sewardjf13a16a2004-07-05 17:10:14 +0000194
sewardj9e6491a2005-07-02 19:24:10 +0000195 DisOneInstrFn disInstrFn;
196
sewardjeeac8412004-11-02 00:26:55 +0000197 VexGuestLayout* guest_layout;
198 Bool host_is_bigendian = False;
199 IRBB* irbb;
200 HInstrArray* vcode;
201 HInstrArray* rcode;
202 Int i, j, k, out_used, guest_sizeB;
sewardjce02aa72006-01-12 12:27:58 +0000203 Int offB_TISTART, offB_TILEN, offB_NRADDR;
sewardjeeac8412004-11-02 00:26:55 +0000204 UChar insn_bytes[32];
sewardjcf787902004-11-03 09:08:33 +0000205 IRType guest_word_type;
206 IRType host_word_type;
cerion92b64362005-12-13 12:02:26 +0000207 Bool mode64;
sewardjf13a16a2004-07-05 17:10:14 +0000208
sewardj49651f42004-10-28 22:11:04 +0000209 guest_layout = NULL;
sewardj36ca5132004-07-24 13:12:23 +0000210 available_real_regs = NULL;
211 n_available_real_regs = 0;
212 isMove = NULL;
213 getRegUsage = NULL;
214 mapRegs = NULL;
215 genSpill = NULL;
216 genReload = NULL;
217 ppInstr = NULL;
218 ppReg = NULL;
219 iselBB = NULL;
sewardj36ca5132004-07-24 13:12:23 +0000220 emit = NULL;
sewardj84ff0652004-08-23 16:16:08 +0000221 specHelper = NULL;
sewardj8d2291c2004-10-25 14:50:21 +0000222 preciseMemExnsFn = NULL;
sewardj9e6491a2005-07-02 19:24:10 +0000223 disInstrFn = NULL;
sewardjcf787902004-11-03 09:08:33 +0000224 guest_word_type = Ity_INVALID;
225 host_word_type = Ity_INVALID;
sewardjdb4738a2005-07-07 01:32:16 +0000226 offB_TISTART = 0;
227 offB_TILEN = 0;
cerion92b64362005-12-13 12:02:26 +0000228 mode64 = False;
sewardjce02aa72006-01-12 12:27:58 +0000229 offB_NRADDR = 0;
sewardj36ca5132004-07-24 13:12:23 +0000230
sewardj17c7f952005-12-15 14:02:34 +0000231 vex_traceflags = vta->traceflags;
sewardj58800ff2004-07-28 01:51:10 +0000232
sewardj35421a32004-07-05 13:12:34 +0000233 vassert(vex_initdone);
sewardj2d6b14a2005-11-23 04:25:07 +0000234 vexSetAllocModeTEMP_and_clear();
235 vexAllocSanityCheck();
sewardj2a9ad022004-11-25 02:46:58 +0000236
sewardjf13a16a2004-07-05 17:10:14 +0000237 /* First off, check that the guest and host insn sets
238 are supported. */
sewardj2a9ad022004-11-25 02:46:58 +0000239
sewardj17c7f952005-12-15 14:02:34 +0000240 switch (vta->arch_host) {
sewardj2a9ad022004-11-25 02:46:58 +0000241
sewardjbef170b2004-12-21 01:23:00 +0000242 case VexArchX86:
cerion92b64362005-12-13 12:02:26 +0000243 mode64 = False;
sewardjf13a16a2004-07-05 17:10:14 +0000244 getAllocableRegs_X86 ( &n_available_real_regs,
245 &available_real_regs );
246 isMove = (Bool(*)(HInstr*,HReg*,HReg*)) isMove_X86Instr;
cerion92b64362005-12-13 12:02:26 +0000247 getRegUsage = (void(*)(HRegUsage*,HInstr*, Bool)) getRegUsage_X86Instr;
248 mapRegs = (void(*)(HRegRemap*,HInstr*, Bool)) mapRegs_X86Instr;
249 genSpill = (HInstr*(*)(HReg,Int, Bool)) genSpill_X86;
250 genReload = (HInstr*(*)(HReg,Int, Bool)) genReload_X86;
251 ppInstr = (void(*)(HInstr*, Bool)) ppX86Instr;
sewardj2b515872004-07-05 20:50:45 +0000252 ppReg = (void(*)(HReg)) ppHRegX86;
sewardjf13a16a2004-07-05 17:10:14 +0000253 iselBB = iselBB_X86;
sewardj0528bb52005-12-15 15:45:20 +0000254 emit = (Int(*)(UChar*,Int,HInstr*,Bool,void*)) emit_X86Instr;
sewardj72c72812005-01-19 11:49:45 +0000255 host_is_bigendian = False;
sewardjcf787902004-11-03 09:08:33 +0000256 host_word_type = Ity_I32;
sewardj17c7f952005-12-15 14:02:34 +0000257 vassert(vta->archinfo_host.subarch == VexSubArchX86_sse0
258 || vta->archinfo_host.subarch == VexSubArchX86_sse1
259 || vta->archinfo_host.subarch == VexSubArchX86_sse2);
260 vassert(vta->dispatch != NULL); /* jump-to-dispatcher scheme */
sewardjf13a16a2004-07-05 17:10:14 +0000261 break;
sewardj2a9ad022004-11-25 02:46:58 +0000262
sewardjc33671d2005-02-01 20:30:00 +0000263 case VexArchAMD64:
cerion92b64362005-12-13 12:02:26 +0000264 mode64 = True;
sewardjc33671d2005-02-01 20:30:00 +0000265 getAllocableRegs_AMD64 ( &n_available_real_regs,
266 &available_real_regs );
267 isMove = (Bool(*)(HInstr*,HReg*,HReg*)) isMove_AMD64Instr;
cerion92b64362005-12-13 12:02:26 +0000268 getRegUsage = (void(*)(HRegUsage*,HInstr*, Bool)) getRegUsage_AMD64Instr;
269 mapRegs = (void(*)(HRegRemap*,HInstr*, Bool)) mapRegs_AMD64Instr;
270 genSpill = (HInstr*(*)(HReg,Int, Bool)) genSpill_AMD64;
271 genReload = (HInstr*(*)(HReg,Int, Bool)) genReload_AMD64;
272 ppInstr = (void(*)(HInstr*, Bool)) ppAMD64Instr;
sewardjc33671d2005-02-01 20:30:00 +0000273 ppReg = (void(*)(HReg)) ppHRegAMD64;
274 iselBB = iselBB_AMD64;
sewardj0528bb52005-12-15 15:45:20 +0000275 emit = (Int(*)(UChar*,Int,HInstr*,Bool,void*)) emit_AMD64Instr;
sewardjc33671d2005-02-01 20:30:00 +0000276 host_is_bigendian = False;
277 host_word_type = Ity_I64;
sewardj17c7f952005-12-15 14:02:34 +0000278 vassert(vta->archinfo_host.subarch == VexSubArch_NONE);
279 vassert(vta->dispatch != NULL); /* jump-to-dispatcher scheme */
sewardjc33671d2005-02-01 20:30:00 +0000280 break;
281
cerion487e4c92005-02-04 16:28:19 +0000282 case VexArchPPC32:
cerion92b64362005-12-13 12:02:26 +0000283 mode64 = False;
cerion5b2325f2005-12-23 00:55:09 +0000284 getAllocableRegs_PPC ( &n_available_real_regs,
285 &available_real_regs, mode64 );
286 isMove = (Bool(*)(HInstr*,HReg*,HReg*)) isMove_PPCInstr;
287 getRegUsage = (void(*)(HRegUsage*,HInstr*,Bool)) getRegUsage_PPCInstr;
288 mapRegs = (void(*)(HRegRemap*,HInstr*,Bool)) mapRegs_PPCInstr;
289 genSpill = (HInstr*(*)(HReg,Int,Bool)) genSpill_PPC;
290 genReload = (HInstr*(*)(HReg,Int,Bool)) genReload_PPC;
291 ppInstr = (void(*)(HInstr*,Bool)) ppPPCInstr;
292 ppReg = (void(*)(HReg)) ppHRegPPC;
293 iselBB = iselBB_PPC;
294 emit = (Int(*)(UChar*,Int,HInstr*,Bool,void*)) emit_PPCInstr;
cerion487e4c92005-02-04 16:28:19 +0000295 host_is_bigendian = True;
296 host_word_type = Ity_I32;
sewardj17c7f952005-12-15 14:02:34 +0000297 vassert(vta->archinfo_guest.subarch == VexSubArchPPC32_I
298 || vta->archinfo_guest.subarch == VexSubArchPPC32_FI
299 || vta->archinfo_guest.subarch == VexSubArchPPC32_VFI);
300 vassert(vta->dispatch == NULL); /* return-to-dispatcher scheme */
cerion487e4c92005-02-04 16:28:19 +0000301 break;
302
cerionf0de28c2005-12-13 20:21:11 +0000303 case VexArchPPC64:
304 mode64 = True;
cerion5b2325f2005-12-23 00:55:09 +0000305 getAllocableRegs_PPC ( &n_available_real_regs,
306 &available_real_regs, mode64 );
307 isMove = (Bool(*)(HInstr*,HReg*,HReg*)) isMove_PPCInstr;
308 getRegUsage = (void(*)(HRegUsage*,HInstr*, Bool)) getRegUsage_PPCInstr;
309 mapRegs = (void(*)(HRegRemap*,HInstr*, Bool)) mapRegs_PPCInstr;
310 genSpill = (HInstr*(*)(HReg,Int, Bool)) genSpill_PPC;
311 genReload = (HInstr*(*)(HReg,Int, Bool)) genReload_PPC;
312 ppInstr = (void(*)(HInstr*, Bool)) ppPPCInstr;
313 ppReg = (void(*)(HReg)) ppHRegPPC;
314 iselBB = iselBB_PPC;
315 emit = (Int(*)(UChar*,Int,HInstr*,Bool,void*)) emit_PPCInstr;
cerionf0de28c2005-12-13 20:21:11 +0000316 host_is_bigendian = True;
317 host_word_type = Ity_I64;
sewardj17c7f952005-12-15 14:02:34 +0000318 vassert(vta->archinfo_guest.subarch == VexSubArchPPC64_FI
319 || vta->archinfo_guest.subarch == VexSubArchPPC64_VFI);
320 vassert(vta->dispatch == NULL); /* return-to-dispatcher scheme */
cerionf0de28c2005-12-13 20:21:11 +0000321 break;
322
sewardjf13a16a2004-07-05 17:10:14 +0000323 default:
sewardj887a11a2004-07-05 17:26:47 +0000324 vpanic("LibVEX_Translate: unsupported target insn set");
sewardjf13a16a2004-07-05 17:10:14 +0000325 }
326
sewardj2a9ad022004-11-25 02:46:58 +0000327
sewardj17c7f952005-12-15 14:02:34 +0000328 switch (vta->arch_guest) {
sewardj2a9ad022004-11-25 02:46:58 +0000329
sewardjbef170b2004-12-21 01:23:00 +0000330 case VexArchX86:
sewardj8d2291c2004-10-25 14:50:21 +0000331 preciseMemExnsFn = guest_x86_state_requires_precise_mem_exns;
sewardj9e6491a2005-07-02 19:24:10 +0000332 disInstrFn = disInstr_X86;
sewardj2a9ad022004-11-25 02:46:58 +0000333 specHelper = guest_x86_spechelper;
sewardj81ec4182004-10-25 23:15:52 +0000334 guest_sizeB = sizeof(VexGuestX86State);
sewardjcf787902004-11-03 09:08:33 +0000335 guest_word_type = Ity_I32;
sewardj49651f42004-10-28 22:11:04 +0000336 guest_layout = &x86guest_layout;
sewardjdb4738a2005-07-07 01:32:16 +0000337 offB_TISTART = offsetof(VexGuestX86State,guest_TISTART);
338 offB_TILEN = offsetof(VexGuestX86State,guest_TILEN);
sewardjce02aa72006-01-12 12:27:58 +0000339 offB_NRADDR = offsetof(VexGuestX86State,guest_NRADDR);
sewardj17c7f952005-12-15 14:02:34 +0000340 vassert(vta->archinfo_guest.subarch == VexSubArchX86_sse0
341 || vta->archinfo_guest.subarch == VexSubArchX86_sse1
342 || vta->archinfo_guest.subarch == VexSubArchX86_sse2);
sewardje74f6f72005-08-05 02:55:36 +0000343 vassert(0 == sizeof(VexGuestX86State) % 8);
sewardjce02aa72006-01-12 12:27:58 +0000344 vassert(sizeof( ((VexGuestX86State*)0)->guest_TISTART) == 4);
345 vassert(sizeof( ((VexGuestX86State*)0)->guest_TILEN ) == 4);
346 vassert(sizeof( ((VexGuestX86State*)0)->guest_NRADDR ) == 4);
sewardjf13a16a2004-07-05 17:10:14 +0000347 break;
sewardj2a9ad022004-11-25 02:46:58 +0000348
sewardj44d494d2005-01-20 20:26:33 +0000349 case VexArchAMD64:
350 preciseMemExnsFn = guest_amd64_state_requires_precise_mem_exns;
sewardj9e6491a2005-07-02 19:24:10 +0000351 disInstrFn = disInstr_AMD64;
sewardj44d494d2005-01-20 20:26:33 +0000352 specHelper = guest_amd64_spechelper;
353 guest_sizeB = sizeof(VexGuestAMD64State);
354 guest_word_type = Ity_I64;
355 guest_layout = &amd64guest_layout;
sewardjdb4738a2005-07-07 01:32:16 +0000356 offB_TISTART = offsetof(VexGuestAMD64State,guest_TISTART);
357 offB_TILEN = offsetof(VexGuestAMD64State,guest_TILEN);
sewardjce02aa72006-01-12 12:27:58 +0000358 offB_NRADDR = offsetof(VexGuestAMD64State,guest_NRADDR);
sewardj17c7f952005-12-15 14:02:34 +0000359 vassert(vta->archinfo_guest.subarch == VexSubArch_NONE);
sewardje74f6f72005-08-05 02:55:36 +0000360 vassert(0 == sizeof(VexGuestAMD64State) % 8);
sewardjdb4738a2005-07-07 01:32:16 +0000361 vassert(sizeof( ((VexGuestAMD64State*)0)->guest_TISTART ) == 8);
sewardjce02aa72006-01-12 12:27:58 +0000362 vassert(sizeof( ((VexGuestAMD64State*)0)->guest_TILEN ) == 8);
363 vassert(sizeof( ((VexGuestAMD64State*)0)->guest_NRADDR ) == 8);
sewardj44d494d2005-01-20 20:26:33 +0000364 break;
365
sewardjbef170b2004-12-21 01:23:00 +0000366 case VexArchARM:
sewardj2a9ad022004-11-25 02:46:58 +0000367 preciseMemExnsFn = guest_arm_state_requires_precise_mem_exns;
sewardj9e6491a2005-07-02 19:24:10 +0000368 disInstrFn = NULL; /* HACK */
sewardj2a9ad022004-11-25 02:46:58 +0000369 specHelper = guest_arm_spechelper;
370 guest_sizeB = sizeof(VexGuestARMState);
371 guest_word_type = Ity_I32;
372 guest_layout = &armGuest_layout;
sewardjdb4738a2005-07-07 01:32:16 +0000373 offB_TISTART = 0; /* hack ... arm has bitrot */
374 offB_TILEN = 0; /* hack ... arm has bitrot */
sewardjce02aa72006-01-12 12:27:58 +0000375 offB_NRADDR = 0; /* hack ... arm has bitrot */
sewardj17c7f952005-12-15 14:02:34 +0000376 vassert(vta->archinfo_guest.subarch == VexSubArchARM_v4);
sewardj2a9ad022004-11-25 02:46:58 +0000377 break;
378
cerionaabdfbf2005-01-29 12:56:15 +0000379 case VexArchPPC32:
380 preciseMemExnsFn = guest_ppc32_state_requires_precise_mem_exns;
cerion5b2325f2005-12-23 00:55:09 +0000381 disInstrFn = disInstr_PPC;
cerionaabdfbf2005-01-29 12:56:15 +0000382 specHelper = guest_ppc32_spechelper;
383 guest_sizeB = sizeof(VexGuestPPC32State);
384 guest_word_type = Ity_I32;
385 guest_layout = &ppc32Guest_layout;
sewardjdb4738a2005-07-07 01:32:16 +0000386 offB_TISTART = offsetof(VexGuestPPC32State,guest_TISTART);
387 offB_TILEN = offsetof(VexGuestPPC32State,guest_TILEN);
sewardjce02aa72006-01-12 12:27:58 +0000388 offB_NRADDR = offsetof(VexGuestPPC32State,guest_NRADDR);
sewardj17c7f952005-12-15 14:02:34 +0000389 vassert(vta->archinfo_guest.subarch == VexSubArchPPC32_I
390 || vta->archinfo_guest.subarch == VexSubArchPPC32_FI
391 || vta->archinfo_guest.subarch == VexSubArchPPC32_VFI);
sewardje74f6f72005-08-05 02:55:36 +0000392 vassert(0 == sizeof(VexGuestPPC32State) % 8);
sewardjdb4738a2005-07-07 01:32:16 +0000393 vassert(sizeof( ((VexGuestPPC32State*)0)->guest_TISTART ) == 4);
sewardjce02aa72006-01-12 12:27:58 +0000394 vassert(sizeof( ((VexGuestPPC32State*)0)->guest_TILEN ) == 4);
395 vassert(sizeof( ((VexGuestPPC32State*)0)->guest_NRADDR ) == 4);
cerionaabdfbf2005-01-29 12:56:15 +0000396 break;
397
cerionf0de28c2005-12-13 20:21:11 +0000398 case VexArchPPC64:
399 preciseMemExnsFn = guest_ppc64_state_requires_precise_mem_exns;
cerion5b2325f2005-12-23 00:55:09 +0000400 disInstrFn = disInstr_PPC;
cerionf0de28c2005-12-13 20:21:11 +0000401 specHelper = guest_ppc64_spechelper;
402 guest_sizeB = sizeof(VexGuestPPC64State);
403 guest_word_type = Ity_I64;
404 guest_layout = &ppc64Guest_layout;
405 offB_TISTART = offsetof(VexGuestPPC64State,guest_TISTART);
406 offB_TILEN = offsetof(VexGuestPPC64State,guest_TILEN);
sewardj17c7f952005-12-15 14:02:34 +0000407 vassert(vta->archinfo_guest.subarch == VexSubArchPPC64_FI
408 || vta->archinfo_guest.subarch == VexSubArchPPC64_VFI);
cerionf0de28c2005-12-13 20:21:11 +0000409 vassert(0 == sizeof(VexGuestPPC64State) % 16);
410 vassert(sizeof( ((VexGuestPPC64State*)0)->guest_TISTART ) == 8);
411 vassert(sizeof( ((VexGuestPPC64State*)0)->guest_TILEN ) == 8);
412 break;
413
sewardjf13a16a2004-07-05 17:10:14 +0000414 default:
sewardj887a11a2004-07-05 17:26:47 +0000415 vpanic("LibVEX_Translate: unsupported guest insn set");
sewardjf13a16a2004-07-05 17:10:14 +0000416 }
417
sewardj9df271d2004-12-31 22:37:42 +0000418 /* yet more sanity checks ... */
sewardj17c7f952005-12-15 14:02:34 +0000419 if (vta->arch_guest == vta->arch_host) {
sewardj9df271d2004-12-31 22:37:42 +0000420 /* doesn't necessarily have to be true, but if it isn't it means
sewardj0ec57c52005-02-01 15:24:10 +0000421 we are simulating one flavour of an architecture a different
422 flavour of the same architecture, which is pretty strange. */
sewardj17c7f952005-12-15 14:02:34 +0000423 vassert(vta->archinfo_guest.subarch == vta->archinfo_host.subarch);
sewardj9df271d2004-12-31 22:37:42 +0000424 }
sewardj2a9ad022004-11-25 02:46:58 +0000425
sewardj2d6b14a2005-11-23 04:25:07 +0000426 vexAllocSanityCheck();
427
sewardjf48ac192004-10-29 00:41:29 +0000428 if (vex_traceflags & VEX_TRACE_FE)
429 vex_printf("\n------------------------"
430 " Front end "
431 "------------------------\n\n");
432
sewardj17c7f952005-12-15 14:02:34 +0000433 irbb = bb_to_IR ( vta->guest_extents,
sewardj9e6491a2005-07-02 19:24:10 +0000434 disInstrFn,
sewardj17c7f952005-12-15 14:02:34 +0000435 vta->guest_bytes,
436 vta->guest_bytes_addr,
sewardjce02aa72006-01-12 12:27:58 +0000437 vta->guest_bytes_addr_noredir,
sewardj17c7f952005-12-15 14:02:34 +0000438 vta->chase_into_ok,
sewardj9e6491a2005-07-02 19:24:10 +0000439 host_is_bigendian,
sewardj17c7f952005-12-15 14:02:34 +0000440 &vta->archinfo_guest,
sewardjdb4738a2005-07-07 01:32:16 +0000441 guest_word_type,
sewardj17c7f952005-12-15 14:02:34 +0000442 vta->do_self_check,
sewardjce02aa72006-01-12 12:27:58 +0000443 vta->do_set_NRADDR,
sewardjdb4738a2005-07-07 01:32:16 +0000444 offB_TISTART,
sewardjce02aa72006-01-12 12:27:58 +0000445 offB_TILEN,
446 offB_NRADDR );
sewardjf13a16a2004-07-05 17:10:14 +0000447
sewardj2d6b14a2005-11-23 04:25:07 +0000448 vexAllocSanityCheck();
449
sewardjf13a16a2004-07-05 17:10:14 +0000450 if (irbb == NULL) {
451 /* Access failure. */
sewardj2d6b14a2005-11-23 04:25:07 +0000452 vexSetAllocModeTEMP_and_clear();
sewardjf48ac192004-10-29 00:41:29 +0000453 vex_traceflags = 0;
sewardjd887b862005-01-17 18:34:34 +0000454 return VexTransAccessFail;
sewardjf13a16a2004-07-05 17:10:14 +0000455 }
sewardjaa59f942004-10-09 09:34:36 +0000456
sewardj17c7f952005-12-15 14:02:34 +0000457 vassert(vta->guest_extents->n_used >= 1 && vta->guest_extents->n_used <= 3);
458 vassert(vta->guest_extents->base[0] == vta->guest_bytes_addr);
459 for (i = 0; i < vta->guest_extents->n_used; i++) {
460 vassert(vta->guest_extents->len[i] < 10000); /* sanity */
sewardj72c72812005-01-19 11:49:45 +0000461 }
462
sewardjaa59f942004-10-09 09:34:36 +0000463 /* If debugging, show the raw guest bytes for this bb. */
sewardj109ffdb2004-12-10 21:45:38 +0000464 if (0 || (vex_traceflags & VEX_TRACE_FE)) {
sewardj17c7f952005-12-15 14:02:34 +0000465 if (vta->guest_extents->n_used > 1) {
sewardj72c72812005-01-19 11:49:45 +0000466 vex_printf("can't show code due to extents > 1\n");
467 } else {
468 /* HACK */
sewardj17c7f952005-12-15 14:02:34 +0000469 UChar* p = (UChar*)vta->guest_bytes;
470 UInt guest_bytes_read = (UInt)vta->guest_extents->len[0];
471 vex_printf(". 0 %llx %u\n.", vta->guest_bytes_addr, guest_bytes_read );
sewardj72c72812005-01-19 11:49:45 +0000472 for (i = 0; i < guest_bytes_read; i++)
cerionf0de28c2005-12-13 20:21:11 +0000473 vex_printf(" %02x", (Int)p[i] );
sewardj72c72812005-01-19 11:49:45 +0000474 vex_printf("\n\n");
475 }
sewardjaa59f942004-10-09 09:34:36 +0000476 }
477
478 /* Sanity check the initial IR. */
sewardjb9230752004-12-29 19:25:06 +0000479 sanityCheckIRBB( irbb, "initial IR",
480 False/*can be non-flat*/, guest_word_type );
sewardje8e9d732004-07-16 21:03:45 +0000481
sewardj2d6b14a2005-11-23 04:25:07 +0000482 vexAllocSanityCheck();
483
sewardjedf4d692004-08-17 13:52:58 +0000484 /* Clean it up, hopefully a lot. */
sewardj8d2291c2004-10-25 14:50:21 +0000485 irbb = do_iropt_BB ( irbb, specHelper, preciseMemExnsFn,
sewardj17c7f952005-12-15 14:02:34 +0000486 vta->guest_bytes_addr );
sewardjb9230752004-12-29 19:25:06 +0000487 sanityCheckIRBB( irbb, "after initial iropt",
488 True/*must be flat*/, guest_word_type );
sewardjedf4d692004-08-17 13:52:58 +0000489
sewardjf48ac192004-10-29 00:41:29 +0000490 if (vex_traceflags & VEX_TRACE_OPT1) {
491 vex_printf("\n------------------------"
492 " After pre-instr IR optimisation "
493 "------------------------\n\n");
sewardjedf4d692004-08-17 13:52:58 +0000494 ppIRBB ( irbb );
495 vex_printf("\n");
496 }
497
sewardj2d6b14a2005-11-23 04:25:07 +0000498 vexAllocSanityCheck();
499
sewardjf13a16a2004-07-05 17:10:14 +0000500 /* Get the thing instrumented. */
sewardj17c7f952005-12-15 14:02:34 +0000501 if (vta->instrument1)
502 irbb = vta->instrument1(irbb, guest_layout,
503 vta->guest_bytes_addr_noredir,
504 vta->guest_extents,
505 guest_word_type, host_word_type);
sewardj2d6b14a2005-11-23 04:25:07 +0000506 vexAllocSanityCheck();
507
sewardj17c7f952005-12-15 14:02:34 +0000508 if (vta->instrument2)
509 irbb = vta->instrument2(irbb, guest_layout,
510 vta->guest_bytes_addr_noredir,
511 vta->guest_extents,
512 guest_word_type, host_word_type);
sewardj49651f42004-10-28 22:11:04 +0000513
sewardjf48ac192004-10-29 00:41:29 +0000514 if (vex_traceflags & VEX_TRACE_INST) {
515 vex_printf("\n------------------------"
516 " After instrumentation "
517 "------------------------\n\n");
518 ppIRBB ( irbb );
519 vex_printf("\n");
520 }
521
sewardj17c7f952005-12-15 14:02:34 +0000522 if (vta->instrument1 || vta->instrument2)
sewardjb9230752004-12-29 19:25:06 +0000523 sanityCheckIRBB( irbb, "after instrumentation",
524 True/*must be flat*/, guest_word_type );
sewardjf13a16a2004-07-05 17:10:14 +0000525
sewardj9578a8b2004-11-04 19:44:48 +0000526 /* Do a post-instrumentation cleanup pass. */
sewardj17c7f952005-12-15 14:02:34 +0000527 if (vta->instrument1 || vta->instrument2) {
sewardj9578a8b2004-11-04 19:44:48 +0000528 do_deadcode_BB( irbb );
529 irbb = cprop_BB( irbb );
530 do_deadcode_BB( irbb );
sewardjb9230752004-12-29 19:25:06 +0000531 sanityCheckIRBB( irbb, "after post-instrumentation cleanup",
532 True/*must be flat*/, guest_word_type );
sewardj9578a8b2004-11-04 19:44:48 +0000533 }
534
sewardj2d6b14a2005-11-23 04:25:07 +0000535 vexAllocSanityCheck();
536
sewardj9578a8b2004-11-04 19:44:48 +0000537 if (vex_traceflags & VEX_TRACE_OPT2) {
538 vex_printf("\n------------------------"
539 " After post-instr IR optimisation "
540 "------------------------\n\n");
541 ppIRBB ( irbb );
542 vex_printf("\n");
543 }
544
sewardjf9517d02005-11-28 13:39:37 +0000545 /* Turn it into virtual-registerised code. Build trees -- this
546 also throws away any dead bindings. */
547 ado_treebuild_BB( irbb );
sewardjf48ac192004-10-29 00:41:29 +0000548
sewardj2d6b14a2005-11-23 04:25:07 +0000549 vexAllocSanityCheck();
550
sewardjf48ac192004-10-29 00:41:29 +0000551 if (vex_traceflags & VEX_TRACE_TREES) {
552 vex_printf("\n------------------------"
553 " After tree-building "
554 "------------------------\n\n");
555 ppIRBB ( irbb );
556 vex_printf("\n");
557 }
558
sewardje908c422005-02-04 21:18:16 +0000559 /* HACK */
sewardj17c7f952005-12-15 14:02:34 +0000560 if (0) { *(vta->host_bytes_used) = 0; return VexTransOK; }
sewardje908c422005-02-04 21:18:16 +0000561 /* end HACK */
sewardjc33671d2005-02-01 20:30:00 +0000562
sewardjf48ac192004-10-29 00:41:29 +0000563 if (vex_traceflags & VEX_TRACE_VCODE)
564 vex_printf("\n------------------------"
565 " Instruction selection "
566 "------------------------\n");
567
sewardj17c7f952005-12-15 14:02:34 +0000568 vcode = iselBB ( irbb, &vta->archinfo_host );
sewardjf13a16a2004-07-05 17:10:14 +0000569
sewardj2d6b14a2005-11-23 04:25:07 +0000570 vexAllocSanityCheck();
571
sewardjf48ac192004-10-29 00:41:29 +0000572 if (vex_traceflags & VEX_TRACE_VCODE)
573 vex_printf("\n");
574
sewardjf48ac192004-10-29 00:41:29 +0000575 if (vex_traceflags & VEX_TRACE_VCODE) {
sewardj1f40a0a2004-07-21 12:28:07 +0000576 for (i = 0; i < vcode->arr_used; i++) {
577 vex_printf("%3d ", i);
cerion92b64362005-12-13 12:02:26 +0000578 ppInstr(vcode->arr[i], mode64);
sewardj1f40a0a2004-07-21 12:28:07 +0000579 vex_printf("\n");
580 }
sewardjfbcaf332004-07-08 01:46:01 +0000581 vex_printf("\n");
582 }
sewardjfbcaf332004-07-08 01:46:01 +0000583
sewardjf13a16a2004-07-05 17:10:14 +0000584 /* Register allocate. */
585 rcode = doRegisterAllocation ( vcode, available_real_regs,
cerionf0de28c2005-12-13 20:21:11 +0000586 n_available_real_regs,
sewardj72c72812005-01-19 11:49:45 +0000587 isMove, getRegUsage, mapRegs,
588 genSpill, genReload, guest_sizeB,
cerion92b64362005-12-13 12:02:26 +0000589 ppInstr, ppReg, mode64 );
sewardjf13a16a2004-07-05 17:10:14 +0000590
sewardj2d6b14a2005-11-23 04:25:07 +0000591 vexAllocSanityCheck();
592
sewardjf48ac192004-10-29 00:41:29 +0000593 if (vex_traceflags & VEX_TRACE_RCODE) {
594 vex_printf("\n------------------------"
595 " Register-allocated code "
596 "------------------------\n\n");
sewardj1f40a0a2004-07-21 12:28:07 +0000597 for (i = 0; i < rcode->arr_used; i++) {
598 vex_printf("%3d ", i);
cerion92b64362005-12-13 12:02:26 +0000599 ppInstr(rcode->arr[i], mode64);
sewardj1f40a0a2004-07-21 12:28:07 +0000600 vex_printf("\n");
601 }
sewardjfbcaf332004-07-08 01:46:01 +0000602 vex_printf("\n");
603 }
sewardjfbcaf332004-07-08 01:46:01 +0000604
sewardje908c422005-02-04 21:18:16 +0000605 /* HACK */
sewardj17c7f952005-12-15 14:02:34 +0000606 if (0) { *(vta->host_bytes_used) = 0; return VexTransOK; }
sewardje908c422005-02-04 21:18:16 +0000607 /* end HACK */
608
sewardj81bd5502004-07-21 18:49:27 +0000609 /* Assemble */
sewardjf48ac192004-10-29 00:41:29 +0000610 if (vex_traceflags & VEX_TRACE_ASM) {
611 vex_printf("\n------------------------"
612 " Assembly "
613 "------------------------\n\n");
614 }
615
sewardj81bd5502004-07-21 18:49:27 +0000616 out_used = 0; /* tracks along the host_bytes array */
617 for (i = 0; i < rcode->arr_used; i++) {
sewardjf48ac192004-10-29 00:41:29 +0000618 if (vex_traceflags & VEX_TRACE_ASM) {
cerion92b64362005-12-13 12:02:26 +0000619 ppInstr(rcode->arr[i], mode64);
sewardjbad34a92004-07-22 01:14:11 +0000620 vex_printf("\n");
621 }
sewardj17c7f952005-12-15 14:02:34 +0000622 j = (*emit)( insn_bytes, 32, rcode->arr[i], mode64, vta->dispatch );
sewardjf48ac192004-10-29 00:41:29 +0000623 if (vex_traceflags & VEX_TRACE_ASM) {
sewardjbad34a92004-07-22 01:14:11 +0000624 for (k = 0; k < j; k++)
sewardj72c72812005-01-19 11:49:45 +0000625 if (insn_bytes[k] < 16)
sewardj86898e82004-07-22 17:26:12 +0000626 vex_printf("0%x ", (UInt)insn_bytes[k]);
627 else
628 vex_printf("%x ", (UInt)insn_bytes[k]);
sewardjbad34a92004-07-22 01:14:11 +0000629 vex_printf("\n\n");
630 }
sewardj17c7f952005-12-15 14:02:34 +0000631 if (out_used + j > vta->host_bytes_size) {
sewardj2d6b14a2005-11-23 04:25:07 +0000632 vexSetAllocModeTEMP_and_clear();
sewardjf48ac192004-10-29 00:41:29 +0000633 vex_traceflags = 0;
sewardjd887b862005-01-17 18:34:34 +0000634 return VexTransOutputFull;
sewardj81bd5502004-07-21 18:49:27 +0000635 }
636 for (k = 0; k < j; k++) {
sewardj17c7f952005-12-15 14:02:34 +0000637 vta->host_bytes[out_used] = insn_bytes[k];
sewardj81bd5502004-07-21 18:49:27 +0000638 out_used++;
639 }
sewardj17c7f952005-12-15 14:02:34 +0000640 vassert(out_used <= vta->host_bytes_size);
sewardj81bd5502004-07-21 18:49:27 +0000641 }
sewardj17c7f952005-12-15 14:02:34 +0000642 *(vta->host_bytes_used) = out_used;
sewardj81bd5502004-07-21 18:49:27 +0000643
sewardj2d6b14a2005-11-23 04:25:07 +0000644 vexAllocSanityCheck();
645
646 vexSetAllocModeTEMP_and_clear();
sewardjf13a16a2004-07-05 17:10:14 +0000647
sewardjf48ac192004-10-29 00:41:29 +0000648 vex_traceflags = 0;
sewardjd887b862005-01-17 18:34:34 +0000649 return VexTransOK;
sewardj35421a32004-07-05 13:12:34 +0000650}
651
652
sewardj893aada2004-11-29 19:57:54 +0000653/* --------- Emulation warnings. --------- */
654
655HChar* LibVEX_EmWarn_string ( VexEmWarn ew )
656{
657 switch (ew) {
658 case EmWarn_NONE:
659 return "none";
660 case EmWarn_X86_x87exns:
661 return "Unmasking x87 FP exceptions";
sewardj893aada2004-11-29 19:57:54 +0000662 case EmWarn_X86_x87precision:
663 return "Selection of non-80-bit x87 FP precision";
664 case EmWarn_X86_sseExns:
sewardj5edfc262004-12-15 12:13:52 +0000665 return "Unmasking SSE FP exceptions";
666 case EmWarn_X86_fz:
667 return "Setting %mxcsr.fz (SSE flush-underflows-to-zero mode)";
668 case EmWarn_X86_daz:
669 return "Setting %mxcsr.daz (SSE treat-denormals-as-zero mode)";
sewardj6d269842005-08-06 11:45:02 +0000670 case EmWarn_X86_acFlag:
671 return "Setting %eflags.ac (setting noted but ignored)";
cerion094d1392005-06-20 13:45:57 +0000672 case EmWarn_PPC32exns:
673 return "Unmasking PPC32 FP exceptions";
sewardj893aada2004-11-29 19:57:54 +0000674 default:
675 vpanic("LibVEX_EmWarn_string: unknown warning");
676 }
677}
sewardj35421a32004-07-05 13:12:34 +0000678
sewardj27e1dd62005-06-30 11:49:14 +0000679/* --------- Arch/Subarch stuff. --------- */
sewardjbef170b2004-12-21 01:23:00 +0000680
681const HChar* LibVEX_ppVexArch ( VexArch arch )
682{
683 switch (arch) {
684 case VexArch_INVALID: return "INVALID";
685 case VexArchX86: return "X86";
686 case VexArchAMD64: return "AMD64";
687 case VexArchARM: return "ARM";
sewardj0ec57c52005-02-01 15:24:10 +0000688 case VexArchPPC32: return "PPC32";
cerionf0de28c2005-12-13 20:21:11 +0000689 case VexArchPPC64: return "PPC64";
sewardjbef170b2004-12-21 01:23:00 +0000690 default: return "VexArch???";
691 }
692}
693
694const HChar* LibVEX_ppVexSubArch ( VexSubArch subarch )
695{
696 switch (subarch) {
sewardj0ec57c52005-02-01 15:24:10 +0000697 case VexSubArch_INVALID: return "INVALID";
698 case VexSubArch_NONE: return "NONE";
699 case VexSubArchX86_sse0: return "x86-sse0";
700 case VexSubArchX86_sse1: return "x86-sse1";
701 case VexSubArchX86_sse2: return "x86-sse2";
702 case VexSubArchARM_v4: return "arm-v4";
sewardj059601a2005-11-13 00:53:05 +0000703 case VexSubArchPPC32_I: return "ppc32-int-only";
704 case VexSubArchPPC32_FI: return "ppc32-int-and-fp";
705 case VexSubArchPPC32_VFI: return "ppc32-int-fp-and-AV";
cerionf0de28c2005-12-13 20:21:11 +0000706 case VexSubArchPPC64_FI: return "ppc64-int-and-fp";
707 case VexSubArchPPC64_VFI: return "ppc64-int-fp-and-AV";
sewardj0ec57c52005-02-01 15:24:10 +0000708 default: return "VexSubArch???";
sewardjbef170b2004-12-21 01:23:00 +0000709 }
710}
711
sewardj27e1dd62005-06-30 11:49:14 +0000712/* Write default settings info *vai. */
713void LibVEX_default_VexArchInfo ( /*OUT*/VexArchInfo* vai )
714{
cerion5b2325f2005-12-23 00:55:09 +0000715 vai->subarch = VexSubArch_INVALID;
716 vai->ppc_cache_line_szB = 0;
sewardj27e1dd62005-06-30 11:49:14 +0000717}
718
719
sewardj35421a32004-07-05 13:12:34 +0000720/*---------------------------------------------------------------*/
sewardjc0ee2ed2004-07-27 10:29:41 +0000721/*--- end main/vex_main.c ---*/
sewardj35421a32004-07-05 13:12:34 +0000722/*---------------------------------------------------------------*/