如何在LLVM中运行模块传递

时间:2018-12-16 07:39:28

标签: c++ llvm llvm-c++-api

我正在尝试寻找一种方法来优化空的全局构造函数。先前的优化会将构造函数转换为不执行任何操作的函数。我需要添加新通行证才能从llvm.global_ctors中删除这些功能。

首先,我尝试了optimizeGlobalCtorsList,但是即使填充了llvm.global_ctors,该函数实际上也不会调用我给它的回调。

然后我尝试运行GlobalOptPass。我尝试过:

llvm::GlobalOptPass pass;
llvm::ModuleAnalysisManager MAM{true};
pass.run(module, MAM);

此操作最终取消引用AnalysisManager::lookupPass中的空指针。我想我需要执行某种初始化或注册,但是我不知道该怎么做。关于“ llvm通行证注册”的所有参考都谈到了用opt注册通行证。我不想那样做。我只想运行通行证。

1 个答案:

答案 0 :(得分:0)

查找func FlattenDeep(args ...interface{}) []interface{} { list := []interface{}{} for _, v := range args { kind := getKind(v); if kind != "unknown" { for _, z := range FlattenDeep((v.([]interface{})...) { list = append(list, z) } } else { list = append(list, v); } } return list; } (对于新的通行证管理器,则为<button onclick="print('blank')">Click me</button> ),以查看lib/Transforms/IPO/PassManagerBuilder.cpp如何设置其通行管道。 lib/Passes/PassBuilder.cpp的代码在opt中,并且非常小,几乎将其所有工作委托给了核心库。

您可以将opt用作自己的工具的模板,也可以破解通行证构建基准线以将通行证插入所需的位置。