【问题标题】:Calling conventions in LLVM IRLLVM IR 中的调用约定
【发布时间】:2018-02-08 09:05:02
【问题描述】:

LLVM 允许 call 指令和 defines 指定调用约定。 IR 本身是否已经需要遵守指定的约定?例如,当使用ccc 时,我相信返回值需要适合我的操作系统/架构上的 64 位 eax。我是否可以编写返回结构为 3 i32 的 LLVM IR 代码? LLVM 是否将其转换为符合 C 调用约定的内容?我可以在不更改任何其他代码的情况下更改调用约定吗?

当我查看使用 -emit-llvm 编译 C 文件的输出时,IR 生成器已经应用了调用约定,并将在调用站点进行分配,并将返回值转换为指针参数。在现阶段这绝对必要吗? LLVM 如何处理下一阶段使用哪个调用约定的信息-emit-obj

【问题讨论】:

    标签: llvm llvm-ir


    【解决方案1】:

    不幸的是,这里混杂了很多东西。调用约定通常根据源语言定义。在转换为 LLVM IR 时,许多必要的细节已经丢失。因此,为了保留 ABI 和调用约定,前端应该正确布置参数/返回值,以便在 LLVM 级别正确编码。

    所以,长话短说:调用约定同时包含高级(源语言)和低级要求。前者由前端处理,后者由后端处理。您可以更改 LLVM IR,但您需要确保生成的代码确实与您的 C 代码兼容。在某些平台上,这可能很复杂。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-11
      • 1970-01-01
      • 1970-01-01
      • 2014-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多