LLVM – 使用clang自动运行自己的通行证

我为llvm写了一些自己的传递,以便与clang一起使用它们。

我将它们集成在llvm中(不是动态加载的)。 当我输入时,它们甚至列在Optimizations available:部分中:

opt --help-hidden 

当我打电话给clang时,我想自动运行我自己的一个通行证作为最后一个

 clang ./hello.bc -o ./hello 

甚至用c代码:

 clang ./hello.c -o ./hello 

当我手动使用opt运行传递时,会生成修改后的ByteCode并将其写入新的.bc文件:

 opt -my-pass  ./hello_optimized.bc 

当我用clang编译修改后的.bc时,会再次运行普通的clang优化,这会破坏我手动执行的传递的优化:

 clang -O0 -m32 ./hello_optimized.bc -o ./hello_optimized 

我的问题是:

  • 如何使用clang自动运行我自己的书面传递作为最后一次传递?
  • 另一种可能的解决方案是完全停用所有通行证,或者至少取消clang / opt的死代码/function。 我怎么能这样做?

这样做的正确方法是让clang将你的传递添加到它构建的传递管理器中。 请参阅clang/lib/CodeGen/BackendUtil.cpp:void EmitAssemblyHelper::CreatePasses() ,了解如何为清理程序处理它。

您可以使用-Xclang直接使用clang运行自己的传递。

 clang++ -Xclang -load -Xclang ./libmypass.so input.cpp 

资源