如何 运行 模块在 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 作为您自己工具的模板,或者您可以破解通行证构建管道以将您的通行证插入到您想要的地方。