我一直在LLVM中尝试使用MCJIT,并且在尝试加载结构类型时遇到了问题。
我试图加载的相关结构可以在这里看到:
std::list
生成的LLVM代码如下所示。
typedef struct {
float x;
float y;
} cfloat;
相关结构和功能:
--LLVM IR--
; ModuleID = 'Test_Module'
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
%cfloat = type { float, float }
declare float @cabs(%cfloat)
declare float @cabsptr(%cfloat*)
define i32 @test(i32 %argc, i8** %args) {
entry:
%argloc0 = getelementptr i8*, i8** %args, i64 0
%argloc1 = getelementptr i8*, i8** %args, i64 1
%arg0 = load i8*, i8** %argloc0
%iptr = bitcast i8* %arg0 to %cfloat*
%arg1 = load i8*, i8** %argloc1
%optr = bitcast i8* %arg1 to float*
%ival = load %cfloat, %cfloat* %iptr
%oval = call float @cabs(%cfloat %ival)
%oval2 = call float @cabsptr(%cfloat* %iptr)
store float %oval, float* %optr
ret i32 %argc
}
当我将extern "C" float cabs(cfloat val)
{
printf("%f, %f\n", val.x, val.y);
return sqrtf(val.x * val.x + val.y * val.y);
}
extern "C" float cabsptr(cfloat *val)
{
printf("%f, %f\n", val->x, val->y);
return sqrtf(val->x * val->x + val->y * val->y);
}
传递给函数
cfloat val = {300, -400};
打印cabs
。300.0000, 0.0000
打印cabsptr
。我希望这两个函数都能打印输入值。
这是我遇到的错误还是在生成LLVM功能时我错过了什么?
可以在此处看到重现此问题的完整源代码: https://gist.github.com/pavanky/4439f1a6c2ca182058c19187aa8215a7
修改
将我的自定义类型定义为300.0000, -400.0000
VectorType
似乎是我的一项工作。但是如果有的话,我想知道一个合适的解决方案。