【问题标题】:LLVM IR main function returning voidLLVM IR 主函数返回 void
【发布时间】:2015-08-27 21:05:57
【问题描述】:

我正在测试一个只返回 void 并且在使用lli 运行位码时出现核心转储错误(信号 65 或 73)的主函数:

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

这是 lli 的限制还是在 LLVM 中完全非法?

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

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

【问题讨论】:

    标签: llvm void


    【解决方案1】:

    对我来说它不会崩溃,所以罪魁祸首一定是别的东西:

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

    无论如何,lli 都支持 void main 方法,如您在ExecutionEngine::runFunctionAsMain() 中所见。

    【讨论】:

    • 谢谢。我已经像你一样直接用 lli 进行了测试(而不是 llvm-as then lli),但它仍然随机崩溃。顺便说一句,我在 Window 7 上。
    • @Stringer 你有没有成功地在任何东西上运行 lli?例如一个clang生成的IR文件?如果还没有,那么肯定涉及到一个更基本的问题 - 尝试提出一个新问题,详细说明错误和您的构建过程。要验证它不是 void 的东西,您也可以更改您的 main 方法以返回一些 int 并查看它的行为是否相同。
    • 是的,我正在研究一种可转换为 LLVM IR 的玩具语言。到目前为止一切顺利,因为我所有的单元测试 (68) 总是从 main 返回 i32 或 i1。构建过程很简单:llvm-as then lli(我不知道lli可以直接取IR字符串)。
    • 您的 lli 版本是什么,您在哪个操作系统上?谢谢。我会接受你的回答,因为现在我知道主返回 void 是合法的,我会尝试在 Debug 中重建 lli 看看会发生什么。
    • @Stringer 我的 lli 来自 3.4.2 版,大约一岁。不过,我提供的代码链接是最新版本。
    猜你喜欢
    • 2015-01-12
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    相关资源
    最近更新 更多