[llvm] r220536 - Make getDISubprogram(const Function *F) available in LLVM

David Majnemer david.majnemer at gmail.com
Fri Oct 24 13:52:20 PDT 2014


On Fri, Oct 24, 2014 at 12:05 PM, David Blaikie <dblaikie at gmail.com> wrote:

>
>
> On Fri, Oct 24, 2014 at 11:41 AM, Timur Iskhodzhanov <timurrrr at google.com>
> wrote:
>
>> 2014-10-23 18:49 GMT-07:00 David Blaikie <dblaikie at gmail.com>:
>> >
>> >
>> > On Thu, Oct 23, 2014 at 6:21 PM, Timur Iskhodzhanov <
>> timurrrr at google.com>
>> > wrote:
>> >>
>> >> 2014-10-23 18:10 GMT-07:00 David Blaikie <dblaikie at gmail.com>:
>> >> >
>> >> >
>> >> > On Thu, Oct 23, 2014 at 4:46 PM, Timur Iskhodzhanov
>> >> > <timurrrr at google.com>
>> >> > wrote:
>> >> >>
>> >> >> Author: timurrrr
>> >> >> Date: Thu Oct 23 18:46:28 2014
>> >> >> New Revision: 220536
>> >> >>
>> >> >> URL: http://llvm.org/viewvc/llvm-project?rev=220536&view=rev
>> >> >> Log:
>> >> >> Make getDISubprogram(const Function *F) available in LLVM
>> >> >>
>> >> >> Reviewed at http://reviews.llvm.org/D5950
>> >> >>
>> >> >> Modified:
>> >> >>     llvm/trunk/include/llvm/IR/DebugInfo.h
>> >> >>     llvm/trunk/lib/IR/DebugInfo.cpp
>> >> >>     llvm/trunk/lib/Transforms/Scalar/SampleProfile.cpp
>> >> >>
>> >> >> Modified: llvm/trunk/include/llvm/IR/DebugInfo.h
>> >> >> URL:
>> >> >>
>> >> >>
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/DebugInfo.h?rev=220536&r1=220535&r2=220536&view=diff
>> >> >>
>> >> >>
>> >> >>
>> ==============================================================================
>> >> >> --- llvm/trunk/include/llvm/IR/DebugInfo.h (original)
>> >> >> +++ llvm/trunk/include/llvm/IR/DebugInfo.h Thu Oct 23 18:46:28 2014
>> >> >> @@ -961,6 +961,11 @@ public:
>> >> >>  /// \brief Find subprogram that is enclosing this scope.
>> >> >>  DISubprogram getDISubprogram(const MDNode *Scope);
>> >> >>
>> >> >> +/// \brief Find debug info for a given function.
>> >> >> +/// \returns a valid DISubprogram, if found. Otherwise, it returns
>> an
>> >> >> empty
>> >> >> +/// DISubprogram.
>> >> >> +DISubprogram getDISubprogram(const Function *F);
>> >> >> +
>> >> >>  /// \brief Find underlying composite type.
>> >> >>  DICompositeType getDICompositeType(DIType T);
>> >> >>
>> >> >>
>> >> >> Modified: llvm/trunk/lib/IR/DebugInfo.cpp
>> >> >> URL:
>> >> >>
>> >> >>
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugInfo.cpp?rev=220536&r1=220535&r2=220536&view=diff
>> >> >>
>> >> >>
>> >> >>
>> ==============================================================================
>> >> >> --- llvm/trunk/lib/IR/DebugInfo.cpp (original)
>> >> >> +++ llvm/trunk/lib/IR/DebugInfo.cpp Thu Oct 23 18:46:28 2014
>> >> >> @@ -912,6 +912,24 @@ DISubprogram llvm::getDISubprogram(const
>> >> >>    return DISubprogram();
>> >> >>  }
>> >> >>
>> >> >> +DISubprogram llvm::getDISubprogram(const Function *F) {
>> >> >> +  // We look for the first instr that has a debug annotation
>> leading
>> >> >> back
>> >> >> to F.
>> >> >> +  const LLVMContext &Ctx = F->getParent()->getContext();
>> >> >> +  for (auto &BB : *F) {
>> >> >> +    for (auto &Inst : BB.getInstList()) {
>> >> >> +      DebugLoc DLoc = Inst.getDebugLoc();
>> >> >> +      if (DLoc.isUnknown())
>> >> >> +        continue;
>> >> >> +      const MDNode *Scope = DLoc.getScopeNode(Ctx);
>> >> >> +      DISubprogram Subprogram = getDISubprogram(Scope);
>> >> >> +      if (Subprogram.describes(F))
>> >> >> +       return Subprogram;
>> >> >
>> >> >
>> >> > You've changed this in the moving - it used to return on the first
>> >> > Instruction with DebugInfo, now it keeps searching.
>> >>
>> >> Yep – we thought the original version was slightly incorrect?
>> >
>> >
>> > We? (sorry, perhaps I missed some IRC conversation, etc) - this was
>> > discussed in code review/on IRC when I described the idea to Diego
>> > originally. What problem were you seeing/thinking of?
>>
>> Me and David Majnemer.
>> There's no particular problem we were trying to fix, but we just kind
>> of thought the function can try a bit harder than it did.
>> Is this a wrong approach?
>>
>
> There's no need for it to try harder. It's a (recently established)
> invariant that if a function has debug info (if the function appears in a
> CU's subprogram list) then all instructions in that function which have
> debug locs will chain up to that function and nowhere else.
>
> So as soon as you find a debug loc, either you've found the subprogram or
> you can stop searching because this function doesn't have debug info  (it
> might have debug locs inlined into it from some debug-having function, but
> the function itself does not - these debuglocs are kept around so that if
> the non-debug-having function is later inlined into a debug-having
> function, that all works properly)
>
> Make sense?
>

This makes sense.  I think it was the loop structure which seemed irregular
and lead us to believe that something might be wrong.

I think it's a bit more clear when written like:
DISubprogram llvm::getDISubprogram(const Function *F) {
  // We look for the first instr that has a debug annotation leading back
to F.
  for (auto &BB : *F) {
    auto Inst = std::find_if(BB.begin(), BB.end(), [](const Instruction
&Inst) {
      return !Inst.getDebugLoc().isUnknown();
    });
    if (Inst != BB.end()) {
      DebugLoc DLoc = Inst->getDebugLoc();
      const MDNode *Scope = DLoc.getScopeNode(F->getParent()->getContext());
      DISubprogram Subprogram = getDISubprogram(Scope);
      return Subprogram.describes(F) ? Subprogram : DISubprogram();
    }
  }

  return DISubprogram();
}


>
>
>>
>> >> > (also, we could change this function to take a reference instead of a
>> >> > pointer - I was going to make that change when I saw this semantic
>> >> > change
>> >> > that caught me by surprise)
>> >> >
>> >> >>
>> >> >> +    }
>> >> >> +  }
>> >> >> +
>> >> >> +  return DISubprogram();
>> >> >> +}
>> >> >> +
>> >> >>  DICompositeType llvm::getDICompositeType(DIType T) {
>> >> >>    if (T.isCompositeType())
>> >> >>      return DICompositeType(T);
>> >> >>
>> >> >> Modified: llvm/trunk/lib/Transforms/Scalar/SampleProfile.cpp
>> >> >> URL:
>> >> >>
>> >> >>
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SampleProfile.cpp?rev=220536&r1=220535&r2=220536&view=diff
>> >> >>
>> >> >>
>> >> >>
>> ==============================================================================
>> >> >> --- llvm/trunk/lib/Transforms/Scalar/SampleProfile.cpp (original)
>> >> >> +++ llvm/trunk/lib/Transforms/Scalar/SampleProfile.cpp Thu Oct 23
>> >> >> 18:46:28
>> >> >> 2014
>> >> >> @@ -627,29 +627,6 @@ void SampleProfileLoader::propagateWeigh
>> >> >>    }
>> >> >>  }
>> >> >>
>> >> >> -/// \brief Locate the DISubprogram for F.
>> >> >> -///
>> >> >> -/// We look for the first instruction that has a debug annotation
>> >> >> -/// leading back to \p F.
>> >> >> -///
>> >> >> -/// \returns a valid DISubprogram, if found. Otherwise, it returns
>> an
>> >> >> empty
>> >> >> -/// DISubprogram.
>> >> >> -static const DISubprogram getDISubprogram(Function &F, const
>> >> >> LLVMContext
>> >> >> &Ctx) {
>> >> >> -  for (auto &BI : F) {
>> >> >> -    BasicBlock *BB = &BI;
>> >> >> -    for (auto &Inst : BB->getInstList()) {
>> >> >> -      DebugLoc DLoc = Inst.getDebugLoc();
>> >> >> -      if (DLoc.isUnknown())
>> >> >> -        continue;
>> >> >> -      const MDNode *Scope = DLoc.getScopeNode(Ctx);
>> >> >> -      DISubprogram Subprogram = getDISubprogram(Scope);
>> >> >> -      return Subprogram.describes(&F) ? Subprogram :
>> DISubprogram();
>> >> >> -    }
>> >> >> -  }
>> >> >> -
>> >> >> -  return DISubprogram();
>> >> >> -}
>> >> >> -
>> >> >>  /// \brief Get the line number for the function header.
>> >> >>  ///
>> >> >>  /// This looks up function \p F in the current compilation unit and
>> >> >> @@ -662,7 +639,7 @@ static const DISubprogram getDISubprogra
>> >> >>  /// \returns the line number where \p F is defined. If it returns
>> 0,
>> >> >>  ///          it means that there is no debug information available
>> for
>> >> >> \p
>> >> >> F.
>> >> >>  unsigned SampleProfileLoader::getFunctionLoc(Function &F) {
>> >> >> -  const DISubprogram &S = getDISubprogram(F, *Ctx);
>> >> >> +  DISubprogram S = getDISubprogram(&F);
>> >> >>    if (S.isSubprogram())
>> >> >>      return S.getLineNumber();
>> >> >>
>> >> >>
>> >> >>
>> >> >> _______________________________________________
>> >> >> llvm-commits mailing list
>> >> >> llvm-commits at cs.uiuc.edu
>> >> >> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>> >> >
>> >> >
>> >
>> >
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141024/48fc1b97/attachment.html>


More information about the llvm-commits mailing list