J Skye via llvm-dev
2019-Apr-02 06:47 UTC
[llvm-dev] How can I use llvm::LoopInfo in the runOnModule method?
Hi all, I tried to have a LoopInfo object in a function pass, and add addRequired in getAnalysisUsage, and then use getAnalysis in runOnFunction(). It worked OK. Now I want to have a module pass to traverse the functions, and similarly, I want to have to loop information of the functions. When I did the above in runOnModule, and build the module pass, the following error popped out, and the compile did not succeed: [ 50%] Building CXX object src/CMakeFiles/SkeletonPass.dir/Skeleton.cpp.o /home/**/Desktop/skeleton/src/Skeleton.cpp: In member function ‘virtual bool llvm::SkeletonPass::runOnModule(llvm::Module&)’: /home/**/Desktop/skeleton/src/Skeleton.cpp:47:43: error: no matching function for call to ‘llvm::SkeletonPass::getAnalysis(llvm::Function*&)’ LoopInfo &LI = getAnalysis<LoopInfo>(F); ... home/**/Work/llvm-6.0.1.src/include/llvm/PassAnalysisSupport.h: In instantiation of ‘llvm::AnalysisUsage& llvm::AnalysisUsage::addRequired() [with PassClass = llvm::LoopInfo]’: /home/**/Desktop/skeleton/src/Skeleton.cpp:24:38: required from here /home/**/Work/llvm-6.0.1.src/include/llvm/PassAnalysisSupport.h:67:39: error: ‘ID’ is not a member of ‘llvm::LoopInfo’ return addRequiredID(PassClass::ID); ^ Here is my source code: #include "llvm/Pass.h" #include "llvm/IR/Function.h" #include "llvm/IR/Module.h" #include "llvm/Support/raw_ostream.h" #include "llvm/IR/Dominators.h" #include "llvm/Analysis/LoopInfo.h" namespace llvm { class SkeletonPass : public ModulePass { public: static char ID; SkeletonPass() : ModulePass(ID) {} bool runOnModule(Module &M) override; virtual StringRef getPassName() const override { return "Skeleton"; } virtual void getAnalysisUsage(AnalysisUsage &AU) const override { errs() << "get analysis usage method.\n"; AU.addRequired<LoopInfo>(); } }; Pass *createSkeletonPass() { return new SkeletonPass(); } char SkeletonPass::ID = 0; Pass *createSkeletonPass(); void initializeSkeletonPass(PassRegistry &Registry); } // namespace llvm using namespace llvm; using namespace std; bool SkeletonPass::runOnModule(llvm::Module &M){ errs() << "=============start=============\n"; auto F = M.getFunction("main"); LoopInfo &LI = getAnalysis<LoopInfo>(F); LI.print(errs()); errs() << "==========================\n"; } static RegisterPass<SkeletonPass> X("run", "Hello world pass", false, false); The version of LLVM is 6.0.1, can anyone tell me the correct way to handle this in a module pass? Thanks a lot! Best, Liu -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190402/e5bdc3b5/attachment.html>
Jonathan Smith via llvm-dev
2019-Apr-02 14:24 UTC
[llvm-dev] How can I use llvm::LoopInfo in the runOnModule method?
It should be `LoopInfoWrapperPass` instead of just `LoopInfo`, but you can also get the same information if you manually construct a dominator tree and target info first and pass those to the LoopInfo constructor. On Tue, Apr 2, 2019 at 2:48 AM J Skye via llvm-dev <llvm-dev at lists.llvm.org> wrote:> > Hi all, > > > I tried to have a LoopInfo object in a function pass, and add addRequired in getAnalysisUsage, and then use getAnalysis in runOnFunction(). It worked OK. > Now I want to have a module pass to traverse the functions, and similarly, I want to have to loop information of the functions. > When I did the above in runOnModule, and build the module pass, the following error popped out, and the compile did not succeed: > > [ 50%] Building CXX object src/CMakeFiles/SkeletonPass.dir/Skeleton.cpp.o > /home/**/Desktop/skeleton/src/Skeleton.cpp: In member function ‘virtual bool llvm::SkeletonPass::runOnModule(llvm::Module&)’: > /home/**/Desktop/skeleton/src/Skeleton.cpp:47:43: error: no matching function for call to ‘llvm::SkeletonPass::getAnalysis(llvm::Function*&)’ > LoopInfo &LI = getAnalysis<LoopInfo>(F); > > ... > home/**/Work/llvm-6.0.1.src/include/llvm/PassAnalysisSupport.h: In instantiation of ‘llvm::AnalysisUsage& llvm::AnalysisUsage::addRequired() [with PassClass = llvm::LoopInfo]’: > /home/**/Desktop/skeleton/src/Skeleton.cpp:24:38: required from here > /home/**/Work/llvm-6.0.1.src/include/llvm/PassAnalysisSupport.h:67:39: error: ‘ID’ is not a member of ‘llvm::LoopInfo’ > return addRequiredID(PassClass::ID); > ^ > > Here is my source code: > > #include "llvm/Pass.h" > #include "llvm/IR/Function.h" > #include "llvm/IR/Module.h" > #include "llvm/Support/raw_ostream.h" > #include "llvm/IR/Dominators.h" > #include "llvm/Analysis/LoopInfo.h" > > namespace llvm > { > class SkeletonPass : public ModulePass > { > public: > static char ID; > SkeletonPass() : ModulePass(ID) {} > bool runOnModule(Module &M) override; > virtual StringRef getPassName() const override > { > return "Skeleton"; > } > virtual void getAnalysisUsage(AnalysisUsage &AU) const override { > errs() << "get analysis usage method.\n"; > AU.addRequired<LoopInfo>(); > } > }; > > Pass *createSkeletonPass() > { > return new SkeletonPass(); > } > > char SkeletonPass::ID = 0; > Pass *createSkeletonPass(); > void initializeSkeletonPass(PassRegistry &Registry); > > > } // namespace llvm > > using namespace llvm; > using namespace std; > > > bool SkeletonPass::runOnModule(llvm::Module &M){ > errs() << "=============start=============\n"; > auto F = M.getFunction("main"); > LoopInfo &LI = getAnalysis<LoopInfo>(F); > > LI.print(errs()); > errs() << "==========================\n"; > } > > static RegisterPass<SkeletonPass> X("run", "Hello world pass", false, false); > > The version of LLVM is 6.0.1, can anyone tell me the correct way to handle this in a module pass? Thanks a lot! > > Best, > Liu > > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
David Greene via llvm-dev
2019-Apr-03 16:40 UTC
[llvm-dev] How can I use llvm::LoopInfo in the runOnModule method?
Interesting that we're getting a relative flood of these recently. See here: http://lists.llvm.org/pipermail/llvm-dev/2019-March/131346.html I don't think one can reliably get a Function analysis pass from within a ModulePass using the legacy pass manager. You have to manually construct the pass yourself. -David Jonathan Smith via llvm-dev <llvm-dev at lists.llvm.org> writes:> It should be `LoopInfoWrapperPass` instead of just `LoopInfo`, but you > can also get the same information if you manually construct a > dominator tree and target info first and pass those to the LoopInfo > constructor. > > On Tue, Apr 2, 2019 at 2:48 AM J Skye via llvm-dev > <llvm-dev at lists.llvm.org> wrote: >> >> Hi all, >> >> >> I tried to have a LoopInfo object in a function pass, and add addRequired in getAnalysisUsage, and then use getAnalysis in runOnFunction(). It worked OK. >> Now I want to have a module pass to traverse the functions, and similarly, I want to have to loop information of the functions. >> When I did the above in runOnModule, and build the module pass, the following error popped out, and the compile did not succeed: >> >> [ 50%] Building CXX object src/CMakeFiles/SkeletonPass.dir/Skeleton.cpp.o >> /home/**/Desktop/skeleton/src/Skeleton.cpp: In member function ‘virtual bool llvm::SkeletonPass::runOnModule(llvm::Module&)’: >> /home/**/Desktop/skeleton/src/Skeleton.cpp:47:43: error: no matching function for call to ‘llvm::SkeletonPass::getAnalysis(llvm::Function*&)’ >> LoopInfo &LI = getAnalysis<LoopInfo>(F); >> >> ... >> home/**/Work/llvm-6.0.1.src/include/llvm/PassAnalysisSupport.h: In instantiation of ‘llvm::AnalysisUsage& llvm::AnalysisUsage::addRequired() [with PassClass = llvm::LoopInfo]’: >> /home/**/Desktop/skeleton/src/Skeleton.cpp:24:38: required from here >> /home/**/Work/llvm-6.0.1.src/include/llvm/PassAnalysisSupport.h:67:39: error: ‘ID’ is not a member of ‘llvm::LoopInfo’ >> return addRequiredID(PassClass::ID); >> ^ >> >> Here is my source code: >> >> #include "llvm/Pass.h" >> #include "llvm/IR/Function.h" >> #include "llvm/IR/Module.h" >> #include "llvm/Support/raw_ostream.h" >> #include "llvm/IR/Dominators.h" >> #include "llvm/Analysis/LoopInfo.h" >> >> namespace llvm >> { >> class SkeletonPass : public ModulePass >> { >> public: >> static char ID; >> SkeletonPass() : ModulePass(ID) {} >> bool runOnModule(Module &M) override; >> virtual StringRef getPassName() const override >> { >> return "Skeleton"; >> } >> virtual void getAnalysisUsage(AnalysisUsage &AU) const override { >> errs() << "get analysis usage method.\n"; >> AU.addRequired<LoopInfo>(); >> } >> }; >> >> Pass *createSkeletonPass() >> { >> return new SkeletonPass(); >> } >> >> char SkeletonPass::ID = 0; >> Pass *createSkeletonPass(); >> void initializeSkeletonPass(PassRegistry &Registry); >> >> >> } // namespace llvm >> >> using namespace llvm; >> using namespace std; >> >> >> bool SkeletonPass::runOnModule(llvm::Module &M){ >> errs() << "=============start=============\n"; >> auto F = M.getFunction("main"); >> LoopInfo &LI = getAnalysis<LoopInfo>(F); >> >> LI.print(errs()); >> errs() << "==========================\n"; >> } >> >> static RegisterPass<SkeletonPass> X("run", "Hello world pass", false, false); >> >> The version of LLVM is 6.0.1, can anyone tell me the correct way to handle this in a module pass? Thanks a lot! >> >> Best, >> Liu >> >> _______________________________________________ >> LLVM Developers mailing list >> llvm-dev at lists.llvm.org >> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev_______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev