class DiscontiguousStream : public WritableBinaryStream {
public:
- DiscontiguousStream(MutableArrayRef<uint8_t> Data, endianness Endian)
- : Data(Data), PartitionIndex(Data.size() / 2), Endian(Endian) {}
+ DiscontiguousStream(MutableArrayRef<uint8_t> Data, endianness Endian,
+ uint32_t Align)
+ : Data(Data), PartitionIndex(alignDown(Data.size() / 2, Align)),
+ Endian(Endian) {}
endianness getEndian() const override { return Endian; }
std::unique_ptr<WritableBinaryStream> Output;
};
- void initializeInput(ArrayRef<uint8_t> Input) {
+ void initializeInput(ArrayRef<uint8_t> Input, uint32_t Align) {
InputData = Input;
BrokenInputData.resize(InputData.size());
if (!Input.empty()) {
- uint32_t PartitionIndex = InputData.size() / 2;
+ uint32_t PartitionIndex = alignDown(InputData.size() / 2, Align);
uint32_t RightBytes = InputData.size() - PartitionIndex;
uint32_t LeftBytes = PartitionIndex;
if (RightBytes > 0)
for (uint32_t I = 0; I < NumEndians; ++I) {
auto InByteStream =
llvm::make_unique<BinaryByteStream>(InputData, Endians[I]);
- auto InBrokenStream =
- llvm::make_unique<DiscontiguousStream>(BrokenInputData, Endians[I]);
+ auto InBrokenStream = llvm::make_unique<DiscontiguousStream>(
+ BrokenInputData, Endians[I], Align);
Streams[I * 2].Input = std::move(InByteStream);
Streams[I * 2 + 1].Input = std::move(InBrokenStream);
}
}
- void initializeOutput(uint32_t Size) {
+ void initializeOutput(uint32_t Size, uint32_t Align) {
OutputData.resize(Size);
BrokenOutputData.resize(Size);
for (uint32_t I = 0; I < NumEndians; ++I) {
Streams[I * 2].Output =
llvm::make_unique<MutableBinaryByteStream>(OutputData, Endians[I]);
- Streams[I * 2 + 1].Output =
- llvm::make_unique<DiscontiguousStream>(BrokenOutputData, Endians[I]);
+ Streams[I * 2 + 1].Output = llvm::make_unique<DiscontiguousStream>(
+ BrokenOutputData, Endians[I], Align);
}
}
- void initializeOutputFromInput() {
+ void initializeOutputFromInput(uint32_t Align) {
for (uint32_t I = 0; I < NumEndians; ++I) {
Streams[I * 2].Output =
llvm::make_unique<MutableBinaryByteStream>(InputData, Endians[I]);
- Streams[I * 2 + 1].Output =
- llvm::make_unique<DiscontiguousStream>(BrokenInputData, Endians[I]);
+ Streams[I * 2 + 1].Output = llvm::make_unique<DiscontiguousStream>(
+ BrokenInputData, Endians[I], Align);
}
}
- void initializeInputFromOutput() {
+ void initializeInputFromOutput(uint32_t Align) {
for (uint32_t I = 0; I < NumEndians; ++I) {
Streams[I * 2].Input =
llvm::make_unique<BinaryByteStream>(OutputData, Endians[I]);
- Streams[I * 2 + 1].Input =
- llvm::make_unique<DiscontiguousStream>(BrokenOutputData, Endians[I]);
+ Streams[I * 2 + 1].Input = llvm::make_unique<DiscontiguousStream>(
+ BrokenOutputData, Endians[I], Align);
}
}
// Tests that a we can read from a BinaryByteStream without a StreamReader.
TEST_F(BinaryStreamTest, BinaryByteStreamBounds) {
std::vector<uint8_t> InputData = {1, 2, 3, 4, 5};
- initializeInput(InputData);
+ initializeInput(InputData, 1);
for (auto &Stream : Streams) {
ArrayRef<uint8_t> Buffer;
TEST_F(BinaryStreamTest, StreamRefBounds) {
std::vector<uint8_t> InputData = {1, 2, 3, 4, 5};
- initializeInput(InputData);
+ initializeInput(InputData, 1);
for (const auto &Stream : Streams) {
ArrayRef<uint8_t> Buffer;
// Test that we can write to a BinaryStream without a StreamWriter.
TEST_F(BinaryStreamTest, MutableBinaryByteStreamBounds) {
std::vector<uint8_t> InputData = {'T', 'e', 's', 't', '\0'};
- initializeInput(InputData);
- initializeOutput(InputData.size());
+ initializeInput(InputData, 1);
+ initializeOutput(InputData.size(), 1);
// For every combination of input stream and output stream.
for (auto &Stream : Streams) {
ArrayRef<uint8_t> IntBytes(reinterpret_cast<uint8_t *>(Ints.data()),
Ints.size() * sizeof(uint32_t));
- initializeInput(IntBytes);
+ initializeInput(IntBytes, alignof(uint32_t));
for (auto &Stream : Streams) {
MutableArrayRef<uint8_t> Buffer;
"Extra Longest Test Of All");
ArrayRef<uint8_t> StringBytes(
reinterpret_cast<const uint8_t *>(Strings.data()), Strings.size());
- initializeInput(StringBytes);
+ initializeInput(StringBytes, 1);
struct StringExtractor {
public:
TEST_F(BinaryStreamTest, StreamReaderBounds) {
std::vector<uint8_t> Bytes;
- initializeInput(Bytes);
+ initializeInput(Bytes, 1);
for (auto &Stream : Streams) {
StringRef S;
BinaryStreamReader Reader(*Stream.Input);
}
Bytes.resize(5);
- initializeInput(Bytes);
+ initializeInput(Bytes, 1);
for (auto &Stream : Streams) {
StringRef S;
BinaryStreamReader Reader(*Stream.Input);
constexpr uint32_t Size =
sizeof(Little) + sizeof(Big) + sizeof(NS) + sizeof(NI) + sizeof(NUL);
- initializeOutput(Size);
- initializeInputFromOutput();
+ initializeOutput(Size, alignof(support::ulittle64_t));
+ initializeInputFromOutput(alignof(support::ulittle64_t));
for (auto &Stream : Streams) {
BinaryStreamWriter Writer(*Stream.Output);
}
}
-TEST_F(BinaryStreamTest, DISABLED_StreamReaderIntegerArray) {
+TEST_F(BinaryStreamTest, StreamReaderIntegerArray) {
// 1. Arrays of integers
std::vector<int> Ints = {1, 2, 3, 4, 5};
ArrayRef<uint8_t> IntBytes(reinterpret_cast<uint8_t *>(&Ints[0]),
Ints.size() * sizeof(int));
- initializeInput(IntBytes);
+ initializeInput(IntBytes, alignof(int));
for (auto &Stream : Streams) {
BinaryStreamReader Reader(*Stream.Input);
ArrayRef<int> IntsRef;
std::vector<MyEnum> Enums = {MyEnum::Bar, MyEnum::Baz, MyEnum::Foo};
- initializeOutput(Enums.size() * sizeof(MyEnum));
- initializeInputFromOutput();
+ initializeOutput(Enums.size() * sizeof(MyEnum), alignof(MyEnum));
+ initializeInputFromOutput(alignof(MyEnum));
for (auto &Stream : Streams) {
BinaryStreamWriter Writer(*Stream.Output);
for (auto Value : Enums)
const uint8_t *Bytes = reinterpret_cast<const uint8_t *>(&Foos[0]);
- initializeInput(makeArrayRef(Bytes, 2 * sizeof(Foo)));
+ initializeInput(makeArrayRef(Bytes, 2 * sizeof(Foo)), alignof(Foo));
for (auto &Stream : Streams) {
// 1. Reading object pointers.
std::vector<uint8_t> Bytes = {'O', 'n', 'e', '\0', 'T', 'w', 'o',
'\0', 'T', 'h', 'r', 'e', 'e', '\0',
'F', 'o', 'u', 'r', '\0'};
- initializeInput(Bytes);
+ initializeInput(Bytes, 1);
for (auto &Stream : Streams) {
BinaryStreamReader Reader(*Stream.Input);
}
TEST_F(BinaryStreamTest, StreamWriterBounds) {
- initializeOutput(5);
+ initializeOutput(5, 1);
for (auto &Stream : Streams) {
BinaryStreamWriter Writer(*Stream.Output);
ArrayRef<uint8_t> SourceBytes(reinterpret_cast<uint8_t *>(&SourceInts[0]),
SourceInts.size() * sizeof(int));
- initializeInput(SourceBytes);
- initializeOutputFromInput();
+ initializeInput(SourceBytes, alignof(int));
+ initializeOutputFromInput(alignof(int));
for (auto &Stream : Streams) {
BinaryStreamReader Reader(*Stream.Input);
size_t Length = 0;
for (auto S : Strings)
Length += S.size() + 1;
- initializeOutput(Length);
- initializeInputFromOutput();
+ initializeOutput(Length, 1);
+ initializeInputFromOutput(1);
for (auto &Stream : Streams) {
BinaryStreamWriter Writer(*Stream.Output);