From 7385c3207c5fa893abe91cf75e95ed36f64caf40 Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Mon, 24 Mar 2014 22:27:06 +0000 Subject: [PATCH] DwarfDebug: Simplify debug_loc merging No functional change intended. Merging up-front rather than delaying this task until later. This just seems simpler and more efficient (avoiding growing the debug loc list only to have to skip over those post-merged entries, etc). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204679 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/AsmPrinter/DIEHash.cpp | 2 -- lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 16 +++------------- lib/CodeGen/AsmPrinter/DwarfDebug.h | 24 ++++++++++-------------- 3 files changed, 13 insertions(+), 29 deletions(-) diff --git a/lib/CodeGen/AsmPrinter/DIEHash.cpp b/lib/CodeGen/AsmPrinter/DIEHash.cpp index d59622e1495..0f5e8fb5b4b 100644 --- a/lib/CodeGen/AsmPrinter/DIEHash.cpp +++ b/lib/CodeGen/AsmPrinter/DIEHash.cpp @@ -296,8 +296,6 @@ void DIEHash::hashLocList(const DIELocList &LocList) { // which is the next empty entry. if (Entry.isEmpty()) return; - else if (Entry.isMerged()) - continue; else AP->getDwarfDebug()->emitDebugLocEntry(Streamer, Entry); } diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index ba81adbff85..3f794ad8ff5 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -1297,8 +1297,9 @@ DwarfDebug::collectVariableInfo(SmallPtrSet &Processed) { // The value is valid until the next DBG_VALUE or clobber. LexicalScope *FnScope = LScopes.getCurrentFunctionScope(); DwarfCompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode()); - DotDebugLocEntries.push_back( - getDebugLocEntry(Asm, FLabel, SLabel, Begin, TheCU)); + DebugLocEntry Loc = getDebugLocEntry(Asm, FLabel, SLabel, Begin, TheCU); + if (DotDebugLocEntries.empty() || !DotDebugLocEntries.back().Merge(Loc)) + DotDebugLocEntries.push_back(std::move(Loc)); } DotDebugLocEntries.push_back(DebugLocEntry()); } @@ -2378,15 +2379,6 @@ void DwarfDebug::emitDebugLoc() { if (DotDebugLocEntries.empty()) return; - for (SmallVectorImpl::iterator - I = DotDebugLocEntries.begin(), - E = DotDebugLocEntries.end(); - I != E; ++I) { - DebugLocEntry &Entry = *I; - if (I + 1 != DotDebugLocEntries.end()) - Entry.Merge(I + 1); - } - // Start the dwarf loc section. Asm->OutStreamer.SwitchSection( Asm->getObjFileLowering().getDwarfLocSection()); @@ -2398,8 +2390,6 @@ void DwarfDebug::emitDebugLoc() { E = DotDebugLocEntries.end(); I != E; ++I, ++index) { const DebugLocEntry &Entry = *I; - if (Entry.isMerged()) - continue; if (Entry.isEmpty()) { Asm->OutStreamer.EmitIntValue(0, Size); diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.h b/lib/CodeGen/AsmPrinter/DwarfDebug.h index 71ea0fb4e72..2d073e380c0 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -84,34 +84,31 @@ class DebugLocEntry { // The compile unit to which this location entry is referenced by. const DwarfCompileUnit *Unit; - // Whether this location has been merged. - bool Merged; - public: - DebugLocEntry() : Begin(0), End(0), Variable(0), Unit(0), Merged(false) { + DebugLocEntry() : Begin(0), End(0), Variable(0), Unit(0) { Constants.Int = 0; } DebugLocEntry(const MCSymbol *B, const MCSymbol *E, MachineLocation &L, const MDNode *V, const DwarfCompileUnit *U) - : Begin(B), End(E), Loc(L), Variable(V), Unit(U), Merged(false) { + : Begin(B), End(E), Loc(L), Variable(V), Unit(U) { Constants.Int = 0; EntryKind = E_Location; } DebugLocEntry(const MCSymbol *B, const MCSymbol *E, int64_t i, const DwarfCompileUnit *U) - : Begin(B), End(E), Variable(0), Unit(U), Merged(false) { + : Begin(B), End(E), Variable(0), Unit(U) { Constants.Int = i; EntryKind = E_Integer; } DebugLocEntry(const MCSymbol *B, const MCSymbol *E, const ConstantFP *FPtr, const DwarfCompileUnit *U) - : Begin(B), End(E), Variable(0), Unit(U), Merged(false) { + : Begin(B), End(E), Variable(0), Unit(U) { Constants.CFP = FPtr; EntryKind = E_ConstantFP; } DebugLocEntry(const MCSymbol *B, const MCSymbol *E, const ConstantInt *IPtr, const DwarfCompileUnit *U) - : Begin(B), End(E), Variable(0), Unit(U), Merged(false) { + : Begin(B), End(E), Variable(0), Unit(U) { Constants.CIP = IPtr; EntryKind = E_ConstantInt; } @@ -119,12 +116,11 @@ public: /// \brief Empty entries are also used as a trigger to emit temp label. Such /// labels are referenced is used to find debug_loc offset for a given DIE. bool isEmpty() const { return Begin == 0 && End == 0; } - bool isMerged() const { return Merged; } - void Merge(DebugLocEntry *Next) { - if (!(Begin && Loc == Next->Loc && End == Next->Begin)) - return; - Next->Begin = Begin; - Merged = true; + bool Merge(const DebugLocEntry &Next) { + if (!(Begin && Loc == Next.Loc && End == Next.Begin)) + return false; + End = Next.End; + return true; } bool isLocation() const { return EntryKind == E_Location; } bool isInt() const { return EntryKind == E_Integer; } -- 2.34.1