diff options
| author | Lang Hames <lhames@gmail.com> | 2019-04-17 15:38:27 +0000 |
|---|---|---|
| committer | Lang Hames <lhames@gmail.com> | 2019-04-17 15:38:27 +0000 |
| commit | c1106c9b1161a120ccc0c44b0dcab0b403860ad2 (patch) | |
| tree | 9f5874fc27cd96942ad4fa5f933b3570c1a11dae /llvm/unittests/Support | |
| parent | 258a425c69f0f611ae237ad507252ad18048d2ab (diff) | |
| download | bcm5719-llvm-c1106c9b1161a120ccc0c44b0dcab0b403860ad2.tar.gz bcm5719-llvm-c1106c9b1161a120ccc0c44b0dcab0b403860ad2.zip | |
[Support] Add LEB128 support to BinaryStreamReader/Writer.
Summary:
This patch adds support for ULEB128 and SLEB128 encoding and decoding to
BinaryStreamWriter and BinaryStreamReader respectively.
Support for ULEB128/SLEB128 will be used for eh-frame parsing in the JITLink
library currently under development (see https://reviews.llvm.org/D58704).
Reviewers: zturner, dblaikie
Subscribers: kristina, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D60810
llvm-svn: 358584
Diffstat (limited to 'llvm/unittests/Support')
| -rw-r--r-- | llvm/unittests/Support/BinaryStreamTest.cpp | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/llvm/unittests/Support/BinaryStreamTest.cpp b/llvm/unittests/Support/BinaryStreamTest.cpp index fe574072a11..5291a31013c 100644 --- a/llvm/unittests/Support/BinaryStreamTest.cpp +++ b/llvm/unittests/Support/BinaryStreamTest.cpp @@ -610,6 +610,77 @@ TEST_F(BinaryStreamTest, StreamReaderEnum) { } } +TEST_F(BinaryStreamTest, StreamReaderULEB128) { + std::vector<uint64_t> TestValues = { + 0, // Zero + 0x7F, // One byte + 0xFF, // One byte, all-ones + 0xAAAA, // Two bytes + 0xAAAAAAAA, // Four bytes + 0xAAAAAAAAAAAAAAAA, // Eight bytes + 0xffffffffffffffff // Eight bytess, all-ones + }; + + // Conservatively assume a 10-byte encoding for each of our LEB128s, with no + // alignment requirement. + initializeOutput(10 * TestValues.size(), 1); + initializeInputFromOutput(1); + + for (auto &Stream : Streams) { + // Write fields. + BinaryStreamWriter Writer(*Stream.Output); + for (const auto &Value : TestValues) + ASSERT_THAT_ERROR(Writer.writeULEB128(Value), Succeeded()); + + // Read fields. + BinaryStreamReader Reader(*Stream.Input); + std::vector<uint64_t> Results; + Results.resize(TestValues.size()); + for (unsigned I = 0; I != TestValues.size(); ++I) + ASSERT_THAT_ERROR(Reader.readULEB128(Results[I]), Succeeded()); + + for (unsigned I = 0; I != TestValues.size(); ++I) + EXPECT_EQ(TestValues[I], Results[I]); + } +} + +TEST_F(BinaryStreamTest, StreamReaderSLEB128) { + std::vector<int64_t> TestValues = { + 0, // Zero + 0x7F, // One byte + -0x7F, // One byte, negative + 0xFF, // One byte, all-ones + 0xAAAA, // Two bytes + -0xAAAA, // Two bytes, negative + 0xAAAAAAAA, // Four bytes + -0xAAAAAAAA, // Four bytes, negative + 0x2AAAAAAAAAAAAAAA, // Eight bytes + -0x7ffffffffffffff // Eight bytess, negative + }; + + // Conservatively assume a 10-byte encoding for each of our LEB128s, with no + // alignment requirement. + initializeOutput(10 * TestValues.size(), 1); + initializeInputFromOutput(1); + + for (auto &Stream : Streams) { + // Write fields. + BinaryStreamWriter Writer(*Stream.Output); + for (const auto &Value : TestValues) + ASSERT_THAT_ERROR(Writer.writeSLEB128(Value), Succeeded()); + + // Read fields. + BinaryStreamReader Reader(*Stream.Input); + std::vector<int64_t> Results; + Results.resize(TestValues.size()); + for (unsigned I = 0; I != TestValues.size(); ++I) + ASSERT_THAT_ERROR(Reader.readSLEB128(Results[I]), Succeeded()); + + for (unsigned I = 0; I != TestValues.size(); ++I) + EXPECT_EQ(TestValues[I], Results[I]); + } +} + TEST_F(BinaryStreamTest, StreamReaderObject) { struct Foo { int X; |

