https://lwn.net/Articles/734071/ — 木芽

近年来,大家一直努力使用Clang C(LLVM 项目的一部分)编译内核。在今年的Linux Plumbers Conference上,Google的两位工程师Greg Hackmann 和 Nick Desaulniers在Android分会汇报相关进展。得力于二位的辛苦,kernel 4.4 和4.9将能够使用Clang编译。

Desaulniers首先回答了为何要用Clang来编译内核。因为目前Android用户空间全部使用Clang编译,因此Google更愿意减少编译工具。虽然看起来,这项措施对于Google来说好处不大,但对于更广泛的商业界,受益匪浅。

接着,他讲到了Clang和GCC在编译方面的不同处,比如warning方面,更方便内核用户找到bugs。另外Clang中的ink-time optimization (LTO) and profile-guided optimization (PGO) 对于热路径将会提高编译速度。

同时,使用另一种编译器来编译内核可以更好地查找那些依赖未定义行为的代码。用户对于未定义形为有不同的处理方式从而选择更方便的一种。而这种选择也可能改变,甚至GCC的一次升级将会造成不符合预期的结果(如果这段代码依赖于未定义形为)。Desaulniers说到,包括kernel和LLVM/Clang都可以从中收益。内核是一个如此大的项目,帮助找到编译器的bug。

Greg Kroah-Hartman 也同意这种说法,有竞争才有好事。另外,现在除了这两种外,还有其他的编译器。同时他也提到了关于upstream kernel的状态,他很自信地跟大家讲,很快就有支持Clang的kernel版本。在支持编译内核的同时,也帮助发现了LLVM的多个bugs,最开始是在LLVM4.0上,现在他们已经更新到LLVM5.0,不久将在LLVM当前开发版本上支持。版本越高,内æ ¸编译速度越快。

目前来讲,内核编译支持方面依然还有一些问题。包括结构体中的变长数组不被Clang支持,一个对内联函数的GNU C扩展不被支持,还有LLVM汇编器不能用来编译内核。因此,目前的做法是Clang作为前端编译内核,对于assembler 和 linker需要GNU Binutils支持。

下一步要做的就是LLVM对于内核的自动测试。目前已经在做。

总的来说,Clang作为编译内核的编译器选项,有好处,但还存在一些缺点。希望不断进展,早日为大家带来不一样的编译体验。