Skip to content

Commit 43a80a6

Browse files
committed
endianize
1 parent 50df1f8 commit 43a80a6

File tree

2 files changed

+77
-59
lines changed

2 files changed

+77
-59
lines changed

llvm/include/llvm/BinaryFormat/SFrame.h

Lines changed: 38 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@
1616
#define LLVM_BINARYFORMAT_SFRAME_H
1717

1818
#include "llvm/ADT/BitmaskEnum.h"
19-
#include "llvm/Support/Compiler.h"
2019
#include "llvm/Support/DataTypes.h"
20+
#include "llvm/Support/Endian.h"
2121

2222
namespace llvm::sframe {
2323

2424
LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE();
2525

26-
constexpr uint16_t MagicSignature = 0xdee2;
26+
constexpr uint16_t Magic = 0xdee2;
2727

2828
enum class Version : uint8_t {
2929
V1 = 1,
@@ -75,35 +75,39 @@ enum class BaseReg : uint8_t {
7575
SP = 1,
7676
};
7777

78-
LLVM_PACKED_START
78+
namespace detail {
79+
template <typename T, endianness E>
80+
using packed =
81+
support::detail::packed_endian_specific_integral<T, E, support::unaligned>;
82+
}
7983

80-
struct Preamble {
81-
uint16_t Magic;
82-
enum Version Version;
83-
enum Flags Flags;
84+
template <endianness E> struct Preamble {
85+
detail::packed<uint16_t, E> Magic;
86+
detail::packed<enum Version, E> Version;
87+
detail::packed<enum Flags, E> Flags;
8488
};
8589

86-
struct Header {
87-
struct Preamble Preamble;
88-
ABI ABIArch;
89-
int8_t CFAFixedFPOffset;
90-
int8_t CFAFixedRAOffset;
91-
uint8_t AuxHdrLen;
92-
uint32_t NumFDEs;
93-
uint32_t NumFREs;
94-
uint32_t FRELen;
95-
uint32_t FDEOff;
96-
uint32_t FREOff;
90+
template <endianness E> struct Header {
91+
struct Preamble<E> Preamble;
92+
detail::packed<ABI, E> ABIArch;
93+
detail::packed<int8_t, E> CFAFixedFPOffset;
94+
detail::packed<int8_t, E> CFAFixedRAOffset;
95+
detail::packed<uint8_t, E> AuxHdrLen;
96+
detail::packed<uint32_t, E> NumFDEs;
97+
detail::packed<uint32_t, E> NumFREs;
98+
detail::packed<uint32_t, E> FRELen;
99+
detail::packed<uint32_t, E> FDEOff;
100+
detail::packed<uint32_t, E> FREOff;
97101
};
98102

99-
struct FuncDescEntry {
100-
int32_t StartAddress;
101-
uint32_t Size;
102-
uint32_t StartFREOff;
103-
uint32_t NumFREs;
104-
uint8_t Info;
105-
uint8_t RepSize;
106-
uint16_t Padding2;
103+
template <endianness E> struct FuncDescEntry {
104+
detail::packed<int32_t, E> StartAddress;
105+
detail::packed<uint32_t, E> Size;
106+
detail::packed<uint32_t, E> StartFREOff;
107+
detail::packed<uint32_t, E> NumFREs;
108+
detail::packed<uint8_t, E> Info;
109+
detail::packed<uint8_t, E> RepSize;
110+
detail::packed<uint16_t, E> Padding2;
107111

108112
uint8_t getPAuthKey() const { return (Info >> 5) & 1; }
109113
FDEType getFDEType() const { return static_cast<FDEType>((Info >> 4) & 1); }
@@ -117,8 +121,8 @@ struct FuncDescEntry {
117121
}
118122
};
119123

120-
struct FREInfo {
121-
uint8_t Info;
124+
template <endianness E> struct FREInfo {
125+
detail::packed<uint8_t, E> Info;
122126

123127
bool isReturnAddressSigned() const { return Info >> 7; }
124128
FREOffset getOffsetSize() const {
@@ -145,22 +149,14 @@ struct FREInfo {
145149
}
146150
};
147151

148-
struct FrameRowEntryAddr1 {
149-
uint8_t StartAddress;
150-
FREInfo Info;
152+
template <typename T, endianness E> struct FrameRowEntry {
153+
detail::packed<T, E> StartAddress;
154+
FREInfo<E> Info;
151155
};
152156

153-
struct FrameRowEntryAddr2 {
154-
uint16_t StartAddress;
155-
FREInfo Info;
156-
};
157-
158-
struct FrameRowEntryAddr4 {
159-
uint32_t StartAddress;
160-
FREInfo Info;
161-
};
162-
163-
LLVM_PACKED_END
157+
template <endianness E> using FrameRowEntryAddr1 = FrameRowEntry<uint8_t, E>;
158+
template <endianness E> using FrameRowEntryAddr2 = FrameRowEntry<uint16_t, E>;
159+
template <endianness E> using FrameRowEntryAddr4 = FrameRowEntry<uint32_t, E>;
164160

165161
} // namespace llvm::sframe
166162

llvm/unittests/BinaryFormat/SFrameTest.cpp

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,32 +8,54 @@
88

99
#include "llvm/BinaryFormat/SFrame.h"
1010
#include "gtest/gtest.h"
11+
#include <type_traits>
1112

1213
using namespace llvm;
1314
using namespace llvm::sframe;
1415

1516
namespace {
16-
// Test structure sizes and triviality.
17-
static_assert(std::is_trivial_v<Preamble>);
18-
static_assert(sizeof(Preamble) == 4);
1917

20-
static_assert(std::is_trivial_v<Header>);
21-
static_assert(sizeof(Header) == 28);
18+
template<typename EndianT>
19+
class SFrameTest : public testing::Test {
20+
protected:
21+
static constexpr endianness Endian = EndianT::value;
2222

23-
static_assert(std::is_trivial_v<FuncDescEntry>);
24-
static_assert(sizeof(FuncDescEntry) == 20);
23+
// Test structure sizes and triviality.
24+
static_assert(std::is_trivial_v<Preamble<Endian>>);
25+
static_assert(sizeof(Preamble<Endian>) == 4);
2526

26-
static_assert(std::is_trivial_v<FrameRowEntryAddr1>);
27-
static_assert(sizeof(FrameRowEntryAddr1) == 2);
27+
static_assert(std::is_trivial_v<Header<Endian>>);
28+
static_assert(sizeof(Header<Endian>) == 28);
2829

29-
static_assert(std::is_trivial_v<FrameRowEntryAddr2>);
30-
static_assert(sizeof(FrameRowEntryAddr2) == 3);
30+
static_assert(std::is_trivial_v<FuncDescEntry<Endian>>);
31+
static_assert(sizeof(FuncDescEntry<Endian>) == 20);
3132

32-
static_assert(std::is_trivial_v<FrameRowEntryAddr4>);
33-
static_assert(sizeof(FrameRowEntryAddr4) == 5);
33+
static_assert(std::is_trivial_v<FrameRowEntryAddr1<Endian>>);
34+
static_assert(sizeof(FrameRowEntryAddr1<Endian>) == 2);
3435

35-
TEST(SFrameTest, FDEFlags) {
36-
FuncDescEntry FDE = {};
36+
static_assert(std::is_trivial_v<FrameRowEntryAddr2<Endian>>);
37+
static_assert(sizeof(FrameRowEntryAddr2<Endian>) == 3);
38+
39+
static_assert(std::is_trivial_v<FrameRowEntryAddr4<Endian>>);
40+
static_assert(sizeof(FrameRowEntryAddr4<Endian>) == 5);
41+
42+
};
43+
44+
struct NameGenerator {
45+
template <typename T> static constexpr const char *GetName(int) {
46+
if constexpr (T::value == endianness::little)
47+
return "little";
48+
if constexpr (T::value == endianness::big)
49+
return "big";
50+
}
51+
};
52+
using Types =
53+
testing::Types<std::integral_constant<endianness, endianness::little>,
54+
std::integral_constant<endianness, endianness::big>>;
55+
TYPED_TEST_SUITE(SFrameTest, Types, NameGenerator);
56+
57+
TYPED_TEST(SFrameTest, FDEFlags) {
58+
FuncDescEntry<TestFixture::Endian> FDE = {};
3759
EXPECT_EQ(FDE.Info, 0u);
3860
EXPECT_EQ(FDE.getPAuthKey(), 0);
3961
EXPECT_EQ(FDE.getFDEType(), FDEType::PCInc);
@@ -58,8 +80,8 @@ TEST(SFrameTest, FDEFlags) {
5880
EXPECT_EQ(FDE.getFREType(), FREType::Addr4);
5981
}
6082

61-
TEST(SFrameTest, FREFlags) {
62-
FREInfo Info = {};
83+
TYPED_TEST(SFrameTest, FREFlags) {
84+
FREInfo<TestFixture::Endian> Info = {};
6385
EXPECT_EQ(Info.Info, 0u);
6486
EXPECT_FALSE(Info.isReturnAddressSigned());
6587
EXPECT_EQ(Info.getOffsetSize(), FREOffset::B1);

0 commit comments

Comments
 (0)