Skip to content

Commit 5b0619e

Browse files
Move function info word into its own data structure (#153627)
The sframe generator needs to construct this word separately from FDEs themselves, so split them into a separate data structure.
1 parent 95d4362 commit 5b0619e

File tree

4 files changed

+47
-40
lines changed

4 files changed

+47
-40
lines changed

llvm/include/llvm/BinaryFormat/SFrame.h

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -104,14 +104,8 @@ template <endianness E> struct Header {
104104
detail::packed<uint32_t, E> FREOff;
105105
};
106106

107-
template <endianness E> struct FuncDescEntry {
108-
detail::packed<int32_t, E> StartAddress;
109-
detail::packed<uint32_t, E> Size;
110-
detail::packed<uint32_t, E> StartFREOff;
111-
detail::packed<uint32_t, E> NumFREs;
107+
template <endianness E> struct FDEInfo {
112108
detail::packed<uint8_t, E> Info;
113-
detail::packed<uint8_t, E> RepSize;
114-
detail::packed<uint16_t, E> Padding2;
115109

116110
uint8_t getPAuthKey() const { return (Info >> 5) & 1; }
117111
FDEType getFDEType() const { return static_cast<FDEType>((Info >> 4) & 1); }
@@ -125,6 +119,16 @@ template <endianness E> struct FuncDescEntry {
125119
}
126120
};
127121

122+
template <endianness E> struct FuncDescEntry {
123+
detail::packed<int32_t, E> StartAddress;
124+
detail::packed<uint32_t, E> Size;
125+
detail::packed<uint32_t, E> StartFREOff;
126+
detail::packed<uint32_t, E> NumFREs;
127+
FDEInfo<E> Info;
128+
detail::packed<uint8_t, E> RepSize;
129+
detail::packed<uint16_t, E> Padding2;
130+
};
131+
128132
template <endianness E> struct FREInfo {
129133
detail::packed<uint8_t, E> Info;
130134

llvm/lib/Object/SFrameParser.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,10 +176,10 @@ iterator_range<typename SFrameParser<E>::fre_iterator>
176176
SFrameParser<E>::fres(const sframe::FuncDescEntry<E> &FDE, Error &Err) const {
177177
uint64_t Offset = getFREBase() + FDE.StartFREOff;
178178
fre_iterator BeforeBegin = make_fallible_itr(
179-
FallibleFREIterator(Data, FDE.getFREType(), -1, FDE.NumFREs, Offset),
179+
FallibleFREIterator(Data, FDE.Info.getFREType(), -1, FDE.NumFREs, Offset),
180180
Err);
181181
fre_iterator End = make_fallible_end(
182-
FallibleFREIterator(Data, FDE.getFREType(), FDE.NumFREs, FDE.NumFREs,
182+
FallibleFREIterator(Data, FDE.Info.getFREType(), FDE.NumFREs, FDE.NumFREs,
183183
/*Offset=*/0));
184184
return {++BeforeBegin, End};
185185
}

llvm/tools/llvm-readobj/ELFDumper.cpp

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6512,25 +6512,27 @@ void ELFDumper<ELFT>::printSFrameFDEs(
65126512

65136513
{
65146514
DictScope InfoScope(W, "Info");
6515-
W.printEnum("FRE Type", It->getFREType(), sframe::getFRETypes());
6516-
W.printEnum("FDE Type", It->getFDEType(), sframe::getFDETypes());
6515+
W.printEnum("FRE Type", It->Info.getFREType(), sframe::getFRETypes());
6516+
W.printEnum("FDE Type", It->Info.getFDEType(), sframe::getFDETypes());
65176517
switch (Parser.getHeader().ABIArch) {
65186518
case sframe::ABI::AArch64EndianBig:
65196519
case sframe::ABI::AArch64EndianLittle:
6520-
W.printEnum("PAuth Key", sframe::AArch64PAuthKey(It->getPAuthKey()),
6520+
W.printEnum("PAuth Key",
6521+
sframe::AArch64PAuthKey(It->Info.getPAuthKey()),
65216522
sframe::getAArch64PAuthKeys());
65226523
break;
65236524
case sframe::ABI::AMD64EndianLittle:
65246525
// unused
65256526
break;
65266527
}
65276528

6528-
W.printHex("Raw", It->Info);
6529+
W.printHex("Raw", It->Info.Info);
65296530
}
65306531

65316532
W.printHex(
65326533
("Repetitive block size" +
6533-
Twine(It->getFDEType() == sframe::FDEType::PCMask ? "" : " (unused)"))
6534+
Twine(It->Info.getFDEType() == sframe::FDEType::PCMask ? ""
6535+
: " (unused)"))
65346536
.str(),
65356537
It->RepSize);
65366538

@@ -6541,10 +6543,11 @@ void ELFDumper<ELFT>::printSFrameFDEs(
65416543
for (const typename SFrameParser<ELFT::Endianness>::FrameRowEntry &FRE :
65426544
Parser.fres(*It, Err)) {
65436545
DictScope FREScope(W, "Frame Row Entry");
6544-
W.printHex(
6545-
"Start Address",
6546-
(It->getFDEType() == sframe::FDEType::PCInc ? FDEStartAddress : 0) +
6547-
FRE.StartAddress);
6546+
W.printHex("Start Address",
6547+
(It->Info.getFDEType() == sframe::FDEType::PCInc
6548+
? FDEStartAddress
6549+
: 0) +
6550+
FRE.StartAddress);
65486551
W.printBoolean("Return Address Signed", FRE.Info.isReturnAddressSigned());
65496552
W.printEnum("Offset Size", FRE.Info.getOffsetSize(),
65506553
sframe::getFREOffsets());

llvm/unittests/BinaryFormat/SFrameTest.cpp

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -54,28 +54,28 @@ TYPED_TEST_SUITE(SFrameTest, Types, NameGenerator);
5454

5555
TYPED_TEST(SFrameTest, FDEFlags) {
5656
FuncDescEntry<TestFixture::Endian> FDE = {};
57-
EXPECT_EQ(FDE.Info, 0u);
58-
EXPECT_EQ(FDE.getPAuthKey(), 0);
59-
EXPECT_EQ(FDE.getFDEType(), FDEType::PCInc);
60-
EXPECT_EQ(FDE.getFREType(), FREType::Addr1);
61-
62-
FDE.setPAuthKey(1);
63-
EXPECT_EQ(FDE.Info, 0x20u);
64-
EXPECT_EQ(FDE.getPAuthKey(), 1);
65-
EXPECT_EQ(FDE.getFDEType(), FDEType::PCInc);
66-
EXPECT_EQ(FDE.getFREType(), FREType::Addr1);
67-
68-
FDE.setFDEType(FDEType::PCMask);
69-
EXPECT_EQ(FDE.Info, 0x30u);
70-
EXPECT_EQ(FDE.getPAuthKey(), 1);
71-
EXPECT_EQ(FDE.getFDEType(), FDEType::PCMask);
72-
EXPECT_EQ(FDE.getFREType(), FREType::Addr1);
73-
74-
FDE.setFREType(FREType::Addr4);
75-
EXPECT_EQ(FDE.Info, 0x32u);
76-
EXPECT_EQ(FDE.getPAuthKey(), 1);
77-
EXPECT_EQ(FDE.getFDEType(), FDEType::PCMask);
78-
EXPECT_EQ(FDE.getFREType(), FREType::Addr4);
57+
EXPECT_EQ(FDE.Info.Info, 0u);
58+
EXPECT_EQ(FDE.Info.getPAuthKey(), 0);
59+
EXPECT_EQ(FDE.Info.getFDEType(), FDEType::PCInc);
60+
EXPECT_EQ(FDE.Info.getFREType(), FREType::Addr1);
61+
62+
FDE.Info.setPAuthKey(1);
63+
EXPECT_EQ(FDE.Info.Info, 0x20u);
64+
EXPECT_EQ(FDE.Info.getPAuthKey(), 1);
65+
EXPECT_EQ(FDE.Info.getFDEType(), FDEType::PCInc);
66+
EXPECT_EQ(FDE.Info.getFREType(), FREType::Addr1);
67+
68+
FDE.Info.setFDEType(FDEType::PCMask);
69+
EXPECT_EQ(FDE.Info.Info, 0x30u);
70+
EXPECT_EQ(FDE.Info.getPAuthKey(), 1);
71+
EXPECT_EQ(FDE.Info.getFDEType(), FDEType::PCMask);
72+
EXPECT_EQ(FDE.Info.getFREType(), FREType::Addr1);
73+
74+
FDE.Info.setFREType(FREType::Addr4);
75+
EXPECT_EQ(FDE.Info.Info, 0x32u);
76+
EXPECT_EQ(FDE.Info.getPAuthKey(), 1);
77+
EXPECT_EQ(FDE.Info.getFDEType(), FDEType::PCMask);
78+
EXPECT_EQ(FDE.Info.getFREType(), FREType::Addr4);
7979
}
8080

8181
TYPED_TEST(SFrameTest, FREFlags) {

0 commit comments

Comments
 (0)