How to place call(s) to functions found in other llvm modules ???

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