如何 运行 模块在 LLVM 中传递
How to run a module pass in LLVM
我正在尝试找到一种方法来优化空的全局构造函数。以前的优化会将构造函数变成什么都不做的函数。我需要添加一个新的传递以从 llvm.global_ctors
.
中删除这些函数
首先,我尝试了 optimizeGlobalCtorsList
,但是这个函数实际上并没有调用我给它的回调,即使填充了 llvm.global_ctors
。
然后我试了运行宁GlobalOptPass
。我试过这个:
llvm::GlobalOptPass pass;
llvm::ModuleAnalysisManager MAM{true};
pass.run(module, MAM);
这最终取消引用了 AnalysisManager::lookupPass
中的空指针。我想我需要执行某种初始化或注册,但我不知道该怎么做。 "llvm pass registration" 上的所有参考资料都讨论了使用 opt
注册通行证。我不想那样做。我只想运行传球
查看 lib/Transforms/IPO/PassManagerBuilder.cpp
(或 lib/Passes/PassBuilder.cpp
新的传递管理器)以了解 opt
如何设置其传递管道。 opt
的代码在 tools/opt/opt.cpp
中并且非常小,几乎将其所有工作委托给了核心库。
您可以使用 opt
作为您自己工具的模板,或者您可以破解通行证构建管道以将您的通行证插入到您想要的地方。
我正在尝试找到一种方法来优化空的全局构造函数。以前的优化会将构造函数变成什么都不做的函数。我需要添加一个新的传递以从 llvm.global_ctors
.
首先,我尝试了 optimizeGlobalCtorsList
,但是这个函数实际上并没有调用我给它的回调,即使填充了 llvm.global_ctors
。
然后我试了运行宁GlobalOptPass
。我试过这个:
llvm::GlobalOptPass pass;
llvm::ModuleAnalysisManager MAM{true};
pass.run(module, MAM);
这最终取消引用了 AnalysisManager::lookupPass
中的空指针。我想我需要执行某种初始化或注册,但我不知道该怎么做。 "llvm pass registration" 上的所有参考资料都讨论了使用 opt
注册通行证。我不想那样做。我只想运行传球
查看 lib/Transforms/IPO/PassManagerBuilder.cpp
(或 lib/Passes/PassBuilder.cpp
新的传递管理器)以了解 opt
如何设置其传递管道。 opt
的代码在 tools/opt/opt.cpp
中并且非常小,几乎将其所有工作委托给了核心库。
您可以使用 opt
作为您自己工具的模板,或者您可以破解通行证构建管道以将您的通行证插入到您想要的地方。