main_main.c revision be1b6ff6cdb576c59734762fb778ae48eb8e7a10
135421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
235421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*---------------------------------------------------------------*/
335421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*---                                                         ---*/
4c0ee2edb4563c90bc8f1a83a09984a1fda86d1d3sewardj/*--- This file (main/vex_main.c) is                          ---*/
5dbcfae724d5338205befbcd379a48f2303658198sewardj/*--- Copyright (C) OpenWorks LLP.  All rights reserved.      ---*/
635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*---                                                         ---*/
735421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*---------------------------------------------------------------*/
835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
9f8ed9d874a7b8651654591c68c6d431c758d787csewardj/*
10f8ed9d874a7b8651654591c68c6d431c758d787csewardj   This file is part of LibVEX, a library for dynamic binary
11f8ed9d874a7b8651654591c68c6d431c758d787csewardj   instrumentation and translation.
12f8ed9d874a7b8651654591c68c6d431c758d787csewardj
13e744153445a2b0277be5e4d0eed68466af9a3101sewardj   Copyright (C) 2004-2007 OpenWorks LLP.  All rights reserved.
147bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
157bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   This library is made available under a dual licensing scheme.
167bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
177bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   If you link LibVEX against other code all of which is itself
187bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   licensed under the GNU General Public License, version 2 dated June
197bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   1991 ("GPL v2"), then you may use LibVEX under the terms of the GPL
207bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   v2, as appearing in the file LICENSE.GPL.  If the file LICENSE.GPL
217bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   is missing, you can obtain a copy of the GPL v2 from the Free
227bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   Software Foundation Inc., 51 Franklin St, Fifth Floor, Boston, MA
237bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   02110-1301, USA.
247bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
257bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   For any other uses of LibVEX, you must first obtain a commercial
267bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   license from OpenWorks LLP.  Please contact info@open-works.co.uk
277bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   for information about commercial licensing.
287bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj
297bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   This software is provided by OpenWorks LLP "as is" and any express
307bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   or implied warranties, including, but not limited to, the implied
317bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   warranties of merchantability and fitness for a particular purpose
327bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   are disclaimed.  In no event shall OpenWorks LLP be liable for any
337bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   direct, indirect, incidental, special, exemplary, or consequential
347bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   damages (including, but not limited to, procurement of substitute
357bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   goods or services; loss of use, data, or profits; or business
367bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   interruption) however caused and on any theory of liability,
377bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   whether in contract, strict liability, or tort (including
387bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   negligence or otherwise) arising in any way out of the use of this
397bd6ffe203f3aa9e7b25f7eae40a9b9cf48710cfsewardj   software, even if advised of the possibility of such damage.
40f8ed9d874a7b8651654591c68c6d431c758d787csewardj
41f8ed9d874a7b8651654591c68c6d431c758d787csewardj   Neither the names of the U.S. Department of Energy nor the
42f8ed9d874a7b8651654591c68c6d431c758d787csewardj   University of California nor the names of its contributors may be
43f8ed9d874a7b8651654591c68c6d431c758d787csewardj   used to endorse or promote products derived from this software
44f8ed9d874a7b8651654591c68c6d431c758d787csewardj   without prior written permission.
45f8ed9d874a7b8651654591c68c6d431c758d787csewardj*/
46f8ed9d874a7b8651654591c68c6d431c758d787csewardj
47887a11a609f3e61d2ae8fe4e67f176207715da7esewardj#include "libvex.h"
48893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj#include "libvex_emwarn.h"
4981ec4189e287a97256f1e0a9fa7c0be316aaefc6sewardj#include "libvex_guest_x86.h"
5044d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj#include "libvex_guest_amd64.h"
512a9ad023890d3b34cf45e429df2a8ae88b419128sewardj#include "libvex_guest_arm.h"
52aabdfbf4193a965a8c50c643e536129d1d33661bcerion#include "libvex_guest_ppc32.h"
53f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion#include "libvex_guest_ppc64.h"
54f13a16a82132fa2358899c7683193effecf9a56fsewardj
55c0ee2edb4563c90bc8f1a83a09984a1fda86d1d3sewardj#include "main/vex_globals.h"
56c0ee2edb4563c90bc8f1a83a09984a1fda86d1d3sewardj#include "main/vex_util.h"
57c0ee2edb4563c90bc8f1a83a09984a1fda86d1d3sewardj#include "host-generic/h_generic_regs.h"
582a9ad023890d3b34cf45e429df2a8ae88b419128sewardj#include "ir/iropt.h"
592a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
60c0ee2edb4563c90bc8f1a83a09984a1fda86d1d3sewardj#include "host-x86/hdefs.h"
61c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj#include "host-amd64/hdefs.h"
62d0eae2d5b6d8224bf1f075098e044b23ecffd9aecerion#include "host-ppc/hdefs.h"
632a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
649e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj#include "guest-generic/bb_to_IR.h"
65c0ee2edb4563c90bc8f1a83a09984a1fda86d1d3sewardj#include "guest-x86/gdefs.h"
6644d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj#include "guest-amd64/gdefs.h"
672a9ad023890d3b34cf45e429df2a8ae88b419128sewardj#include "guest-arm/gdefs.h"
68d0eae2d5b6d8224bf1f075098e044b23ecffd9aecerion#include "guest-ppc/gdefs.h"
6935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
7035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
7135421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* This file contains the top level interface to the library. */
7235421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
735117ce116f47141cb23d1b49cc826e19323add97sewardj/* --------- fwds ... --------- */
745117ce116f47141cb23d1b49cc826e19323add97sewardj
755117ce116f47141cb23d1b49cc826e19323add97sewardjstatic Bool   are_valid_hwcaps ( VexArch arch, UInt hwcaps );
765117ce116f47141cb23d1b49cc826e19323add97sewardjstatic HChar* show_hwcaps ( VexArch arch, UInt hwcaps );
775117ce116f47141cb23d1b49cc826e19323add97sewardj
785117ce116f47141cb23d1b49cc826e19323add97sewardj
7935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* --------- Initialise the library. --------- */
8035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
8135421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* Exported to library client. */
8235421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
83d887b8634b2c2685f528bd968459c628e8f86a34sewardjconst HChar* LibVEX_Version ( void )
8480f5fceef55dc74b2ccca99d957699cbfc495176sewardj{
8580f5fceef55dc74b2ccca99d957699cbfc495176sewardjreturn
8680f5fceef55dc74b2ccca99d957699cbfc495176sewardj#include "main/vex_svnversion.h"
8780f5fceef55dc74b2ccca99d957699cbfc495176sewardj    ;
8880f5fceef55dc74b2ccca99d957699cbfc495176sewardj}
8980f5fceef55dc74b2ccca99d957699cbfc495176sewardj
9080f5fceef55dc74b2ccca99d957699cbfc495176sewardj
9180f5fceef55dc74b2ccca99d957699cbfc495176sewardj/* Exported to library client. */
9280f5fceef55dc74b2ccca99d957699cbfc495176sewardj
9308613749b639323cc7582c1bbe56c6e21c69774fsewardjvoid LibVEX_default_VexControl ( /*OUT*/ VexControl* vcon )
9408613749b639323cc7582c1bbe56c6e21c69774fsewardj{
9508613749b639323cc7582c1bbe56c6e21c69774fsewardj   vcon->iropt_verbosity            = 0;
9608613749b639323cc7582c1bbe56c6e21c69774fsewardj   vcon->iropt_level                = 2;
9708613749b639323cc7582c1bbe56c6e21c69774fsewardj   vcon->iropt_precise_memory_exns  = False;
9808613749b639323cc7582c1bbe56c6e21c69774fsewardj   vcon->iropt_unroll_thresh        = 120;
9918b4bb706744f3d02ada9d7c2288df5ec7dc7115sewardj   vcon->guest_max_insns            = 60;
10008613749b639323cc7582c1bbe56c6e21c69774fsewardj   vcon->guest_chase_thresh         = 10;
10108613749b639323cc7582c1bbe56c6e21c69774fsewardj}
10208613749b639323cc7582c1bbe56c6e21c69774fsewardj
10308613749b639323cc7582c1bbe56c6e21c69774fsewardj
10408613749b639323cc7582c1bbe56c6e21c69774fsewardj/* Exported to library client. */
10508613749b639323cc7582c1bbe56c6e21c69774fsewardj
106887a11a609f3e61d2ae8fe4e67f176207715da7esewardjvoid LibVEX_Init (
10735421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   /* failure exit function */
1082b51587159d1d7c331719886d896c0a9cf217ee4sewardj   __attribute__ ((noreturn))
10935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   void (*failure_exit) ( void ),
11035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   /* logging output function */
111d97636248eaa5ac7e5b323c5c048efafe179e5c3sewardj   void (*log_bytes) ( HChar*, Int nbytes ),
11235421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   /* debug paranoia level */
11335421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   Int debuglevel,
11435421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   /* Are we supporting valgrind checking? */
11535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   Bool valgrind_support,
11608613749b639323cc7582c1bbe56c6e21c69774fsewardj   /* Control ... */
11708613749b639323cc7582c1bbe56c6e21c69774fsewardj   /*READONLY*/VexControl* vcon
11835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj)
11935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj{
12008613749b639323cc7582c1bbe56c6e21c69774fsewardj   /* First off, do enough minimal setup so that the following
12108613749b639323cc7582c1bbe56c6e21c69774fsewardj      assertions can fail in a sane fashion, if need be. */
122ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vex_failure_exit = failure_exit;
123ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vex_log_bytes    = log_bytes;
124ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj
125ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   /* Now it's safe to check parameters for sanity. */
12635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   vassert(!vex_initdone);
12735421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   vassert(failure_exit);
12835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   vassert(log_bytes);
12935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   vassert(debuglevel >= 0);
13008613749b639323cc7582c1bbe56c6e21c69774fsewardj
13108613749b639323cc7582c1bbe56c6e21c69774fsewardj   vassert(vcon->iropt_verbosity >= 0);
13208613749b639323cc7582c1bbe56c6e21c69774fsewardj   vassert(vcon->iropt_level >= 0);
13308613749b639323cc7582c1bbe56c6e21c69774fsewardj   vassert(vcon->iropt_level <= 2);
13408613749b639323cc7582c1bbe56c6e21c69774fsewardj   vassert(vcon->iropt_unroll_thresh >= 0);
13508613749b639323cc7582c1bbe56c6e21c69774fsewardj   vassert(vcon->iropt_unroll_thresh <= 400);
13608613749b639323cc7582c1bbe56c6e21c69774fsewardj   vassert(vcon->guest_max_insns >= 1);
13708613749b639323cc7582c1bbe56c6e21c69774fsewardj   vassert(vcon->guest_max_insns <= 100);
13808613749b639323cc7582c1bbe56c6e21c69774fsewardj   vassert(vcon->guest_chase_thresh >= 0);
13908613749b639323cc7582c1bbe56c6e21c69774fsewardj   vassert(vcon->guest_chase_thresh < vcon->guest_max_insns);
140443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj
141ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   /* Check that Vex has been built with sizes of basic types as
142ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj      stated in priv/libvex_basictypes.h.  Failure of any of these is
143ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj      a serious configuration error and should be corrected
144ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj      immediately.  If any of these assertions fail you can fully
145ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj      expect Vex not to work properly, if at all. */
146ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj
147ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(1 == sizeof(UChar));
148ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(1 == sizeof(Char));
149ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(2 == sizeof(UShort));
150ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(2 == sizeof(Short));
151ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(4 == sizeof(UInt));
152ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(4 == sizeof(Int));
153ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(8 == sizeof(ULong));
154ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(8 == sizeof(Long));
155ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(4 == sizeof(Float));
156ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(8 == sizeof(Double));
157ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(1 == sizeof(Bool));
158ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(4 == sizeof(Addr32));
159ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(8 == sizeof(Addr64));
160c9a43665879a03886b27a65b68af2a2c11b04f59sewardj   vassert(16 == sizeof(U128));
161ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj
162ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(sizeof(void*) == 4 || sizeof(void*) == 8);
163ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(sizeof(void*) == sizeof(int*));
164ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   vassert(sizeof(void*) == sizeof(HWord));
165ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj
16697e87935760215710e2d88bd66ca77fdeefd8dd7sewardj   vassert(VEX_HOST_WORDSIZE == sizeof(void*));
16797e87935760215710e2d88bd66ca77fdeefd8dd7sewardj   vassert(VEX_HOST_WORDSIZE == sizeof(HWord));
16897e87935760215710e2d88bd66ca77fdeefd8dd7sewardj
169ea602bc23ecabe934348ef9ea4113a22d4e0bb80sewardj   /* Really start up .. */
170443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj   vex_debuglevel         = debuglevel;
171443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj   vex_valgrind_support   = valgrind_support;
17208613749b639323cc7582c1bbe56c6e21c69774fsewardj   vex_control            = *vcon;
173443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj   vex_initdone           = True;
174d887b8634b2c2685f528bd968459c628e8f86a34sewardj   vexSetAllocMode ( VexAllocModeTEMP );
17535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj}
17635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
17735421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
17835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* --------- Make a translation. --------- */
17935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
18035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* Exported to library client. */
18135421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
18217c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardjVexTranslateResult LibVEX_Translate ( VexTranslateArgs* vta )
18335421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj{
18481bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj   /* This the bundle of functions we need to do the back-end stuff
18581bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj      (insn selection, reg-alloc, assembly) whilst being insulated
18681bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj      from the target instruction set. */
187f13a16a82132fa2358899c7683193effecf9a56fsewardj   HReg* available_real_regs;
188f13a16a82132fa2358899c7683193effecf9a56fsewardj   Int   n_available_real_regs;
189fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj   Bool         (*isMove)       ( HInstr*, HReg*, HReg* );
190fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj   void         (*getRegUsage)  ( HRegUsage*, HInstr*, Bool );
191fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj   void         (*mapRegs)      ( HRegRemap*, HInstr*, Bool );
192fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj   HInstr*      (*genSpill)     ( HReg, Int, Bool );
193fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj   HInstr*      (*genReload)    ( HReg, Int, Bool );
194fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj   HInstr*      (*directReload) ( HInstr*, HReg, Short );
195fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj   void         (*ppInstr)      ( HInstr*, Bool );
196fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj   void         (*ppReg)        ( HReg );
197fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj   HInstrArray* (*iselSB)       ( IRSB*, VexArch, VexArchInfo*,
198fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj                                                  VexAbiInfo* );
199fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj   Int          (*emit)         ( UChar*, Int, HInstr*, Bool, void* );
200fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj   IRExpr*      (*specHelper)   ( HChar*, IRExpr** );
2018d2291c9199adf1d0d9a5c684932d7ffe6d8e0c9sewardj   Bool         (*preciseMemExnsFn) ( Int, Int );
202f13a16a82132fa2358899c7683193effecf9a56fsewardj
2039e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   DisOneInstrFn disInstrFn;
2049e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj
205eeac841fbfcadbc19e97c7ef56bfa3354ba78637sewardj   VexGuestLayout* guest_layout;
206eeac841fbfcadbc19e97c7ef56bfa3354ba78637sewardj   Bool            host_is_bigendian = False;
207dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   IRSB*           irsb;
208eeac841fbfcadbc19e97c7ef56bfa3354ba78637sewardj   HInstrArray*    vcode;
209eeac841fbfcadbc19e97c7ef56bfa3354ba78637sewardj   HInstrArray*    rcode;
210eeac841fbfcadbc19e97c7ef56bfa3354ba78637sewardj   Int             i, j, k, out_used, guest_sizeB;
211c716aea1cafe66ee431dc7d6909c98f18788a028sewardj   Int             offB_TISTART, offB_TILEN;
212eeac841fbfcadbc19e97c7ef56bfa3354ba78637sewardj   UChar           insn_bytes[32];
213cf7879021370aabcccb1a9347244fcc7d5680141sewardj   IRType          guest_word_type;
214cf7879021370aabcccb1a9347244fcc7d5680141sewardj   IRType          host_word_type;
21592b643609c5fa432b11fc726c2706ae3f3296eb4cerion   Bool            mode64;
216f13a16a82132fa2358899c7683193effecf9a56fsewardj
21749651f4b59b1ab7e0e70cccd34001630eafbe957sewardj   guest_layout           = NULL;
21836ca51378f8851635df814230fa23f2c409b9eddsewardj   available_real_regs    = NULL;
21936ca51378f8851635df814230fa23f2c409b9eddsewardj   n_available_real_regs  = 0;
22036ca51378f8851635df814230fa23f2c409b9eddsewardj   isMove                 = NULL;
22136ca51378f8851635df814230fa23f2c409b9eddsewardj   getRegUsage            = NULL;
22236ca51378f8851635df814230fa23f2c409b9eddsewardj   mapRegs                = NULL;
22336ca51378f8851635df814230fa23f2c409b9eddsewardj   genSpill               = NULL;
22436ca51378f8851635df814230fa23f2c409b9eddsewardj   genReload              = NULL;
225fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj   directReload           = NULL;
22636ca51378f8851635df814230fa23f2c409b9eddsewardj   ppInstr                = NULL;
22736ca51378f8851635df814230fa23f2c409b9eddsewardj   ppReg                  = NULL;
228dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   iselSB                 = NULL;
22936ca51378f8851635df814230fa23f2c409b9eddsewardj   emit                   = NULL;
23084ff0657940e62f38e618ea18bac6f27ce0e741fsewardj   specHelper             = NULL;
2318d2291c9199adf1d0d9a5c684932d7ffe6d8e0c9sewardj   preciseMemExnsFn       = NULL;
2329e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj   disInstrFn             = NULL;
233cf7879021370aabcccb1a9347244fcc7d5680141sewardj   guest_word_type        = Ity_INVALID;
234cf7879021370aabcccb1a9347244fcc7d5680141sewardj   host_word_type         = Ity_INVALID;
235db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj   offB_TISTART           = 0;
236db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj   offB_TILEN             = 0;
23792b643609c5fa432b11fc726c2706ae3f3296eb4cerion   mode64                 = False;
23836ca51378f8851635df814230fa23f2c409b9eddsewardj
23917c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   vex_traceflags = vta->traceflags;
24058800ff1f3bc35d5cae9885c9d8a51a8d9d33016sewardj
24135421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   vassert(vex_initdone);
2422d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexSetAllocModeTEMP_and_clear();
2432d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
2442a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
245f13a16a82132fa2358899c7683193effecf9a56fsewardj   /* First off, check that the guest and host insn sets
246f13a16a82132fa2358899c7683193effecf9a56fsewardj      are supported. */
2472a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
24817c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   switch (vta->arch_host) {
2492a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
250bef170b7e84713d1e2181b9204d9415d29de3d65sewardj      case VexArchX86:
251fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj         mode64       = False;
252f13a16a82132fa2358899c7683193effecf9a56fsewardj         getAllocableRegs_X86 ( &n_available_real_regs,
253f13a16a82132fa2358899c7683193effecf9a56fsewardj                                &available_real_regs );
254fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj         isMove       = (Bool(*)(HInstr*,HReg*,HReg*)) isMove_X86Instr;
255fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj         getRegUsage  = (void(*)(HRegUsage*,HInstr*, Bool)) getRegUsage_X86Instr;
256fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj         mapRegs      = (void(*)(HRegRemap*,HInstr*, Bool)) mapRegs_X86Instr;
257fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj         genSpill     = (HInstr*(*)(HReg,Int, Bool)) genSpill_X86;
258fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj         genReload    = (HInstr*(*)(HReg,Int, Bool)) genReload_X86;
259fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj         directReload = (HInstr*(*)(HInstr*,HReg,Short)) directReload_X86;
260fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj         ppInstr      = (void(*)(HInstr*, Bool)) ppX86Instr;
261fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj         ppReg        = (void(*)(HReg)) ppHRegX86;
262fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj         iselSB       = iselSB_X86;
263fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj         emit         = (Int(*)(UChar*,Int,HInstr*,Bool,void*)) emit_X86Instr;
26472c72814ab82c51d8ee8accad1a00f2d37942545sewardj         host_is_bigendian = False;
265cf7879021370aabcccb1a9347244fcc7d5680141sewardj         host_word_type    = Ity_I32;
2665117ce116f47141cb23d1b49cc826e19323add97sewardj         vassert(are_valid_hwcaps(VexArchX86, vta->archinfo_host.hwcaps));
26717c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj         vassert(vta->dispatch != NULL); /* jump-to-dispatcher scheme */
268f13a16a82132fa2358899c7683193effecf9a56fsewardj         break;
2692a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
270c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj      case VexArchAMD64:
27192b643609c5fa432b11fc726c2706ae3f3296eb4cerion         mode64      = True;
272c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj         getAllocableRegs_AMD64 ( &n_available_real_regs,
273c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj                                  &available_real_regs );
274c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj         isMove      = (Bool(*)(HInstr*,HReg*,HReg*)) isMove_AMD64Instr;
27592b643609c5fa432b11fc726c2706ae3f3296eb4cerion         getRegUsage = (void(*)(HRegUsage*,HInstr*, Bool)) getRegUsage_AMD64Instr;
27692b643609c5fa432b11fc726c2706ae3f3296eb4cerion         mapRegs     = (void(*)(HRegRemap*,HInstr*, Bool)) mapRegs_AMD64Instr;
27792b643609c5fa432b11fc726c2706ae3f3296eb4cerion         genSpill    = (HInstr*(*)(HReg,Int, Bool)) genSpill_AMD64;
27892b643609c5fa432b11fc726c2706ae3f3296eb4cerion         genReload   = (HInstr*(*)(HReg,Int, Bool)) genReload_AMD64;
27992b643609c5fa432b11fc726c2706ae3f3296eb4cerion         ppInstr     = (void(*)(HInstr*, Bool)) ppAMD64Instr;
280c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj         ppReg       = (void(*)(HReg)) ppHRegAMD64;
281dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj         iselSB      = iselSB_AMD64;
2820528bb5bd879eed0e8fa7e2bc9bc8debea00bf5fsewardj         emit        = (Int(*)(UChar*,Int,HInstr*,Bool,void*)) emit_AMD64Instr;
283c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj         host_is_bigendian = False;
284c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj         host_word_type    = Ity_I64;
2855117ce116f47141cb23d1b49cc826e19323add97sewardj         vassert(are_valid_hwcaps(VexArchAMD64, vta->archinfo_host.hwcaps));
28617c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj         vassert(vta->dispatch != NULL); /* jump-to-dispatcher scheme */
287c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj         break;
288c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj
289487e4c9a453dfd32d87dbd4a51fac8aec054d563cerion      case VexArchPPC32:
29092b643609c5fa432b11fc726c2706ae3f3296eb4cerion         mode64      = False;
2915b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion         getAllocableRegs_PPC ( &n_available_real_regs,
2925b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion                                &available_real_regs, mode64 );
2935b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion         isMove      = (Bool(*)(HInstr*,HReg*,HReg*)) isMove_PPCInstr;
2945b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion         getRegUsage = (void(*)(HRegUsage*,HInstr*,Bool)) getRegUsage_PPCInstr;
2955b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion         mapRegs     = (void(*)(HRegRemap*,HInstr*,Bool)) mapRegs_PPCInstr;
2965b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion         genSpill    = (HInstr*(*)(HReg,Int,Bool)) genSpill_PPC;
2975b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion         genReload   = (HInstr*(*)(HReg,Int,Bool)) genReload_PPC;
2985b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion         ppInstr     = (void(*)(HInstr*,Bool)) ppPPCInstr;
2995b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion         ppReg       = (void(*)(HReg)) ppHRegPPC;
300dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj         iselSB      = iselSB_PPC;
3015b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion         emit        = (Int(*)(UChar*,Int,HInstr*,Bool,void*)) emit_PPCInstr;
302487e4c9a453dfd32d87dbd4a51fac8aec054d563cerion         host_is_bigendian = True;
303487e4c9a453dfd32d87dbd4a51fac8aec054d563cerion         host_word_type    = Ity_I32;
3045117ce116f47141cb23d1b49cc826e19323add97sewardj         vassert(are_valid_hwcaps(VexArchPPC32, vta->archinfo_host.hwcaps));
30517c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj         vassert(vta->dispatch == NULL); /* return-to-dispatcher scheme */
306487e4c9a453dfd32d87dbd4a51fac8aec054d563cerion         break;
307487e4c9a453dfd32d87dbd4a51fac8aec054d563cerion
308f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion      case VexArchPPC64:
309f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion         mode64      = True;
3105b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion         getAllocableRegs_PPC ( &n_available_real_regs,
3115b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion                                &available_real_regs, mode64 );
3125b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion         isMove      = (Bool(*)(HInstr*,HReg*,HReg*)) isMove_PPCInstr;
3135b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion         getRegUsage = (void(*)(HRegUsage*,HInstr*, Bool)) getRegUsage_PPCInstr;
3145b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion         mapRegs     = (void(*)(HRegRemap*,HInstr*, Bool)) mapRegs_PPCInstr;
3155b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion         genSpill    = (HInstr*(*)(HReg,Int, Bool)) genSpill_PPC;
3165b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion         genReload   = (HInstr*(*)(HReg,Int, Bool)) genReload_PPC;
3175b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion         ppInstr     = (void(*)(HInstr*, Bool)) ppPPCInstr;
3185b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion         ppReg       = (void(*)(HReg)) ppHRegPPC;
319dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj         iselSB      = iselSB_PPC;
3205b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion         emit        = (Int(*)(UChar*,Int,HInstr*,Bool,void*)) emit_PPCInstr;
321f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion         host_is_bigendian = True;
322f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion         host_word_type    = Ity_I64;
3235117ce116f47141cb23d1b49cc826e19323add97sewardj         vassert(are_valid_hwcaps(VexArchPPC64, vta->archinfo_host.hwcaps));
32417c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj         vassert(vta->dispatch == NULL); /* return-to-dispatcher scheme */
325f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion         break;
326f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion
327f13a16a82132fa2358899c7683193effecf9a56fsewardj      default:
328887a11a609f3e61d2ae8fe4e67f176207715da7esewardj         vpanic("LibVEX_Translate: unsupported target insn set");
329f13a16a82132fa2358899c7683193effecf9a56fsewardj   }
330f13a16a82132fa2358899c7683193effecf9a56fsewardj
3312a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
33217c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   switch (vta->arch_guest) {
3332a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
334bef170b7e84713d1e2181b9204d9415d29de3d65sewardj      case VexArchX86:
3358d2291c9199adf1d0d9a5c684932d7ffe6d8e0c9sewardj         preciseMemExnsFn = guest_x86_state_requires_precise_mem_exns;
3369e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj         disInstrFn       = disInstr_X86;
3372a9ad023890d3b34cf45e429df2a8ae88b419128sewardj         specHelper       = guest_x86_spechelper;
33881ec4189e287a97256f1e0a9fa7c0be316aaefc6sewardj         guest_sizeB      = sizeof(VexGuestX86State);
339cf7879021370aabcccb1a9347244fcc7d5680141sewardj         guest_word_type  = Ity_I32;
34049651f4b59b1ab7e0e70cccd34001630eafbe957sewardj         guest_layout     = &x86guest_layout;
341db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj         offB_TISTART     = offsetof(VexGuestX86State,guest_TISTART);
342db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj         offB_TILEN       = offsetof(VexGuestX86State,guest_TILEN);
3435117ce116f47141cb23d1b49cc826e19323add97sewardj         vassert(are_valid_hwcaps(VexArchX86, vta->archinfo_guest.hwcaps));
344e74f6f7cb93e88b774ca3635c8969dc3314d85acsewardj         vassert(0 == sizeof(VexGuestX86State) % 8);
345ce02aa77bc02dbe225a068df0fb6b31faddedcdfsewardj         vassert(sizeof( ((VexGuestX86State*)0)->guest_TISTART) == 4);
346ce02aa77bc02dbe225a068df0fb6b31faddedcdfsewardj         vassert(sizeof( ((VexGuestX86State*)0)->guest_TILEN  ) == 4);
347ce02aa77bc02dbe225a068df0fb6b31faddedcdfsewardj         vassert(sizeof( ((VexGuestX86State*)0)->guest_NRADDR ) == 4);
348f13a16a82132fa2358899c7683193effecf9a56fsewardj         break;
3492a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
35044d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj      case VexArchAMD64:
35144d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj         preciseMemExnsFn = guest_amd64_state_requires_precise_mem_exns;
3529e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj         disInstrFn       = disInstr_AMD64;
35344d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj         specHelper       = guest_amd64_spechelper;
35444d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj         guest_sizeB      = sizeof(VexGuestAMD64State);
35544d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj         guest_word_type  = Ity_I64;
35644d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj         guest_layout     = &amd64guest_layout;
357db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj         offB_TISTART     = offsetof(VexGuestAMD64State,guest_TISTART);
358db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj         offB_TILEN       = offsetof(VexGuestAMD64State,guest_TILEN);
3595117ce116f47141cb23d1b49cc826e19323add97sewardj         vassert(are_valid_hwcaps(VexArchAMD64, vta->archinfo_guest.hwcaps));
360e74f6f7cb93e88b774ca3635c8969dc3314d85acsewardj         vassert(0 == sizeof(VexGuestAMD64State) % 8);
361db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj         vassert(sizeof( ((VexGuestAMD64State*)0)->guest_TISTART ) == 8);
362ce02aa77bc02dbe225a068df0fb6b31faddedcdfsewardj         vassert(sizeof( ((VexGuestAMD64State*)0)->guest_TILEN   ) == 8);
363ce02aa77bc02dbe225a068df0fb6b31faddedcdfsewardj         vassert(sizeof( ((VexGuestAMD64State*)0)->guest_NRADDR  ) == 8);
36444d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj         break;
36544d494dfad0c12f96f61cf9edfc889dfa69e3b30sewardj
366bef170b7e84713d1e2181b9204d9415d29de3d65sewardj      case VexArchARM:
3672a9ad023890d3b34cf45e429df2a8ae88b419128sewardj         preciseMemExnsFn = guest_arm_state_requires_precise_mem_exns;
3689e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj         disInstrFn       = NULL; /* HACK */
3692a9ad023890d3b34cf45e429df2a8ae88b419128sewardj         specHelper       = guest_arm_spechelper;
3702a9ad023890d3b34cf45e429df2a8ae88b419128sewardj         guest_sizeB      = sizeof(VexGuestARMState);
3712a9ad023890d3b34cf45e429df2a8ae88b419128sewardj         guest_word_type  = Ity_I32;
3722a9ad023890d3b34cf45e429df2a8ae88b419128sewardj         guest_layout     = &armGuest_layout;
373db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj         offB_TISTART     = 0; /* hack ... arm has bitrot */
374db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj         offB_TILEN       = 0; /* hack ... arm has bitrot */
3755117ce116f47141cb23d1b49cc826e19323add97sewardj         vassert(are_valid_hwcaps(VexArchARM, vta->archinfo_guest.hwcaps));
3762a9ad023890d3b34cf45e429df2a8ae88b419128sewardj         break;
3772a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
378aabdfbf4193a965a8c50c643e536129d1d33661bcerion      case VexArchPPC32:
379aabdfbf4193a965a8c50c643e536129d1d33661bcerion         preciseMemExnsFn = guest_ppc32_state_requires_precise_mem_exns;
3805b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion         disInstrFn       = disInstr_PPC;
381aabdfbf4193a965a8c50c643e536129d1d33661bcerion         specHelper       = guest_ppc32_spechelper;
382aabdfbf4193a965a8c50c643e536129d1d33661bcerion         guest_sizeB      = sizeof(VexGuestPPC32State);
383aabdfbf4193a965a8c50c643e536129d1d33661bcerion         guest_word_type  = Ity_I32;
384aabdfbf4193a965a8c50c643e536129d1d33661bcerion         guest_layout     = &ppc32Guest_layout;
385db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj         offB_TISTART     = offsetof(VexGuestPPC32State,guest_TISTART);
386db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj         offB_TILEN       = offsetof(VexGuestPPC32State,guest_TILEN);
3875117ce116f47141cb23d1b49cc826e19323add97sewardj         vassert(are_valid_hwcaps(VexArchPPC32, vta->archinfo_guest.hwcaps));
388e74f6f7cb93e88b774ca3635c8969dc3314d85acsewardj         vassert(0 == sizeof(VexGuestPPC32State) % 8);
389db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj         vassert(sizeof( ((VexGuestPPC32State*)0)->guest_TISTART ) == 4);
390ce02aa77bc02dbe225a068df0fb6b31faddedcdfsewardj         vassert(sizeof( ((VexGuestPPC32State*)0)->guest_TILEN   ) == 4);
391ce02aa77bc02dbe225a068df0fb6b31faddedcdfsewardj         vassert(sizeof( ((VexGuestPPC32State*)0)->guest_NRADDR  ) == 4);
392aabdfbf4193a965a8c50c643e536129d1d33661bcerion         break;
393aabdfbf4193a965a8c50c643e536129d1d33661bcerion
394f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion      case VexArchPPC64:
395f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion         preciseMemExnsFn = guest_ppc64_state_requires_precise_mem_exns;
3965b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion         disInstrFn       = disInstr_PPC;
397f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion         specHelper       = guest_ppc64_spechelper;
398f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion         guest_sizeB      = sizeof(VexGuestPPC64State);
399f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion         guest_word_type  = Ity_I64;
400f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion         guest_layout     = &ppc64Guest_layout;
401f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion         offB_TISTART     = offsetof(VexGuestPPC64State,guest_TISTART);
402f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion         offB_TILEN       = offsetof(VexGuestPPC64State,guest_TILEN);
4035117ce116f47141cb23d1b49cc826e19323add97sewardj         vassert(are_valid_hwcaps(VexArchPPC64, vta->archinfo_guest.hwcaps));
404f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion         vassert(0 == sizeof(VexGuestPPC64State) % 16);
4053fd3967db856eb90b2030ebeb42b685d45bc3276sewardj         vassert(sizeof( ((VexGuestPPC64State*)0)->guest_TISTART    ) == 8);
4063fd3967db856eb90b2030ebeb42b685d45bc3276sewardj         vassert(sizeof( ((VexGuestPPC64State*)0)->guest_TILEN      ) == 8);
4073fd3967db856eb90b2030ebeb42b685d45bc3276sewardj         vassert(sizeof( ((VexGuestPPC64State*)0)->guest_NRADDR     ) == 8);
4083fd3967db856eb90b2030ebeb42b685d45bc3276sewardj         vassert(sizeof( ((VexGuestPPC64State*)0)->guest_NRADDR_GPR2) == 8);
409f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion         break;
410f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion
411f13a16a82132fa2358899c7683193effecf9a56fsewardj      default:
412887a11a609f3e61d2ae8fe4e67f176207715da7esewardj         vpanic("LibVEX_Translate: unsupported guest insn set");
413f13a16a82132fa2358899c7683193effecf9a56fsewardj   }
414f13a16a82132fa2358899c7683193effecf9a56fsewardj
4159df271d97c0f79a58a8eabdcfbe6f8bf4d17876asewardj   /* yet more sanity checks ... */
41617c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   if (vta->arch_guest == vta->arch_host) {
4179df271d97c0f79a58a8eabdcfbe6f8bf4d17876asewardj      /* doesn't necessarily have to be true, but if it isn't it means
4180ec57c595719a395e71b48792a4d62c5b896b6d3sewardj         we are simulating one flavour of an architecture a different
4190ec57c595719a395e71b48792a4d62c5b896b6d3sewardj         flavour of the same architecture, which is pretty strange. */
4205117ce116f47141cb23d1b49cc826e19323add97sewardj      vassert(vta->archinfo_guest.hwcaps == vta->archinfo_host.hwcaps);
4219df271d97c0f79a58a8eabdcfbe6f8bf4d17876asewardj   }
4222a9ad023890d3b34cf45e429df2a8ae88b419128sewardj
4232d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
4242d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
425f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   if (vex_traceflags & VEX_TRACE_FE)
426f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n------------------------"
427f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   " Front end "
428f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   "------------------------\n\n");
429f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj
430dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   irsb = bb_to_IR ( vta->guest_extents,
431c716aea1cafe66ee431dc7d6909c98f18788a028sewardj                     vta->callback_opaque,
4329e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj                     disInstrFn,
43317c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj                     vta->guest_bytes,
43417c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj                     vta->guest_bytes_addr,
43517c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj                     vta->chase_into_ok,
4369e6491ab55324b8e45e187b1e1e9632ac3cb3e27sewardj                     host_is_bigendian,
437a5f55da7e956978fddad927436da5fab9568f3f1sewardj                     vta->arch_guest,
43817c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj                     &vta->archinfo_guest,
439dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj                     &vta->abiinfo_both,
440db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj                     guest_word_type,
44117c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj                     vta->do_self_check,
442c716aea1cafe66ee431dc7d6909c98f18788a028sewardj                     vta->preamble_function,
443db4738ab05bf88fabe7fd931a24fab2fa2060e73sewardj                     offB_TISTART,
444c716aea1cafe66ee431dc7d6909c98f18788a028sewardj                     offB_TILEN );
445f13a16a82132fa2358899c7683193effecf9a56fsewardj
4462d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
4472d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
448dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   if (irsb == NULL) {
449f13a16a82132fa2358899c7683193effecf9a56fsewardj      /* Access failure. */
4502d6b14aa64df2ff85f8da143516779d5d43574cbsewardj      vexSetAllocModeTEMP_and_clear();
451f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_traceflags = 0;
452d887b8634b2c2685f528bd968459c628e8f86a34sewardj      return VexTransAccessFail;
453f13a16a82132fa2358899c7683193effecf9a56fsewardj   }
454aa59f942f729b5c98703d84321265313daeb32b8sewardj
45517c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   vassert(vta->guest_extents->n_used >= 1 && vta->guest_extents->n_used <= 3);
45617c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   vassert(vta->guest_extents->base[0] == vta->guest_bytes_addr);
45717c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   for (i = 0; i < vta->guest_extents->n_used; i++) {
45817c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj      vassert(vta->guest_extents->len[i] < 10000); /* sanity */
45972c72814ab82c51d8ee8accad1a00f2d37942545sewardj   }
46072c72814ab82c51d8ee8accad1a00f2d37942545sewardj
461aa59f942f729b5c98703d84321265313daeb32b8sewardj   /* If debugging, show the raw guest bytes for this bb. */
462109ffdbb31ff652ae83d0ad400966f68c46cd4f1sewardj   if (0 || (vex_traceflags & VEX_TRACE_FE)) {
46317c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj      if (vta->guest_extents->n_used > 1) {
46472c72814ab82c51d8ee8accad1a00f2d37942545sewardj         vex_printf("can't show code due to extents > 1\n");
46572c72814ab82c51d8ee8accad1a00f2d37942545sewardj      } else {
46672c72814ab82c51d8ee8accad1a00f2d37942545sewardj         /* HACK */
46717c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj         UChar* p = (UChar*)vta->guest_bytes;
46817c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj         UInt   guest_bytes_read = (UInt)vta->guest_extents->len[0];
46917c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj         vex_printf(". 0 %llx %u\n.", vta->guest_bytes_addr, guest_bytes_read );
47072c72814ab82c51d8ee8accad1a00f2d37942545sewardj         for (i = 0; i < guest_bytes_read; i++)
471f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion            vex_printf(" %02x", (Int)p[i] );
47272c72814ab82c51d8ee8accad1a00f2d37942545sewardj         vex_printf("\n\n");
47372c72814ab82c51d8ee8accad1a00f2d37942545sewardj      }
474aa59f942f729b5c98703d84321265313daeb32b8sewardj   }
475aa59f942f729b5c98703d84321265313daeb32b8sewardj
476aa59f942f729b5c98703d84321265313daeb32b8sewardj   /* Sanity check the initial IR. */
477dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   sanityCheckIRSB( irsb, "initial IR",
478b92307503d4fb9265136e182d10c42ebb9dd8272sewardj                    False/*can be non-flat*/, guest_word_type );
479e8e9d73817f92d295f45b1c6c823c613bc2e90aesewardj
4802d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
4812d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
482edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj   /* Clean it up, hopefully a lot. */
483dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   irsb = do_iropt_BB ( irsb, specHelper, preciseMemExnsFn,
48417c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj                              vta->guest_bytes_addr );
485dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   sanityCheckIRSB( irsb, "after initial iropt",
486b92307503d4fb9265136e182d10c42ebb9dd8272sewardj                    True/*must be flat*/, guest_word_type );
487edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj
488f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   if (vex_traceflags & VEX_TRACE_OPT1) {
489f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n------------------------"
490f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   " After pre-instr IR optimisation "
491f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   "------------------------\n\n");
492dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      ppIRSB ( irsb );
493edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj      vex_printf("\n");
494edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj   }
495edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj
4962d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
4972d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
498f13a16a82132fa2358899c7683193effecf9a56fsewardj   /* Get the thing instrumented. */
49917c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   if (vta->instrument1)
500dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      irsb = vta->instrument1(vta->callback_opaque,
501dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj                              irsb, guest_layout,
50217c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj                              vta->guest_extents,
50317c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj                              guest_word_type, host_word_type);
5042d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
5052d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
50617c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   if (vta->instrument2)
507dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      irsb = vta->instrument2(vta->callback_opaque,
508dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj                              irsb, guest_layout,
50917c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj                              vta->guest_extents,
51017c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj                              guest_word_type, host_word_type);
51149651f4b59b1ab7e0e70cccd34001630eafbe957sewardj
512f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   if (vex_traceflags & VEX_TRACE_INST) {
513f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n------------------------"
514f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   " After instrumentation "
515f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   "------------------------\n\n");
516dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      ppIRSB ( irsb );
517f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n");
518f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   }
519f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj
52017c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   if (vta->instrument1 || vta->instrument2)
521dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      sanityCheckIRSB( irsb, "after instrumentation",
522b92307503d4fb9265136e182d10c42ebb9dd8272sewardj                       True/*must be flat*/, guest_word_type );
523f13a16a82132fa2358899c7683193effecf9a56fsewardj
5249578a8bf6159d81eeadeb771c3214109cfee3715sewardj   /* Do a post-instrumentation cleanup pass. */
52517c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   if (vta->instrument1 || vta->instrument2) {
526dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      do_deadcode_BB( irsb );
527dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      irsb = cprop_BB( irsb );
528dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      do_deadcode_BB( irsb );
529dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      sanityCheckIRSB( irsb, "after post-instrumentation cleanup",
530b92307503d4fb9265136e182d10c42ebb9dd8272sewardj                       True/*must be flat*/, guest_word_type );
5319578a8bf6159d81eeadeb771c3214109cfee3715sewardj   }
5329578a8bf6159d81eeadeb771c3214109cfee3715sewardj
5332d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
5342d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
5359578a8bf6159d81eeadeb771c3214109cfee3715sewardj   if (vex_traceflags & VEX_TRACE_OPT2) {
5369578a8bf6159d81eeadeb771c3214109cfee3715sewardj      vex_printf("\n------------------------"
5379578a8bf6159d81eeadeb771c3214109cfee3715sewardj                   " After post-instr IR optimisation "
5389578a8bf6159d81eeadeb771c3214109cfee3715sewardj                   "------------------------\n\n");
539dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      ppIRSB ( irsb );
5409578a8bf6159d81eeadeb771c3214109cfee3715sewardj      vex_printf("\n");
5419578a8bf6159d81eeadeb771c3214109cfee3715sewardj   }
5429578a8bf6159d81eeadeb771c3214109cfee3715sewardj
543f9517d0d452899780e8c34f02bef004ef7c5a163sewardj   /* Turn it into virtual-registerised code.  Build trees -- this
544f9517d0d452899780e8c34f02bef004ef7c5a163sewardj      also throws away any dead bindings. */
545dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   ado_treebuild_BB( irsb );
546f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj
547be1b6ff6cdb576c59734762fb778ae48eb8e7a10sewardj   if (vta->finaltidy) {
548be1b6ff6cdb576c59734762fb778ae48eb8e7a10sewardj      irsb = vta->finaltidy(irsb);
549be1b6ff6cdb576c59734762fb778ae48eb8e7a10sewardj   }
550be1b6ff6cdb576c59734762fb778ae48eb8e7a10sewardj
5512d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
5522d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
553f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   if (vex_traceflags & VEX_TRACE_TREES) {
554f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n------------------------"
555f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   "  After tree-building "
556f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   "------------------------\n\n");
557dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj      ppIRSB ( irsb );
558f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n");
559f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   }
560f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj
561e908c426bc9991611a1731ee881208d148e913fbsewardj   /* HACK */
56217c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   if (0) { *(vta->host_bytes_used) = 0; return VexTransOK; }
563e908c426bc9991611a1731ee881208d148e913fbsewardj   /* end HACK */
564c33671d7b0e21edb1d1015e4cbccbc6ca139e6d8sewardj
565f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   if (vex_traceflags & VEX_TRACE_VCODE)
566f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n------------------------"
567f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   " Instruction selection "
568f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   "------------------------\n");
569f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj
570dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   vcode = iselSB ( irsb, vta->arch_host, &vta->archinfo_host,
571dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj                                          &vta->abiinfo_both );
572f13a16a82132fa2358899c7683193effecf9a56fsewardj
5732d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
5742d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
575f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   if (vex_traceflags & VEX_TRACE_VCODE)
576f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n");
577f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj
578f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   if (vex_traceflags & VEX_TRACE_VCODE) {
5791f40a0a104034009e253675288ebefdcccf30da8sewardj      for (i = 0; i < vcode->arr_used; i++) {
5801f40a0a104034009e253675288ebefdcccf30da8sewardj         vex_printf("%3d   ", i);
58192b643609c5fa432b11fc726c2706ae3f3296eb4cerion         ppInstr(vcode->arr[i], mode64);
5821f40a0a104034009e253675288ebefdcccf30da8sewardj         vex_printf("\n");
5831f40a0a104034009e253675288ebefdcccf30da8sewardj      }
584fbcaf3312f39fb73d54821636c6168db76245f61sewardj      vex_printf("\n");
585fbcaf3312f39fb73d54821636c6168db76245f61sewardj   }
586fbcaf3312f39fb73d54821636c6168db76245f61sewardj
587f13a16a82132fa2358899c7683193effecf9a56fsewardj   /* Register allocate. */
588f13a16a82132fa2358899c7683193effecf9a56fsewardj   rcode = doRegisterAllocation ( vcode, available_real_regs,
589f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion                                  n_available_real_regs,
59072c72814ab82c51d8ee8accad1a00f2d37942545sewardj                                  isMove, getRegUsage, mapRegs,
591fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj                                  genSpill, genReload, directReload,
592fb7373aee5e8a3039f2916ecf09870f3ec0c1805sewardj                                  guest_sizeB,
59392b643609c5fa432b11fc726c2706ae3f3296eb4cerion                                  ppInstr, ppReg, mode64 );
594f13a16a82132fa2358899c7683193effecf9a56fsewardj
5952d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
5962d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
597f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   if (vex_traceflags & VEX_TRACE_RCODE) {
598f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n------------------------"
599f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   " Register-allocated code "
600f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   "------------------------\n\n");
6011f40a0a104034009e253675288ebefdcccf30da8sewardj      for (i = 0; i < rcode->arr_used; i++) {
6021f40a0a104034009e253675288ebefdcccf30da8sewardj         vex_printf("%3d   ", i);
60392b643609c5fa432b11fc726c2706ae3f3296eb4cerion         ppInstr(rcode->arr[i], mode64);
6041f40a0a104034009e253675288ebefdcccf30da8sewardj         vex_printf("\n");
6051f40a0a104034009e253675288ebefdcccf30da8sewardj      }
606fbcaf3312f39fb73d54821636c6168db76245f61sewardj      vex_printf("\n");
607fbcaf3312f39fb73d54821636c6168db76245f61sewardj   }
608fbcaf3312f39fb73d54821636c6168db76245f61sewardj
609e908c426bc9991611a1731ee881208d148e913fbsewardj   /* HACK */
61017c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   if (0) { *(vta->host_bytes_used) = 0; return VexTransOK; }
611e908c426bc9991611a1731ee881208d148e913fbsewardj   /* end HACK */
612e908c426bc9991611a1731ee881208d148e913fbsewardj
61381bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj   /* Assemble */
614f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   if (vex_traceflags & VEX_TRACE_ASM) {
615f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      vex_printf("\n------------------------"
616f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   " Assembly "
617f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj                   "------------------------\n\n");
618f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   }
619f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj
62081bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj   out_used = 0; /* tracks along the host_bytes array */
62181bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj   for (i = 0; i < rcode->arr_used; i++) {
622f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      if (vex_traceflags & VEX_TRACE_ASM) {
62392b643609c5fa432b11fc726c2706ae3f3296eb4cerion         ppInstr(rcode->arr[i], mode64);
624bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj         vex_printf("\n");
625bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj      }
62617c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj      j = (*emit)( insn_bytes, 32, rcode->arr[i], mode64, vta->dispatch );
627f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj      if (vex_traceflags & VEX_TRACE_ASM) {
628bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj         for (k = 0; k < j; k++)
62972c72814ab82c51d8ee8accad1a00f2d37942545sewardj            if (insn_bytes[k] < 16)
63086898e8e1501f624d49b1cc43561c7a2a3b104f4sewardj               vex_printf("0%x ",  (UInt)insn_bytes[k]);
63186898e8e1501f624d49b1cc43561c7a2a3b104f4sewardj            else
63286898e8e1501f624d49b1cc43561c7a2a3b104f4sewardj               vex_printf("%x ", (UInt)insn_bytes[k]);
633bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj         vex_printf("\n\n");
634bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj      }
63517c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj      if (out_used + j > vta->host_bytes_size) {
6362d6b14aa64df2ff85f8da143516779d5d43574cbsewardj         vexSetAllocModeTEMP_and_clear();
637f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj         vex_traceflags = 0;
638d887b8634b2c2685f528bd968459c628e8f86a34sewardj         return VexTransOutputFull;
63981bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj      }
64081bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj      for (k = 0; k < j; k++) {
64117c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj         vta->host_bytes[out_used] = insn_bytes[k];
64281bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj         out_used++;
64381bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj      }
64417c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj      vassert(out_used <= vta->host_bytes_size);
64581bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj   }
64617c7f95c78bb3c8ced934e41a4bf1aae6d857d59sewardj   *(vta->host_bytes_used) = out_used;
64781bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj
6482d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexAllocSanityCheck();
6492d6b14aa64df2ff85f8da143516779d5d43574cbsewardj
6502d6b14aa64df2ff85f8da143516779d5d43574cbsewardj   vexSetAllocModeTEMP_and_clear();
651f13a16a82132fa2358899c7683193effecf9a56fsewardj
652f48ac19a67a98af44fe452c8c2be4192ac94b62dsewardj   vex_traceflags = 0;
653d887b8634b2c2685f528bd968459c628e8f86a34sewardj   return VexTransOK;
65435421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj}
65535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
65635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
657893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj/* --------- Emulation warnings. --------- */
658893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj
659893aadad7f29f7801ce26cb7575c16e90bd3767fsewardjHChar* LibVEX_EmWarn_string ( VexEmWarn ew )
660893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj{
661893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj   switch (ew) {
662893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj     case EmWarn_NONE:
663893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj        return "none";
664893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj     case EmWarn_X86_x87exns:
665893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj        return "Unmasking x87 FP exceptions";
666893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj     case EmWarn_X86_x87precision:
667893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj        return "Selection of non-80-bit x87 FP precision";
668893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj     case EmWarn_X86_sseExns:
6695edfc26d72ca8ebea2aa0443a1ed4dd218343d04sewardj        return "Unmasking SSE FP exceptions";
6705edfc26d72ca8ebea2aa0443a1ed4dd218343d04sewardj     case EmWarn_X86_fz:
6715edfc26d72ca8ebea2aa0443a1ed4dd218343d04sewardj        return "Setting %mxcsr.fz (SSE flush-underflows-to-zero mode)";
6725edfc26d72ca8ebea2aa0443a1ed4dd218343d04sewardj     case EmWarn_X86_daz:
6735edfc26d72ca8ebea2aa0443a1ed4dd218343d04sewardj        return "Setting %mxcsr.daz (SSE treat-denormals-as-zero mode)";
6746d26984a0df6a7d20b658bac6edf869eb872cca3sewardj     case EmWarn_X86_acFlag:
6756d26984a0df6a7d20b658bac6edf869eb872cca3sewardj        return "Setting %eflags.ac (setting noted but ignored)";
6769dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj     case EmWarn_PPCexns:
6779dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj        return "Unmasking PPC32/64 FP exceptions";
6789dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj     case EmWarn_PPC64_redir_overflow:
6799dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj        return "PPC64 function redirection stack overflow";
6809dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj     case EmWarn_PPC64_redir_underflow:
6819dd9cf1cb0b6915fc2f7dff642455ca41e162649sewardj        return "PPC64 function redirection stack underflow";
682893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj     default:
683893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj        vpanic("LibVEX_EmWarn_string: unknown warning");
684893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj   }
685893aadad7f29f7801ce26cb7575c16e90bd3767fsewardj}
68635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
6875117ce116f47141cb23d1b49cc826e19323add97sewardj/* ------------------ Arch/HwCaps stuff. ------------------ */
688bef170b7e84713d1e2181b9204d9415d29de3d65sewardj
689bef170b7e84713d1e2181b9204d9415d29de3d65sewardjconst HChar* LibVEX_ppVexArch ( VexArch arch )
690bef170b7e84713d1e2181b9204d9415d29de3d65sewardj{
691bef170b7e84713d1e2181b9204d9415d29de3d65sewardj   switch (arch) {
692bef170b7e84713d1e2181b9204d9415d29de3d65sewardj      case VexArch_INVALID: return "INVALID";
693bef170b7e84713d1e2181b9204d9415d29de3d65sewardj      case VexArchX86:      return "X86";
694bef170b7e84713d1e2181b9204d9415d29de3d65sewardj      case VexArchAMD64:    return "AMD64";
695bef170b7e84713d1e2181b9204d9415d29de3d65sewardj      case VexArchARM:      return "ARM";
6960ec57c595719a395e71b48792a4d62c5b896b6d3sewardj      case VexArchPPC32:    return "PPC32";
697f0de28cf1a762b0d6f74c93d3532c89a230673bbcerion      case VexArchPPC64:    return "PPC64";
698bef170b7e84713d1e2181b9204d9415d29de3d65sewardj      default:              return "VexArch???";
699bef170b7e84713d1e2181b9204d9415d29de3d65sewardj   }
700bef170b7e84713d1e2181b9204d9415d29de3d65sewardj}
701bef170b7e84713d1e2181b9204d9415d29de3d65sewardj
7025117ce116f47141cb23d1b49cc826e19323add97sewardjconst HChar* LibVEX_ppVexHwCaps ( VexArch arch, UInt hwcaps )
703bef170b7e84713d1e2181b9204d9415d29de3d65sewardj{
7045117ce116f47141cb23d1b49cc826e19323add97sewardj   HChar* str = show_hwcaps(arch,hwcaps);
7055117ce116f47141cb23d1b49cc826e19323add97sewardj   return str ? str : "INVALID";
706bef170b7e84713d1e2181b9204d9415d29de3d65sewardj}
707bef170b7e84713d1e2181b9204d9415d29de3d65sewardj
7085117ce116f47141cb23d1b49cc826e19323add97sewardj
70927e1dd6317760f3222f8a82185fa0e8ba138c85bsewardj/* Write default settings info *vai. */
71027e1dd6317760f3222f8a82185fa0e8ba138c85bsewardjvoid LibVEX_default_VexArchInfo ( /*OUT*/VexArchInfo* vai )
71127e1dd6317760f3222f8a82185fa0e8ba138c85bsewardj{
7125117ce116f47141cb23d1b49cc826e19323add97sewardj   vai->hwcaps             = 0;
7135b2325f209f6d3c7ab9c4e819d15060f8d1f09efcerion   vai->ppc_cache_line_szB = 0;
71427e1dd6317760f3222f8a82185fa0e8ba138c85bsewardj}
71527e1dd6317760f3222f8a82185fa0e8ba138c85bsewardj
716dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj/* Write default settings info *vbi. */
717dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardjvoid LibVEX_default_VexAbiInfo ( /*OUT*/VexAbiInfo* vbi )
718aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj{
719dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   vbi->guest_stack_redzone_size       = 0;
720dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   vbi->guest_ppc_zap_RZ_at_blr        = False;
721dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   vbi->guest_ppc_zap_RZ_at_bl         = NULL;
722dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   vbi->guest_ppc_sc_continues_at_LR   = False;
723dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   vbi->host_ppc_calls_use_fndescrs    = False;
724dd40fdf58cc8a6fe9466c4f00bdfc9fe9bf00449sewardj   vbi->host_ppc32_regalign_int64_args = False;
725aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj}
726aca070a5b3418a6a9b01e3c57a7eb0fbb5050908sewardj
72727e1dd6317760f3222f8a82185fa0e8ba138c85bsewardj
7285117ce116f47141cb23d1b49cc826e19323add97sewardj/* Return a string showing the hwcaps in a nice way.  The string will
7295117ce116f47141cb23d1b49cc826e19323add97sewardj   be NULL for invalid combinations of flags, so these functions also
7305117ce116f47141cb23d1b49cc826e19323add97sewardj   serve as a way to validate hwcaps values. */
7315117ce116f47141cb23d1b49cc826e19323add97sewardj
7325117ce116f47141cb23d1b49cc826e19323add97sewardjstatic HChar* show_hwcaps_x86 ( UInt hwcaps )
7335117ce116f47141cb23d1b49cc826e19323add97sewardj{
7345117ce116f47141cb23d1b49cc826e19323add97sewardj   /* Monotonic, SSE3 > SSE2 > SSE1 > baseline. */
7355117ce116f47141cb23d1b49cc826e19323add97sewardj   if (hwcaps == 0)
7365117ce116f47141cb23d1b49cc826e19323add97sewardj      return "x86-sse0";
7375117ce116f47141cb23d1b49cc826e19323add97sewardj   if (hwcaps == VEX_HWCAPS_X86_SSE1)
7385117ce116f47141cb23d1b49cc826e19323add97sewardj      return "x86-sse1";
7395117ce116f47141cb23d1b49cc826e19323add97sewardj   if (hwcaps == (VEX_HWCAPS_X86_SSE1 | VEX_HWCAPS_X86_SSE2))
7405117ce116f47141cb23d1b49cc826e19323add97sewardj      return "x86-sse1-sse2";
7415117ce116f47141cb23d1b49cc826e19323add97sewardj   if (hwcaps == (VEX_HWCAPS_X86_SSE1
7425117ce116f47141cb23d1b49cc826e19323add97sewardj                  | VEX_HWCAPS_X86_SSE2 | VEX_HWCAPS_X86_SSE3))
7435117ce116f47141cb23d1b49cc826e19323add97sewardj      return "x86-sse1-sse2-sse3";
7445117ce116f47141cb23d1b49cc826e19323add97sewardj
7455117ce116f47141cb23d1b49cc826e19323add97sewardj   return False;
7465117ce116f47141cb23d1b49cc826e19323add97sewardj}
7475117ce116f47141cb23d1b49cc826e19323add97sewardj
7485117ce116f47141cb23d1b49cc826e19323add97sewardjstatic HChar* show_hwcaps_amd64 ( UInt hwcaps )
7495117ce116f47141cb23d1b49cc826e19323add97sewardj{
7505117ce116f47141cb23d1b49cc826e19323add97sewardj   /* Monotonic, SSE3 > baseline. */
7515117ce116f47141cb23d1b49cc826e19323add97sewardj   if (hwcaps == 0)
7525117ce116f47141cb23d1b49cc826e19323add97sewardj      return "amd64-sse2";
7535117ce116f47141cb23d1b49cc826e19323add97sewardj   if (hwcaps == VEX_HWCAPS_AMD64_SSE3)
7545117ce116f47141cb23d1b49cc826e19323add97sewardj      return "amd64-sse3";
7555117ce116f47141cb23d1b49cc826e19323add97sewardj   return False;
7565117ce116f47141cb23d1b49cc826e19323add97sewardj}
7575117ce116f47141cb23d1b49cc826e19323add97sewardj
7585117ce116f47141cb23d1b49cc826e19323add97sewardjstatic HChar* show_hwcaps_ppc32 ( UInt hwcaps )
7595117ce116f47141cb23d1b49cc826e19323add97sewardj{
7605117ce116f47141cb23d1b49cc826e19323add97sewardj   /* Monotonic with complications.  Basically V > F > baseline,
7615117ce116f47141cb23d1b49cc826e19323add97sewardj      but once you have F then you can have FX or GX too. */
7625117ce116f47141cb23d1b49cc826e19323add97sewardj   const UInt F  = VEX_HWCAPS_PPC32_F;
7635117ce116f47141cb23d1b49cc826e19323add97sewardj   const UInt V  = VEX_HWCAPS_PPC32_V;
7645117ce116f47141cb23d1b49cc826e19323add97sewardj   const UInt FX = VEX_HWCAPS_PPC32_FX;
7655117ce116f47141cb23d1b49cc826e19323add97sewardj   const UInt GX = VEX_HWCAPS_PPC32_GX;
7665117ce116f47141cb23d1b49cc826e19323add97sewardj         UInt c  = hwcaps;
7675117ce116f47141cb23d1b49cc826e19323add97sewardj   if (c == 0)           return "ppc32-int";
7685117ce116f47141cb23d1b49cc826e19323add97sewardj   if (c == F)           return "ppc32-int-flt";
7695117ce116f47141cb23d1b49cc826e19323add97sewardj   if (c == (F|FX))      return "ppc32-int-flt-FX";
7705117ce116f47141cb23d1b49cc826e19323add97sewardj   if (c == (F|GX))      return "ppc32-int-flt-GX";
7715117ce116f47141cb23d1b49cc826e19323add97sewardj   if (c == (F|FX|GX))   return "ppc32-int-flt-FX-GX";
7725117ce116f47141cb23d1b49cc826e19323add97sewardj   if (c == (F|V))       return "ppc32-int-flt-vmx";
7735117ce116f47141cb23d1b49cc826e19323add97sewardj   if (c == (F|V|FX))    return "ppc32-int-flt-vmx-FX";
7745117ce116f47141cb23d1b49cc826e19323add97sewardj   if (c == (F|V|GX))    return "ppc32-int-flt-vmx-GX";
7755117ce116f47141cb23d1b49cc826e19323add97sewardj   if (c == (F|V|FX|GX)) return "ppc32-int-flt-vmx-FX-GX";
7765117ce116f47141cb23d1b49cc826e19323add97sewardj   return NULL;
7775117ce116f47141cb23d1b49cc826e19323add97sewardj}
7785117ce116f47141cb23d1b49cc826e19323add97sewardj
7795117ce116f47141cb23d1b49cc826e19323add97sewardjstatic HChar* show_hwcaps_ppc64 ( UInt hwcaps )
7805117ce116f47141cb23d1b49cc826e19323add97sewardj{
7815117ce116f47141cb23d1b49cc826e19323add97sewardj   /* Monotonic with complications.  Basically V > baseline(==F),
7825117ce116f47141cb23d1b49cc826e19323add97sewardj      but once you have F then you can have FX or GX too. */
7833fd3967db856eb90b2030ebeb42b685d45bc3276sewardj   const UInt V  = VEX_HWCAPS_PPC64_V;
7843fd3967db856eb90b2030ebeb42b685d45bc3276sewardj   const UInt FX = VEX_HWCAPS_PPC64_FX;
7853fd3967db856eb90b2030ebeb42b685d45bc3276sewardj   const UInt GX = VEX_HWCAPS_PPC64_GX;
7865117ce116f47141cb23d1b49cc826e19323add97sewardj         UInt c  = hwcaps;
7875117ce116f47141cb23d1b49cc826e19323add97sewardj   if (c == 0)         return "ppc64-int-flt";
7885117ce116f47141cb23d1b49cc826e19323add97sewardj   if (c == FX)        return "ppc64-int-flt-FX";
7895117ce116f47141cb23d1b49cc826e19323add97sewardj   if (c == GX)        return "ppc64-int-flt-GX";
7905117ce116f47141cb23d1b49cc826e19323add97sewardj   if (c == (FX|GX))   return "ppc64-int-flt-FX-GX";
7915117ce116f47141cb23d1b49cc826e19323add97sewardj   if (c == V)         return "ppc64-int-flt-vmx";
7925117ce116f47141cb23d1b49cc826e19323add97sewardj   if (c == (V|FX))    return "ppc64-int-flt-vmx-FX";
7935117ce116f47141cb23d1b49cc826e19323add97sewardj   if (c == (V|GX))    return "ppc64-int-flt-vmx-GX";
7945117ce116f47141cb23d1b49cc826e19323add97sewardj   if (c == (V|FX|GX)) return "ppc64-int-flt-vmx-FX-GX";
7955117ce116f47141cb23d1b49cc826e19323add97sewardj   return NULL;
7965117ce116f47141cb23d1b49cc826e19323add97sewardj}
7975117ce116f47141cb23d1b49cc826e19323add97sewardj
7985117ce116f47141cb23d1b49cc826e19323add97sewardjstatic HChar* show_hwcaps_arm ( UInt hwcaps )
7995117ce116f47141cb23d1b49cc826e19323add97sewardj{
8005117ce116f47141cb23d1b49cc826e19323add97sewardj   if (hwcaps == 0) return "arm-baseline";
8015117ce116f47141cb23d1b49cc826e19323add97sewardj   return NULL;
8025117ce116f47141cb23d1b49cc826e19323add97sewardj}
8035117ce116f47141cb23d1b49cc826e19323add97sewardj
8045117ce116f47141cb23d1b49cc826e19323add97sewardj/* ---- */
8055117ce116f47141cb23d1b49cc826e19323add97sewardjstatic HChar* show_hwcaps ( VexArch arch, UInt hwcaps )
8065117ce116f47141cb23d1b49cc826e19323add97sewardj{
8075117ce116f47141cb23d1b49cc826e19323add97sewardj   switch (arch) {
8083fd3967db856eb90b2030ebeb42b685d45bc3276sewardj      case VexArchX86:   return show_hwcaps_x86(hwcaps);
8095117ce116f47141cb23d1b49cc826e19323add97sewardj      case VexArchAMD64: return show_hwcaps_amd64(hwcaps);
8105117ce116f47141cb23d1b49cc826e19323add97sewardj      case VexArchPPC32: return show_hwcaps_ppc32(hwcaps);
8115117ce116f47141cb23d1b49cc826e19323add97sewardj      case VexArchPPC64: return show_hwcaps_ppc64(hwcaps);
8123fd3967db856eb90b2030ebeb42b685d45bc3276sewardj      case VexArchARM:   return show_hwcaps_arm(hwcaps);
8135117ce116f47141cb23d1b49cc826e19323add97sewardj      default: return NULL;
8145117ce116f47141cb23d1b49cc826e19323add97sewardj   }
8155117ce116f47141cb23d1b49cc826e19323add97sewardj}
8165117ce116f47141cb23d1b49cc826e19323add97sewardj
8175117ce116f47141cb23d1b49cc826e19323add97sewardjstatic Bool are_valid_hwcaps ( VexArch arch, UInt hwcaps )
8185117ce116f47141cb23d1b49cc826e19323add97sewardj{
8195117ce116f47141cb23d1b49cc826e19323add97sewardj   return show_hwcaps(arch,hwcaps) != NULL;
8205117ce116f47141cb23d1b49cc826e19323add97sewardj}
8215117ce116f47141cb23d1b49cc826e19323add97sewardj
8225117ce116f47141cb23d1b49cc826e19323add97sewardj
82335421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*---------------------------------------------------------------*/
824c0ee2edb4563c90bc8f1a83a09984a1fda86d1d3sewardj/*--- end                                     main/vex_main.c ---*/
82535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*---------------------------------------------------------------*/
826