今天尝试将之前写的Pass移到LTO阶段。
将一个Pass加入LTO的方法如下:
- 在llvm/lib/LTO/LTOCodeGenerator.cpp文件initializeLTOPasses函数中加入相应初始化函数的调用(
initializeXXXPass(R);
); - 在llvm/lib/Transforms/IPO/LLVMBuild.txt文件required_libraries字段中加入新增Pass作为依赖;
- 在llvm/lib/Transforms/IPO/PassManagerBuilder.cpp文件populateLTOPassManager函数中, 在合适的时机将新增Pass加入PassManager (
PM.add(createXXXPass());
, 需要确保有createXXXPass()
函数); - 新增的Pass需要作为llvm_component_library编译(CMakeLists.txt里面写add_llvm_component_library)。新增的LTO Pass代码与普通Pass放置在相同的位置似乎就可以工作。
LTO的Pass是一个ModulePass, 这个Pass看到的Module是所有被链接的对象拼在一起之后的一个大Module。
此外, clang命令行参数给LTO Pass传参数的方法为: -Wl,-plugin-opt,--xxx-yyy
。Pass的参数可以在其代码中使用cl::opt
定义。
我加了一些feature, 然后产生了一些bug, 正在修复。
发表评论