让x
成为运行时程序中全局变量g
的地址。 LLVM IR生成存储指令,如下所示:
store i32 30, i32* @g, align 4
我正在编写一个LLVM传递,它将检测程序,以便在运行时将x
传递给检测函数func(int addr)
。我可以成功使用func
向IRBuilder
插入电话。我无法做的是插入工具来收集x
。
if (StoreInst *store_inst = dyn_cast<StoreInst>(&I)) {
Value* po = store_inst->getPointerOperand();
if(isa<GlobalVariable>(po)) {
errs() << "store [pointer]: " << *po << '\n';
Constant *instrument_func = F.getParent()->getOrInsertFunction("func", Type::getVoidTy(Ctx), Type::getInt32Ty(Ctx), NULL);
IRBuilder<> builder(&I);
builder.SetInsertPoint(&B, ++builder.GetInsertPoint());
Value* args[] = {po};
builder.CreateCall(instrument_func, args);
}
}
运行opt
的结果是:
Call parameter type does not match function signature!
i32* @a
i32 call void bitcast (void (i64)* @func to void (i32)*)(i32* @a)
LLVM ERROR: Broken function found, compilation aborted!
答案 0 :(得分:0)
您可以传递不同类型或不同大小的参数。
我不太确定但是试试这个:
if (StoreInst *store_inst = dyn_cast<StoreInst>(&I)) {
Value* po = store_inst->getPointerOperand();
if(isa<GlobalVariable>(po)) {
errs() << "store [pointer]: " << *po << '\n';
Constant *instrument_func = F.getParent()->getOrInsertFunction("func", Type::getVoidTy(Ctx), Type::getInt32Ty(Ctx), NULL);
IRBuilder<> builder(&I);
builder.SetInsertPoint(&B, ++builder.GetInsertPoint());
std::vector<Value *> args;
args.push_back(po);
builder.CreateCall(instrument_func, args);
}
}