创建一个外部函数的callinst

时间:2015-08-22 13:23:19

标签: llvm llvm-ir llvm-c++-api

我正在进行仪器测试。该传递应该以specefic方式修改给定的IR。其中一项必要的修改是在特定位置插入对函数的调用。 这是被调用函数的签名:

void myclass::foo(Function *f, BasicBlock* b)

此函数的原型位于 include / llvm 中的foofile.h文件中 函数定义位于 MCJIT 文件夹中的foofile.cpp文件中。 并在此文件夹中运行make工作正常,foofile.cpp编译为MCJIT.cpp,同一文件中的另一个函数正常工作正常。 没有回到仪器通行证。如何在给定的IR中将callinst插入foo函数? 以下是插入呼叫的片段:

Type* retTy = Type::getInt32Ty(C);
FunctionType* FuncTy = FunctionType::get(retTy, false);
PointerType* PtrToFuncTy = PointerType::get(FuncTy, 0);
Constant *fun = M->getOrInsertFunction("foo", Type::getVoidTy(C), PtrToFuncTy, Type::getLabelTy(C), nullptr);
Function *dofoo = cast<Function>(fun);
Instruction* dofooCall = CallInst::Create(fun, Args2, "", bb);

注意: Args2是一个arraylist,包含2个指向函数和基本块的值指针,bb是插入调用的基本块。

当我在给定的IR上使用op运行传递时,它会像这样正确地生成声明和调用:

声明:

declare void @foo(i32 ()*, label)

拨打:

call void @foo(i32 ()* @main, label %for.cond)

但是当我尝试使用lli运行生成的.ll文件时,一切都爆炸了!这是stacktrace之前的前两行:

Can't get register for value!
UNREACHABLE executed at /home/marwayusuf/llvm-env/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp:1158!
我总结说问题是找不到foo函数。如果这是问题,我该如何正确创建callinst?

1 个答案:

答案 0 :(得分:0)

如果函数是类myclass的成员,它将使用this-pointer作为第一个参数。 C ++方法名称也有名称修改,所以它不使用符号“foo”。当使用mcjit时它会降低你的IR到机器代码,它实际上并没有执行IR,所以在运行时你没有传递llvm :: Function或llvm :: BasicBlock所以即使你把它调成它也不会有效那。