我正在研究 LLVM 系统并且我已经阅读了入门文档 http://llvm.org/docs/GettingStarted.html。然而,一些术语(以及 clang 示例中的措辞)仍然有点令人困惑。以下术语和命令都是编译过程的一部分,我想知道是否有人能够为我更好地解释它们:
-
clang -S
vs. clang -c
(我知道什么-c
确实如此,但结果有何不同?)*(Edit)
- LLVM 位码与 LLVM IR(有什么区别?)
- .ll 文件与 .bc 文件(它们是什么,它们有何不同?)
-
LLVM汇编代码 vs. 本机汇编代码(有什么区别吗?)
在更高的层次上,我了解了整个编译过程,并且可以跟踪我的整个过程fairly好吧,我只是陷入了一些困境,例如,我希望看到“IR”,但却看到“bitcode”或“LLVM assembly”,这让我认为我对它们的理解并不像我一样好。应该!
铿锵用法
一般来说,Clang 接受与 GCC 相同的命令行选项。这-c
选项(仅编译和汇编,不链接)和-S
选项(仅编译,不汇编或链接)在两者中含义相同。
关于中间表示的 LLVM 术语
引用自我在这个网站上的另一个答案 https://stackoverflow.com/a/12954198/242762:
LLVM IR 通常存储在磁盘上的文本文件中.ll扩展名或二进制文件.bc扩大。两者之间的转换很简单,您只需使用llvm-dis
for bc -> ll and llvm-as
for ll -> bc。二进制格式更节省内存,而文本格式则易于人类阅读。
另外,还有一些常用的别名:
- 二进制格式,存储在.bc文件,也称为bitcode(尽管我偶尔听说术语“位码”也适用于通用 IR)
- IR 也称为LLVM汇编 or LLVM汇编语言
无论如何,在可能不同的表述下,这一切都意味着同一件事。
本地组装
原生汇编是许多人在听到“汇编”一词时通常想到的 - 低级语言几乎 1:1 映射到本机机器二进制文件,与 LLVM 汇编不同,本机汇编是very依赖于目标(例如 x86 汇编、ARM 汇编等)。本机程序集通过汇编器组装成本机二进制文件 - LLVM 确实包含一个汇编器,尽管您也可以使用其他汇编器(例如gas
).
本机二进制文件(汇编过程的结果)当然是计算机真正使用的(唯一)语言,链接后可以将其加载到内存中并直接在硬件上运行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)