[llvm] r220536 - Make getDISubprogram(const Function *F) available in LLVM
David Blaikie
dblaikie at gmail.com
Fri Oct 24 12:05:35 PDT 2014
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?
>
> >> > (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/3666dd3d/attachment.html>
More information about the llvm-commits
mailing list