我正在LLVM上实现几个Passes以添加原始优化, 这些通行证基于FunctionPass和ModulePass。 现在,每个Pass都由相应的opt命令选项调用 由RegisterPass模板注册。
将来,我希望这些Passes只能由一个opt命令选项调用。 我的想法如下: - - 首先,Function传递给run,最后Module传递给run。 - 每个函数传递使用前一个函数传递的分析信息。 - 最后的Module传递使用前一个Function传递结果来构造一个新函数。 - 所有这些Passes序列仅通过一个opt命令选项调用,指定最终的Module传递。
我以为我可以在AnalysisUsage类中使用addRequired方法。 但是,它似乎不起作用: - - 在函数传递中,可以在顺序中添加几个函数传递。 - 在函数传递中,只有一个模块传递可以是addRequired。 - 在Function pass(X)中,Function pass和Module pass不能同时添加addRequired。 即,使用选项X执行opt命令会导致锁定状态。 - 在模块传递中,只有一个模块传递可能是addRequired。 - 在模块传递(Y)中,函数传递(Z)不能是addRequired。 即带选项Y的opt命令只执行Y,忽略函数传递(Z)。
我对Pass管理机制并不熟悉。 有人帮我如何在Module传递之前只使用一个opt命令选项运行Function传递吗?
执行的情况如下所示: -
$ 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);
答案 0 :(得分:0)
我尝试使用LLVM 3.8.1模拟问题here。
我相信你的Function
通行证可以在这里运行:
Module Pass
Unnamed pass: implement Pass::getPassName()
我不知道为什么它被标记为未命名,尽管getPassName
被覆盖。
您需要注意的一个细节是,为了使函数传递实际执行其runOnFunction
方法,您需要调用Function &
的{{1}}特定方法,如:
getAnalysis
似乎依赖传递在一小部分IR上运行而不是需要它的传递,它需要明确地执行。我可能会弄错,因为我还没有尝试使用getAnalysis<tryFPass4>(f); // where f is the current Function operating on
所需的BasicBlockPass
。