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