Skip to content

Commit

Permalink
DwarfDebug: Simplify debug_loc merging
Browse files Browse the repository at this point in the history
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
  • Loading branch information
dwblaikie committed Mar 24, 2014
1 parent 1b14452 commit 7385c32
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 29 deletions.
2 changes: 0 additions & 2 deletions lib/CodeGen/AsmPrinter/DIEHash.cpp
Expand Up @@ -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);
}
Expand Down
16 changes: 3 additions & 13 deletions lib/CodeGen/AsmPrinter/DwarfDebug.cpp
Expand Up @@ -1297,8 +1297,9 @@ DwarfDebug::collectVariableInfo(SmallPtrSet<const MDNode *, 16> &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());
}
Expand Down Expand Up @@ -2378,15 +2379,6 @@ void DwarfDebug::emitDebugLoc() {
if (DotDebugLocEntries.empty())
return;

for (SmallVectorImpl<DebugLocEntry>::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());
Expand All @@ -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);
Expand Down
24 changes: 10 additions & 14 deletions lib/CodeGen/AsmPrinter/DwarfDebug.h
Expand Up @@ -84,47 +84,43 @@ 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;
}

/// \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; }
Expand Down

0 comments on commit 7385c32

Please sign in to comment.