clang如何能够引导C/C++代码优化?

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根据所需/可能的优化和转换级别进行设置,并调用相应的模块(clangCodeGenBackendUtil.cpp填充模块传递管理器并应用优化的模块中)和工具(例如Windows)ld连接器).它从头到尾引导编译过程.

最后我建议阅读Clang和LLVM文档,它们非常明确,大多数问题应该首先在那里寻找答案.

  • 顺便问一下,你能说出生成图片的工具是什么吗? (3认同)

MSa*_*ers 10

它与GCC不完全相同,所以不要花费太多时间来精确地匹配这两者.

LLVM编译器是一种特定语言LLVM的编译器.Clang所做的是将C++代码编译为LLVM,而不进行优化.然后,Clang可以调用LLVM编译器将该LLVM代码编译为优化的程序集.