在LLVM中加载结构的正确方法

时间:2016-09-07 03:07:04

标签: llvm

我一直在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似乎是我的一项工作。但是如果有的话,我想知道一个合适的解决方案。

0 个答案:

没有答案