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

📄 vex_main.c

📁 The Valgrind distribution has multiple tools. The most popular is the memory checking tool (called M
💻 C
📖 第 1 页 / 共 2 页
字号:
         vassert(sizeof( ((VexGuestPPC64State*)0)->guest_NRADDR_GPR2) == 8);         break;      default:         vpanic("LibVEX_Translate: unsupported guest insn set");   }   /* yet more sanity checks ... */   if (vta->arch_guest == vta->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(vta->archinfo_guest.hwcaps == vta->archinfo_host.hwcaps);   }   vexAllocSanityCheck();   if (vex_traceflags & VEX_TRACE_FE)      vex_printf("\n------------------------"                    " Front end "                   "------------------------\n\n");   irbb = bb_to_IR ( vta->guest_extents,                     vta->callback_opaque,                     disInstrFn,                     vta->guest_bytes,                      vta->guest_bytes_addr,                     vta->chase_into_ok,                     host_is_bigendian,                     vta->arch_guest,                     &vta->archinfo_guest,                     guest_word_type,                     vta->do_self_check,                     vta->preamble_function,                     offB_TISTART,                     offB_TILEN );   vexAllocSanityCheck();   if (irbb == NULL) {      /* Access failure. */      vexSetAllocModeTEMP_and_clear();      vex_traceflags = 0;      return VexTransAccessFail;   }   vassert(vta->guest_extents->n_used >= 1 && vta->guest_extents->n_used <= 3);   vassert(vta->guest_extents->base[0] == vta->guest_bytes_addr);   for (i = 0; i < vta->guest_extents->n_used; i++) {      vassert(vta->guest_extents->len[i] < 10000); /* sanity */   }   /* If debugging, show the raw guest bytes for this bb. */   if (0 || (vex_traceflags & VEX_TRACE_FE)) {      if (vta->guest_extents->n_used > 1) {         vex_printf("can't show code due to extents > 1\n");      } else {         /* HACK */         UChar* p = (UChar*)vta->guest_bytes;         UInt   guest_bytes_read = (UInt)vta->guest_extents->len[0];         vex_printf(". 0 %llx %u\n.", vta->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 );   vexAllocSanityCheck();   /* Clean it up, hopefully a lot. */   irbb = do_iropt_BB ( irbb, specHelper, preciseMemExnsFn,                               vta->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");   }   vexAllocSanityCheck();   /* Get the thing instrumented. */   if (vta->instrument1)      irbb = vta->instrument1(vta->callback_opaque,                              irbb, guest_layout,                               vta->guest_extents,                              guest_word_type, host_word_type);   vexAllocSanityCheck();   if (vta->instrument2)      irbb = vta->instrument2(vta->callback_opaque,                              irbb, guest_layout,                              vta->guest_extents,                              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 (vta->instrument1 || vta->instrument2)      sanityCheckIRBB( irbb, "after instrumentation",                       True/*must be flat*/, guest_word_type );   /* Do a post-instrumentation cleanup pass. */   if (vta->instrument1 || vta->instrument2) {      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 );   }   vexAllocSanityCheck();   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.  Build trees -- this      also throws away any dead bindings. */   ado_treebuild_BB( irbb );   vexAllocSanityCheck();   if (vex_traceflags & VEX_TRACE_TREES) {      vex_printf("\n------------------------"                    "  After tree-building "                   "------------------------\n\n");      ppIRBB ( irbb );      vex_printf("\n");   }   /* HACK */   if (0) { *(vta->host_bytes_used) = 0; return VexTransOK; }   /* end HACK */   if (vex_traceflags & VEX_TRACE_VCODE)      vex_printf("\n------------------------"                    " Instruction selection "                   "------------------------\n");   vcode = iselBB ( irbb, vta->arch_host, &vta->archinfo_host );   vexAllocSanityCheck();   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], mode64);         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, mode64 );   vexAllocSanityCheck();   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], mode64);         vex_printf("\n");      }      vex_printf("\n");   }   /* HACK */   if (0) { *(vta->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], mode64);         vex_printf("\n");      }      j = (*emit)( insn_bytes, 32, rcode->arr[i], mode64, vta->dispatch );      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 > vta->host_bytes_size) {         vexSetAllocModeTEMP_and_clear();         vex_traceflags = 0;         return VexTransOutputFull;      }      for (k = 0; k < j; k++) {         vta->host_bytes[out_used] = insn_bytes[k];         out_used++;      }      vassert(out_used <= vta->host_bytes_size);   }   *(vta->host_bytes_used) = out_used;   vexAllocSanityCheck();   vexSetAllocModeTEMP_and_clear();   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_X86_acFlag:        return "Setting %eflags.ac (setting noted but ignored)";     case EmWarn_PPCexns:        return "Unmasking PPC32/64 FP exceptions";     case EmWarn_PPC64_redir_overflow:        return "PPC64 function redirection stack overflow";     case EmWarn_PPC64_redir_underflow:        return "PPC64 function redirection stack underflow";     default:         vpanic("LibVEX_EmWarn_string: unknown warning");   }}/* ------------------ Arch/HwCaps 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";      case VexArchPPC64:    return "PPC64";      default:              return "VexArch???";   }}const HChar* LibVEX_ppVexHwCaps ( VexArch arch, UInt hwcaps ){   HChar* str = show_hwcaps(arch,hwcaps);   return str ? str : "INVALID";}/* Write default settings info *vai. */void LibVEX_default_VexArchInfo ( /*OUT*/VexArchInfo* vai ){   vai->hwcaps             = 0;   vai->ppc_cache_line_szB = 0;}/* Return a string showing the hwcaps in a nice way.  The string will   be NULL for invalid combinations of flags, so these functions also   serve as a way to validate hwcaps values. */static HChar* show_hwcaps_x86 ( UInt hwcaps ) {   /* Monotonic, SSE3 > SSE2 > SSE1 > baseline. */   if (hwcaps == 0)      return "x86-sse0";   if (hwcaps == VEX_HWCAPS_X86_SSE1)      return "x86-sse1";   if (hwcaps == (VEX_HWCAPS_X86_SSE1 | VEX_HWCAPS_X86_SSE2))      return "x86-sse1-sse2";   if (hwcaps == (VEX_HWCAPS_X86_SSE1                   | VEX_HWCAPS_X86_SSE2 | VEX_HWCAPS_X86_SSE3))      return "x86-sse1-sse2-sse3";   return False;}static HChar* show_hwcaps_amd64 ( UInt hwcaps ){   /* Monotonic, SSE3 > baseline. */   if (hwcaps == 0)      return "amd64-sse2";   if (hwcaps == VEX_HWCAPS_AMD64_SSE3)      return "amd64-sse3";   return False;}static HChar* show_hwcaps_ppc32 ( UInt hwcaps ){   /* Monotonic with complications.  Basically V > F > baseline,      but once you have F then you can have FX or GX too. */   const UInt F  = VEX_HWCAPS_PPC32_F;   const UInt V  = VEX_HWCAPS_PPC32_V;   const UInt FX = VEX_HWCAPS_PPC32_FX;   const UInt GX = VEX_HWCAPS_PPC32_GX;         UInt c  = hwcaps;   if (c == 0)           return "ppc32-int";   if (c == F)           return "ppc32-int-flt";   if (c == (F|FX))      return "ppc32-int-flt-FX";   if (c == (F|GX))      return "ppc32-int-flt-GX";   if (c == (F|FX|GX))   return "ppc32-int-flt-FX-GX";   if (c == (F|V))       return "ppc32-int-flt-vmx";   if (c == (F|V|FX))    return "ppc32-int-flt-vmx-FX";   if (c == (F|V|GX))    return "ppc32-int-flt-vmx-GX";   if (c == (F|V|FX|GX)) return "ppc32-int-flt-vmx-FX-GX";   return NULL;}static HChar* show_hwcaps_ppc64 ( UInt hwcaps ){   /* Monotonic with complications.  Basically V > baseline(==F),      but once you have F then you can have FX or GX too. */   const UInt V  = VEX_HWCAPS_PPC64_V;   const UInt FX = VEX_HWCAPS_PPC64_FX;   const UInt GX = VEX_HWCAPS_PPC64_GX;         UInt c  = hwcaps;   if (c == 0)         return "ppc64-int-flt";   if (c == FX)        return "ppc64-int-flt-FX";   if (c == GX)        return "ppc64-int-flt-GX";   if (c == (FX|GX))   return "ppc64-int-flt-FX-GX";   if (c == V)         return "ppc64-int-flt-vmx";   if (c == (V|FX))    return "ppc64-int-flt-vmx-FX";   if (c == (V|GX))    return "ppc64-int-flt-vmx-GX";   if (c == (V|FX|GX)) return "ppc64-int-flt-vmx-FX-GX";   return NULL;}static HChar* show_hwcaps_arm ( UInt hwcaps ){   if (hwcaps == 0) return "arm-baseline";   return NULL;}/* ---- */static HChar* show_hwcaps ( VexArch arch, UInt hwcaps ){   switch (arch) {      case VexArchX86:   return show_hwcaps_x86(hwcaps);      case VexArchAMD64: return show_hwcaps_amd64(hwcaps);      case VexArchPPC32: return show_hwcaps_ppc32(hwcaps);      case VexArchPPC64: return show_hwcaps_ppc64(hwcaps);      case VexArchARM:   return show_hwcaps_arm(hwcaps);      default: return NULL;   }}static Bool are_valid_hwcaps ( VexArch arch, UInt hwcaps ){   return show_hwcaps(arch,hwcaps) != NULL;}/*---------------------------------------------------------------*//*--- end                                     main/vex_main.c ---*//*---------------------------------------------------------------*/

⌨️ 快捷键说明

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