aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/MC/MCDwarf.cpp
diff options
context:
space:
mode:
authorFlorian Mayer <fmayer@google.com>2022-10-10 18:17:55 -0700
committerFlorian Mayer <fmayer@google.com>2022-10-12 14:51:24 -0700
commit42cdec1134cb85fef867e50bd66dac49338ab20d (patch)
treede3c32a71b260e28811c8ba969374d1004660d57 /llvm/lib/MC/MCDwarf.cpp
parentab25678ca5aec3e106f87351eae20b57df5ee602 (diff)
downloadllvm-42cdec1134cb85fef867e50bd66dac49338ab20d.zip
llvm-42cdec1134cb85fef867e50bd66dac49338ab20d.tar.gz
llvm-42cdec1134cb85fef867e50bd66dac49338ab20d.tar.bz2
[MC] Consider IsMTETaggedFrame in CIEKey
Before this, we would incorrectly coalesce CIE for frames with and without stack MTE. Reviewed By: eugenis Differential Revision: https://reviews.llvm.org/D135639
Diffstat (limited to 'llvm/lib/MC/MCDwarf.cpp')
-rw-r--r--llvm/lib/MC/MCDwarf.cpp29
1 files changed, 18 insertions, 11 deletions
diff --git a/llvm/lib/MC/MCDwarf.cpp b/llvm/lib/MC/MCDwarf.cpp
index 4bdf6f0..2368326 100644
--- a/llvm/lib/MC/MCDwarf.cpp
+++ b/llvm/lib/MC/MCDwarf.cpp
@@ -1774,27 +1774,29 @@ namespace {
struct CIEKey {
static const CIEKey getEmptyKey() {
return CIEKey(nullptr, 0, -1, false, false, static_cast<unsigned>(INT_MAX),
- false);
+ false, false);
}
static const CIEKey getTombstoneKey() {
return CIEKey(nullptr, -1, 0, false, false, static_cast<unsigned>(INT_MAX),
- false);
+ false, false);
}
CIEKey(const MCSymbol *Personality, unsigned PersonalityEncoding,
unsigned LSDAEncoding, bool IsSignalFrame, bool IsSimple,
- unsigned RAReg, bool IsBKeyFrame)
+ unsigned RAReg, bool IsBKeyFrame, bool IsMTETaggedFrame)
: Personality(Personality), PersonalityEncoding(PersonalityEncoding),
LsdaEncoding(LSDAEncoding), IsSignalFrame(IsSignalFrame),
- IsSimple(IsSimple), RAReg(RAReg), IsBKeyFrame(IsBKeyFrame) {}
+ IsSimple(IsSimple), RAReg(RAReg), IsBKeyFrame(IsBKeyFrame),
+ IsMTETaggedFrame(IsMTETaggedFrame) {}
explicit CIEKey(const MCDwarfFrameInfo &Frame)
: Personality(Frame.Personality),
PersonalityEncoding(Frame.PersonalityEncoding),
LsdaEncoding(Frame.LsdaEncoding), IsSignalFrame(Frame.IsSignalFrame),
IsSimple(Frame.IsSimple), RAReg(Frame.RAReg),
- IsBKeyFrame(Frame.IsBKeyFrame) {}
+ IsBKeyFrame(Frame.IsBKeyFrame),
+ IsMTETaggedFrame(Frame.IsMTETaggedFrame) {}
StringRef PersonalityName() const {
if (!Personality)
@@ -1804,10 +1806,12 @@ struct CIEKey {
bool operator<(const CIEKey &Other) const {
return std::make_tuple(PersonalityName(), PersonalityEncoding, LsdaEncoding,
- IsSignalFrame, IsSimple, RAReg, IsBKeyFrame) <
+ IsSignalFrame, IsSimple, RAReg, IsBKeyFrame,
+ IsMTETaggedFrame) <
std::make_tuple(Other.PersonalityName(), Other.PersonalityEncoding,
Other.LsdaEncoding, Other.IsSignalFrame,
- Other.IsSimple, Other.RAReg, Other.IsBKeyFrame);
+ Other.IsSimple, Other.RAReg, Other.IsBKeyFrame,
+ Other.IsMTETaggedFrame);
}
const MCSymbol *Personality;
@@ -1817,6 +1821,7 @@ struct CIEKey {
bool IsSimple;
unsigned RAReg;
bool IsBKeyFrame;
+ bool IsMTETaggedFrame;
};
} // end anonymous namespace
@@ -1828,9 +1833,10 @@ template <> struct DenseMapInfo<CIEKey> {
static CIEKey getTombstoneKey() { return CIEKey::getTombstoneKey(); }
static unsigned getHashValue(const CIEKey &Key) {
- return static_cast<unsigned>(hash_combine(
- Key.Personality, Key.PersonalityEncoding, Key.LsdaEncoding,
- Key.IsSignalFrame, Key.IsSimple, Key.RAReg, Key.IsBKeyFrame));
+ return static_cast<unsigned>(
+ hash_combine(Key.Personality, Key.PersonalityEncoding, Key.LsdaEncoding,
+ Key.IsSignalFrame, Key.IsSimple, Key.RAReg,
+ Key.IsBKeyFrame, Key.IsMTETaggedFrame));
}
static bool isEqual(const CIEKey &LHS, const CIEKey &RHS) {
@@ -1839,7 +1845,8 @@ template <> struct DenseMapInfo<CIEKey> {
LHS.LsdaEncoding == RHS.LsdaEncoding &&
LHS.IsSignalFrame == RHS.IsSignalFrame &&
LHS.IsSimple == RHS.IsSimple && LHS.RAReg == RHS.RAReg &&
- LHS.IsBKeyFrame == RHS.IsBKeyFrame;
+ LHS.IsBKeyFrame == RHS.IsBKeyFrame &&
+ LHS.IsMTETaggedFrame == RHS.IsMTETaggedFrame;
}
};