[llvm-dev] Problems with registering of ModulePass (with Dependencies)
Gerion Entrup via llvm-dev
llvm-dev at lists.llvm.org
Mon Jul 10 07:57:58 PDT 2017
Hello,
I have created a ModulePass, that now needs LoopInfo information.
The ModulePass registration is taken from [1]. I use clang to directly invoke
it (This is also a hard requirement, because I need the fancy output of clang
warnings/remarks).
The problem is, that the dependency to the LoopInfoWrapperPass does not seem
to work. The error is:
--- snip ---
clang-4.0: /var/tmp/portage/sys-devel/llvm-4.0.1/work/llvm-4.0.1.src/include/llvm/PassAnalysisSupport.h:236:
AnalysisType& llvm::Pass::getAnalysisID(llvm::AnalysisID) const [with AnalysisType = llvm::LoopInfoWrapperPass; llvm::AnalysisID = const void*]:
Assertion `ResultPass && "getAnalysis*() called on an analysis that was not " "'required' by pass!"' failed.
--- /snip ---
The minimal code, that triggers the error is:
--------- snip ---------
#include "llvm/Support/raw_ostream.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/LegacyPassManager.h"
#include "llvm/IR/Module.h"
#include "llvm/Support/Debug.h"
#include "llvm/Transforms/IPO/PassManagerBuilder.h"
#include "llvm/Analysis/LoopInfo.h"
using namespace llvm;
namespace {
struct SkeletonPass : public ModulePass {
static char ID;
SkeletonPass() : ModulePass(ID) { }
virtual bool runOnModule(Module &M) override {
errs() << "In module called: " << M.getName() << "!\n";
LoopInfo& li = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
return false;
}
virtual void getAnalysisUsage(AnalysisUsage& au) const override {
au.setPreservesCFG();
au.addRequired<LoopInfoWrapperPass>();
}
};
}
char SkeletonPass::ID = 0;
//Automatically enable the pass.
//http://adriansampson.net/blog/clangpass.html
static void registerSkeletonPass(const PassManagerBuilder &,
legacy::PassManagerBase &PM) {
PM.add(new SkeletonPass());
}
static RegisterStandardPasses
RegisterMyPass(PassManagerBuilder::EP_ModuleOptimizerEarly, registerSkeletonPass);
static RegisterStandardPasses
RegisterMyPass0(PassManagerBuilder::EP_EnabledOnOptLevel0, registerSkeletonPass);
-------- /snip------
Invocation per:
clang -Xclang -load -Xclang /path/to/llvm-pass-skeleton/build/skeleton/libSkeletonPass.so -g test.c
I use clang 4.0.1.
Can someone give me an advice, how to fix this and use the LoopInfo?
Gerion
[1] https://github.com/sampsyo/llvm-pass-skeleton/issues/7
More information about the llvm-dev
mailing list