我正在研究玩具语言。我想创建一个将函数作为参数的函数,稍后可以调用它。在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
}