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 でコンパイルすると、逆アセンブリで MPX 命令が表示されobjdump
、例では境界違反が正しく書き込まれます。
Saw a #BR! status 0 at 0x401798
ここで、Intel Pin を使用して特定の MPX 命令の総数を数えたいと思いBNDLDX
ますBNDMK
。
私の最初の試みは、付属のツールを使用することでしたsource/tools/SimpleExamples/trace.cpp
。このツールはNOPs
、MPX 命令の場所を示してくれました。
2 回目の試行では、次のスニペットを使用して独自のツールを作成しました。
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
しているようで、デフォルトで有効になっています。コマンドラインまたはツールで有効にする方法がわかりません。コードまたはインターネットでこの問題に関する他の参照は見つかりませんでした。
インテル SDE を使用して、MPX 命令を含むデバッグ トレースをダンプできることはわかっています。Intel Pin で MPX を有効にする方法はあるのだろうか。それとも、オペコードを自分でデコードするしか解決策はありませんか?