我正在尝试使用LLVM来为我的代码添加即时编译,但发现很难找到关于如何在LLVM中执行我想要的事情的参考,尽管已经通过Kaleidoscope教程检查了语言参考手册,程序员手册和doxygen文档.是否有更多对LLVM的C++ API的引用?
现在提出具体问题.我已经分配了一个带有两个元素的数组对象(我假设它对应double[2]于C++):
const llvm::Type* double_t = llvm::Type::getDoubleTy(llvm::getGlobalContext());
const llvm::Type* array_t = llvm::ArrayType::get(double_t,2)
Run Code Online (Sandbox Code Playgroud)
稍后在代码中,我创建了一个函数,其中此数组是参数之一.然后,在我的函数中,我提取数组中的第一个元素并将其返回给用户:
llvm::Function::arg_iterator AI = jit_function_->arg_begin();
llvm::Value *x = AI;
llvm::Value *x0 = Builder.CreateExtractValue(x,0);
Builder.CreateRet(x0);
Run Code Online (Sandbox Code Playgroud)
代码很好,但是当我尝试运行它时,它不起作用.例如:
typedef double (*GenType)(double[2]);
GenType FP = GenType(intptr_t(TheExecutionEngine->getPointerToFunction(jit_function_)));
double y[2] = {10,20};
double r = FP(y);
printf("r = %g\n", r);
Run Code Online (Sandbox Code Playgroud)
返回值只是废话,我看不出我做错了什么.如果我将数组(10和20)中的值作为函数的标量参数传递,它可以正常工作.
llvm ×1