diff --git a/lib/CodeGen/AsmPrinter/DIE.cpp b/lib/CodeGen/AsmPrinter/DIE.cpp index cea9df14dfc..26e8f2da853 100644 --- a/lib/CodeGen/AsmPrinter/DIE.cpp +++ b/lib/CodeGen/AsmPrinter/DIE.cpp @@ -560,7 +560,7 @@ unsigned DIELocList::SizeOf(AsmPrinter *AP, dwarf::Form Form) const { /// void DIELocList::EmitValue(AsmPrinter *AP, dwarf::Form Form) const { DwarfDebug *DD = AP->getDwarfDebug(); - MCSymbol *Label = AP->GetTempSymbol("debug_loc", Index); + MCSymbol *Label = DD->getDebugLocEntries()[Index].Label; if (AP->MAI->doesDwarfUseRelocationsAcrossSections() && !DD->useSplitDwarf()) AP->EmitSectionOffset(Label, DD->getDebugLocSym()); diff --git a/lib/CodeGen/AsmPrinter/DIEHash.cpp b/lib/CodeGen/AsmPrinter/DIEHash.cpp index 9756054b285..74beec1c955 100644 --- a/lib/CodeGen/AsmPrinter/DIEHash.cpp +++ b/lib/CodeGen/AsmPrinter/DIEHash.cpp @@ -284,9 +284,10 @@ void DIEHash::hashBlockData(const SmallVectorImpl &Values) { // Hash the contents of a loclistptr class. void DIEHash::hashLocList(const DIELocList &LocList) { HashingByteStreamer Streamer(*this); + DwarfDebug &DD = *AP->getDwarfDebug(); for (const auto &Entry : - AP->getDwarfDebug()->getDebugLocEntries()[LocList.getValue()]) - AP->getDwarfDebug()->emitDebugLocEntry(Streamer, Entry); + DD.getDebugLocEntries()[LocList.getValue()].List) + DD.emitDebugLocEntry(Streamer, Entry); } // Hash an individual attribute \param Attr based on the type of attribute and diff --git a/lib/CodeGen/AsmPrinter/DebugLocList.h b/lib/CodeGen/AsmPrinter/DebugLocList.h new file mode 100644 index 00000000000..7a51c7bd5b0 --- /dev/null +++ b/lib/CodeGen/AsmPrinter/DebugLocList.h @@ -0,0 +1,23 @@ +//===--- lib/CodeGen/DebugLocList.h - DWARF debug_loc list ------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef CODEGEN_ASMPRINTER_DEBUGLOCLIST_H__ +#define CODEGEN_ASMPRINTER_DEBUGLOCLIST_H__ + +#include "llvm/MC/MCSymbol.h" +#include "llvm/ADT/SmallVector.h" +#include "DebugLocEntry.h" + +namespace llvm { +struct DebugLocList { + MCSymbol *Label; + SmallVector List; +}; +} +#endif diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 7770cee1b38..1b99ba61d3d 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -1271,7 +1271,11 @@ DwarfDebug::collectVariableInfo(SmallPtrSet &Processed) { // Handle multiple DBG_VALUE instructions describing one variable. RegVar->setDotDebugLocOffset(DotDebugLocEntries.size()); - SmallVector DebugLoc; + DotDebugLocEntries.resize(DotDebugLocEntries.size() + 1); + DebugLocList &LocList = DotDebugLocEntries.back(); + LocList.Label = + Asm->GetTempSymbol("debug_loc", DotDebugLocEntries.size() - 1); + SmallVector &DebugLoc = LocList.List; for (SmallVectorImpl::const_iterator HI = History.begin(), HE = History.end(); @@ -1313,7 +1317,6 @@ DwarfDebug::collectVariableInfo(SmallPtrSet &Processed) { if (DebugLoc.empty() || !DebugLoc.back().Merge(Loc)) DebugLoc.push_back(std::move(Loc)); } - DotDebugLocEntries.push_back(std::move(DebugLoc)); } // Collect info for variables that were optimized out. @@ -2406,10 +2409,9 @@ void DwarfDebug::emitDebugLoc() { useSplitDwarf() ? Asm->getObjFileLowering().getDwarfLocDWOSection() : Asm->getObjFileLowering().getDwarfLocSection()); unsigned char Size = Asm->getDataLayout().getPointerSize(); - unsigned index = 0; for (const auto &DebugLoc : DotDebugLocEntries) { - Asm->OutStreamer.EmitLabel(Asm->GetTempSymbol("debug_loc", index)); - for (const auto &Entry : DebugLoc) { + Asm->OutStreamer.EmitLabel(DebugLoc.Label); + for (const auto &Entry : DebugLoc.List) { // 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. @@ -2440,7 +2442,6 @@ void DwarfDebug::emitDebugLoc() { 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 fcac25d5207..424595070d8 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -17,6 +17,7 @@ #include "AsmPrinterHandler.h" #include "DIE.h" #include "DebugLocEntry.h" +#include "DebugLocList.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/MapVector.h" #include "llvm/ADT/SmallPtrSet.h" @@ -288,8 +289,9 @@ class DwarfDebug : public AsmPrinterHandler { // Collection of abstract variables. DenseMap AbstractVariables; - // Collection of DebugLocEntry. - SmallVector, 4> DotDebugLocEntries; + // Collection of DebugLocEntry. Stored in a linked list so that DIELocLists + // can refer to them in spite of insertions into this list. + SmallVector DotDebugLocEntries; // Collection of subprogram DIEs that are marked (at the end of the module) // as DW_AT_inline. @@ -686,7 +688,7 @@ public: const DwarfCompileUnit *getPrevCU() const { return PrevCU; } /// Returns the entries for the .debug_loc section. - const SmallVectorImpl> & + const SmallVectorImpl & getDebugLocEntries() const { return DotDebugLocEntries; }