Skip to content

Commit 1d18e31

Browse files
committed
[MC][DWARF][NFC] Drop CIEKey map
We already sort frames by their CIEKey, so we know that we only need to update the CIE symbol when the CIE key changes. No need for a DenseMap.
1 parent 8cc6a24 commit 1d18e31

File tree

1 file changed

+26
-58
lines changed

1 file changed

+26
-58
lines changed

llvm/lib/MC/MCDwarf.cpp

Lines changed: 26 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1777,23 +1777,7 @@ void FrameEmitterImpl::EmitFDE(const MCSymbol &cieStart,
17771777
namespace {
17781778

17791779
struct CIEKey {
1780-
static const CIEKey getEmptyKey() {
1781-
return CIEKey(nullptr, 0, -1, false, false, static_cast<unsigned>(INT_MAX),
1782-
false, false);
1783-
}
1784-
1785-
static const CIEKey getTombstoneKey() {
1786-
return CIEKey(nullptr, -1, 0, false, false, static_cast<unsigned>(INT_MAX),
1787-
false, false);
1788-
}
1789-
1790-
CIEKey(const MCSymbol *Personality, unsigned PersonalityEncoding,
1791-
unsigned LSDAEncoding, bool IsSignalFrame, bool IsSimple,
1792-
unsigned RAReg, bool IsBKeyFrame, bool IsMTETaggedFrame)
1793-
: Personality(Personality), PersonalityEncoding(PersonalityEncoding),
1794-
LsdaEncoding(LSDAEncoding), IsSignalFrame(IsSignalFrame),
1795-
IsSimple(IsSimple), RAReg(RAReg), IsBKeyFrame(IsBKeyFrame),
1796-
IsMTETaggedFrame(IsMTETaggedFrame) {}
1780+
CIEKey() {}
17971781

17981782
explicit CIEKey(const MCDwarfFrameInfo &Frame)
17991783
: Personality(Frame.Personality),
@@ -1819,44 +1803,28 @@ struct CIEKey {
18191803
Other.IsMTETaggedFrame);
18201804
}
18211805

1822-
const MCSymbol *Personality;
1823-
unsigned PersonalityEncoding;
1824-
unsigned LsdaEncoding;
1825-
bool IsSignalFrame;
1826-
bool IsSimple;
1827-
unsigned RAReg;
1828-
bool IsBKeyFrame;
1829-
bool IsMTETaggedFrame;
1806+
bool operator==(const CIEKey &Other) const {
1807+
return Personality == Other.Personality &&
1808+
PersonalityEncoding == Other.PersonalityEncoding &&
1809+
LsdaEncoding == Other.LsdaEncoding &&
1810+
IsSignalFrame == Other.IsSignalFrame && IsSimple == Other.IsSimple &&
1811+
RAReg == Other.RAReg && IsBKeyFrame == Other.IsBKeyFrame &&
1812+
IsMTETaggedFrame == Other.IsMTETaggedFrame;
1813+
}
1814+
bool operator!=(const CIEKey &Other) const { return !(*this == Other); }
1815+
1816+
const MCSymbol *Personality = nullptr;
1817+
unsigned PersonalityEncoding = 0;
1818+
unsigned LsdaEncoding = -1;
1819+
bool IsSignalFrame = false;
1820+
bool IsSimple = false;
1821+
unsigned RAReg = static_cast<unsigned>(INT_MAX);
1822+
bool IsBKeyFrame = false;
1823+
bool IsMTETaggedFrame = false;
18301824
};
18311825

18321826
} // end anonymous namespace
18331827

1834-
namespace llvm {
1835-
1836-
template <> struct DenseMapInfo<CIEKey> {
1837-
static CIEKey getEmptyKey() { return CIEKey::getEmptyKey(); }
1838-
static CIEKey getTombstoneKey() { return CIEKey::getTombstoneKey(); }
1839-
1840-
static unsigned getHashValue(const CIEKey &Key) {
1841-
return static_cast<unsigned>(
1842-
hash_combine(Key.Personality, Key.PersonalityEncoding, Key.LsdaEncoding,
1843-
Key.IsSignalFrame, Key.IsSimple, Key.RAReg,
1844-
Key.IsBKeyFrame, Key.IsMTETaggedFrame));
1845-
}
1846-
1847-
static bool isEqual(const CIEKey &LHS, const CIEKey &RHS) {
1848-
return LHS.Personality == RHS.Personality &&
1849-
LHS.PersonalityEncoding == RHS.PersonalityEncoding &&
1850-
LHS.LsdaEncoding == RHS.LsdaEncoding &&
1851-
LHS.IsSignalFrame == RHS.IsSignalFrame &&
1852-
LHS.IsSimple == RHS.IsSimple && LHS.RAReg == RHS.RAReg &&
1853-
LHS.IsBKeyFrame == RHS.IsBKeyFrame &&
1854-
LHS.IsMTETaggedFrame == RHS.IsMTETaggedFrame;
1855-
}
1856-
};
1857-
1858-
} // end namespace llvm
1859-
18601828
void MCDwarfFrameEmitter::Emit(MCObjectStreamer &Streamer, MCAsmBackend *MAB,
18611829
bool IsEH) {
18621830
MCContext &Context = Streamer.getContext();
@@ -1906,9 +1874,6 @@ void MCDwarfFrameEmitter::Emit(MCObjectStreamer &Streamer, MCAsmBackend *MAB,
19061874
MCSymbol *SectionStart = Context.createTempSymbol();
19071875
Streamer.emitLabel(SectionStart);
19081876

1909-
DenseMap<CIEKey, const MCSymbol *> CIEStarts;
1910-
1911-
const MCSymbol *DummyDebugKey = nullptr;
19121877
bool CanOmitDwarf = MOFI->getOmitDwarfIfHaveCompactUnwind();
19131878
// Sort the FDEs by their corresponding CIE before we emit them.
19141879
// This isn't technically necessary according to the DWARF standard,
@@ -1919,6 +1884,8 @@ void MCDwarfFrameEmitter::Emit(MCObjectStreamer &Streamer, MCAsmBackend *MAB,
19191884
[](const MCDwarfFrameInfo &X, const MCDwarfFrameInfo &Y) {
19201885
return CIEKey(X) < CIEKey(Y);
19211886
});
1887+
CIEKey LastKey;
1888+
const MCSymbol *LastCIEStart = nullptr;
19221889
for (auto I = FrameArrayX.begin(), E = FrameArrayX.end(); I != E;) {
19231890
const MCDwarfFrameInfo &Frame = *I;
19241891
++I;
@@ -1933,11 +1900,12 @@ void MCDwarfFrameEmitter::Emit(MCObjectStreamer &Streamer, MCAsmBackend *MAB,
19331900
continue;
19341901

19351902
CIEKey Key(Frame);
1936-
const MCSymbol *&CIEStart = IsEH ? CIEStarts[Key] : DummyDebugKey;
1937-
if (!CIEStart)
1938-
CIEStart = &Emitter.EmitCIE(Frame);
1903+
if (!LastCIEStart || (IsEH && Key != LastKey)) {
1904+
LastKey = Key;
1905+
LastCIEStart = &Emitter.EmitCIE(Frame);
1906+
}
19391907

1940-
Emitter.EmitFDE(*CIEStart, Frame, I == E, *SectionStart);
1908+
Emitter.EmitFDE(*LastCIEStart, Frame, I == E, *SectionStart);
19411909
}
19421910
}
19431911

0 commit comments

Comments
 (0)