LLVM IR主函数返回void

6

我正在测试一个简单的返回void类型的主函数,但是在使用lli运行位码时出现了核心转储错误(信号65或73):

define void @main() {
entry:
  ret void
}

这是lli的限制还是LLVM的违规操作?

我很清楚,在C++中,返回类型为void的main函数声明是不正确的。事实上,我已经尝试过使用Clang(只是一个警告)并获得了几乎相同的代码(不完全相同,因为有#0属性,但足够接近,我相信差异不会导致这个问题):

; Function Attrs: nounwind
define void @main() #0 {
entry:
  ret void
}
1个回答

5

我没有遇到崩溃的情况,所以罪魁祸首必定是其他原因:

$ echo "define void @main() {entry: ret void}" | lli -
$

无论如何,lli支持void main方法,正如您在ExecutionEngine::runFunctionAsMain()中看到的那样。


谢谢。我已经像你一样直接使用lli进行了测试(而不是llvm-as然后lli),但它仍然会随机崩溃。顺便说一下,我在Windows 7上。 - elmattic
@Stringer,你成功地在任何东西上运行过lli吗?例如,clang生成的IR文件?如果没有,那么可能涉及到更基本的问题-尝试提出一个新问题,详细说明错误和构建过程。为了验证它不是这个void的问题,您还可以将主方法更改为返回一些int并查看其是否表现相同。 - Oak
是的,我正在开发一种玩具语言,可以转换为LLVM IR。到目前为止,一切都很顺利,因为我的所有单元测试(68个)始终从主函数返回i32或i1。构建过程非常简单:先使用llvm-as,然后使用lli(我不知道lli可以直接接受IR字符串)。 - elmattic
你的lli版本是什么,运行在哪个操作系统上?谢谢。我会接受你的答案,因为现在我知道有一个返回void的main函数是合法的,我会尝试在Debug模式下重新构建lli看看会发生什么。 - elmattic
@Stringer 我的 lli 版本是 3.4.2,大约一年前发布的。但是我提供的代码链接是最新版本的。 - Oak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接