[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