From 0f53443d827491502a4f56728a383ea8b39cf3dd Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Mon, 24 Mar 2014 22:38:38 +0000 Subject: [PATCH] DebugInfo: Simplify debug loc list handling by keeping separate lists Rather than using a flat list with "empty" entries (ala the actual on-disk format), keep separate lists for each variable. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204680 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/AsmPrinter/DIEHash.cpp | 18 +++--------------- lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 27 +++++++++++---------------- lib/CodeGen/AsmPrinter/DwarfDebug.h | 5 +++-- 3 files changed, 17 insertions(+), 33 deletions(-) diff --git a/lib/CodeGen/AsmPrinter/DIEHash.cpp b/lib/CodeGen/AsmPrinter/DIEHash.cpp index 0f5e8fb5b4b..9756054b285 100644 --- a/lib/CodeGen/AsmPrinter/DIEHash.cpp +++ b/lib/CodeGen/AsmPrinter/DIEHash.cpp @@ -283,22 +283,10 @@ void DIEHash::hashBlockData(const SmallVectorImpl &Values) { // Hash the contents of a loclistptr class. void DIEHash::hashLocList(const DIELocList &LocList) { - SmallVectorImpl::const_iterator Start = - AP->getDwarfDebug()->getDebugLocEntries().begin(); - Start += LocList.getValue(); HashingByteStreamer Streamer(*this); - for (SmallVectorImpl::const_iterator - I = Start, - E = AP->getDwarfDebug()->getDebugLocEntries().end(); - I != E; ++I) { - const DebugLocEntry &Entry = *I; - // Go through the entries until we hit the end of the list, - // which is the next empty entry. - if (Entry.isEmpty()) - return; - else - AP->getDwarfDebug()->emitDebugLocEntry(Streamer, Entry); - } + for (const auto &Entry : + AP->getDwarfDebug()->getDebugLocEntries()[LocList.getValue()]) + AP->getDwarfDebug()->emitDebugLocEntry(Streamer, Entry); } // Hash an individual attribute \param Attr based on the type of attribute and diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 3f794ad8ff5..c50243af083 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -1260,6 +1260,7 @@ DwarfDebug::collectVariableInfo(SmallPtrSet &Processed) { // Handle multiple DBG_VALUE instructions describing one variable. RegVar->setDotDebugLocOffset(DotDebugLocEntries.size()); + SmallVector DebugLoc; for (SmallVectorImpl::const_iterator HI = History.begin(), HE = History.end(); @@ -1298,10 +1299,10 @@ DwarfDebug::collectVariableInfo(SmallPtrSet &Processed) { LexicalScope *FnScope = LScopes.getCurrentFunctionScope(); DwarfCompileUnit *TheCU = SPMap.lookup(FnScope->getScopeNode()); DebugLocEntry Loc = getDebugLocEntry(Asm, FLabel, SLabel, Begin, TheCU); - if (DotDebugLocEntries.empty() || !DotDebugLocEntries.back().Merge(Loc)) - DotDebugLocEntries.push_back(std::move(Loc)); + if (DebugLoc.empty() || !DebugLoc.back().Merge(Loc)) + DebugLoc.push_back(std::move(Loc)); } - DotDebugLocEntries.push_back(DebugLocEntry()); + DotDebugLocEntries.push_back(std::move(DebugLoc)); } // Collect info for variables that were optimized out. @@ -2383,19 +2384,10 @@ void DwarfDebug::emitDebugLoc() { Asm->OutStreamer.SwitchSection( Asm->getObjFileLowering().getDwarfLocSection()); unsigned char Size = Asm->getDataLayout().getPointerSize(); - Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", 0)); - unsigned index = 1; - for (SmallVectorImpl::const_iterator - I = DotDebugLocEntries.begin(), - E = DotDebugLocEntries.end(); - I != E; ++I, ++index) { - const DebugLocEntry &Entry = *I; - - if (Entry.isEmpty()) { - Asm->OutStreamer.EmitIntValue(0, Size); - Asm->OutStreamer.EmitIntValue(0, Size); - Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index)); - } else { + unsigned index = 0; + for (const auto &DebugLoc : DotDebugLocEntries) { + Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index)); + for (const auto &Entry : DebugLoc) { // Set up the range. This range is relative to the entry point of the // compile unit. This is a hard coded 0 for low_pc when we're emitting // ranges, or the DW_AT_low_pc on the compile unit otherwise. @@ -2420,6 +2412,9 @@ void DwarfDebug::emitDebugLoc() { // Close the range. Asm->OutStreamer.EmitLabel(end); } + Asm->OutStreamer.EmitIntValue(0, Size); + Asm->OutStreamer.EmitIntValue(0, Size); + ++index; } } diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.h b/lib/CodeGen/AsmPrinter/DwarfDebug.h index 2d073e380c0..064c0fa7624 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -366,7 +366,7 @@ class DwarfDebug : public AsmPrinterHandler { DenseMap AbstractVariables; // Collection of DebugLocEntry. - SmallVector DotDebugLocEntries; + SmallVector, 4> DotDebugLocEntries; // Collection of subprogram DIEs that are marked (at the end of the module) // as DW_AT_inline. @@ -763,7 +763,8 @@ public: const DwarfCompileUnit *getPrevCU() const { return PrevCU; } /// Returns the entries for the .debug_loc section. - const SmallVectorImpl &getDebugLocEntries() const { + const SmallVectorImpl> & + getDebugLocEntries() const { return DotDebugLocEntries; }