在 CMake 项目中编译后添加自定义 llvm 优化命令 (opt)

Add custom llvm optimization command (opt) after compilation within CMake projects

我在 LLVM 3.7.0 中创建了自己的 LLVM 优化通道。 我想在 cmake 项目中使用此通行证。 在-O2(或-O3)的所有优化传递都由 clang(或 clang++)执行之后,我需要 运行 最后传递。

不幸的是,我没有找到通过直接从 clang 传递标志来调用 pass 的机制(如果你给我指出一种方法,这已经很有帮助了)。

假设无法通过给 clang 一个标志来 运行 传递,我需要在我的工具链中放置一个额外的优化传递,以放置在编译和链接阶段之间。我在整个 cmake 项目中都需要它。

我需要从两个源文件生成二进制文件的命令是:

clang -c -g -emit-llvm -O3 mySource0.c -o mySource0.bc
clang -c -g -emit-llvm -O3 mySource1.c -o mySource.bc
llvm-link mySource0.bc mySource1.bc -o main.bc
opt -load myAnalysis.so -myAnalysis main.bc -o main.analysis.bc
clang <libraryRelatedFlags> main.analysis.bc -o myExecutable

我的通行证注册为:

static RegisterPass<myAnalysis> X("myAnalysis", "Implement my analysis", false, false);

如: http://llvm.org/docs/WritingAnLLVMPass.html#basic-code-required

如果我对你的问题的理解正确,你只是想添加你的通行证,使其在 -O3 下 运行。

您需要编辑 $(llvm-dir)/tools/opt/opt.cpp 以获得 运行 -O3 的通行证。您需要找到 OptLevelO3 布尔值用于添加通行证的位置,并确保也在那里添加您的通行证。

如果您只是希望您的通行证 运行 在它自己的标志上,您需要在注册通行证之前正确初始化您的通行证。我们可以将 DependenceAnalysis.cpp 作为一个很好的例子来说明如何做到这一点:

INITIALIZE_PASS_BEGIN(DependenceAnalysis, "da", "Dependence Analysis", true, true)
INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)
INITIALIZE_PASS_DEPENDENCY(ScalarEvolution)
INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
INITIALIZE_PASS_END(DependenceAnalysis, "da", "Dependence Analysis", true, true)

您还提到您希望在其他一些传球之后将传球传给 运行。只需将它们标记为 DA 所做的:

INITIALIZE_PASS_DEPENDENCY(ScalarEvolution)

确保您的通行证 运行 在您想要依赖的通行证之后。