Hello Everyone,
I am trying to create two modules in LLVM, where first module contains the definition of a function, gcd in this example and another module contains a call to this function. My example is based on the following tutorial, with a few changes.
When I execute the verifier pass on my modules, it complains that the 'GCDMain' module is malformed and aborts when I try to write this module as a bitcode file.
Here is the output of my example.
You can't reference a global in one module in another module. Either
stick with one module, or add a declaration of the function in the
second module and call that.
-Eli
Hi,
I tried this as well, using the following line to add function declaration to the caller module.
Function::Create(FT, Function::ExternalLinkage, "gcd", mod);
Where "FT" is the same as before. And the output produced by the PrintModulePass becomes:
; ModuleID = 'GCDMain'
declare i32 @gcd(i32, i32)
define i32 @main() {
EntryBlock:
%tmp = call i32 @gcd(i32 30, i32 50)
ret i32 %tmp
}
But it still fails to WriteBitcodeToFile, and produces the same error as before.
I guess I might be missing some attribute, like "extern" in C ...
Any Comments?
Thanks again for your help,
Hamayun
If you're still getting the "Referencing function in another module"
error, the call isn't referring to a declaration in the same module.
-Eli
Hi Eli,
Yes, you were right. I was doing something like this ... (which doesn't work :()
Function* gcd = inMod.getFunction("gcd"); // Get gcd function from the input module
...
Function *F_GCD = Function::Create(FT, Function::ExternalLinkage, "gcd", mod); // Add a prototype of the gcd function
...
Value *gcd_val = builder.CreateCall(gcd, args.begin(), args.end(), "tmp"); // Add a call to the gcd function.
In fact we don't need to getFunction from the other module.
Just adding a prototype and calling this prototype is sufficient.
Like this ... (this works :))
Function *F_GCD = Function::Create(FT, Function::ExternalLinkage, "gcd", mod); // Add a prototype of the gcd function
...
Value *gcd_val = builder.CreateCall(F_GCD, args.begin(), args.end(), "tmp"); // Add a call to the gcd function.
Thanks for you help,
Have a Nice Day !!!
Hamayun