C++ clang如何控制C/C++;代码优化?

C++ clang如何控制C/C++;代码优化?,c++,gcc,compilation,clang,llvm,C++,Gcc,Compilation,Clang,Llvm,有人告诉我,clang是一个类似gcc的驱动程序,用于预处理、编译和链接工作。在编译和链接过程中,据我所知,实际上是llvm进行优化(“-O1”、“-O2”、“-O3”、“-Os”、“-flto”) 但我无法理解llvm是如何参与的 编译源代码似乎甚至不需要像libLLVMCore.a这样的静态库,而debian clang包依赖于另一个名为libllvm-3.4(clang版本是3.4)的包,其中包含libllvm-3.4。那么(.1),clang是否使用这个共享库进行优化 我已经检查了cla

有人告诉我,clang是一个类似gcc的驱动程序,用于预处理、编译和链接工作。在编译和链接过程中,据我所知,实际上是llvm进行优化(
“-O1”、“-O2”、“-O3”、“-Os”、“-flto”

但我无法理解llvm是如何参与的

编译源代码似乎甚至不需要像
libLLVMCore.a
这样的静态库,而debian clang包依赖于另一个名为
libllvm-3.4
(clang版本是3.4)的包,其中包含
libllvm-3.4。那么(.1)
,clang是否使用这个共享库进行优化

我已经检查了clang源代码一段时间,发现
include/clang/Driver/Options.td
包含相关选项,但不幸的是,我没有找到包含该文件的源文件,所以我仍然不知道该机制


我希望有人能给我一些提示。

它与GCC不完全一样,所以不要花太多时间试图将两者精确匹配

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

(TL;dontwannread-跳到此答案的末尾)

要正确回答您的问题,您首先需要了解编译器的和(尤其是第一个)之间的区别

CLAN是C++、C++、Objic C和Obj++语言的编译器<强>前端< /强>()。 Clang的职责如下:

即从C++源代码(或C或Objo C等)转换为代码所需的文本低级表示。为了做到这一点,Clang使用了许多子模块,这些子模块的描述可以在任何一本像样的编译器构造书中找到:lexer、parser+a语义分析器(Sema)等

是一组库,其主要任务如下:假设我们具有以下C++函数

的LLVM IR表示
int double_this_number(int num) {
    int result = 0;
    result = num;
    result = result * 2;
    return result;
}
LLVM过程的核心应优化LLVM IR代码:

如何处理优化后的LLVM IR代码完全取决于您:您可以将其转换为x86_64可执行代码或对其进行修改,然后将其作为ARM可执行代码或GPU可执行代码输出。这取决于项目的目标

术语“后端”经常令人困惑,因为有许多论文将LLVM库定义为编译器链中的“中间端”,并将“后端”定义为执行代码生成的最终模块(LLVM IR到可执行代码或其他不再需要编译器处理的部分)。其他来源将LLVM称为Clang的后端。无论哪种方式,它们的作用都是明确的,它们提供了一种强大的机制:无论您针对哪种语言(C++、C、Objective C、Python等),如果您有一个前端将其转换为LLVM IR,您可以使用同一组LLVM库来优化它,只要您有一个后端用于您的目标体系结构,您可以生成优化的可执行代码

回想一下LLVM是一组库(不仅是优化过程,还包括实用程序模块、诊断模块等),Clang在其前端过程中还利用了许多LLVM库。你不可能真的把每个LLVM模块都从Clang中删除,因为后者是建立在前者的基础上的

至于Clang被称为“编译驱动程序”的原因:Clang负责解释命令行参数(描述和许多声明都是“d”的,它们可能需要一个简单的grep来遍历源代码),决定要执行的
作业和阶段,根据所需/可能的优化和转换级别设置
codegeoptions
,并调用适当的模块(
BackendUtil.cpp
中的
clangCodeGen
)和工具(例如Windows
ld
链接器),用要应用的优化填充模块过程管理器。它从头到尾指导编译过程


最后,我建议您阅读Clang和LLVM文档,它们非常详细,您的大多数问题首先应该在那里找到答案。

我知道它们并不完全相同,但我希望了解更多关于Clang如何调用LLVM编译器来进行优化工作的详细信息。这可能是另一个XY问题。如果你得到这个问题的答案,你打算解决什么问题?@MSalters我只是想知道clang如何驱动llvm进行优化工作。我正在做一个项目,它似乎需要clang消毒剂和llvm IR pass分析,所以我想知道关于clang如何工作的细节。基本上,我们希望实现一个(非常轻量级的)驱动程序,它的工作方式类似于clang,但目标是端到端代码漏洞检查。为LLVM编写一个目标语言描述并编译成它不是更好吗?LLVM编译器不限于针对x86或ARM,它是可扩展的。如果定义了合适的目标语言,您的漏洞将在最终输出中脱颖而出。@mAlters我认为为目标语言编写前端对我来说仍然很困难,我们目前只对以x86(32/64)为体系结构的c/c++代码感兴趣。因此,我希望有一个关于llvm转换和分析过程的驱动程序接口的详细答案。您看过文档了吗,我想我的问题有点模棱两可,但是你给了我一个很好的答案,告诉我如何深入到IR生成,特别是最后三段;非常感谢你!顺便说一句,你能告诉我什么是生成th的工具吗