C++ 编译器的重用结果';s前端以加快C++;用于多种配置/平台的代码

C++ 编译器的重用结果';s前端以加快C++;用于多种配置/平台的代码,c++,gcc,visual-c++,clang,llvm,C++,Gcc,Visual C++,Clang,Llvm,我想缩短我的项目的编译时间。我支持多种平台:OSX、Linux、Android、iOS。我为他们中的每一个构建了调试和发布的项目 假设我的代码既没有特定于平台的代码,也没有特定于配置的代码 任何编译器是否可以在以下情况下保存其中间表示形式: 1) 解析代码或 2) 优化阶段 因此,我可以通过(分别)重用结果来缩短编译时间: 1) 调试/发布配置 2) 平台(Android、iOS、OSX、Linux的发行版)?如果您使用clang-答案是肯定的,可能是: clang -S -emit-llvm

我想缩短我的项目的编译时间。我支持多种平台:OSX、Linux、Android、iOS。我为他们中的每一个构建了调试和发布的项目

假设我的代码既没有特定于平台的代码,也没有特定于配置的代码

任何编译器是否可以在以下情况下保存其中间表示形式:

1) 解析代码或

2) 优化阶段

因此,我可以通过(分别)重用结果来缩短编译时间:

1) 调试/发布配置


2) 平台(Android、iOS、OSX、Linux的发行版)?

如果您使用clang-答案是肯定的,可能是:

clang -S -emit-llvm something.c
生成
something.ll
,它是LLVM IR文件。下一步是使用实用程序生成部件文件:

llc -march=x86 something.ll
应该使用x86特定的程序集创建
something.s

不过,我建议不要在大型项目中使用它(如果您正在寻找加速编译的选项,可能您有一个大型项目)。原因是,在您的代码或第三方中,可能使用了特定于平台的宏。例如:

#ifdef UNIX
...
#else
...

预处理阶段是第一阶段,它在发射红外之前进行。因此,如果您要为另一个平台生成程序集,它可能是格式不正确的。

您是否尝试过
预编译头
:?所有编译器都能够转储预处理的翻译单元,clang甚至可以生成中间LLVM表示。但是,即使您的项目不包含任何特定于平台的代码,它也可能存在于标准库和其他依赖项中,因此肯定无法重用编译产品。您说您希望加快编译时间,但您确定了瓶颈是什么吗?考虑到单个变量的编译速度相当快,我将并行构建所有必需的变量。@VTT:除非我动态链接库,否则平台特定的代码不应该是问题。关于瓶颈:我还没有检查。我只有数千个翻译单元,我需要在我们的CI上构建它们,我得出结论,编译器的大部分前端工作都是重复的。另外,我认为您对“特定于平台的代码不应该是问题”相当乐观-我打赌所有这些平台都有非常不同的预处理器定义和内部函数集。谢谢@Dmitry Gordon!我想可以从发出llvm IR中分离预处理器阶段,这样我就可以确保预处理代码在给定的平台/配置上是相同的。是的,可以从IR生成中分离预处理器(-E标志表示clang)。但我的观点是IR取决于预处理器的结果,这可能是特定于平台的。因此,不同平台将不会有可重用的工件。还有更多。。。大多数前端会出于这样或那样的原因调用LLVM的DataLayout,如果只是为了在调用
new Foo()
时生成
malloc(132)
,并且在使用DataLayout时,LLVM IR通常包含与目标相关的幻数,如132。sizeof(Foo)在一个64位平台上可能是124,在另一个平台上可能是132。