Hon*_*hen 13 c++ gcc compilation llvm clang
我被告知clang是一个像gcc一样工作的驱动程序,可以进行预处理,编译和链接工作.在编译和链接期间,据我所知,它实际上是llvm进行优化("-O1", "-O2", "-O3", "-Os", "-flto").
但我无法理解llvm是如何参与的.
似乎编译源代码甚至不需要静态库libLLVMCore.a,相反,对于debian clang包依赖于另一个名为libllvm-3.4(clang version is 3.4)的包,其中包含libLLVM-3.4.so(.1),clang是否使用此共享库进行优化?
我已经检查了一段时间的clang源代码并发现其中include/clang/Driver/Options.td包含相关选项,但遗憾的是我找不到包含该文件的源文件,因此我仍然不了解该机制.
我希望有人可以给我一些提示.
Mar*_* A. 19
(TL; DontWannaRead - 跳到这个答案的结尾)
要正确回答您的问题,首先需要了解编译器的前端和后端(尤其是第一个)之间的区别.
Clang是C,C++,Objective C和Objective C++语言的编译器前端(http://en.wikipedia.org/wiki/Clang).
Clang的职责如下:

即从C++源代码(或C,或Objective C等)转换为LLVM IR,这是该代码应该做的文本低级表示.为了做到这一点,Clang使用了许多子模块,您可以在任何体面的编译器构建书中找到它们:lexer,parser +语义分析器(Sema)等.
LLVM是一组库,其主要任务如下:假设我们具有以下C++函数的LLVM IR表示
int double_this_number(int num) {
int result = 0;
result = num;
result = result * 2;
return result;
}
Run Code Online (Sandbox Code Playgroud)
LLVM传递的核心应优化 LLVM IR代码:

如何处理优化的LLVM IR代码完全取决于您:您可以将其转换为x86_64可执行代码或修改它,然后将其作为ARM可执行代码或GPU可执行代码吐出.这取决于您的项目的目标.
术语"后端"经常令人困惑,因为有很多论文将LLVM库定义为编译器链中的"中间端",并将"后端"定义为执行代码生成的最终模块(LLVM IR to可执行代码或其他不再需要编译器处理的东西.其他来源将LLVM称为Clang的后端.无论哪种方式,它们的作用是明确的,他们提供了一个强有力的机制:无论你的目标(C++,C,目标C,Python和等)的语言,如果你有一个前端,它转化为LLVM IR,你可以使用同一组LLVM库来优化它,只要您有目标体系结构的后端,就可以生成优化的可执行代码.
回顾LLVM是一组库(不仅是优化传递,还包括数据结构,实用程序模块,诊断模块等),Clang还在其前端过程中利用了许多 LLVM库.你不能真正撕掉每个 LLVM模块,因为后者建立在前一套上.
至于为什么Clang被称为"编译驱动程序"的原因:Clang管理解释命令行参数(描述和许多声明都是TableGen,它们可能需要比简单的grep更多来游遍源代码),决定Jobs要执行哪些和阶段,CodeGenOptions根据所需/可能的优化和转换级别进行设置,并调用相应的模块(clangCodeGen在BackendUtil.cpp填充模块传递管理器并应用优化的模块中)和工具(例如Windows)ld连接器).它从头到尾引导编译过程.
最后我建议阅读Clang和LLVM文档,它们非常明确,大多数问题应该首先在那里寻找答案.
MSa*_*ers 10
它与GCC不完全相同,所以不要花费太多时间来精确地匹配这两者.
LLVM编译器是一种特定语言LLVM的编译器.Clang所做的是将C++代码编译为LLVM,而不进行优化.然后,Clang可以调用LLVM编译器将该LLVM代码编译为优化的程序集.