函数 LLVM 的前向声明
Forward declaration of function LLVM
我正在尝试在 LLVM 中使用函数的前向声明,但我做不到...这样做的原因是这个错误:
error: invalid forward reference to function 'f' with wrong type! "
现在我正在尝试使用以下代码来实现:
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
它并开始插入函数指令
好的,LLVM 似乎做到了 'automatically'。
我刚刚意识到当我再次 运行 代码时函数改变了它们的顺序。因此,如果您之前创建了一个函数,即使您没有插入任何代码(主体),它也会创建原型并等待对主体的任何进一步声明,只要您使用 getOrInsert()
引用此函数模块 class 的方法。
我不知道这个答案是否正确或者是否清楚,但它解决了我的问题...
我正在尝试在 LLVM 中使用函数的前向声明,但我做不到...这样做的原因是这个错误:
error: invalid forward reference to function 'f' with wrong type! "
现在我正在尝试使用以下代码来实现:
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
它并开始插入函数指令
好的,LLVM 似乎做到了 'automatically'。
我刚刚意识到当我再次 运行 代码时函数改变了它们的顺序。因此,如果您之前创建了一个函数,即使您没有插入任何代码(主体),它也会创建原型并等待对主体的任何进一步声明,只要您使用 getOrInsert()
引用此函数模块 class 的方法。
我不知道这个答案是否正确或者是否清楚,但它解决了我的问题...