mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-22 13:29:44 +00:00
DwarfDebug: Simplify debug_loc merging
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
This commit is contained in:
parent
1b14452fe4
commit
7385c3207c
@ -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);
|
||||
}
|
||||
|
@ -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());
|
||||
}
|
||||
@ -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());
|
||||
@ -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);
|
||||
|
@ -84,34 +84,31 @@ 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;
|
||||
}
|
||||
@ -119,12 +116,11 @@ public:
|
||||
/// \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; }
|
||||
|
Loading…
x
Reference in New Issue
Block a user