我正在用 OCaml 编写一个编译器,可以编译为 LLVM IR。目前的程序很简单:
num main() {
return 0;
}
当我使用编译器运行它时,我得到以下 LLVM IR 代码:
; ModuleID = 'PixMix'
source_filename = "PixMix"
@fmt = private unnamed_addr constant [4 x i8] c"%d\0A\00"
@fmt.1 = private unnamed_addr constant [4 x i8] c"%s\0A\00"
declare i32 @printf(i8*, ...)
define double @main() {
entry:
ret double 0.000000e+00
}
但是,如果我将其传递给 lli
,我会被告知返回类型无效。查看该代码,main
被定义为 double
并且它返回一个 double
,那么为什么 lli
告诉我们我认为返回类型搞砸了?
最佳答案
问题是入口点函数(默认情况下是main
,但名称可以由-entry-function
标志控制)预计具有一定的签名,类似于 C 或 C++ 中的 main
。特别是,它应该返回 void
或整数类型。您可以阅读the implementation of the check以确保您生成的 IR 满足它。
关于LLVM 提供的 main() 返回类型无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47601603/