如何解决LLVM错误:MCJIT :: runFunction不支持全功能参数传递
我从here得到了一个例子,但遇到运行错误
LLVM错误:目标不支持MC发射!
由this修复的。
尽管如此,我仍然观察到运行时问题:
./example 3 5
LLVM错误:MCJIT :: runFunction不支持全功能参数传递。请使用ExecutionEngine :: getFunctionAddress并将结果强制转换为所需的函数指针类型。
main.cpp
/**
* LLVM equivalent of:
*
* int sum(int a,int b) {
* return a + b;
* }
*/
#include <llvm-c/Core.h>
#include <llvm-c/ExecutionEngine.h>
#include <llvm-c/Target.h>
#include <llvm-c/Analysis.h>
#include <llvm-c/BitWriter.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char const *argv[]) {
LLVMModuleRef mod = LLVMModuleCreateWithName("my_module");
LLVMTypeRef param_types[] = { LLVMInt32Type(),LLVMInt32Type() };
LLVMTypeRef ret_type = LLVMFunctionType(LLVMInt32Type(),param_types,2,0);
LLVMValueRef sum = LLVMAddFunction(mod,"sum",ret_type);
LLVMBasicBlockRef entry = LLVMAppendBasicBlock(sum,"entry");
LLVMBuilderRef builder = LLVMCreateBuilder();
LLVMPositionBuilderAtEnd(builder,entry);
LLVMValueRef tmp = LLVMBuildAdd(builder,LLVMGetParam(sum,0),1),"tmp");
LLVMBuildRet(builder,tmp);
char *error = NULL;
LLVMVerifyModule(mod,LLVMAbortProcessAction,&error);
LLVMDisposeMessage(error);
LLVMExecutionEngineRef engine;
error = NULL;
LLVMLinkInMCJIT();
LLVMInitializeNativeTarget();
LLVMInitializeNativeAsmPrinter(); // added
LLVMInitializeNativeAsmParser(); // added
if (LLVMCreateExecutionEngineForModule(&engine,mod,&error) != 0)
{
fprintf(stderr,"failed to create execution engine\n");
abort();
}
if (error)
{
fprintf(stderr,"error: %s\n",error);
LLVMDisposeMessage(error);
exit(EXIT_FAILURE);
}
if (argc < 3)
{
fprintf(stderr,"usage: %s x y\n",argv[0]);
exit(EXIT_FAILURE);
}
long long x = strtoll(argv[1],NULL,10);
long long y = strtoll(argv[2],10);
LLVMGenericValueRef args[] = {
LLVMCreateGenericValueOfInt(LLVMInt32Type(),x,LLVMCreateGenericValueOfInt(LLVMInt32Type(),y,0)
};
LLVMGenericValueRef res = LLVMRunFunction(engine,sum,args);
printf("%d\n",(int)LLVMGenericValueToInt(res,0));
// Write out bitcode to file
if (LLVMWriteBitcodeToFile(mod,"sum.bc") != 0) {
fprintf(stderr,"error writing bitcode to file,skipping\n");
}
LLVMDisposeBuilder(builder);
LLVMDisposeExecutionEngine(engine);
}
尽管对于代码作者而言,消息很清楚,但对于用户而言,它是如此神秘。我该如何解决?
解决方法
摘自MCJIT::runFunction
的文档:
对于MCJIT执行引擎,鼓励客户端使用“ GetFunctionAddress”方法(而不是runFunction),并将返回的uint64_t强制转换为所需的函数指针类型。但是,为了向后兼容,MCJIT的实现可以执行“类似于主函数”的功能(即那些返回void或int且不带参数或(int,char * [])的函数)。
因此,除非参数数组为空或仅由MCJIT::runFunction
组成,否则您将无法调用LLVMRunFunction
(以及与MCJIT引擎一起使用时扩展的C API的i32
)。和i8*
(按此顺序)。您的数组包含两个i32
,因此不满足这些限制。
如文档(和异常消息)中所述,您应该改用ExecutionEngine::getFunctionAddress
(或其C包装器LLVMGetFunctionAddress
),将结果转换为int (*)(int,int)
,然后将其称为f(0,0);
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。