main_main.c revision 84ff0657940e62f38e618ea18bac6f27ce0e741f
135421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
235421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*---------------------------------------------------------------*/
335421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*---                                                         ---*/
4c0ee2edb4563c90bc8f1a83a09984a1fda86d1d3sewardj/*--- This file (main/vex_main.c) is                          ---*/
535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*--- Copyright (c) 2004 OpenWorks LLP.  All rights reserved. ---*/
635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*---                                                         ---*/
735421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*---------------------------------------------------------------*/
835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
9887a11a609f3e61d2ae8fe4e67f176207715da7esewardj#include "libvex.h"
10f13a16a82132fa2358899c7683193effecf9a56fsewardj
11c0ee2edb4563c90bc8f1a83a09984a1fda86d1d3sewardj#include "main/vex_globals.h"
12c0ee2edb4563c90bc8f1a83a09984a1fda86d1d3sewardj#include "main/vex_util.h"
13c0ee2edb4563c90bc8f1a83a09984a1fda86d1d3sewardj#include "host-generic/h_generic_regs.h"
14c0ee2edb4563c90bc8f1a83a09984a1fda86d1d3sewardj#include "host-x86/hdefs.h"
15c0ee2edb4563c90bc8f1a83a09984a1fda86d1d3sewardj#include "guest-x86/gdefs.h"
16edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj#include "ir/iropt.h"
1735421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
1835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
1935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* This file contains the top level interface to the library. */
2035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
2135421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* --------- Initialise the library. --------- */
2235421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
2335421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* Exported to library client. */
2435421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
25887a11a609f3e61d2ae8fe4e67f176207715da7esewardjvoid LibVEX_Init (
2635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   /* failure exit function */
272b51587159d1d7c331719886d896c0a9cf217ee4sewardj   __attribute__ ((noreturn))
2835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   void (*failure_exit) ( void ),
2935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   /* logging output function */
3035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   void (*log_bytes) ( Char*, Int nbytes ),
3135421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   /* debug paranoia level */
3235421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   Int debuglevel,
3358800ff1f3bc35d5cae9885c9d8a51a8d9d33016sewardj   /* initial verbosity level */
3435421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   Int verbosity,
3535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   /* Are we supporting valgrind checking? */
3635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   Bool valgrind_support,
3735421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   /* Max # guest insns per bb */
3835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   Int guest_insns_per_bb
3935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj)
4035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj{
4135421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   vassert(!vex_initdone);
4235421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   vassert(failure_exit);
4335421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   vassert(log_bytes);
4435421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   vassert(debuglevel >= 0);
4535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   vassert(verbosity >= 0);
4635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   vassert(guest_insns_per_bb >= 1 && guest_insns_per_bb <= 100);
47443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj
48443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj   vex_failure_exit       = failure_exit;
49443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj   vex_log_bytes          = log_bytes;
50443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj   vex_debuglevel         = debuglevel;
51443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj   vex_verbosity          = verbosity;
52443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj   vex_valgrind_support   = valgrind_support;
5335421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   vex_guest_insns_per_bb = guest_insns_per_bb;
54443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj   vex_initdone           = True;
55443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj   LibVEX_SetAllocMode ( AllocModeTEMPORARY );
5635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj}
5735421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
5835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
5935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* --------- Make a translation. --------- */
6035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
6135421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/* Exported to library client. */
6235421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
63887a11a609f3e61d2ae8fe4e67f176207715da7esewardjTranslateResult LibVEX_Translate (
6435421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   /* The instruction sets we are translating from and to. */
6535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   InsnSet iset_guest,
6635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   InsnSet iset_host,
6735421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   /* IN: the block to translate, and its guest address. */
6881bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj   UChar* guest_bytes,
6935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   Addr64 guest_bytes_addr,
7035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   /* OUT: the number of bytes actually read */
7135421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   Int* guest_bytes_read,
7235421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   /* IN: a place to put the resulting code, and its size */
7381bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj   UChar* host_bytes,
7481bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj   Int    host_bytes_size,
7535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   /* OUT: how much of the output area is used. */
7635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   Int* host_bytes_used,
7735421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   /* IN: optionally, an instrumentation function. */
78f13a16a82132fa2358899c7683193effecf9a56fsewardj   IRBB* (*instrument) ( IRBB* ),
7935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   /* IN: optionally, an access check function for guest code. */
8058800ff1f3bc35d5cae9885c9d8a51a8d9d33016sewardj   Bool (*byte_accessible) ( Addr64 ),
8158800ff1f3bc35d5cae9885c9d8a51a8d9d33016sewardj   /* IN: if > 0, use this verbosity for this bb */
8258800ff1f3bc35d5cae9885c9d8a51a8d9d33016sewardj   Int  bb_verbosity
8335421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj)
8435421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj{
8581bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj   /* This the bundle of functions we need to do the back-end stuff
8681bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj      (insn selection, reg-alloc, assembly) whilst being insulated
8781bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj      from the target instruction set. */
88f13a16a82132fa2358899c7683193effecf9a56fsewardj   HReg* available_real_regs;
89f13a16a82132fa2358899c7683193effecf9a56fsewardj   Int   n_available_real_regs;
90443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj   Bool         (*isMove)      (HInstr*, HReg*, HReg*);
91443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj   void         (*getRegUsage) (HRegUsage*, HInstr*);
92443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj   void         (*mapRegs)     (HRegRemap*, HInstr*);
93443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj   HInstr*      (*genSpill)    ( HReg, Int );
94443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj   HInstr*      (*genReload)   ( HReg, Int );
95443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj   void         (*ppInstr)     ( HInstr* );
96443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj   void         (*ppReg)       ( HReg );
9736ca51378f8851635df814230fa23f2c409b9eddsewardj   HInstrArray* (*iselBB)      ( IRBB*, Addr64(*)(Char*) );
98443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj   IRBB*        (*bbToIR)      ( UChar*, Addr64, Int*,
99443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj                                         Bool(*)(Addr64), Bool );
10081bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj   Int          (*emit)        ( UChar*, Int, HInstr* );
10136ca51378f8851635df814230fa23f2c409b9eddsewardj   Addr64       (*findHelper)  ( Char* );
10284ff0657940e62f38e618ea18bac6f27ce0e741fsewardj   IRExpr*      (*specHelper)  ( Char*, IRExpr** );
103f13a16a82132fa2358899c7683193effecf9a56fsewardj
104c9a6570e86f4252f8a486b4df48de8710d357a4asewardj   Bool         host_is_bigendian = False;
105f13a16a82132fa2358899c7683193effecf9a56fsewardj   IRBB*        irbb;
106f13a16a82132fa2358899c7683193effecf9a56fsewardj   HInstrArray* vcode;
107f13a16a82132fa2358899c7683193effecf9a56fsewardj   HInstrArray* rcode;
10858800ff1f3bc35d5cae9885c9d8a51a8d9d33016sewardj   Int          i, j, k, out_used, saved_verbosity;
1092e56f9fe21d92f77c2e3cbdf6185d6705bf47224sewardj   UChar        insn_bytes[32];
110f13a16a82132fa2358899c7683193effecf9a56fsewardj
11136ca51378f8851635df814230fa23f2c409b9eddsewardj   available_real_regs    = NULL;
11236ca51378f8851635df814230fa23f2c409b9eddsewardj   n_available_real_regs  = 0;
11336ca51378f8851635df814230fa23f2c409b9eddsewardj   isMove                 = NULL;
11436ca51378f8851635df814230fa23f2c409b9eddsewardj   getRegUsage            = NULL;
11536ca51378f8851635df814230fa23f2c409b9eddsewardj   mapRegs                = NULL;
11636ca51378f8851635df814230fa23f2c409b9eddsewardj   genSpill               = NULL;
11736ca51378f8851635df814230fa23f2c409b9eddsewardj   genReload              = NULL;
11836ca51378f8851635df814230fa23f2c409b9eddsewardj   ppInstr                = NULL;
11936ca51378f8851635df814230fa23f2c409b9eddsewardj   ppReg                  = NULL;
12036ca51378f8851635df814230fa23f2c409b9eddsewardj   iselBB                 = NULL;
12136ca51378f8851635df814230fa23f2c409b9eddsewardj   bbToIR                 = NULL;
12236ca51378f8851635df814230fa23f2c409b9eddsewardj   emit                   = NULL;
12336ca51378f8851635df814230fa23f2c409b9eddsewardj   findHelper             = NULL;
12484ff0657940e62f38e618ea18bac6f27ce0e741fsewardj   specHelper             = NULL;
12536ca51378f8851635df814230fa23f2c409b9eddsewardj
12658800ff1f3bc35d5cae9885c9d8a51a8d9d33016sewardj   saved_verbosity = vex_verbosity;
12758800ff1f3bc35d5cae9885c9d8a51a8d9d33016sewardj   if (bb_verbosity > 0)
12858800ff1f3bc35d5cae9885c9d8a51a8d9d33016sewardj      vex_verbosity = bb_verbosity;
12958800ff1f3bc35d5cae9885c9d8a51a8d9d33016sewardj
13035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   vassert(vex_initdone);
131443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj   LibVEX_ClearTemporary(False);
132f13a16a82132fa2358899c7683193effecf9a56fsewardj
133f13a16a82132fa2358899c7683193effecf9a56fsewardj   /* First off, check that the guest and host insn sets
134f13a16a82132fa2358899c7683193effecf9a56fsewardj      are supported. */
135f13a16a82132fa2358899c7683193effecf9a56fsewardj   switch (iset_host) {
136f13a16a82132fa2358899c7683193effecf9a56fsewardj      case InsnSetX86:
137f13a16a82132fa2358899c7683193effecf9a56fsewardj         getAllocableRegs_X86 ( &n_available_real_regs,
138f13a16a82132fa2358899c7683193effecf9a56fsewardj                                &available_real_regs );
139f13a16a82132fa2358899c7683193effecf9a56fsewardj         isMove      = (Bool(*)(HInstr*,HReg*,HReg*)) isMove_X86Instr;
140f13a16a82132fa2358899c7683193effecf9a56fsewardj         getRegUsage = (void(*)(HRegUsage*,HInstr*)) getRegUsage_X86Instr;
141f13a16a82132fa2358899c7683193effecf9a56fsewardj         mapRegs     = (void(*)(HRegRemap*,HInstr*)) mapRegs_X86Instr;
142f13a16a82132fa2358899c7683193effecf9a56fsewardj         genSpill    = (HInstr*(*)(HReg,Int)) genSpill_X86;
143f13a16a82132fa2358899c7683193effecf9a56fsewardj         genReload   = (HInstr*(*)(HReg,Int)) genReload_X86;
1442b51587159d1d7c331719886d896c0a9cf217ee4sewardj         ppInstr     = (void(*)(HInstr*)) ppX86Instr;
1452b51587159d1d7c331719886d896c0a9cf217ee4sewardj         ppReg       = (void(*)(HReg)) ppHRegX86;
146f13a16a82132fa2358899c7683193effecf9a56fsewardj         iselBB      = iselBB_X86;
14781bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj         emit        = (Int(*)(UChar*,Int,HInstr*)) emit_X86Instr;
148c9a6570e86f4252f8a486b4df48de8710d357a4asewardj	 host_is_bigendian = False;
149f13a16a82132fa2358899c7683193effecf9a56fsewardj         break;
150f13a16a82132fa2358899c7683193effecf9a56fsewardj      default:
151887a11a609f3e61d2ae8fe4e67f176207715da7esewardj         vpanic("LibVEX_Translate: unsupported target insn set");
152f13a16a82132fa2358899c7683193effecf9a56fsewardj   }
153f13a16a82132fa2358899c7683193effecf9a56fsewardj
154f13a16a82132fa2358899c7683193effecf9a56fsewardj   switch (iset_guest) {
155f13a16a82132fa2358899c7683193effecf9a56fsewardj      case InsnSetX86:
15636ca51378f8851635df814230fa23f2c409b9eddsewardj         bbToIR     = bbToIR_X86Instr;
15736ca51378f8851635df814230fa23f2c409b9eddsewardj         findHelper = x86guest_findhelper;
15884ff0657940e62f38e618ea18bac6f27ce0e741fsewardj         specHelper = x86guest_spechelper;
159f13a16a82132fa2358899c7683193effecf9a56fsewardj         break;
160f13a16a82132fa2358899c7683193effecf9a56fsewardj      default:
161887a11a609f3e61d2ae8fe4e67f176207715da7esewardj         vpanic("LibVEX_Translate: unsupported guest insn set");
162f13a16a82132fa2358899c7683193effecf9a56fsewardj   }
163f13a16a82132fa2358899c7683193effecf9a56fsewardj
164f13a16a82132fa2358899c7683193effecf9a56fsewardj   irbb = bbToIR ( guest_bytes,
165f13a16a82132fa2358899c7683193effecf9a56fsewardj		   guest_bytes_addr,
166f13a16a82132fa2358899c7683193effecf9a56fsewardj		   guest_bytes_read,
167c9a6570e86f4252f8a486b4df48de8710d357a4asewardj		   byte_accessible,
168c9a6570e86f4252f8a486b4df48de8710d357a4asewardj		   host_is_bigendian );
169f13a16a82132fa2358899c7683193effecf9a56fsewardj
170f13a16a82132fa2358899c7683193effecf9a56fsewardj   if (irbb == NULL) {
171f13a16a82132fa2358899c7683193effecf9a56fsewardj      /* Access failure. */
172443cd9d34617dd7608e5dd4b4b0b4674d4f433e7sewardj      LibVEX_ClearTemporary(False);
17358800ff1f3bc35d5cae9885c9d8a51a8d9d33016sewardj      vex_verbosity = saved_verbosity;
174f13a16a82132fa2358899c7683193effecf9a56fsewardj      return TransAccessFail;
175f13a16a82132fa2358899c7683193effecf9a56fsewardj   }
176354392111e47edc50442ea5095fa2367d9cc206fsewardj   sanityCheckIRBB(irbb, Ity_I32);
177e8e9d73817f92d295f45b1c6c823c613bc2e90aesewardj
178edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj   /* Clean it up, hopefully a lot. */
17984ff0657940e62f38e618ea18bac6f27ce0e741fsewardj   irbb = do_iropt_BB ( irbb, specHelper );
180d7cb8538d814660fe68ea7100571fd3ed1de8082sewardj   sanityCheckIRBB(irbb, Ity_I32);
181edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj
182edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj   if (vex_verbosity > 0) {
183edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj      vex_printf("\n-------- After IR optimisation --------\n");
184edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj      ppIRBB ( irbb );
185edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj      vex_printf("\n");
186edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj   }
187edf4d69c8477cad95851d0f6ccf91ab323e5a446sewardj
188f13a16a82132fa2358899c7683193effecf9a56fsewardj   /* Get the thing instrumented. */
189f13a16a82132fa2358899c7683193effecf9a56fsewardj   if (instrument)
190f13a16a82132fa2358899c7683193effecf9a56fsewardj      irbb = (*instrument)(irbb);
191f13a16a82132fa2358899c7683193effecf9a56fsewardj
192f13a16a82132fa2358899c7683193effecf9a56fsewardj   /* Turn it into virtual-registerised code. */
19336ca51378f8851635df814230fa23f2c409b9eddsewardj   vcode = iselBB ( irbb, findHelper );
194f13a16a82132fa2358899c7683193effecf9a56fsewardj
1951f40a0a104034009e253675288ebefdcccf30da8sewardj   if (vex_verbosity > 0) {
1961f40a0a104034009e253675288ebefdcccf30da8sewardj      vex_printf("\n-------- Virtual registerised code --------\n");
1971f40a0a104034009e253675288ebefdcccf30da8sewardj      for (i = 0; i < vcode->arr_used; i++) {
1981f40a0a104034009e253675288ebefdcccf30da8sewardj         vex_printf("%3d   ", i);
1991f40a0a104034009e253675288ebefdcccf30da8sewardj         ppInstr(vcode->arr[i]);
2001f40a0a104034009e253675288ebefdcccf30da8sewardj         vex_printf("\n");
2011f40a0a104034009e253675288ebefdcccf30da8sewardj      }
202fbcaf3312f39fb73d54821636c6168db76245f61sewardj      vex_printf("\n");
203fbcaf3312f39fb73d54821636c6168db76245f61sewardj   }
204fbcaf3312f39fb73d54821636c6168db76245f61sewardj
205f13a16a82132fa2358899c7683193effecf9a56fsewardj   /* Register allocate. */
206f13a16a82132fa2358899c7683193effecf9a56fsewardj   rcode = doRegisterAllocation ( vcode, available_real_regs,
207f13a16a82132fa2358899c7683193effecf9a56fsewardj                  	       	  n_available_real_regs,
208f13a16a82132fa2358899c7683193effecf9a56fsewardj			          isMove, getRegUsage, mapRegs,
2092b51587159d1d7c331719886d896c0a9cf217ee4sewardj			          genSpill, genReload,
2102b51587159d1d7c331719886d896c0a9cf217ee4sewardj				  ppInstr, ppReg );
211f13a16a82132fa2358899c7683193effecf9a56fsewardj
2121f40a0a104034009e253675288ebefdcccf30da8sewardj   if (vex_verbosity > 0) {
2131f40a0a104034009e253675288ebefdcccf30da8sewardj      vex_printf("\n-------- Post-regalloc code --------\n");
2141f40a0a104034009e253675288ebefdcccf30da8sewardj      for (i = 0; i < rcode->arr_used; i++) {
2151f40a0a104034009e253675288ebefdcccf30da8sewardj         vex_printf("%3d   ", i);
2161f40a0a104034009e253675288ebefdcccf30da8sewardj         ppInstr(rcode->arr[i]);
2171f40a0a104034009e253675288ebefdcccf30da8sewardj         vex_printf("\n");
2181f40a0a104034009e253675288ebefdcccf30da8sewardj      }
219fbcaf3312f39fb73d54821636c6168db76245f61sewardj      vex_printf("\n");
220fbcaf3312f39fb73d54821636c6168db76245f61sewardj   }
221fbcaf3312f39fb73d54821636c6168db76245f61sewardj
22281bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj   /* Assemble */
22381bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj   out_used = 0; /* tracks along the host_bytes array */
22481bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj   for (i = 0; i < rcode->arr_used; i++) {
22514731f22bf7759d6d23383ca870ac89d9581f1e9sewardj      if (vex_verbosity > 1) {
226bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj         ppInstr(rcode->arr[i]);
227bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj         vex_printf("\n");
228bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj      }
22981bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj      j = (*emit)( insn_bytes, 32, rcode->arr[i] );
23014731f22bf7759d6d23383ca870ac89d9581f1e9sewardj      if (vex_verbosity > 1) {
231bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj         for (k = 0; k < j; k++)
23286898e8e1501f624d49b1cc43561c7a2a3b104f4sewardj	    if (insn_bytes[k] < 16)
23386898e8e1501f624d49b1cc43561c7a2a3b104f4sewardj               vex_printf("0%x ",  (UInt)insn_bytes[k]);
23486898e8e1501f624d49b1cc43561c7a2a3b104f4sewardj            else
23586898e8e1501f624d49b1cc43561c7a2a3b104f4sewardj               vex_printf("%x ", (UInt)insn_bytes[k]);
236bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj         vex_printf("\n\n");
237bad34a9c950dcc0c3f68ea2904206f3341fb5e91sewardj      }
23881bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj      if (out_used + j > host_bytes_size) {
23981bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj         LibVEX_ClearTemporary(False);
24058800ff1f3bc35d5cae9885c9d8a51a8d9d33016sewardj         vex_verbosity = saved_verbosity;
24181bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj         return TransOutputFull;
24281bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj      }
24381bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj      for (k = 0; k < j; k++) {
24481bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj         host_bytes[out_used] = insn_bytes[k];
24581bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj         out_used++;
24681bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj      }
24781bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj      vassert(out_used <= host_bytes_size);
24881bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj   }
24981bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj   *host_bytes_used = out_used;
25081bd550f9a1d58ceeedb159d18642d9790e75eb4sewardj
2511f40a0a104034009e253675288ebefdcccf30da8sewardj   //   LibVEX_ClearTemporary(True);
2521f40a0a104034009e253675288ebefdcccf30da8sewardj   LibVEX_ClearTemporary(False);
253f13a16a82132fa2358899c7683193effecf9a56fsewardj
25458800ff1f3bc35d5cae9885c9d8a51a8d9d33016sewardj   vex_verbosity = saved_verbosity;
25535421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj   return TransOK;
25635421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj}
25735421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
25835421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
25935421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj
26035421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*---------------------------------------------------------------*/
261c0ee2edb4563c90bc8f1a83a09984a1fda86d1d3sewardj/*--- end                                     main/vex_main.c ---*/
26235421a3cfd43bc829d27ee15bd34bbc7cb690805sewardj/*---------------------------------------------------------------*/
263