<div dir="ltr">To whom it may concern,<div><br></div><div>I'm writing a LLVM ModulePass as a part of my undergraduate dissertation and I need to keep a list of pointers to all Loops within a Module.</div><div>I've tried the following bit of code (inside a runOnModule() method in my ModulePass, I also have getAnalysisUsage setup properly with LoopInfo added as required)</div><div><br></div><div><div><font face="monospace">  std::vector<Loop*> loops;</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">  for (Module::iterator F = M.begin(), FEND = M.end(); F != FEND; ++F){</font></div><div><font face="monospace">    if (!(*F).isDeclaration()){</font></div><div><font face="monospace">      LoopInfo& LI = getAnalysis<LoopInfo>(*F);</font></div><div><font face="monospace">      for(LoopInfo::iterator l = LI.begin(), lend = LI.end(); l != lend; ++l){</font></div><div><font face="monospace">        loops.push_back(*l);</font></div><div><font face="monospace">      }</font></div><div><font face="monospace">    }</font></div><div><font face="monospace">  }</font></div></div><div><br></div><div>However, if I try to print out the loops with </div><div><br></div><div><div><font face="monospace">  for(auto l: loops){</font></div><div><font face="monospace">    errs() << *l << "\n";</font></div><div><font face="monospace">  }</font></div></div><div><font face="monospace"><br></font></div><div><font face="arial, helvetica, sans-serif">I get runtime errors. Now, I understand why this is happening - the LoopInfo object is not living between iterations of the outermost loop and thus all pointers are invalidated. I tried keep a pair std::pair<Function*, int> of a function pointer and the corresponding position of the loop in the list from LI.begin() to LI.end() but this causes runtime exceptions as well. The code for that looks like this:</font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><div><font face="monospace">  std::vector<std::pair<Function*,int>> loops;</font></div><div><font face="monospace">  for (Module::iterator F = M.begin(), FEND = M.end(); F != FEND; ++F){</font></div><div><font face="monospace">    if (!(*F).isDeclaration()){</font></div><div><font face="monospace">      LoopInfo& LI = getAnalysis<LoopInfo>(*F);</font></div><div><font face="monospace">      int count = 0;</font></div><div><font face="monospace">      for(LoopInfo::iterator l = LI.begin(), lend = LI.end(); l != lend; ++l){</font></div><div><font face="monospace">        if ((*l)->getLoopDepth() == 0) errs() << **l <<"\n";</font></div><div><font face="monospace">        loops.push_back(std::make_pair(F,count));</font></div><div><font face="monospace">        ++count;</font></div><div><font face="monospace">      }</font></div><div><font face="monospace">    }</font></div><div><font face="monospace">  }</font></div><div><font face="monospace">  for(auto l: loops){</font></div><div><font face="monospace">    LoopInfo& LI = getAnalysis<LoopInfo>(*l.first);</font></div><div><font face="monospace">    errs() << *(*(LI.begin()) + l.second) << "\n";</font></div><div><font face="monospace">  }</font></div></div><div><font face="monospace"><br></font></div><div><font face="monospace">However, no luck again. Is there any way to keep pointers to all loops in a Module Pass?</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">Thanks,</font></div><div><font face="monospace"><br></font></div><div><font face="monospace">Bilyan</font></div></div>