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