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