Index: include/llvm/IR/DebugInfo.h =================================================================== --- include/llvm/IR/DebugInfo.h +++ include/llvm/IR/DebugInfo.h @@ -961,6 +961,11 @@ /// \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); Index: lib/IR/DebugInfo.cpp =================================================================== --- lib/IR/DebugInfo.cpp +++ lib/IR/DebugInfo.cpp @@ -912,6 +912,24 @@ 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); Index: lib/Transforms/Scalar/SampleProfile.cpp =================================================================== --- lib/Transforms/Scalar/SampleProfile.cpp +++ lib/Transforms/Scalar/SampleProfile.cpp @@ -627,29 +627,6 @@ } } -/// \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 @@ /// \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();