diff options
author | Florian Mayer <fmayer@google.com> | 2022-10-10 18:17:55 -0700 |
---|---|---|
committer | Florian Mayer <fmayer@google.com> | 2022-10-12 14:51:24 -0700 |
commit | 42cdec1134cb85fef867e50bd66dac49338ab20d (patch) | |
tree | de3c32a71b260e28811c8ba969374d1004660d57 /llvm/lib/MC/MCDwarf.cpp | |
parent | ab25678ca5aec3e106f87351eae20b57df5ee602 (diff) | |
download | llvm-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.cpp | 29 |
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; } }; |