renno
renno

Reputation: 2827

Forward declaration of function LLVM

I'm trying to use forward declaration of functions in LLVM, but I'm not able to do it... The reason for doing that is this error:

error: invalid forward reference to function 'f' with wrong type! "

Right now I'm trying to do it with this code:

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);

But it does not show in the IR when I generate the code. When I create the function again using this same code shown above, it works. I wonder if it's because I insert a BasicBlock right after when I start insert things within the function.

Right now that's how it is my IR

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

I believe that putting an declare %struct.f @f(i32*) before the @main function would fix this issue, but I can't figure out how to do it...

Summary: I just want to create something with a declare on top of the file, so I can use the define it later and start inserting instructions of the function

Upvotes: 1

Views: 2566

Answers (1)

renno
renno

Reputation: 2827

Ok, it seems LLVM does that 'automatically'.

I just realized that the functions changed their orders when I ran the code again. So, if you create a function before even though you don't insert any code (body), it will create the prototype and wait for any further declarations to the body, as long as you reference this function with the getOrInsert() method of the Module class.

I don't know if this is the right answer or if it's clear, but it solved my problem...

Upvotes: 1

Related Questions