From: Timur Iskhodzhanov Date: Thu, 23 Oct 2014 23:46:28 +0000 (+0000) Subject: Make getDISubprogram(const Function *F) available in LLVM X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=da45b2bdbd92af261ca8ff18069fb0a988e5963d Make getDISubprogram(const Function *F) available in LLVM Reviewed at http://reviews.llvm.org/D5950 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@220536 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/IR/DebugInfo.h b/include/llvm/IR/DebugInfo.h index 63fbe60ded5..2a248e88a06 100644 --- a/include/llvm/IR/DebugInfo.h +++ b/include/llvm/IR/DebugInfo.h @@ -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); diff --git a/lib/IR/DebugInfo.cpp b/lib/IR/DebugInfo.cpp index 04eb65bc2a7..56b06230e22 100644 --- a/lib/IR/DebugInfo.cpp +++ b/lib/IR/DebugInfo.cpp @@ -912,6 +912,24 @@ DISubprogram llvm::getDISubprogram(const MDNode *Scope) { 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; + } + } + + return DISubprogram(); +} + DICompositeType llvm::getDICompositeType(DIType T) { if (T.isCompositeType()) return DICompositeType(T); diff --git a/lib/Transforms/Scalar/SampleProfile.cpp b/lib/Transforms/Scalar/SampleProfile.cpp index 4f746577f8e..fedbcf3a7c0 100644 --- a/lib/Transforms/Scalar/SampleProfile.cpp +++ b/lib/Transforms/Scalar/SampleProfile.cpp @@ -627,29 +627,6 @@ void SampleProfileLoader::propagateWeights(Function &F) { } } -/// \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 getDISubprogram(Function &F, const LLVMContext &Ctx) { /// \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();