0
コール命令(LLVMのCallInstクラスを使用)に関する情報を抽出する方法があります。 'if'命令のメタデータも抽出できる方法はありますか?変数名、演算子、またはリテラルのように?LLVM IRから 'if'ステートメントから条件を抽出できますか?
コール命令(LLVMのCallInstクラスを使用)に関する情報を抽出する方法があります。 'if'命令のメタデータも抽出できる方法はありますか?変数名、演算子、またはリテラルのように?LLVM IRから 'if'ステートメントから条件を抽出できますか?
このような操作は、LLVM Passを記述することによって実行できます。基本的には、処理中に命令を代行できるrunOnFunction()
を実装する必要があります。次のパスは、分岐命令から比較述語を読み込みます。
namespace {
struct PredicateNamePass: public FunctionPass {
static char ID; // Pass identification, replacement for typeid
PredicateNamePass() : FunctionPass(ID) {}
bool runOnFunction(Function &F) override {
for (Instruction& I : inst_range(F)) {
if (I.isTerminator()) {
if (strcmp(I.getOperand(0)->getName().str().c_str(), "cmp") == 0)
if (CmpInst *cp = dyn_cast<CmpInst>(I.getPrevNode()))
errs() << cp->getPredicate() << '\n';
}
}
return false;
}
};
}
プログラム例:
int main(int argc, char* argv[]) {
int a = 10;
if(argc == 3)
a = 11;
else
a++;
return 0;
}
コマンド:
> opt -load ../build.llvm/lib/LLVMPredicateNamePass.so \
-PredicateNamePass <example.bc> /dev/null
出力:
> 32
私は 'if'命令で接続されているすべてのメタデータが欲しいです。メタデータは印刷されません。私のコード: 'if(ICmpInst * iCmpInst = dyn_cast(&* i)){ \t errs()<< iCmpInst-> getOpcodeName()<< '\ t'; \t errs()<< iCmpInst-> getPredicate()<< '\ t'; \t SmallVector 、8> MDs; \t iCmpInst-> getAllMetadata(MDs); \t SmallVector 名前; F.getContext()。getMDKindNames(Names); \t errs(errs(0)): for(SmallVector 、8> :: iterator II = MDs.begin()、EE = MDs.end(); II!= EE; ()<< "name:" << Names[II-> first "<<" \ n "; } } ' –
@DhritiKhanna:clangで-gフラグを使ってコンパイルを試しましたか? – ConsistentProgrammer
私はちょうど今試しました。この警告は '警告:file.bcの無効なバージョン(1)でデバッグ情報を無視し、何も表示しません。 –