[LLVMdev] Vectors and function calls across modules

Danny llvm at pixelperplexity.net
Thu Jan 3 18:30:59 PST 2008


Hey all, thanks for your prompt replies from before, now I have more 
questions!

First, I've heard rumors about the ability to call functions across 
modules. I'm interested in learning how, but I haven't been able to 
figure it out yet. I tried just taking a Function* that I got from one 
module and calling it from another one, but that didn't work. How do I 
do that?

Second, I'm interested in using vectors of floats within llvm, but my 
first stab at it proved unsuccessful. Here's what I tried: a simple 
function which takes in 2 vectors, multiplies them, and returns the 
result. Here's the relevant code for making the function ("mul"):


//Code snip start
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");
Value* y = args++;
y->setName("y");

BasicBlock* block = new BasicBlock("entry", mul);
Value* tmp  = BinaryOperator::create(Instruction::Mul, x, y, "result", 
block);
new ReturnInst(tmp, block);
//code snip end

When I try to get a pointer to this function through 
llvm::JIT::getPointerToFunction(), I hit an abort trap which tells me 
"Return operand #1 has unhandled type f32".

When I print out the IR, I get what I'd expect:
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
}

Any ideas on what I'm doing wrong here?

Thanks for all the help,
danny



More information about the llvm-dev mailing list