19

我正在研究 LLVM 系统,并且已经阅读了入门文档。但是,一些命名法(以及 clang 示例中的措辞)仍然有些混乱。以下术语和命令都是编译过程的一部分,我想知道是否有人可以为我更好地解释它们:

  • clang -Svs. clang -c(我知道是什么-c,但结果有何不同?)* (编辑)
  • LLVM Bitcode 与 LLVM IR(有什么区别?)
  • .ll 文件与 .bc 文件(它们是什么,它们有何不同?)
  • LLVM 汇编代码本机汇编代码(有区别吗?)

在更高的层次上,我了解整个编译过程,并且可以很好地跟踪我的方式,我只是卡在某些点上,例如,我希望看到“IR”,但看到的是“bitcode”或 LLVM 程序集”,这让我认为我几乎没有像我应该的那样理解它们!

4

1 回答 1

30

Clang 用法

通常,Clang 接受与 GCC 相同的命令行选项。选项(仅编译和汇编,-c不链接)和-S选项(仅编译,不汇编或链接)在两者中的含义相同。

关于中间表示的 LLVM 条款

引用我在这个网站上的另一个答案

LLVM IR 通常以 .ll 扩展名的文本文件或 .bc扩展名的二进制文件存储在磁盘上。两者之间的转换是微不足道的,您可以只使用for bc -> ll和for ll -> bc。二进制格式更节省内存,而文本格式是人类可读的。llvm-disllvm-as

此外,还有一些常用的别名:

  • 存储在.bc文件中的二进制格式也称为位码(尽管我偶尔会听到术语“位码”也适用于一般 IR)
  • IR 也称为LLVM 汇编LLVM 汇编语言

无论如何,在可能不同的表示下,这一切都意味着同样的事情。

本机组装

本地程序集是许多人在听到“程序集”一词时通常会想到的 - 低级语言几乎 1:1 映射到您的本机机器二进制文件,并且与 LLVM 程序集不同,本机程序集非常依赖于目标(例如 x86 程序集、ARM 汇编等)。本机程序集通过汇编程序组装成本机二进制文件 - LLVM 确实包含一个,但您也可以使用其他汇编程序(例如gas)。

本机二进制 - 组装过程的结果 - 当然是计算机真正说的(唯一)语言,链接后可以将其加载到内存中并直接在您的硬件上运行。

于 2013-01-01T07:15:00.897 回答