近期在读<Getting Started with LLVM Core Libraries>。这是读的第一本LLVM的书。非常多地方尽管讲的是自己知道的东西。可是也给人耳目一新的感觉,让人感觉之前有些不确定的东西,或者没有联系起来的知识点一下子贯通了,那感觉非常酸爽。
1.先谈谈题目里的Everything。
LLVM每日谈之十六中,以前提到过:Everything is a value.主要讲的是重要的LLVM IR的C++类都是Value的子类,同一时候在对IR的详细操作中,由于LLVM IR使用的是SSA,所以能够把非常多的东西直接看成Value,而且也能够当做Value去操作,这样就非常方便了。我觉的这句话非常经典,是属于点睛之笔的一句话。理解了这句话,有种豁然开朗,境地猛一下提升的感觉。详细内容能够去參照LLVM每日谈之十六。
在读<Getting ...>这本书的时候,遇到了另外一个Everything:Everything is a lib.这句话相同的经典,相同的高境地。之前我依据源代码结构,自己猜測LLVM整个架构下的所有产品基本上都是依照库的形式去组织代码的。甚至有的工具在是一个工具的同一时候,也是一个库。
这句话证实了我的看法,LLVM的源代码是依照库的形式去组织的。这对理解整个LLVM的源代码,有非常大的帮助,尽管不过一个架构方面的知识,可是能够让人对架构的理解提升不少。
所以:
Everything is a lib.
Everything is a value.
2. Clang driver。
Clang是LLVM框架以下的一个前端,这是无需置疑的。可是非常多人easy忽略Clang driver。这个方面之前我也有过考虑,也是从读<Getting ...>这本书彻底的理清楚了。
把LLVM作为编译器使用的时候。命令行使用的“clang”事实上并非前端Clang,而是指的是Clang driver;在命令行使用的“Clang cc1”也指的不是前端Clang,而指的是Clang编译器。这当中不仅包括了前端Clang。还包括了LLVM Core部分等。Clang driver不只调用了前端Clang,同一时候还调用了LLVM Core,而且应为LLVM没有自己的Linker的缘故,在编译的最后阶段,还调用了系统的linker。LLVM的linker产品lld仍然在开发中。
所以假设把前端Clang和Clang driver分清楚,就好像分清楚了LLVM Core和LLVM框架一样,不同的概念指代的是不同范围的东西。假设不搞清楚。那么对之后的学习和工作。会造成非常多的困扰。
所以:
Clang driver是一个驱动,一个包括编译所有阶段的驱动,不同于前端Clang,也不同于编译器Clang。