广义的LLVM其实就是指整个LLVM编译器架构,包括了前端、后端、优化器、众多的库函数以及很多的模块;而狭义的LLVM其实就是聚焦于编译器后端功能(代码生成、代码优化、JIT等)的一系列模块和库。

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/6567a92a-87da-46c1-a4ec-cca5063b9c10/Untitled_picture.png

Clang其实大致上可以对应到编译器的前端,主要处理一些和具体机器无关的针对语言的分析操作

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/8f6ed6e7-2a4c-4eca-a644-5e27f272d074/v2-7a8a0c81a49b24601b43a24c28400fe0_720w.jpg

Source Code --- 前端 --- 优化器 --- 后端 --- Machine Code

这样支持一种新的编程语言只需重新实现一个前端,支持一种新的目标架构只需重新实现一个后端,前端和后端连接枢纽就是LLVM IR。

llvm后端负责进行将IR翻译成asm代码,对asm代码进行汇编生产目标平台程序(机器码)

工具:

llc命令将LLVM源输入编译为用于特定体系结构的汇编语言。 然后可以将汇编语言输出通过本机汇编器和链接器传递,以生成本机可执行文件。

链接器lld:将每个O文件合并成一个,将符号绑定到地址上。lld即LLVM的内置链接器。

备注:在2017年5月,lld已经支持ELF、PE/COFF、 和Mach-O。在lld支持不完全的情况下,用户可以使用其他项目,如GNU ld链接器。 lld支持链接时优化。当LLVM链接时优化被启用时,LLVM可以输出bitcode而不是本机代码,而本机代码生成由链接器优化处理。