【发布时间】:2015-10-28 08:06:15
【问题描述】:
我正在 LLVM 上实现几个 Passes 以添加原始优化,
这些通行证基于FunctionPass 和ModulePass。
现在,每个 Pass 都由相应的 opt 命令选项调用,即
由RegisterPass模板注册。
将来,我希望这些通行证仅由一个 opt 命令选项调用。 我的想法如下:
- 首先,函数传递给运行,最后模块传递给运行。
- 每个函数传递都使用前一个函数传递的分析信息。
- 最终的 Module 传递,用于使用之前 Function 传递的结果构造一个新函数。
- 所有这些 Passes 序列仅由一个 opt 命令选项调用,该选项指定最终的 Module pass。
我想我可以使用AnalysisUsage 类中的addRequired 方法来实现。
但是,它似乎不起作用:
- 在Function pass中,几个Function pass的顺序可能是
addRequired。 - 在函数
pass中,只能添加一个Module pass。 - 在函数
pass(X)中,函数传递和模块传递不能同时为addRequired。 即使用选项X执行opt命令会导致锁定状态。 - 在 Module pass 中,只有一个 Module pass 可能是
addRequired。 - 在模块
pass(Y)中,函数pass(Z)不能是addRequired。 即带有选项Y的opt命令只执行Y,而函数pass(Z)被忽略。
我不熟悉通行证管理器机制。
任何人都可以帮助我如何在只有一个 opt 命令选项的模块传递之前运行函数传递?
执行案例如下图:-
$ opt -stats -load ~/samples/tryPass4.so -MPass4 hello2.ll -S -o tryPass4.ll -debug-pass=Structure
Pass Arguments: -targetlibinfo -datalayout -notti -basictti -x86tti -MPass4 -verify -verify-di -print-module
Target Library Information ↑
Data Layout -FPass4 doesn't appear here
No target information
Target independent code generator's TTI
X86 Target Transform Info
ModulePass Manager
Module Pass
Unnamed pass: implement Pass::getPassName()
FunctionPass Manager
Module Verifier
Debug Info Verifier
Print module to stderr
Pass Arguments: -FPass4 <- here -FPass4 appears, but not executed
FunctionPass Manager
Function Pass
***** Module Name : hello2.ll <- output from the Module pass
上面的源码如下:-
using namespace llvm;
namespace{
class tryFPass4 : public FunctionPass {
public :
static char ID;
tryFPass4() : FunctionPass(ID){}
~tryFPass4(){}
virtual bool runOnFunction(llvm::Function &F);
virtual void getAnalysisUsage(llvm::AnalysisUsage &AU) const;
};
class tryMPass4 : public ModulePass {
public :
static char ID;
tryMPass4() : ModulePass(ID){}
~tryMPass4(){}
virtual bool runOnModule(llvm::Module &M);
virtual void getAnalysisUsage(llvm::AnalysisUsage &AU) const;
};
}
bool tryFPass4::runOnFunction(Function &F) {
bool change = false;
....
return change;
}
bool tryMPass4::runOnModule(Module &M) {
bool change = false ;
....
return change;
}
void tryFPass4::getAnalysisUsage(AnalysisUsage &AU) const {
AU.setPreservesCFG();
}
void tryMPass4::getAnalysisUsage(AnalysisUsage &AU) const {
AU.setPreservesCFG();
AU.addRequired<tryFPass4>();
}
char tryFPass4::ID = 0;
static RegisterPass<tryFPass4> X("FPass4", "Function Pass", false, false);
char tryMPass4::ID = 0;
static RegisterPass<tryMPass4> Y("MPass4", "Module Pass", false, false);
【问题讨论】:
标签: llvm