From 4be00b7013661e64730a6369fbef1059db809ddf Mon Sep 17 00:00:00 2001 From: Justin Bogner Date: Sat, 18 Feb 2017 02:00:27 +0000 Subject: [PATCH] OptDiag: Allow constructing DiagnosticLocation from DISubprograms This avoids creating a DILocation just to represent a line number, since creating Metadata is expensive. Creating a DiagnosticLocation directly is much cheaper. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@295531 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/IR/DiagnosticInfo.h | 1 + lib/IR/DiagnosticInfo.cpp | 10 +++++++++- lib/Transforms/IPO/WholeProgramDevirt.cpp | 3 +-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/include/llvm/IR/DiagnosticInfo.h b/include/llvm/IR/DiagnosticInfo.h index cf52474423e..e06fb4bdaef 100644 --- a/include/llvm/IR/DiagnosticInfo.h +++ b/include/llvm/IR/DiagnosticInfo.h @@ -354,6 +354,7 @@ class DiagnosticLocation { public: DiagnosticLocation() {} DiagnosticLocation(const DebugLoc &DL); + DiagnosticLocation(const DISubprogram *SP); bool isValid() const { return !Filename.empty(); } StringRef getFilename() const { return Filename; } diff --git a/lib/IR/DiagnosticInfo.cpp b/lib/IR/DiagnosticInfo.cpp index 9526614796e..2af2ab9d7a9 100644 --- a/lib/IR/DiagnosticInfo.cpp +++ b/lib/IR/DiagnosticInfo.cpp @@ -156,6 +156,14 @@ DiagnosticLocation::DiagnosticLocation(const DebugLoc &DL) { Column = DL->getColumn(); } +DiagnosticLocation::DiagnosticLocation(const DISubprogram *SP) { + if (!SP) + return; + Filename = SP->getFilename(); + Line = SP->getScopeLine(); + Column = 0; +} + void DiagnosticInfoWithLocationBase::getLocation(StringRef *Filename, unsigned *Line, unsigned *Column) const { @@ -177,7 +185,7 @@ DiagnosticInfoOptimizationBase::Argument::Argument(StringRef Key, const Value *V : Key(Key) { if (auto *F = dyn_cast(V)) { if (DISubprogram *SP = F->getSubprogram()) - Loc = DebugLoc::get(SP->getScopeLine(), 0, SP); + Loc = SP; } else if (auto *I = dyn_cast(V)) Loc = I->getDebugLoc(); diff --git a/lib/Transforms/IPO/WholeProgramDevirt.cpp b/lib/Transforms/IPO/WholeProgramDevirt.cpp index 7470d46c1c0..c6457211c9e 100644 --- a/lib/Transforms/IPO/WholeProgramDevirt.cpp +++ b/lib/Transforms/IPO/WholeProgramDevirt.cpp @@ -1077,8 +1077,7 @@ bool DevirtModule::run() { for (const auto &DT : DevirtTargets) { Function *F = DT.second; DISubprogram *SP = F->getSubprogram(); - DebugLoc DL = SP ? DebugLoc::get(SP->getScopeLine(), 0, SP) : DebugLoc(); - emitOptimizationRemark(F->getContext(), DEBUG_TYPE, *F, DL, + emitOptimizationRemark(F->getContext(), DEBUG_TYPE, *F, SP, Twine("devirtualized ") + F->getName()); } } -- 2.50.1