Intel Pin 3.0无法识别MPX指令?

时间:2016-10-14 16:30:07

标签: intel-pin

我拥有最新版本的Intel Pin 3.0版本76887.

我有一个支持MPX的玩具示例:

#include <stdio.h>
int g[10];
int main(int argc, char **argv) {
  int x = g[11];
  printf("%d\n", x);
  return 0;
}

使用gcc + MPX编译时,我通过objdump在反汇编中看到MPX指令,该示例正确地写了一个边界违规:

Saw a #BR! status 0 at 0x401798

现在,我想计算使用英特尔Pin的特定MPX指令的总数,例如BNDLDXBNDMK

我的第一次尝试是使用随附的工具source/tools/SimpleExamples/trace.cpp。此工具在MPX指令的位置显示NOPs

在我的第二次尝试中,我使用以下代码段编写了自己的工具:

xed_iclass_enum_t iclass = (xed_iclass_enum_t)INS_Opcode(ins);
if (iclass == XED_ICLASS_BNDMK)
    INS_InsertPredicatedCall(ins, IPOINT_BEFORE, (AFUNPTR)countBndmk, IARG_END);

这不起作用,countBndmk永远不会被调用。我用其他指令iclasses仔细检查了我的代码,他们工作了。显然,Pin(或XED?)无法识别MPX指令存在问题。

浏览文档时,我注意到一个有趣的旋钮

KNOB<BOOL> knob_mpx_mode(KNOB_MODE_WRITEONCE,"supported:xed","xed_mpx_mode","0","Enable Intel(R) MPX instruction decoding")

此旋钮似乎启用了MPX解码,默认情况下为0,我不知道如何通过命令行或我的工具启用它。我发现在代码或互联网上没有其他对此问题的引用。

我知道我可以使用Intel SDE转储包括MPX指令的调试跟踪。我想知道是否有办法在Intel Pin中启用MPX。或者唯一的解决方案是自己解码操作码?

1 个答案:

答案 0 :(得分:0)

回答可能有点迟,但似乎你只需将选项传递给PIN。

一点背景知识:

在英特尔手册中有这一行(与MPX无关,但它提供了线索):

Add the knob support_jit_api to the Pin command line as Pin tool option:
    <Pin executable> <pin options> -t <Pin tool> -support_jit_api <Other Pin tool options> -- <Test application> <Test application options>

此选项发生there's an existing KNOB

KNOB<BOOL> LEVEL_PINCLIENT::KnobJitApi  (   KNOB_MODE_WRITEONCE     ,
"pintool:sym"   ,
"support_jit_api"   ,
"0"     ,
"Enables the Jitted Functions Support"  
)

由于MPX旋钮定义为:

KNOB<BOOL> knob_mpx_mode(KNOB_MODE_WRITEONCE,"supported:xed","xed_mpx_mode","0","Enable Intel(R) MPX instruction decoding")

我猜您只需要将选项传递给PIN:

<Pin executable> <pin options> -t <Pin tool> -xed_mpx_mode <Other Pin tool options> -- <Test application> <Test application options>

似乎这些KNOB硬编码到PIN / PinTools上。