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

David Blaikie dblaikie at gmail.com
Fri Oct 24 13:59:24 PDT 2014


On Fri, Oct 24, 2014 at 1:52 PM, David Majnemer <david.majnemer at gmail.com>
wrote:

> 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();
>     });
>

& I here I had been trying to figure out a way to use STL algorithms here
just to mess with Diego.

Looks good to me.

(I wonder if we should have some iterator utilities to make it easy to
iterate over all instructions in a function without having to explicitly
mention basic blocks, for example)


>     if (Inst != BB.end()) {
>

Maybe early-continue:

  if (Inst == BB.end())
    continue;

?


>       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/8f606fb6/attachment.html>


More information about the llvm-commits mailing list