调用函数LLVM的参数

时间:2019-01-08 01:34:00

标签: compiler-construction llvm llvm-ir llvm-c++-api

我正在研究玩具语言。我想创建一个将函数作为参数的函数,稍后可以调用它。在LLVM IR中,它看起来像这样:

define i8 @foo(i8 ()* %f) {
entry:
  %0 = call i8 %f()
  ret i8 %0
}

当我尝试使用c ++ API重新创建它时,遇到了一些问题。我创建了一个函数类型指针类型i8 () *,并将其设置为函数类型的参数。稍后,当我尝试通过func->args()调用函数的参数之一时,出现错误:

Assertion failed: (isa<X>(Val) && "cast<Ty>() argument of incompatible type!"), function cast

此错误指的是什么?我应该如何实施呢?

编辑

打印(funcPtr->print(errs()))时函数指针如下所示

i8 ()* %f

加载指针时没有出现错误,但是,当我尝试打印指针时,出现了错误的访问异常。

代码

    auto* funcPtr = namedArgs[name]; // get the function pointer from arguments

    funcPtr->print(errs()); // => `i8 ()* %f`

    func = (Function *)mBuilder.CreateLoad(funcPtr); // no errors

    func->print(errs()); // => Exception: EXC_BAD_ACCESS (code=EXC_I386_GPFLT)

此外,这是我的代码在未调用时输出的最终函数:

define 18 @callme(i8 ()* %f) {
entry:
  ret 18 0
}

0 个答案:

没有答案