正向声明LLVM的功能

时间:2016-04-09 21:14:59

标签: llvm llvm-clang llvm-ir

我试图在LLVM中使用函数的前向声明,但我无法做到......这样做的原因是这个错误:

  

错误:对函数&f;#f;错误的类型! "

现在我正尝试使用此代码:

std::vector<Type *> args_type = f->get_args_type();
Module* mod = get_module();
std::string struct_name("struct.");
struct_name.append(f->get_name());
Type* StructTy = mod->getTypeByName(struct_name);
if (!StructTy)  {
    StructTy = Type::getVoidTy(getGlobalContext());
}
FunctionType *ftype = FunctionType::get(StructTy, args_type, false);
//Function *func = Function::Create(ftype, GlobalValue::InternalLinkage, f->get_name(),  get_module());
Constant* c = mod->getOrInsertFunction(f->get_name(), ftype);
Function *func = cast<Function>(c);

但是当我生成代码时它没有显示在IR中。当我使用上面显示的相同代码再次创建函数时,它可以工作。我想知道是不是因为我在开始在函数中插入内容后立即插入BasicBlock。

现在,这是我的IR

define internal void @main() {
entry:
    ...
}
define internal %struct.f @f(i32* %x) {
entry:
    ... 
}

我相信在@main函数之前添加declare %struct.f @f(i32*)可以解决这个问题,但我无法弄清楚如何做到这一点......

总结:我只想在文件顶部创建一个declare的内容,以便稍后使用define并开始插入函数的说明

1 个答案:

答案 0 :(得分:1)

好吧,似乎LLVM会自动执行此操作&#39;。

我刚刚意识到,当我再次运行代码时,这些功能改变了他们的命令。因此,如果您之前创建了一个函数,即使您没有插入任何代码(正文),它也会创建原型并等待身体的任何进一步声明,只要您使用{{1引用此函数Module类的方法。

我不知道这是否是正确的答案,或者它是否清楚,但它解决了我的问题......