blob: b232fbf63a796d32e3007602217c8dad5bac0a12 [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;
sewardjc716aea2006-01-17 01:48:46 +0000203 Int offB_TISTART, offB_TILEN;
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;
sewardj36ca5132004-07-24 13:12:23 +0000229
sewardj17c7f952005-12-15 14:02:34 +0000230 vex_traceflags = vta->traceflags;
sewardj58800ff2004-07-28 01:51:10 +0000231
sewardj35421a32004-07-05 13:12:34 +0000232 vassert(vex_initdone);
sewardj2d6b14a2005-11-23 04:25:07 +0000233 vexSetAllocModeTEMP_and_clear();
234 vexAllocSanityCheck();
sewardj2a9ad022004-11-25 02:46:58 +0000235
sewardjf13a16a2004-07-05 17:10:14 +0000236 /* First off, check that the guest and host insn sets
237 are supported. */
sewardj2a9ad022004-11-25 02:46:58 +0000238
sewardj17c7f952005-12-15 14:02:34 +0000239 switch (vta->arch_host) {
sewardj2a9ad022004-11-25 02:46:58 +0000240
sewardjbef170b2004-12-21 01:23:00 +0000241 case VexArchX86:
cerion92b64362005-12-13 12:02:26 +0000242 mode64 = False;
sewardjf13a16a2004-07-05 17:10:14 +0000243 getAllocableRegs_X86 ( &n_available_real_regs,
244 &available_real_regs );
245 isMove = (Bool(*)(HInstr*,HReg*,HReg*)) isMove_X86Instr;
cerion92b64362005-12-13 12:02:26 +0000246 getRegUsage = (void(*)(HRegUsage*,HInstr*, Bool)) getRegUsage_X86Instr;
247 mapRegs = (void(*)(HRegRemap*,HInstr*, Bool)) mapRegs_X86Instr;
248 genSpill = (HInstr*(*)(HReg,Int, Bool)) genSpill_X86;
249 genReload = (HInstr*(*)(HReg,Int, Bool)) genReload_X86;
250 ppInstr = (void(*)(HInstr*, Bool)) ppX86Instr;
sewardj2b515872004-07-05 20:50:45 +0000251 ppReg = (void(*)(HReg)) ppHRegX86;
sewardjf13a16a2004-07-05 17:10:14 +0000252 iselBB = iselBB_X86;
sewardj0528bb52005-12-15 15:45:20 +0000253 emit = (Int(*)(UChar*,Int,HInstr*,Bool,void*)) emit_X86Instr;
sewardj72c72812005-01-19 11:49:45 +0000254 host_is_bigendian = False;
sewardjcf787902004-11-03 09:08:33 +0000255 host_word_type = Ity_I32;
sewardj17c7f952005-12-15 14:02:34 +0000256 vassert(vta->archinfo_host.subarch == VexSubArchX86_sse0
257 || vta->archinfo_host.subarch == VexSubArchX86_sse1
258 || vta->archinfo_host.subarch == VexSubArchX86_sse2);
259 vassert(vta->dispatch != NULL); /* jump-to-dispatcher scheme */
sewardjf13a16a2004-07-05 17:10:14 +0000260 break;
sewardj2a9ad022004-11-25 02:46:58 +0000261
sewardjc33671d2005-02-01 20:30:00 +0000262 case VexArchAMD64:
cerion92b64362005-12-13 12:02:26 +0000263 mode64 = True;
sewardjc33671d2005-02-01 20:30:00 +0000264 getAllocableRegs_AMD64 ( &n_available_real_regs,
265 &available_real_regs );
266 isMove = (Bool(*)(HInstr*,HReg*,HReg*)) isMove_AMD64Instr;
cerion92b64362005-12-13 12:02:26 +0000267 getRegUsage = (void(*)(HRegUsage*,HInstr*, Bool)) getRegUsage_AMD64Instr;
268 mapRegs = (void(*)(HRegRemap*,HInstr*, Bool)) mapRegs_AMD64Instr;
269 genSpill = (HInstr*(*)(HReg,Int, Bool)) genSpill_AMD64;
270 genReload = (HInstr*(*)(HReg,Int, Bool)) genReload_AMD64;
271 ppInstr = (void(*)(HInstr*, Bool)) ppAMD64Instr;
sewardjc33671d2005-02-01 20:30:00 +0000272 ppReg = (void(*)(HReg)) ppHRegAMD64;
273 iselBB = iselBB_AMD64;
sewardj0528bb52005-12-15 15:45:20 +0000274 emit = (Int(*)(UChar*,Int,HInstr*,Bool,void*)) emit_AMD64Instr;
sewardjc33671d2005-02-01 20:30:00 +0000275 host_is_bigendian = False;
276 host_word_type = Ity_I64;
sewardj17c7f952005-12-15 14:02:34 +0000277 vassert(vta->archinfo_host.subarch == VexSubArch_NONE);
278 vassert(vta->dispatch != NULL); /* jump-to-dispatcher scheme */
sewardjc33671d2005-02-01 20:30:00 +0000279 break;
280
cerion487e4c92005-02-04 16:28:19 +0000281 case VexArchPPC32:
cerion92b64362005-12-13 12:02:26 +0000282 mode64 = False;
cerion5b2325f2005-12-23 00:55:09 +0000283 getAllocableRegs_PPC ( &n_available_real_regs,
284 &available_real_regs, mode64 );
285 isMove = (Bool(*)(HInstr*,HReg*,HReg*)) isMove_PPCInstr;
286 getRegUsage = (void(*)(HRegUsage*,HInstr*,Bool)) getRegUsage_PPCInstr;
287 mapRegs = (void(*)(HRegRemap*,HInstr*,Bool)) mapRegs_PPCInstr;
288 genSpill = (HInstr*(*)(HReg,Int,Bool)) genSpill_PPC;
289 genReload = (HInstr*(*)(HReg,Int,Bool)) genReload_PPC;
290 ppInstr = (void(*)(HInstr*,Bool)) ppPPCInstr;
291 ppReg = (void(*)(HReg)) ppHRegPPC;
292 iselBB = iselBB_PPC;
293 emit = (Int(*)(UChar*,Int,HInstr*,Bool,void*)) emit_PPCInstr;
cerion487e4c92005-02-04 16:28:19 +0000294 host_is_bigendian = True;
295 host_word_type = Ity_I32;
sewardj17c7f952005-12-15 14:02:34 +0000296 vassert(vta->archinfo_guest.subarch == VexSubArchPPC32_I
297 || vta->archinfo_guest.subarch == VexSubArchPPC32_FI
298 || vta->archinfo_guest.subarch == VexSubArchPPC32_VFI);
299 vassert(vta->dispatch == NULL); /* return-to-dispatcher scheme */
cerion487e4c92005-02-04 16:28:19 +0000300 break;
301
cerionf0de28c2005-12-13 20:21:11 +0000302 case VexArchPPC64:
303 mode64 = True;
cerion5b2325f2005-12-23 00:55:09 +0000304 getAllocableRegs_PPC ( &n_available_real_regs,
305 &available_real_regs, mode64 );
306 isMove = (Bool(*)(HInstr*,HReg*,HReg*)) isMove_PPCInstr;
307 getRegUsage = (void(*)(HRegUsage*,HInstr*, Bool)) getRegUsage_PPCInstr;
308 mapRegs = (void(*)(HRegRemap*,HInstr*, Bool)) mapRegs_PPCInstr;
309 genSpill = (HInstr*(*)(HReg,Int, Bool)) genSpill_PPC;
310 genReload = (HInstr*(*)(HReg,Int, Bool)) genReload_PPC;
311 ppInstr = (void(*)(HInstr*, Bool)) ppPPCInstr;
312 ppReg = (void(*)(HReg)) ppHRegPPC;
313 iselBB = iselBB_PPC;
314 emit = (Int(*)(UChar*,Int,HInstr*,Bool,void*)) emit_PPCInstr;
cerionf0de28c2005-12-13 20:21:11 +0000315 host_is_bigendian = True;
316 host_word_type = Ity_I64;
sewardj17c7f952005-12-15 14:02:34 +0000317 vassert(vta->archinfo_guest.subarch == VexSubArchPPC64_FI
318 || vta->archinfo_guest.subarch == VexSubArchPPC64_VFI);
319 vassert(vta->dispatch == NULL); /* return-to-dispatcher scheme */
cerionf0de28c2005-12-13 20:21:11 +0000320 break;
321
sewardjf13a16a2004-07-05 17:10:14 +0000322 default:
sewardj887a11a2004-07-05 17:26:47 +0000323 vpanic("LibVEX_Translate: unsupported target insn set");
sewardjf13a16a2004-07-05 17:10:14 +0000324 }
325
sewardj2a9ad022004-11-25 02:46:58 +0000326
sewardj17c7f952005-12-15 14:02:34 +0000327 switch (vta->arch_guest) {
sewardj2a9ad022004-11-25 02:46:58 +0000328
sewardjbef170b2004-12-21 01:23:00 +0000329 case VexArchX86:
sewardj8d2291c2004-10-25 14:50:21 +0000330 preciseMemExnsFn = guest_x86_state_requires_precise_mem_exns;
sewardj9e6491a2005-07-02 19:24:10 +0000331 disInstrFn = disInstr_X86;
sewardj2a9ad022004-11-25 02:46:58 +0000332 specHelper = guest_x86_spechelper;
sewardj81ec4182004-10-25 23:15:52 +0000333 guest_sizeB = sizeof(VexGuestX86State);
sewardjcf787902004-11-03 09:08:33 +0000334 guest_word_type = Ity_I32;
sewardj49651f42004-10-28 22:11:04 +0000335 guest_layout = &x86guest_layout;
sewardjdb4738a2005-07-07 01:32:16 +0000336 offB_TISTART = offsetof(VexGuestX86State,guest_TISTART);
337 offB_TILEN = offsetof(VexGuestX86State,guest_TILEN);
sewardj17c7f952005-12-15 14:02:34 +0000338 vassert(vta->archinfo_guest.subarch == VexSubArchX86_sse0
339 || vta->archinfo_guest.subarch == VexSubArchX86_sse1
340 || vta->archinfo_guest.subarch == VexSubArchX86_sse2);
sewardje74f6f72005-08-05 02:55:36 +0000341 vassert(0 == sizeof(VexGuestX86State) % 8);
sewardjce02aa72006-01-12 12:27:58 +0000342 vassert(sizeof( ((VexGuestX86State*)0)->guest_TISTART) == 4);
343 vassert(sizeof( ((VexGuestX86State*)0)->guest_TILEN ) == 4);
344 vassert(sizeof( ((VexGuestX86State*)0)->guest_NRADDR ) == 4);
sewardjf13a16a2004-07-05 17:10:14 +0000345 break;
sewardj2a9ad022004-11-25 02:46:58 +0000346
sewardj44d494d2005-01-20 20:26:33 +0000347 case VexArchAMD64:
348 preciseMemExnsFn = guest_amd64_state_requires_precise_mem_exns;
sewardj9e6491a2005-07-02 19:24:10 +0000349 disInstrFn = disInstr_AMD64;
sewardj44d494d2005-01-20 20:26:33 +0000350 specHelper = guest_amd64_spechelper;
351 guest_sizeB = sizeof(VexGuestAMD64State);
352 guest_word_type = Ity_I64;
353 guest_layout = &amd64guest_layout;
sewardjdb4738a2005-07-07 01:32:16 +0000354 offB_TISTART = offsetof(VexGuestAMD64State,guest_TISTART);
355 offB_TILEN = offsetof(VexGuestAMD64State,guest_TILEN);
sewardj17c7f952005-12-15 14:02:34 +0000356 vassert(vta->archinfo_guest.subarch == VexSubArch_NONE);
sewardje74f6f72005-08-05 02:55:36 +0000357 vassert(0 == sizeof(VexGuestAMD64State) % 8);
sewardjdb4738a2005-07-07 01:32:16 +0000358 vassert(sizeof( ((VexGuestAMD64State*)0)->guest_TISTART ) == 8);
sewardjce02aa72006-01-12 12:27:58 +0000359 vassert(sizeof( ((VexGuestAMD64State*)0)->guest_TILEN ) == 8);
360 vassert(sizeof( ((VexGuestAMD64State*)0)->guest_NRADDR ) == 8);
sewardj44d494d2005-01-20 20:26:33 +0000361 break;
362
sewardjbef170b2004-12-21 01:23:00 +0000363 case VexArchARM:
sewardj2a9ad022004-11-25 02:46:58 +0000364 preciseMemExnsFn = guest_arm_state_requires_precise_mem_exns;
sewardj9e6491a2005-07-02 19:24:10 +0000365 disInstrFn = NULL; /* HACK */
sewardj2a9ad022004-11-25 02:46:58 +0000366 specHelper = guest_arm_spechelper;
367 guest_sizeB = sizeof(VexGuestARMState);
368 guest_word_type = Ity_I32;
369 guest_layout = &armGuest_layout;
sewardjdb4738a2005-07-07 01:32:16 +0000370 offB_TISTART = 0; /* hack ... arm has bitrot */
371 offB_TILEN = 0; /* hack ... arm has bitrot */
sewardj17c7f952005-12-15 14:02:34 +0000372 vassert(vta->archinfo_guest.subarch == VexSubArchARM_v4);
sewardj2a9ad022004-11-25 02:46:58 +0000373 break;
374
cerionaabdfbf2005-01-29 12:56:15 +0000375 case VexArchPPC32:
376 preciseMemExnsFn = guest_ppc32_state_requires_precise_mem_exns;
cerion5b2325f2005-12-23 00:55:09 +0000377 disInstrFn = disInstr_PPC;
cerionaabdfbf2005-01-29 12:56:15 +0000378 specHelper = guest_ppc32_spechelper;
379 guest_sizeB = sizeof(VexGuestPPC32State);
380 guest_word_type = Ity_I32;
381 guest_layout = &ppc32Guest_layout;
sewardjdb4738a2005-07-07 01:32:16 +0000382 offB_TISTART = offsetof(VexGuestPPC32State,guest_TISTART);
383 offB_TILEN = offsetof(VexGuestPPC32State,guest_TILEN);
sewardj17c7f952005-12-15 14:02:34 +0000384 vassert(vta->archinfo_guest.subarch == VexSubArchPPC32_I
385 || vta->archinfo_guest.subarch == VexSubArchPPC32_FI
386 || vta->archinfo_guest.subarch == VexSubArchPPC32_VFI);
sewardje74f6f72005-08-05 02:55:36 +0000387 vassert(0 == sizeof(VexGuestPPC32State) % 8);
sewardjdb4738a2005-07-07 01:32:16 +0000388 vassert(sizeof( ((VexGuestPPC32State*)0)->guest_TISTART ) == 4);
sewardjce02aa72006-01-12 12:27:58 +0000389 vassert(sizeof( ((VexGuestPPC32State*)0)->guest_TILEN ) == 4);
390 vassert(sizeof( ((VexGuestPPC32State*)0)->guest_NRADDR ) == 4);
cerionaabdfbf2005-01-29 12:56:15 +0000391 break;
392
cerionf0de28c2005-12-13 20:21:11 +0000393 case VexArchPPC64:
394 preciseMemExnsFn = guest_ppc64_state_requires_precise_mem_exns;
cerion5b2325f2005-12-23 00:55:09 +0000395 disInstrFn = disInstr_PPC;
cerionf0de28c2005-12-13 20:21:11 +0000396 specHelper = guest_ppc64_spechelper;
397 guest_sizeB = sizeof(VexGuestPPC64State);
398 guest_word_type = Ity_I64;
399 guest_layout = &ppc64Guest_layout;
400 offB_TISTART = offsetof(VexGuestPPC64State,guest_TISTART);
401 offB_TILEN = offsetof(VexGuestPPC64State,guest_TILEN);
sewardj17c7f952005-12-15 14:02:34 +0000402 vassert(vta->archinfo_guest.subarch == VexSubArchPPC64_FI
403 || vta->archinfo_guest.subarch == VexSubArchPPC64_VFI);
cerionf0de28c2005-12-13 20:21:11 +0000404 vassert(0 == sizeof(VexGuestPPC64State) % 16);
405 vassert(sizeof( ((VexGuestPPC64State*)0)->guest_TISTART ) == 8);
sewardjc716aea2006-01-17 01:48:46 +0000406 vassert(sizeof( ((VexGuestPPC64State*)0)->guest_TILEN ) == 8);
407 vassert(sizeof( ((VexGuestPPC64State*)0)->guest_NRADDR ) == 8);
cerionf0de28c2005-12-13 20:21:11 +0000408 break;
409
sewardjf13a16a2004-07-05 17:10:14 +0000410 default:
sewardj887a11a2004-07-05 17:26:47 +0000411 vpanic("LibVEX_Translate: unsupported guest insn set");
sewardjf13a16a2004-07-05 17:10:14 +0000412 }
413
sewardj9df271d2004-12-31 22:37:42 +0000414 /* yet more sanity checks ... */
sewardj17c7f952005-12-15 14:02:34 +0000415 if (vta->arch_guest == vta->arch_host) {
sewardj9df271d2004-12-31 22:37:42 +0000416 /* doesn't necessarily have to be true, but if it isn't it means
sewardj0ec57c52005-02-01 15:24:10 +0000417 we are simulating one flavour of an architecture a different
418 flavour of the same architecture, which is pretty strange. */
sewardj17c7f952005-12-15 14:02:34 +0000419 vassert(vta->archinfo_guest.subarch == vta->archinfo_host.subarch);
sewardj9df271d2004-12-31 22:37:42 +0000420 }
sewardj2a9ad022004-11-25 02:46:58 +0000421
sewardj2d6b14a2005-11-23 04:25:07 +0000422 vexAllocSanityCheck();
423
sewardjf48ac192004-10-29 00:41:29 +0000424 if (vex_traceflags & VEX_TRACE_FE)
425 vex_printf("\n------------------------"
426 " Front end "
427 "------------------------\n\n");
428
sewardj17c7f952005-12-15 14:02:34 +0000429 irbb = bb_to_IR ( vta->guest_extents,
sewardjc716aea2006-01-17 01:48:46 +0000430 vta->callback_opaque,
sewardj9e6491a2005-07-02 19:24:10 +0000431 disInstrFn,
sewardj17c7f952005-12-15 14:02:34 +0000432 vta->guest_bytes,
433 vta->guest_bytes_addr,
434 vta->chase_into_ok,
sewardj9e6491a2005-07-02 19:24:10 +0000435 host_is_bigendian,
sewardj17c7f952005-12-15 14:02:34 +0000436 &vta->archinfo_guest,
sewardjdb4738a2005-07-07 01:32:16 +0000437 guest_word_type,
sewardj17c7f952005-12-15 14:02:34 +0000438 vta->do_self_check,
sewardjc716aea2006-01-17 01:48:46 +0000439 vta->preamble_function,
sewardjdb4738a2005-07-07 01:32:16 +0000440 offB_TISTART,
sewardjc716aea2006-01-17 01:48:46 +0000441 offB_TILEN );
sewardjf13a16a2004-07-05 17:10:14 +0000442
sewardj2d6b14a2005-11-23 04:25:07 +0000443 vexAllocSanityCheck();
444
sewardjf13a16a2004-07-05 17:10:14 +0000445 if (irbb == NULL) {
446 /* Access failure. */
sewardj2d6b14a2005-11-23 04:25:07 +0000447 vexSetAllocModeTEMP_and_clear();
sewardjf48ac192004-10-29 00:41:29 +0000448 vex_traceflags = 0;
sewardjd887b862005-01-17 18:34:34 +0000449 return VexTransAccessFail;
sewardjf13a16a2004-07-05 17:10:14 +0000450 }
sewardjaa59f942004-10-09 09:34:36 +0000451
sewardj17c7f952005-12-15 14:02:34 +0000452 vassert(vta->guest_extents->n_used >= 1 && vta->guest_extents->n_used <= 3);
453 vassert(vta->guest_extents->base[0] == vta->guest_bytes_addr);
454 for (i = 0; i < vta->guest_extents->n_used; i++) {
455 vassert(vta->guest_extents->len[i] < 10000); /* sanity */
sewardj72c72812005-01-19 11:49:45 +0000456 }
457
sewardjaa59f942004-10-09 09:34:36 +0000458 /* If debugging, show the raw guest bytes for this bb. */
sewardj109ffdb2004-12-10 21:45:38 +0000459 if (0 || (vex_traceflags & VEX_TRACE_FE)) {
sewardj17c7f952005-12-15 14:02:34 +0000460 if (vta->guest_extents->n_used > 1) {
sewardj72c72812005-01-19 11:49:45 +0000461 vex_printf("can't show code due to extents > 1\n");
462 } else {
463 /* HACK */
sewardj17c7f952005-12-15 14:02:34 +0000464 UChar* p = (UChar*)vta->guest_bytes;
465 UInt guest_bytes_read = (UInt)vta->guest_extents->len[0];
466 vex_printf(". 0 %llx %u\n.", vta->guest_bytes_addr, guest_bytes_read );
sewardj72c72812005-01-19 11:49:45 +0000467 for (i = 0; i < guest_bytes_read; i++)
cerionf0de28c2005-12-13 20:21:11 +0000468 vex_printf(" %02x", (Int)p[i] );
sewardj72c72812005-01-19 11:49:45 +0000469 vex_printf("\n\n");
470 }
sewardjaa59f942004-10-09 09:34:36 +0000471 }
472
473 /* Sanity check the initial IR. */
sewardjb9230752004-12-29 19:25:06 +0000474 sanityCheckIRBB( irbb, "initial IR",
475 False/*can be non-flat*/, guest_word_type );
sewardje8e9d732004-07-16 21:03:45 +0000476
sewardj2d6b14a2005-11-23 04:25:07 +0000477 vexAllocSanityCheck();
478
sewardjedf4d692004-08-17 13:52:58 +0000479 /* Clean it up, hopefully a lot. */
sewardj8d2291c2004-10-25 14:50:21 +0000480 irbb = do_iropt_BB ( irbb, specHelper, preciseMemExnsFn,
sewardj17c7f952005-12-15 14:02:34 +0000481 vta->guest_bytes_addr );
sewardjb9230752004-12-29 19:25:06 +0000482 sanityCheckIRBB( irbb, "after initial iropt",
483 True/*must be flat*/, guest_word_type );
sewardjedf4d692004-08-17 13:52:58 +0000484
sewardjf48ac192004-10-29 00:41:29 +0000485 if (vex_traceflags & VEX_TRACE_OPT1) {
486 vex_printf("\n------------------------"
487 " After pre-instr IR optimisation "
488 "------------------------\n\n");
sewardjedf4d692004-08-17 13:52:58 +0000489 ppIRBB ( irbb );
490 vex_printf("\n");
491 }
492
sewardj2d6b14a2005-11-23 04:25:07 +0000493 vexAllocSanityCheck();
494
sewardjf13a16a2004-07-05 17:10:14 +0000495 /* Get the thing instrumented. */
sewardj17c7f952005-12-15 14:02:34 +0000496 if (vta->instrument1)
sewardjc716aea2006-01-17 01:48:46 +0000497 irbb = vta->instrument1(vta->callback_opaque,
498 irbb, guest_layout,
sewardj17c7f952005-12-15 14:02:34 +0000499 vta->guest_extents,
500 guest_word_type, host_word_type);
sewardj2d6b14a2005-11-23 04:25:07 +0000501 vexAllocSanityCheck();
502
sewardj17c7f952005-12-15 14:02:34 +0000503 if (vta->instrument2)
sewardjc716aea2006-01-17 01:48:46 +0000504 irbb = vta->instrument2(vta->callback_opaque,
505 irbb, guest_layout,
sewardj17c7f952005-12-15 14:02:34 +0000506 vta->guest_extents,
507 guest_word_type, host_word_type);
sewardj49651f42004-10-28 22:11:04 +0000508
sewardjf48ac192004-10-29 00:41:29 +0000509 if (vex_traceflags & VEX_TRACE_INST) {
510 vex_printf("\n------------------------"
511 " After instrumentation "
512 "------------------------\n\n");
513 ppIRBB ( irbb );
514 vex_printf("\n");
515 }
516
sewardj17c7f952005-12-15 14:02:34 +0000517 if (vta->instrument1 || vta->instrument2)
sewardjb9230752004-12-29 19:25:06 +0000518 sanityCheckIRBB( irbb, "after instrumentation",
519 True/*must be flat*/, guest_word_type );
sewardjf13a16a2004-07-05 17:10:14 +0000520
sewardj9578a8b2004-11-04 19:44:48 +0000521 /* Do a post-instrumentation cleanup pass. */
sewardj17c7f952005-12-15 14:02:34 +0000522 if (vta->instrument1 || vta->instrument2) {
sewardj9578a8b2004-11-04 19:44:48 +0000523 do_deadcode_BB( irbb );
524 irbb = cprop_BB( irbb );
525 do_deadcode_BB( irbb );
sewardjb9230752004-12-29 19:25:06 +0000526 sanityCheckIRBB( irbb, "after post-instrumentation cleanup",
527 True/*must be flat*/, guest_word_type );
sewardj9578a8b2004-11-04 19:44:48 +0000528 }
529
sewardj2d6b14a2005-11-23 04:25:07 +0000530 vexAllocSanityCheck();
531
sewardj9578a8b2004-11-04 19:44:48 +0000532 if (vex_traceflags & VEX_TRACE_OPT2) {
533 vex_printf("\n------------------------"
534 " After post-instr IR optimisation "
535 "------------------------\n\n");
536 ppIRBB ( irbb );
537 vex_printf("\n");
538 }
539
sewardjf9517d02005-11-28 13:39:37 +0000540 /* Turn it into virtual-registerised code. Build trees -- this
541 also throws away any dead bindings. */
542 ado_treebuild_BB( irbb );
sewardjf48ac192004-10-29 00:41:29 +0000543
sewardj2d6b14a2005-11-23 04:25:07 +0000544 vexAllocSanityCheck();
545
sewardjf48ac192004-10-29 00:41:29 +0000546 if (vex_traceflags & VEX_TRACE_TREES) {
547 vex_printf("\n------------------------"
548 " After tree-building "
549 "------------------------\n\n");
550 ppIRBB ( irbb );
551 vex_printf("\n");
552 }
553
sewardje908c422005-02-04 21:18:16 +0000554 /* HACK */
sewardj17c7f952005-12-15 14:02:34 +0000555 if (0) { *(vta->host_bytes_used) = 0; return VexTransOK; }
sewardje908c422005-02-04 21:18:16 +0000556 /* end HACK */
sewardjc33671d2005-02-01 20:30:00 +0000557
sewardjf48ac192004-10-29 00:41:29 +0000558 if (vex_traceflags & VEX_TRACE_VCODE)
559 vex_printf("\n------------------------"
560 " Instruction selection "
561 "------------------------\n");
562
sewardj17c7f952005-12-15 14:02:34 +0000563 vcode = iselBB ( irbb, &vta->archinfo_host );
sewardjf13a16a2004-07-05 17:10:14 +0000564
sewardj2d6b14a2005-11-23 04:25:07 +0000565 vexAllocSanityCheck();
566
sewardjf48ac192004-10-29 00:41:29 +0000567 if (vex_traceflags & VEX_TRACE_VCODE)
568 vex_printf("\n");
569
sewardjf48ac192004-10-29 00:41:29 +0000570 if (vex_traceflags & VEX_TRACE_VCODE) {
sewardj1f40a0a2004-07-21 12:28:07 +0000571 for (i = 0; i < vcode->arr_used; i++) {
572 vex_printf("%3d ", i);
cerion92b64362005-12-13 12:02:26 +0000573 ppInstr(vcode->arr[i], mode64);
sewardj1f40a0a2004-07-21 12:28:07 +0000574 vex_printf("\n");
575 }
sewardjfbcaf332004-07-08 01:46:01 +0000576 vex_printf("\n");
577 }
sewardjfbcaf332004-07-08 01:46:01 +0000578
sewardjf13a16a2004-07-05 17:10:14 +0000579 /* Register allocate. */
580 rcode = doRegisterAllocation ( vcode, available_real_regs,
cerionf0de28c2005-12-13 20:21:11 +0000581 n_available_real_regs,
sewardj72c72812005-01-19 11:49:45 +0000582 isMove, getRegUsage, mapRegs,
583 genSpill, genReload, guest_sizeB,
cerion92b64362005-12-13 12:02:26 +0000584 ppInstr, ppReg, mode64 );
sewardjf13a16a2004-07-05 17:10:14 +0000585
sewardj2d6b14a2005-11-23 04:25:07 +0000586 vexAllocSanityCheck();
587
sewardjf48ac192004-10-29 00:41:29 +0000588 if (vex_traceflags & VEX_TRACE_RCODE) {
589 vex_printf("\n------------------------"
590 " Register-allocated code "
591 "------------------------\n\n");
sewardj1f40a0a2004-07-21 12:28:07 +0000592 for (i = 0; i < rcode->arr_used; i++) {
593 vex_printf("%3d ", i);
cerion92b64362005-12-13 12:02:26 +0000594 ppInstr(rcode->arr[i], mode64);
sewardj1f40a0a2004-07-21 12:28:07 +0000595 vex_printf("\n");
596 }
sewardjfbcaf332004-07-08 01:46:01 +0000597 vex_printf("\n");
598 }
sewardjfbcaf332004-07-08 01:46:01 +0000599
sewardje908c422005-02-04 21:18:16 +0000600 /* HACK */
sewardj17c7f952005-12-15 14:02:34 +0000601 if (0) { *(vta->host_bytes_used) = 0; return VexTransOK; }
sewardje908c422005-02-04 21:18:16 +0000602 /* end HACK */
603
sewardj81bd5502004-07-21 18:49:27 +0000604 /* Assemble */
sewardjf48ac192004-10-29 00:41:29 +0000605 if (vex_traceflags & VEX_TRACE_ASM) {
606 vex_printf("\n------------------------"
607 " Assembly "
608 "------------------------\n\n");
609 }
610
sewardj81bd5502004-07-21 18:49:27 +0000611 out_used = 0; /* tracks along the host_bytes array */
612 for (i = 0; i < rcode->arr_used; i++) {
sewardjf48ac192004-10-29 00:41:29 +0000613 if (vex_traceflags & VEX_TRACE_ASM) {
cerion92b64362005-12-13 12:02:26 +0000614 ppInstr(rcode->arr[i], mode64);
sewardjbad34a92004-07-22 01:14:11 +0000615 vex_printf("\n");
616 }
sewardj17c7f952005-12-15 14:02:34 +0000617 j = (*emit)( insn_bytes, 32, rcode->arr[i], mode64, vta->dispatch );
sewardjf48ac192004-10-29 00:41:29 +0000618 if (vex_traceflags & VEX_TRACE_ASM) {
sewardjbad34a92004-07-22 01:14:11 +0000619 for (k = 0; k < j; k++)
sewardj72c72812005-01-19 11:49:45 +0000620 if (insn_bytes[k] < 16)
sewardj86898e82004-07-22 17:26:12 +0000621 vex_printf("0%x ", (UInt)insn_bytes[k]);
622 else
623 vex_printf("%x ", (UInt)insn_bytes[k]);
sewardjbad34a92004-07-22 01:14:11 +0000624 vex_printf("\n\n");
625 }
sewardj17c7f952005-12-15 14:02:34 +0000626 if (out_used + j > vta->host_bytes_size) {
sewardj2d6b14a2005-11-23 04:25:07 +0000627 vexSetAllocModeTEMP_and_clear();
sewardjf48ac192004-10-29 00:41:29 +0000628 vex_traceflags = 0;
sewardjd887b862005-01-17 18:34:34 +0000629 return VexTransOutputFull;
sewardj81bd5502004-07-21 18:49:27 +0000630 }
631 for (k = 0; k < j; k++) {
sewardj17c7f952005-12-15 14:02:34 +0000632 vta->host_bytes[out_used] = insn_bytes[k];
sewardj81bd5502004-07-21 18:49:27 +0000633 out_used++;
634 }
sewardj17c7f952005-12-15 14:02:34 +0000635 vassert(out_used <= vta->host_bytes_size);
sewardj81bd5502004-07-21 18:49:27 +0000636 }
sewardj17c7f952005-12-15 14:02:34 +0000637 *(vta->host_bytes_used) = out_used;
sewardj81bd5502004-07-21 18:49:27 +0000638
sewardj2d6b14a2005-11-23 04:25:07 +0000639 vexAllocSanityCheck();
640
641 vexSetAllocModeTEMP_and_clear();
sewardjf13a16a2004-07-05 17:10:14 +0000642
sewardjf48ac192004-10-29 00:41:29 +0000643 vex_traceflags = 0;
sewardjd887b862005-01-17 18:34:34 +0000644 return VexTransOK;
sewardj35421a32004-07-05 13:12:34 +0000645}
646
647
sewardj893aada2004-11-29 19:57:54 +0000648/* --------- Emulation warnings. --------- */
649
650HChar* LibVEX_EmWarn_string ( VexEmWarn ew )
651{
652 switch (ew) {
653 case EmWarn_NONE:
654 return "none";
655 case EmWarn_X86_x87exns:
656 return "Unmasking x87 FP exceptions";
sewardj893aada2004-11-29 19:57:54 +0000657 case EmWarn_X86_x87precision:
658 return "Selection of non-80-bit x87 FP precision";
659 case EmWarn_X86_sseExns:
sewardj5edfc262004-12-15 12:13:52 +0000660 return "Unmasking SSE FP exceptions";
661 case EmWarn_X86_fz:
662 return "Setting %mxcsr.fz (SSE flush-underflows-to-zero mode)";
663 case EmWarn_X86_daz:
664 return "Setting %mxcsr.daz (SSE treat-denormals-as-zero mode)";
sewardj6d269842005-08-06 11:45:02 +0000665 case EmWarn_X86_acFlag:
666 return "Setting %eflags.ac (setting noted but ignored)";
sewardj9dd9cf12006-01-20 14:13:55 +0000667 case EmWarn_PPCexns:
668 return "Unmasking PPC32/64 FP exceptions";
669 case EmWarn_PPC64_redir_overflow:
670 return "PPC64 function redirection stack overflow";
671 case EmWarn_PPC64_redir_underflow:
672 return "PPC64 function redirection stack underflow";
sewardj893aada2004-11-29 19:57:54 +0000673 default:
674 vpanic("LibVEX_EmWarn_string: unknown warning");
675 }
676}
sewardj35421a32004-07-05 13:12:34 +0000677
sewardj27e1dd62005-06-30 11:49:14 +0000678/* --------- Arch/Subarch stuff. --------- */
sewardjbef170b2004-12-21 01:23:00 +0000679
680const HChar* LibVEX_ppVexArch ( VexArch arch )
681{
682 switch (arch) {
683 case VexArch_INVALID: return "INVALID";
684 case VexArchX86: return "X86";
685 case VexArchAMD64: return "AMD64";
686 case VexArchARM: return "ARM";
sewardj0ec57c52005-02-01 15:24:10 +0000687 case VexArchPPC32: return "PPC32";
cerionf0de28c2005-12-13 20:21:11 +0000688 case VexArchPPC64: return "PPC64";
sewardjbef170b2004-12-21 01:23:00 +0000689 default: return "VexArch???";
690 }
691}
692
693const HChar* LibVEX_ppVexSubArch ( VexSubArch subarch )
694{
695 switch (subarch) {
sewardj0ec57c52005-02-01 15:24:10 +0000696 case VexSubArch_INVALID: return "INVALID";
697 case VexSubArch_NONE: return "NONE";
698 case VexSubArchX86_sse0: return "x86-sse0";
699 case VexSubArchX86_sse1: return "x86-sse1";
700 case VexSubArchX86_sse2: return "x86-sse2";
701 case VexSubArchARM_v4: return "arm-v4";
sewardj059601a2005-11-13 00:53:05 +0000702 case VexSubArchPPC32_I: return "ppc32-int-only";
703 case VexSubArchPPC32_FI: return "ppc32-int-and-fp";
704 case VexSubArchPPC32_VFI: return "ppc32-int-fp-and-AV";
cerionf0de28c2005-12-13 20:21:11 +0000705 case VexSubArchPPC64_FI: return "ppc64-int-and-fp";
706 case VexSubArchPPC64_VFI: return "ppc64-int-fp-and-AV";
sewardj0ec57c52005-02-01 15:24:10 +0000707 default: return "VexSubArch???";
sewardjbef170b2004-12-21 01:23:00 +0000708 }
709}
710
sewardj27e1dd62005-06-30 11:49:14 +0000711/* Write default settings info *vai. */
712void LibVEX_default_VexArchInfo ( /*OUT*/VexArchInfo* vai )
713{
cerion5b2325f2005-12-23 00:55:09 +0000714 vai->subarch = VexSubArch_INVALID;
715 vai->ppc_cache_line_szB = 0;
sewardj27e1dd62005-06-30 11:49:14 +0000716}
717
718
sewardj35421a32004-07-05 13:12:34 +0000719/*---------------------------------------------------------------*/
sewardjc0ee2ed2004-07-27 10:29:41 +0000720/*--- end main/vex_main.c ---*/
sewardj35421a32004-07-05 13:12:34 +0000721/*---------------------------------------------------------------*/