问题描述
我正在尝试为我编写的自定义LLVM通过创建包装器通过类。
我主要是试图从依赖分析source code派生它。我能够成功构建以下包装器类。代码如下:
INITIALIZE_PASS_BEGIN(ArrayDependenceWrapperPass,"dda","try1",false,true)
INITIALIZE_PASS_END(ArrayDependenceWrapperPass,true)
char ArrayDependenceWrapperPass::ID=0;
ArrayDependenceWrapperPass::ArrayDependenceWrapperPass() : FunctionPass(ID) {
initializeArrayDependenceWrapperPasspass(*PassRegistry::getpassRegistry());
}
FunctionPass *llvm::createArrayDependenceWrapperPass() {
return new ArrayDependenceWrapperPass();
}
bool ArrayDependenceWrapperPass::runOnFunction(Function &F) {
//code for analysis
return false;
}
我已将initializeArrayDependenceWrapperPasspass(*PassRegistry::getpassRegistry())
添加到initializePasses.h
,并将(void) llvm::createArrayDependenceWrapperPass()
添加到LinkallPasses.h
。当我尝试通过另一遍运行此文件时,请遵循以下步骤:
class Driver : public FunctionPass {
public:
static char ID;
Driver() : FunctionPass(ID) {}
void getAnalysisUsage(AnalysisUsage &AU) const {
AU.addrequired<ArrayDependenceWrapperPass>();
}
bool runOnFunction(Function &F) override {
//getAnalysis<ArrayDependenceWrapperPass>();
F.dump();
}
};
char Driver::ID=0;
static RegisterPass<Driver> X("dda","test");
我得到一个带有以下断言的核心转储:
Assertion `PI && "Expected required passes to be initialized"' Failed
我猜这需要将我已经完成的通行证初始化吗?对可能是什么问题有任何想法吗?
任何帮助将不胜感激!
解决方法
该断言错误在constexpr const char* base_filename() {
const char* p = __FILE__;
const size_t i = std::string_view(p).find_last_of('/');
return std::string_view::npos == i ? p : p + i + 1 ;
}
函数中,如here in lib/IR/LegacyPassManager.cpp所示。您是否仅收到该断言错误?没有更多信息吗?您是否尝试过使用void PMTopLevelManager::schedulePass(Pass *P)
进行调试?
LLVM API多年来已经发生了很大的变化,因此也许几个月前仍有效的解决方案在当前版本中无效。这样说,在邮件列表中也出现此错误has been reported for other passes here和here。
您应该考虑执行LLVM's documentation中提到的步骤。