[llvm-dev] Problems with registering of ModulePass (with Dependencies)

Gerion Entrup via llvm-dev llvm-dev at lists.llvm.org
Tue Jul 11 12:53:17 PDT 2017


Am Dienstag, 11. Juli 2017, 04:13:28 CEST schrieb Gerion Entrup via llvm-dev:
> Am Montag, 10. Juli 2017, 23:20:09 CEST schrieb John Criswell:
> > On 7/10/17 9:57 AM, Gerion Entrup via llvm-dev wrote:
> > > 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).
> > 
> > It's not clear to me what the problem is, but perhaps your pass 
> > dependencies are creating circular dependencies that the PassManager 
> > cannot resolve.  This could happen if LoopInfoWrappersPass, or a pass 
> > upon which LoopInfoWrappersPass depends, is not a pure analysis pass 
> > (i.e., it does not preserve the results of all other passes).
> Is there any other way to get a valid LoopInfo? In the documention the
> LoopInfoWrappersPass is explicitly mentioned for that.
> 
> 
> > To that end, you could try making your pass preserve all other passes 
> > (using addPreserveAll() in your getAnalysisUsage() method) or check that 
> > LoopInfoWrappersPass and all passes it uses do not invalidate any passes.
> addPreservesAll does not change the error.
> 
> 
> > If that doesn't help, then you'll need to dig deeper (using the 
> > debugger) to figure out why the PassManager is hitting the assertion.  
> > Using -debug-pass=structure may help.  Tracing back through the control 
> > flow using the debugger may also provide some insight.
> Ok, I'll try.
> 
> Is this whole problem maybe dependent on the way of registration? The
> standard documentation says to use RegisterPass<SkeletonPass>, what is
> not done in this case. Anyway, using RegisterPass has not worked with direct
> calling from clang for me.
Found the error. The analysis has to be called per Function. The following code
fixes the pass:
                virtual bool runOnModule(Module &M) override {
                        errs() << "In module called: " << M.getName() << "!\n";
-                       LoopInfo& li = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
+                       for(Function& f : M) {
+                               if (!f.isIntrinsic() && !f.empty()) {
+                                       LoopInfo& li = getAnalysis<LoopInfoWrapperPass>(f).getLoopInfo();
+                                       li.print(errs());
+                               }
+                       }
                        return false;
                }

Reference:
https://stackoverflow.com/a/31593435 and
http://lists.llvm.org/pipermail/llvm-dev/2011-March/038496.html


Gerion

> > > 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