Skip to content

Commit 51d85b7

Browse files
authored
[Support] Add llvm::support::endian::writeNext (#88685)
`writeNext` overloads increase the pointer argument like `readNext`. Code like the following ``` endian::write32<ELFT::Endianness>(p, 42); p += 4; endian::write32<ELFT::Endianness>(p, 43); p += 4; ``` can be simplified to: ``` endian::writeNext<uint32_t, ELFT::Endianness>(p, 42); endian::writeNext<uint32_t, ELFT::Endianness>(p, 43); ```
1 parent e09245b commit 51d85b7

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

llvm/include/llvm/Support/Endian.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,21 @@ inline void write(void *memory, value_type value) {
102102
write<value_type, alignment>(memory, value, endian);
103103
}
104104

105+
/// Write a value of a particular endianness, and increment the buffer past that
106+
/// value.
107+
template <typename value_type, std::size_t alignment = unaligned,
108+
typename CharT>
109+
inline void writeNext(CharT *&memory, value_type value, endianness endian) {
110+
write(memory, value, endian);
111+
memory += sizeof(value_type);
112+
}
113+
114+
template <typename value_type, endianness endian,
115+
std::size_t alignment = unaligned, typename CharT>
116+
inline void writeNext(CharT *&memory, value_type value) {
117+
writeNext<value_type, alignment, CharT>(memory, value, endian);
118+
}
119+
105120
template <typename value_type>
106121
using make_unsigned_t = std::make_unsigned_t<value_type>;
107122

llvm/unittests/Support/EndianTest.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,29 @@ TEST(Endian, Read) {
3636
1)));
3737
}
3838

39+
TEST(Endian, WriteNext) {
40+
unsigned char bigval[] = {0x00, 0x00}, *p = bigval;
41+
endian::writeNext<int16_t, llvm::endianness::big>(p, short(0xaabb));
42+
EXPECT_EQ(bigval[0], 0xaa);
43+
EXPECT_EQ(bigval[1], 0xbb);
44+
EXPECT_EQ(p, bigval + 2);
45+
46+
char littleval[8] = {}, *q = littleval;
47+
endian::writeNext<uint32_t, llvm::endianness::little>(q, 0x44556677);
48+
EXPECT_EQ(littleval[0], 0x77);
49+
EXPECT_EQ(littleval[1], 0x66);
50+
EXPECT_EQ(littleval[2], 0x55);
51+
EXPECT_EQ(littleval[3], 0x44);
52+
EXPECT_EQ(q, littleval + 4);
53+
54+
endian::writeNext<uint32_t>(q, 0x11223344, llvm::endianness::little);
55+
EXPECT_EQ(littleval[4], 0x44);
56+
EXPECT_EQ(littleval[5], 0x33);
57+
EXPECT_EQ(littleval[6], 0x22);
58+
EXPECT_EQ(littleval[7], 0x11);
59+
EXPECT_EQ(q, littleval + 8);
60+
}
61+
3962
TEST(Endian, ReadBitAligned) {
4063
// Simple test to make sure we properly pull out the 0x0 word.
4164
unsigned char littleval[] = {0x3f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff};

0 commit comments

Comments
 (0)