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

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

本文关键字:优化 llvm 命令 opt 自定义 增加 项目 CMake 编译      更新时间:2023-10-16

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

不幸的是,我没有找到通过直接从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 bool用于添加通行证的位置,并确保在那里也添加了您的通行证。

如果你只是想让你的通行证在它自己的标志上运行,你需要在注册它之前正确地初始化你的通行证。我们可以看看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)

确保你的传递在你想要依赖的传递之后运行。