LLVM:在另一个文件中定义的函数调用的插入

6
我希望在某个指令之前插入一个函数,但该函数调用是在另一个文件中定义的。我尝试了:
IRBuilder<> Builder(pi);
CallInst *callOne = Builder.CreateCall(func_ins, "foo");

其中func_insFunction*(或者更一般的Value*),而foo是调用函数的变量名前缀。

由于这个函数是在另一个文件中定义的,我不知道指针func_ins应该指向哪里,所以我把它设置为NULL,但是没有起作用。

有人能给我一些提示,如何解决这个问题吗?

还有一个问题是,我是否可以使用WriteBitcodeToFile将具有外部函数调用的插装代码转储到文件中,因为我想知道在执行模块检查时,它是否会报告Referencing function in another moduleBroken Module

1个回答

10
您只能从相同的 模块(Module) 中调用函数,并且不可以使用 NULL 作为被调用方。
如果该函数在另一个模块中定义,您需要先在要进行调用的模块中 声明 它,然后使用该声明进行调用。
要声明它,请在新模块中创建一个相同的函数(通过Function::Create),并且不要为其分配主体。

谢谢,这是我正在使用的示例代码的一部分,我假设Int1代表bool。FunctionType *FT = FunctionType::get(Type::getInt1Ty(getGlobalContext()), false); Value* func_ins = Function::Create(FT, Function::ExternalLinkage, "ExternalFunc", Mod); 剩余的构建器部分与问题中相同。 - Min Gao
请问您能否给我一些有关如何传递函数参数的提示呢?通过FunctionType::get方法,有一个名为ArrayRef<Type *>的参数,我猜测它是用于传递参数的。如果我想要传递三个参数(比如intfloat用户自定义结构体),我该怎么做呢? - Min Gao
@MinGao,你可以查看一下ArrayRef的构造函数,有多种创建方式,包括从数组和std::vector中创建。 - Oak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接