⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vex_main.c

📁 unix下调试内存泄露的工具源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
         preciseMemExnsFn = guest_x86_state_requires_precise_mem_exns;         disInstrFn       = disInstr_X86;         specHelper       = guest_x86_spechelper;         guest_sizeB      = sizeof(VexGuestX86State);         guest_word_type  = Ity_I32;         guest_layout     = &x86guest_layout;         offB_TISTART     = offsetof(VexGuestX86State,guest_TISTART);         offB_TILEN       = offsetof(VexGuestX86State,guest_TILEN);         vassert(archinfo_guest->subarch == VexSubArchX86_sse0                 || archinfo_guest->subarch == VexSubArchX86_sse1                 || archinfo_guest->subarch == VexSubArchX86_sse2);         vassert(sizeof( ((VexGuestX86State*)0)->guest_TISTART ) == 4);         vassert(sizeof( ((VexGuestX86State*)0)->guest_TILEN ) == 4);         break;      case VexArchAMD64:         preciseMemExnsFn = guest_amd64_state_requires_precise_mem_exns;         disInstrFn       = disInstr_AMD64;         specHelper       = guest_amd64_spechelper;         guest_sizeB      = sizeof(VexGuestAMD64State);         guest_word_type  = Ity_I64;         guest_layout     = &amd64guest_layout;         offB_TISTART     = offsetof(VexGuestAMD64State,guest_TISTART);         offB_TILEN       = offsetof(VexGuestAMD64State,guest_TILEN);         vassert(archinfo_guest->subarch == VexSubArch_NONE);         vassert(sizeof( ((VexGuestAMD64State*)0)->guest_TISTART ) == 8);         vassert(sizeof( ((VexGuestAMD64State*)0)->guest_TILEN ) == 8);         break;      case VexArchARM:         preciseMemExnsFn = guest_arm_state_requires_precise_mem_exns;         disInstrFn       = NULL; /* HACK */         specHelper       = guest_arm_spechelper;         guest_sizeB      = sizeof(VexGuestARMState);         guest_word_type  = Ity_I32;         guest_layout     = &armGuest_layout;         offB_TISTART     = 0; /* hack ... arm has bitrot */         offB_TILEN       = 0; /* hack ... arm has bitrot */         vassert(archinfo_guest->subarch == VexSubArchARM_v4);         break;      case VexArchPPC32:         preciseMemExnsFn = guest_ppc32_state_requires_precise_mem_exns;         disInstrFn       = disInstr_PPC32;         specHelper       = guest_ppc32_spechelper;         guest_sizeB      = sizeof(VexGuestPPC32State);         guest_word_type  = Ity_I32;         guest_layout     = &ppc32Guest_layout;         offB_TISTART     = offsetof(VexGuestPPC32State,guest_TISTART);         offB_TILEN       = offsetof(VexGuestPPC32State,guest_TILEN);         vassert(archinfo_guest->subarch == VexSubArchPPC32_noAV                 || archinfo_guest->subarch == VexSubArchPPC32_AV);         vassert(sizeof( ((VexGuestPPC32State*)0)->guest_TISTART ) == 4);         vassert(sizeof( ((VexGuestPPC32State*)0)->guest_TILEN ) == 4);         break;      default:         vpanic("LibVEX_Translate: unsupported guest insn set");   }   /* yet more sanity checks ... */   if (arch_guest == arch_host) {      /* doesn't necessarily have to be true, but if it isn't it means         we are simulating one flavour of an architecture a different         flavour of the same architecture, which is pretty strange. */      vassert(archinfo_guest->subarch == archinfo_host->subarch);   }   if (vex_traceflags & VEX_TRACE_FE)      vex_printf("\n------------------------"                    " Front end "                   "------------------------\n\n");   irbb = bb_to_IR ( guest_extents,                     disInstrFn,                     guest_bytes,                      guest_bytes_addr,                     chase_into_ok,                     host_is_bigendian,                     archinfo_guest,                     guest_word_type,                     do_self_check,                     offB_TISTART,                     offB_TILEN );   if (irbb == NULL) {      /* Access failure. */      vexClearTEMP();      vex_traceflags = 0;      return VexTransAccessFail;   }   vassert(guest_extents->n_used >= 1 && guest_extents->n_used <= 3);   vassert(guest_extents->base[0] == guest_bytes_addr);   for (i = 0; i < guest_extents->n_used; i++) {      vassert(guest_extents->len[i] < 10000); /* sanity */   }   /* If debugging, show the raw guest bytes for this bb. */   if (0 || (vex_traceflags & VEX_TRACE_FE)) {      if (guest_extents->n_used > 1) {         vex_printf("can't show code due to extents > 1\n");      } else {         /* HACK */         UChar* p = (UChar*)guest_bytes;         UInt   guest_bytes_read = (UInt)guest_extents->len[0];         vex_printf(". 0 %llx %u\n.", guest_bytes_addr, guest_bytes_read );         for (i = 0; i < guest_bytes_read; i++)         vex_printf(" %02x", (Int)p[i] );         vex_printf("\n\n");      }   }   /* Sanity check the initial IR. */   sanityCheckIRBB( irbb, "initial IR",                     False/*can be non-flat*/, guest_word_type );   /* Clean it up, hopefully a lot. */   irbb = do_iropt_BB ( irbb, specHelper, preciseMemExnsFn,                               guest_bytes_addr );   sanityCheckIRBB( irbb, "after initial iropt",                     True/*must be flat*/, guest_word_type );   if (vex_traceflags & VEX_TRACE_OPT1) {      vex_printf("\n------------------------"                    " After pre-instr IR optimisation "                   "------------------------\n\n");      ppIRBB ( irbb );      vex_printf("\n");   }   /* Get the thing instrumented. */   if (instrument1)      irbb = (*instrument1)(irbb, guest_layout,                                   guest_word_type, host_word_type);   if (instrument2)      irbb = (*instrument2)(irbb, guest_layout,                                  guest_word_type, host_word_type);         if (vex_traceflags & VEX_TRACE_INST) {      vex_printf("\n------------------------"                    " After instrumentation "                   "------------------------\n\n");      ppIRBB ( irbb );      vex_printf("\n");   }   if (instrument1 || instrument2)      sanityCheckIRBB( irbb, "after instrumentation",                       True/*must be flat*/, guest_word_type );   /* Do a post-instrumentation cleanup pass. */   if (cleanup_after_instrumentation) {      do_deadcode_BB( irbb );      irbb = cprop_BB( irbb );      do_deadcode_BB( irbb );      sanityCheckIRBB( irbb, "after post-instrumentation cleanup",                       True/*must be flat*/, guest_word_type );   }   if (vex_traceflags & VEX_TRACE_OPT2) {      vex_printf("\n------------------------"                    " After post-instr IR optimisation "                   "------------------------\n\n");      ppIRBB ( irbb );      vex_printf("\n");   }   /* Turn it into virtual-registerised code. */   do_deadcode_BB( irbb );   do_treebuild_BB( irbb );   if (vex_traceflags & VEX_TRACE_TREES) {      vex_printf("\n------------------------"                    "  After tree-building "                   "------------------------\n\n");      ppIRBB ( irbb );      vex_printf("\n");   }   /* HACK */   if (0) { *host_bytes_used = 0; return VexTransOK; }   /* end HACK */   if (vex_traceflags & VEX_TRACE_VCODE)      vex_printf("\n------------------------"                    " Instruction selection "                   "------------------------\n");   vcode = iselBB ( irbb, archinfo_host );   if (vex_traceflags & VEX_TRACE_VCODE)      vex_printf("\n");   if (vex_traceflags & VEX_TRACE_VCODE) {      for (i = 0; i < vcode->arr_used; i++) {         vex_printf("%3d   ", i);         ppInstr(vcode->arr[i]);         vex_printf("\n");      }      vex_printf("\n");   }   /* Register allocate. */   rcode = doRegisterAllocation ( vcode, available_real_regs,                                           n_available_real_regs,                                  isMove, getRegUsage, mapRegs,                                   genSpill, genReload, guest_sizeB,                                  ppInstr, ppReg );   if (vex_traceflags & VEX_TRACE_RCODE) {      vex_printf("\n------------------------"                    " Register-allocated code "                   "------------------------\n\n");      for (i = 0; i < rcode->arr_used; i++) {         vex_printf("%3d   ", i);         ppInstr(rcode->arr[i]);         vex_printf("\n");      }      vex_printf("\n");   }   /* HACK */   if (0) { *host_bytes_used = 0; return VexTransOK; }   /* end HACK */   /* Assemble */   if (vex_traceflags & VEX_TRACE_ASM) {      vex_printf("\n------------------------"                    " Assembly "                   "------------------------\n\n");   }   out_used = 0; /* tracks along the host_bytes array */   for (i = 0; i < rcode->arr_used; i++) {      if (vex_traceflags & VEX_TRACE_ASM) {         ppInstr(rcode->arr[i]);         vex_printf("\n");      }      j = (*emit)( insn_bytes, 32, rcode->arr[i] );      if (vex_traceflags & VEX_TRACE_ASM) {         for (k = 0; k < j; k++)            if (insn_bytes[k] < 16)               vex_printf("0%x ",  (UInt)insn_bytes[k]);            else               vex_printf("%x ", (UInt)insn_bytes[k]);         vex_printf("\n\n");      }      if (out_used + j > host_bytes_size) {         vexClearTEMP();         vex_traceflags = 0;         return VexTransOutputFull;      }      for (k = 0; k < j; k++) {         host_bytes[out_used] = insn_bytes[k];         out_used++;      }      vassert(out_used <= host_bytes_size);   }   *host_bytes_used = out_used;   vexClearTEMP();   vex_traceflags = 0;   return VexTransOK;}/* --------- Emulation warnings. --------- */HChar* LibVEX_EmWarn_string ( VexEmWarn ew ){   switch (ew) {     case EmWarn_NONE:         return "none";     case EmWarn_X86_x87exns:        return "Unmasking x87 FP exceptions";     case EmWarn_X86_x87precision:        return "Selection of non-80-bit x87 FP precision";     case EmWarn_X86_sseExns:        return "Unmasking SSE FP exceptions";     case EmWarn_X86_fz:        return "Setting %mxcsr.fz (SSE flush-underflows-to-zero mode)";     case EmWarn_X86_daz:        return "Setting %mxcsr.daz (SSE treat-denormals-as-zero mode)";     case EmWarn_PPC32exns:        return "Unmasking PPC32 FP exceptions";     default:         vpanic("LibVEX_EmWarn_string: unknown warning");   }}/* --------- Arch/Subarch stuff. --------- */const HChar* LibVEX_ppVexArch ( VexArch arch ){   switch (arch) {      case VexArch_INVALID: return "INVALID";      case VexArchX86:      return "X86";      case VexArchAMD64:    return "AMD64";      case VexArchARM:      return "ARM";      case VexArchPPC32:    return "PPC32";      default:              return "VexArch???";   }}const HChar* LibVEX_ppVexSubArch ( VexSubArch subarch ){   switch (subarch) {      case VexSubArch_INVALID:   return "INVALID";      case VexSubArch_NONE:      return "NONE";      case VexSubArchX86_sse0:   return "x86-sse0";      case VexSubArchX86_sse1:   return "x86-sse1";      case VexSubArchX86_sse2:   return "x86-sse2";      case VexSubArchARM_v4:     return "arm-v4";      case VexSubArchPPC32_noAV: return "ppc32-noAltivec";      case VexSubArchPPC32_AV:   return "ppc32-Altivec";      default:                   return "VexSubArch???";   }}/* Write default settings info *vai. */void LibVEX_default_VexArchInfo ( /*OUT*/VexArchInfo* vai ){   vai->subarch              = VexSubArch_INVALID;   vai->ppc32_cache_line_szB = 0;}/*---------------------------------------------------------------*//*--- end                                     main/vex_main.c ---*//*---------------------------------------------------------------*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -