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

swe*_*dev 7 c c++ compiler-construction llvm clang

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

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

opt --help-hidden
Run Code Online (Sandbox Code Playgroud)

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

clang ./hello.bc -o ./hello
Run Code Online (Sandbox Code Playgroud)

甚至用c代码:

clang ./hello.c -o ./hello
Run Code Online (Sandbox Code Playgroud)

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

opt -my-pass < ./hello.bc > ./hello_optimized.bc
Run Code Online (Sandbox Code Playgroud)

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

clang -O0 -m32 ./hello_optimized.bc -o ./hello_optimized
Run Code Online (Sandbox Code Playgroud)

我的问题是:

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

Kub*_*nek 5

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

clang++ -Xclang -load -Xclang ./libmypass.so input.cpp
Run Code Online (Sandbox Code Playgroud)

来源


Mic*_*cer 3

执行此操作的正确方法是让 clang 将您的通行证添加到它构建的通行证管理器中。查看clang/lib/CodeGen/BackendUtil.cpp:void EmitAssemblyHelper::CreatePasses()消毒剂的处理方式。