【问题标题】:LLVM Insert function call defined from another file从另一个文件定义的 LLVM 插入函数调用
【发布时间】:2014-06-20 16:10:10
【问题描述】:

我想在某个指令之前插入一个函数,但函数调用是在另一个文件中定义的。我试过了

IRBuilder<> Builder(pi);
CallInst *callOne = Builder.CreateCall(func_ins, "foo");

其中func_insfunc*(or Value* to be more general)foo 是分配的调用函数的变量名前缀。 由于这个函数是在另一个文件中定义的,我不知道指针 func_ins 应该指向哪里,所以我只是将它设置为 NULL 但它不起作用。

谁能给我一些关于如何解决这个问题的提示?

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

【问题讨论】:

    标签: llvm llvm-ir


    【解决方案1】:

    你只能从同一个Module调用一个函数,你不能使用NULL作为被调用者。

    如果函数是在另一个模块中定义的,您需要先在要调用的模块中声明它,然后使用声明进行调用。

    要声明它,请在新模块中创建一个相同的函数(通过Function::Create),但不要为其分配主体。

    【讨论】:

    • 谢谢,这是我正在使用的示例代码的一部分,我假设 Int1 代表 bool.FunctionType *FT = FunctionType::get(Type::getInt1Ty(getGlobalContext()), false); Value* func_ins = Function::Create(FT, Function::ExternalLinkage, "ExternalFunc", Mod); 剩余的构建器部分与问题中的相同
    • 能否请您给我一些关于如何传递函数参数的提示?通过FunctionType::get 方法,有一个名为ArrayRef&lt;Type *&gt; 的参数,我猜它是用来传递参数的。如果我想向其中传递三个参数(比如 intfloat*user defined struct*)该怎么办?
    • @MinGao 看看ArrayRef's constructors,有多种创建方法——包括从数组和std::vector
    猜你喜欢
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    相关资源
    最近更新 更多