From b2d73d1556b47a79d01b188be3cf0b25631d3982 Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Wed, 2 Apr 2014 01:43:18 +0000 Subject: [PATCH] DebugInfo: Introduce DebugLocList to encapsulate a list of DebugLocEntries and an MC Label to refer to them This removes the magic-number-esque code creating/retrieving the same label for a debug_loc entry from two places and removes the last small piece of reusable logic from emitDebugLoc so that there will be less duplication when refactoring it into two functions (one for debug_loc, the other for debug_loc.dwo). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205382 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/AsmPrinter/DIE.cpp | 2 +- lib/CodeGen/AsmPrinter/DIEHash.cpp | 5 +++-- lib/CodeGen/AsmPrinter/DebugLocList.h | 23 +++++++++++++++++++++++ lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 13 +++++++------ lib/CodeGen/AsmPrinter/DwarfDebug.h | 8 +++++--- 5 files changed, 39 insertions(+), 12 deletions(-) create mode 100644 lib/CodeGen/AsmPrinter/DebugLocList.h 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; }