有一种方法可以提取有关调用指令的信息(使用LLVM的CallInst类)。有没有什么方法可以提取一个' if'的元数据?指导呢?像变量名,运算符或文字?
答案 0 :(得分:0)
可以通过编写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