Skip to content

Commit a2b6288

Browse files
Move function info word into its own data structure
The sframe generator needs to construct this word separately from FDEs themselves, so split them into a separate data structure.
1 parent 2e9944a commit a2b6288

File tree

4 files changed

+48
-41
lines changed

4 files changed

+48
-41
lines changed

llvm/include/llvm/BinaryFormat/SFrame.h

Lines changed: 12 additions & 8 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;
112-
detail::packed<uint8_t, E> Info;
113-
detail::packed<uint8_t, E> RepSize;
114-
detail::packed<uint16_t, E> Padding2;
107+
struct FDEInfo {
108+
uint8_t Info;
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 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
@@ -173,10 +173,10 @@ iterator_range<typename SFrameParser<E>::fre_iterator>
173173
SFrameParser<E>::fres(const sframe::FuncDescEntry<E> &FDE, Error &Err) const {
174174
uint64_t Offset = getFREBase() + FDE.StartFREOff;
175175
fre_iterator BeforeBegin = make_fallible_itr(
176-
FallibleFREIterator(Data, FDE.getFREType(), -1, FDE.NumFREs, Offset),
176+
FallibleFREIterator(Data, FDE.Info.getFREType(), -1, FDE.NumFREs, Offset),
177177
Err);
178178
fre_iterator End = make_fallible_end(
179-
FallibleFREIterator(Data, FDE.getFREType(), FDE.NumFREs, FDE.NumFREs,
179+
FallibleFREIterator(Data, FDE.Info.getFREType(), FDE.NumFREs, FDE.NumFREs,
180180
/*Offset=*/0));
181181
return {++BeforeBegin, End};
182182
}

llvm/tools/llvm-readobj/ELFDumper.cpp

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

65066506
{
65076507
DictScope InfoScope(W, "Info");
6508-
W.printEnum("FRE Type", It->getFREType(), sframe::getFRETypes());
6509-
W.printEnum("FDE Type", It->getFDEType(), sframe::getFDETypes());
6508+
W.printEnum("FRE Type", It->Info.getFREType(), sframe::getFRETypes());
6509+
W.printEnum("FDE Type", It->Info.getFDEType(), sframe::getFDETypes());
65106510
switch (Parser.getHeader().ABIArch) {
65116511
case sframe::ABI::AArch64EndianBig:
65126512
case sframe::ABI::AArch64EndianLittle:
6513-
W.printEnum("PAuth Key", sframe::AArch64PAuthKey(It->getPAuthKey()),
6513+
W.printEnum("PAuth Key",
6514+
sframe::AArch64PAuthKey(It->Info.getPAuthKey()),
65146515
sframe::getAArch64PAuthKeys());
65156516
break;
65166517
case sframe::ABI::AMD64EndianLittle:
65176518
// unused
65186519
break;
65196520
}
65206521

6521-
W.printHex("Raw", It->Info);
6522+
W.printHex("Raw", It->Info.Info);
65226523
}
65236524

65246525
W.printHex(
65256526
("Repetitive block size" +
6526-
Twine(It->getFDEType() == sframe::FDEType::PCMask ? "" : " (unused)"))
6527+
Twine(It->Info.getFDEType() == sframe::FDEType::PCMask ? ""
6528+
: " (unused)"))
65276529
.str(),
65286530
It->RepSize);
65296531

@@ -6534,10 +6536,11 @@ void ELFDumper<ELFT>::printSFrameFDEs(
65346536
for (const typename SFrameParser<ELFT::Endianness>::FrameRowEntry &FRE :
65356537
Parser.fres(*It, Err)) {
65366538
DictScope FREScope(W, "Frame Row Entry");
6537-
W.printHex(
6538-
"Start Address",
6539-
(It->getFDEType() == sframe::FDEType::PCInc ? FDEStartAddress : 0) +
6540-
FRE.StartAddress);
6539+
W.printHex("Start Address",
6540+
(It->Info.getFDEType() == sframe::FDEType::PCInc
6541+
? FDEStartAddress
6542+
: 0) +
6543+
FRE.StartAddress);
65416544
W.printBoolean("Return Address Signed", FRE.Info.isReturnAddressSigned());
65426545
W.printEnum("Offset Size", FRE.Info.getOffsetSize(),
65436546
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)