[LLVMdev] Calling functions across modules. And those pesky vectors!

Danny llvm at pixelperplexity.net
Thu Jan 3 18:14:55 PST 2008


Before I get started with more questions, thanks for the prompt reply on 
my last set question, that was much appreciated.

First, I found references to lazy inling and optimizations for calling 
functions across modules, but I can't figure out how to do that. If I 
just take a Function* that I got out of one module and call it from the 
other, it doesn't work. What's the general method for dealing with 
interactions between modules? Up until this point, everything I've done 
has been within one module.


Second, I was under the impression that vector types were fairly well, 
but I can't seem to get a simple function which takes in and returns 
vectors to work properly. And I don't understand the error. I made a 
simple function which was just supposed to multiply two 3 component 
float vectors and return the result:

//Snip on:
    VectorType *vType = VectorType::get(Type::FloatTy, 3);
   
    std::vector<const Type*> Vectors(2, vType);
    FunctionType *mul_type     = FunctionType::get(vType, Vectors, false);
    Function* mul              = new Function(mul_type, 
Function::ExternalLinkage, "mul", mod);
    mul->setCallingConv(CallingConv::C);
   
    Function::arg_iterator args = mul->arg_begin();
    Value* x = args++;
    x->setName("x");

When I run getPointerToFunction I get an abort trap with the message:
Return operand #1 has unhandled type f32

When I print out the LLVM IR that was produced I get this:
; ModuleID = 'test'

define <3 x float> @mul(<3 x float> %x, <3 x float> %y) {
entry:
        %result = mul <3 x float> %x, %y                ; <<3 x float>> 
[#uses=1]
        ret <3 x float> %result
}

Which seems pretty reasonable to me.

Can anyone help me understand what's going on?

Thanks a lot!
-danny



More information about the llvm-dev mailing list