DebugInfo: Move the reference to the CU from the location list entry to the list itself, since it is constant across an entire list.

This simplifies construction and usage while making the data structure
smaller. It was a holdover from the days when we didn't have a separate
DebugLocList and all we had was a flat list of DebugLocEntries.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@214933 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Blaikie 2014-08-05 23:14:16 +00:00
parent 9920f561c3
commit 5bfa4ba44d
4 changed files with 14 additions and 19 deletions

View File

@ -15,7 +15,6 @@
#include "llvm/MC/MCSymbol.h" #include "llvm/MC/MCSymbol.h"
namespace llvm { namespace llvm {
class DwarfCompileUnit;
class MDNode; class MDNode;
/// \brief This struct describes location entries emitted in the .debug_loc /// \brief This struct describes location entries emitted in the .debug_loc
/// section. /// section.
@ -91,14 +90,10 @@ private:
/// A list of locations/constants belonging to this entry. /// A list of locations/constants belonging to this entry.
SmallVector<Value, 1> Values; SmallVector<Value, 1> Values;
/// The compile unit that this location entry is referenced by.
const DwarfCompileUnit *Unit;
public: public:
DebugLocEntry() : Begin(nullptr), End(nullptr), Unit(nullptr) {} DebugLocEntry() : Begin(nullptr), End(nullptr) {}
DebugLocEntry(const MCSymbol *B, const MCSymbol *E, DebugLocEntry(const MCSymbol *B, const MCSymbol *E, Value Val)
Value Val, const DwarfCompileUnit *U) : Begin(B), End(E) {
: Begin(B), End(E), Unit(U) {
Values.push_back(std::move(Val)); Values.push_back(std::move(Val));
} }
@ -130,7 +125,6 @@ public:
const MCSymbol *getBeginSym() const { return Begin; } const MCSymbol *getBeginSym() const { return Begin; }
const MCSymbol *getEndSym() const { return End; } const MCSymbol *getEndSym() const { return End; }
const DwarfCompileUnit *getCU() const { return Unit; }
const ArrayRef<Value> getValues() const { return Values; } const ArrayRef<Value> getValues() const { return Values; }
void addValue(Value Val) { void addValue(Value Val) {
assert(DIVariable(Val.Variable).isVariablePiece() && assert(DIVariable(Val.Variable).isVariablePiece() &&

View File

@ -10,13 +10,15 @@
#ifndef CODEGEN_ASMPRINTER_DEBUGLOCLIST_H__ #ifndef CODEGEN_ASMPRINTER_DEBUGLOCLIST_H__
#define CODEGEN_ASMPRINTER_DEBUGLOCLIST_H__ #define CODEGEN_ASMPRINTER_DEBUGLOCLIST_H__
#include "llvm/MC/MCSymbol.h"
#include "llvm/ADT/SmallVector.h" #include "llvm/ADT/SmallVector.h"
#include "DebugLocEntry.h" #include "DebugLocEntry.h"
namespace llvm { namespace llvm {
class DwarfCompileUnit;
class MCSymbol;
struct DebugLocList { struct DebugLocList {
MCSymbol *Label; MCSymbol *Label;
DwarfCompileUnit *CU;
SmallVector<DebugLocEntry, 4> List; SmallVector<DebugLocEntry, 4> List;
}; };
} }

View File

@ -1229,10 +1229,9 @@ static bool piecesOverlap(DIVariable P1, DIVariable P2) {
// [1-3] [x, (reg0, piece 0, 32), (reg1, piece 32, 32)] // [1-3] [x, (reg0, piece 0, 32), (reg1, piece 32, 32)]
// [3-4] [x, (reg1, piece 32, 32)] // [3-4] [x, (reg1, piece 32, 32)]
// [4- ] [x, (mem, piece 0, 64)] // [4- ] [x, (mem, piece 0, 64)]
void DwarfDebug:: void
buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc, DwarfDebug::buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc,
const DbgValueHistoryMap::InstrRanges &Ranges, const DbgValueHistoryMap::InstrRanges &Ranges) {
DwarfCompileUnit *TheCU) {
typedef std::pair<DIVariable, DebugLocEntry::Value> Range; typedef std::pair<DIVariable, DebugLocEntry::Value> Range;
SmallVector<Range, 4> OpenRanges; SmallVector<Range, 4> OpenRanges;
@ -1271,7 +1270,7 @@ buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc,
DEBUG(dbgs() << "DotDebugLoc: " << *Begin << "\n"); DEBUG(dbgs() << "DotDebugLoc: " << *Begin << "\n");
auto Value = getDebugLocValue(Begin); auto Value = getDebugLocValue(Begin);
DebugLocEntry Loc(StartLabel, EndLabel, Value, TheCU); DebugLocEntry Loc(StartLabel, EndLabel, Value);
if (DebugLoc.empty() || !DebugLoc.back().Merge(Loc)) { if (DebugLoc.empty() || !DebugLoc.back().Merge(Loc)) {
// Add all values from still valid non-overlapping pieces. // Add all values from still valid non-overlapping pieces.
for (auto Range : OpenRanges) for (auto Range : OpenRanges)
@ -1340,11 +1339,12 @@ DwarfDebug::collectVariableInfo(SmallPtrSet<const MDNode *, 16> &Processed) {
DotDebugLocEntries.resize(DotDebugLocEntries.size() + 1); DotDebugLocEntries.resize(DotDebugLocEntries.size() + 1);
DebugLocList &LocList = DotDebugLocEntries.back(); DebugLocList &LocList = DotDebugLocEntries.back();
LocList.CU = TheCU;
LocList.Label = LocList.Label =
Asm->GetTempSymbol("debug_loc", DotDebugLocEntries.size() - 1); Asm->GetTempSymbol("debug_loc", DotDebugLocEntries.size() - 1);
// Build the location list for this variable. // Build the location list for this variable.
buildLocationList(LocList.List, Ranges, TheCU); buildLocationList(LocList.List, Ranges);
} }
// Collect info for variables that were optimized out. // Collect info for variables that were optimized out.
@ -2198,11 +2198,11 @@ void DwarfDebug::emitDebugLoc() {
unsigned char Size = Asm->getDataLayout().getPointerSize(); unsigned char Size = Asm->getDataLayout().getPointerSize();
for (const auto &DebugLoc : DotDebugLocEntries) { for (const auto &DebugLoc : DotDebugLocEntries) {
Asm->OutStreamer.EmitLabel(DebugLoc.Label); Asm->OutStreamer.EmitLabel(DebugLoc.Label);
const DwarfCompileUnit *CU = DebugLoc.CU;
for (const auto &Entry : DebugLoc.List) { for (const auto &Entry : DebugLoc.List) {
// Set up the range. This range is relative to the entry point of the // 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 // 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. // ranges, or the DW_AT_low_pc on the compile unit otherwise.
const DwarfCompileUnit *CU = Entry.getCU();
if (CU->getRanges().size() == 1) { if (CU->getRanges().size() == 1) {
// Grab the begin symbol from the first range as our base. // Grab the begin symbol from the first range as our base.
const MCSymbol *Base = CU->getRanges()[0].getStart(); const MCSymbol *Base = CU->getRanges()[0].getStart();

View File

@ -538,8 +538,7 @@ class DwarfDebug : public AsmPrinterHandler {
/// \brief Build the location list for all DBG_VALUEs in the /// \brief Build the location list for all DBG_VALUEs in the
/// function that describe the same variable. /// function that describe the same variable.
void buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc, void buildLocationList(SmallVectorImpl<DebugLocEntry> &DebugLoc,
const DbgValueHistoryMap::InstrRanges &Ranges, const DbgValueHistoryMap::InstrRanges &Ranges);
DwarfCompileUnit *TheCU);
/// \brief Collect variable information from the side table maintained /// \brief Collect variable information from the side table maintained
/// by MMI. /// by MMI.