diff --git a/llvm/include/llvm/BinaryFormat/SFrame.h b/llvm/include/llvm/BinaryFormat/SFrame.h index 74e47ea8acca9..095db18b9c254 100644 --- a/llvm/include/llvm/BinaryFormat/SFrame.h +++ b/llvm/include/llvm/BinaryFormat/SFrame.h @@ -104,14 +104,8 @@ template struct Header { detail::packed FREOff; }; -template struct FuncDescEntry { - detail::packed StartAddress; - detail::packed Size; - detail::packed StartFREOff; - detail::packed NumFREs; +template struct FDEInfo { detail::packed Info; - detail::packed RepSize; - detail::packed Padding2; uint8_t getPAuthKey() const { return (Info >> 5) & 1; } FDEType getFDEType() const { return static_cast((Info >> 4) & 1); } @@ -125,6 +119,16 @@ template struct FuncDescEntry { } }; +template struct FuncDescEntry { + detail::packed StartAddress; + detail::packed Size; + detail::packed StartFREOff; + detail::packed NumFREs; + FDEInfo Info; + detail::packed RepSize; + detail::packed Padding2; +}; + template struct FREInfo { detail::packed Info; diff --git a/llvm/lib/Object/SFrameParser.cpp b/llvm/lib/Object/SFrameParser.cpp index 847067a7ae989..c49a02907367f 100644 --- a/llvm/lib/Object/SFrameParser.cpp +++ b/llvm/lib/Object/SFrameParser.cpp @@ -173,10 +173,10 @@ iterator_range::fre_iterator> SFrameParser::fres(const sframe::FuncDescEntry &FDE, Error &Err) const { uint64_t Offset = getFREBase() + FDE.StartFREOff; fre_iterator BeforeBegin = make_fallible_itr( - FallibleFREIterator(Data, FDE.getFREType(), -1, FDE.NumFREs, Offset), + FallibleFREIterator(Data, FDE.Info.getFREType(), -1, FDE.NumFREs, Offset), Err); fre_iterator End = make_fallible_end( - FallibleFREIterator(Data, FDE.getFREType(), FDE.NumFREs, FDE.NumFREs, + FallibleFREIterator(Data, FDE.Info.getFREType(), FDE.NumFREs, FDE.NumFREs, /*Offset=*/0)); return {++BeforeBegin, End}; } diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index ed29e0bf3f7cd..731250532402a 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -6505,12 +6505,13 @@ void ELFDumper::printSFrameFDEs( { DictScope InfoScope(W, "Info"); - W.printEnum("FRE Type", It->getFREType(), sframe::getFRETypes()); - W.printEnum("FDE Type", It->getFDEType(), sframe::getFDETypes()); + W.printEnum("FRE Type", It->Info.getFREType(), sframe::getFRETypes()); + W.printEnum("FDE Type", It->Info.getFDEType(), sframe::getFDETypes()); switch (Parser.getHeader().ABIArch) { case sframe::ABI::AArch64EndianBig: case sframe::ABI::AArch64EndianLittle: - W.printEnum("PAuth Key", sframe::AArch64PAuthKey(It->getPAuthKey()), + W.printEnum("PAuth Key", + sframe::AArch64PAuthKey(It->Info.getPAuthKey()), sframe::getAArch64PAuthKeys()); break; case sframe::ABI::AMD64EndianLittle: @@ -6518,12 +6519,13 @@ void ELFDumper::printSFrameFDEs( break; } - W.printHex("Raw", It->Info); + W.printHex("Raw", It->Info.Info); } W.printHex( ("Repetitive block size" + - Twine(It->getFDEType() == sframe::FDEType::PCMask ? "" : " (unused)")) + Twine(It->Info.getFDEType() == sframe::FDEType::PCMask ? "" + : " (unused)")) .str(), It->RepSize); @@ -6534,10 +6536,11 @@ void ELFDumper::printSFrameFDEs( for (const typename SFrameParser::FrameRowEntry &FRE : Parser.fres(*It, Err)) { DictScope FREScope(W, "Frame Row Entry"); - W.printHex( - "Start Address", - (It->getFDEType() == sframe::FDEType::PCInc ? FDEStartAddress : 0) + - FRE.StartAddress); + W.printHex("Start Address", + (It->Info.getFDEType() == sframe::FDEType::PCInc + ? FDEStartAddress + : 0) + + FRE.StartAddress); W.printBoolean("Return Address Signed", FRE.Info.isReturnAddressSigned()); W.printEnum("Offset Size", FRE.Info.getOffsetSize(), sframe::getFREOffsets()); diff --git a/llvm/unittests/BinaryFormat/SFrameTest.cpp b/llvm/unittests/BinaryFormat/SFrameTest.cpp index 394e382e041e9..ab7b0fe20b750 100644 --- a/llvm/unittests/BinaryFormat/SFrameTest.cpp +++ b/llvm/unittests/BinaryFormat/SFrameTest.cpp @@ -54,28 +54,28 @@ TYPED_TEST_SUITE(SFrameTest, Types, NameGenerator); TYPED_TEST(SFrameTest, FDEFlags) { FuncDescEntry FDE = {}; - EXPECT_EQ(FDE.Info, 0u); - EXPECT_EQ(FDE.getPAuthKey(), 0); - EXPECT_EQ(FDE.getFDEType(), FDEType::PCInc); - EXPECT_EQ(FDE.getFREType(), FREType::Addr1); - - FDE.setPAuthKey(1); - EXPECT_EQ(FDE.Info, 0x20u); - EXPECT_EQ(FDE.getPAuthKey(), 1); - EXPECT_EQ(FDE.getFDEType(), FDEType::PCInc); - EXPECT_EQ(FDE.getFREType(), FREType::Addr1); - - FDE.setFDEType(FDEType::PCMask); - EXPECT_EQ(FDE.Info, 0x30u); - EXPECT_EQ(FDE.getPAuthKey(), 1); - EXPECT_EQ(FDE.getFDEType(), FDEType::PCMask); - EXPECT_EQ(FDE.getFREType(), FREType::Addr1); - - FDE.setFREType(FREType::Addr4); - EXPECT_EQ(FDE.Info, 0x32u); - EXPECT_EQ(FDE.getPAuthKey(), 1); - EXPECT_EQ(FDE.getFDEType(), FDEType::PCMask); - EXPECT_EQ(FDE.getFREType(), FREType::Addr4); + EXPECT_EQ(FDE.Info.Info, 0u); + EXPECT_EQ(FDE.Info.getPAuthKey(), 0); + EXPECT_EQ(FDE.Info.getFDEType(), FDEType::PCInc); + EXPECT_EQ(FDE.Info.getFREType(), FREType::Addr1); + + FDE.Info.setPAuthKey(1); + EXPECT_EQ(FDE.Info.Info, 0x20u); + EXPECT_EQ(FDE.Info.getPAuthKey(), 1); + EXPECT_EQ(FDE.Info.getFDEType(), FDEType::PCInc); + EXPECT_EQ(FDE.Info.getFREType(), FREType::Addr1); + + FDE.Info.setFDEType(FDEType::PCMask); + EXPECT_EQ(FDE.Info.Info, 0x30u); + EXPECT_EQ(FDE.Info.getPAuthKey(), 1); + EXPECT_EQ(FDE.Info.getFDEType(), FDEType::PCMask); + EXPECT_EQ(FDE.Info.getFREType(), FREType::Addr1); + + FDE.Info.setFREType(FREType::Addr4); + EXPECT_EQ(FDE.Info.Info, 0x32u); + EXPECT_EQ(FDE.Info.getPAuthKey(), 1); + EXPECT_EQ(FDE.Info.getFDEType(), FDEType::PCMask); + EXPECT_EQ(FDE.Info.getFREType(), FREType::Addr4); } TYPED_TEST(SFrameTest, FREFlags) {