mirror of
https://github.com/RPCSX/llvm.git
synced 2025-04-07 18:51:48 +00:00

This was reverted due to a "missing" file, but in reality what happened was that I renamed a file, and then due to a merge conflict both the old file and the new file got added to the repository. This led to an unused cpp file being in the repo and not referenced by any CMakeLists.txt but #including a .h file that wasn't in the repo. In an even more unfortunate coincidence, CMake didn't report the unused cpp file because it was in a subdirectory of the folder with the CMakeLists.txt, and not in the same directory as any CMakeLists.txt. The presence of the unused file was then breaking certain tools that determine file lists by globbing rather than by what's specified in CMakeLists.txt In any case, the fix is to just remove the unused file from the patch set. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@302042 91177308-0d34-0410-b5e6-96231b3b80d8
108 lines
3.2 KiB
C++
108 lines
3.2 KiB
C++
//===- BinaryStreamReader.cpp - Reads objects from a binary stream --------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Support/BinaryStreamReader.h"
|
|
|
|
#include "llvm/Support/BinaryStreamError.h"
|
|
#include "llvm/Support/BinaryStreamRef.h"
|
|
|
|
using namespace llvm;
|
|
|
|
BinaryStreamReader::BinaryStreamReader(BinaryStreamRef S)
|
|
: Stream(S), Offset(0) {}
|
|
|
|
Error BinaryStreamReader::readLongestContiguousChunk(
|
|
ArrayRef<uint8_t> &Buffer) {
|
|
if (auto EC = Stream.readLongestContiguousChunk(Offset, Buffer))
|
|
return EC;
|
|
Offset += Buffer.size();
|
|
return Error::success();
|
|
}
|
|
|
|
Error BinaryStreamReader::readBytes(ArrayRef<uint8_t> &Buffer, uint32_t Size) {
|
|
if (auto EC = Stream.readBytes(Offset, Size, Buffer))
|
|
return EC;
|
|
Offset += Size;
|
|
return Error::success();
|
|
}
|
|
|
|
Error BinaryStreamReader::readCString(StringRef &Dest) {
|
|
// TODO: This could be made more efficient by using readLongestContiguousChunk
|
|
// and searching for null terminators in the resulting buffer.
|
|
|
|
uint32_t Length = 0;
|
|
// First compute the length of the string by reading 1 byte at a time.
|
|
uint32_t OriginalOffset = getOffset();
|
|
const char *C;
|
|
while (true) {
|
|
if (auto EC = readObject(C))
|
|
return EC;
|
|
if (*C == '\0')
|
|
break;
|
|
++Length;
|
|
}
|
|
// Now go back and request a reference for that many bytes.
|
|
uint32_t NewOffset = getOffset();
|
|
setOffset(OriginalOffset);
|
|
|
|
if (auto EC = readFixedString(Dest, Length))
|
|
return EC;
|
|
|
|
// Now set the offset back to where it was after we calculated the length.
|
|
setOffset(NewOffset);
|
|
return Error::success();
|
|
}
|
|
|
|
Error BinaryStreamReader::readFixedString(StringRef &Dest, uint32_t Length) {
|
|
ArrayRef<uint8_t> Bytes;
|
|
if (auto EC = readBytes(Bytes, Length))
|
|
return EC;
|
|
Dest = StringRef(reinterpret_cast<const char *>(Bytes.begin()), Bytes.size());
|
|
return Error::success();
|
|
}
|
|
|
|
Error BinaryStreamReader::readStreamRef(BinaryStreamRef &Ref) {
|
|
return readStreamRef(Ref, bytesRemaining());
|
|
}
|
|
|
|
Error BinaryStreamReader::readStreamRef(BinaryStreamRef &Ref, uint32_t Length) {
|
|
if (bytesRemaining() < Length)
|
|
return make_error<BinaryStreamError>(stream_error_code::stream_too_short);
|
|
Ref = Stream.slice(Offset, Length);
|
|
Offset += Length;
|
|
return Error::success();
|
|
}
|
|
|
|
Error BinaryStreamReader::skip(uint32_t Amount) {
|
|
if (Amount > bytesRemaining())
|
|
return make_error<BinaryStreamError>(stream_error_code::stream_too_short);
|
|
Offset += Amount;
|
|
return Error::success();
|
|
}
|
|
|
|
uint8_t BinaryStreamReader::peek() const {
|
|
ArrayRef<uint8_t> Buffer;
|
|
auto EC = Stream.readBytes(Offset, 1, Buffer);
|
|
assert(!EC && "Cannot peek an empty buffer!");
|
|
llvm::consumeError(std::move(EC));
|
|
return Buffer[0];
|
|
}
|
|
|
|
std::pair<BinaryStreamReader, BinaryStreamReader>
|
|
BinaryStreamReader::split(uint32_t Off) const {
|
|
assert(getLength() >= Off);
|
|
|
|
BinaryStreamRef First = Stream.drop_front(Offset);
|
|
|
|
BinaryStreamRef Second = First.drop_front(Off);
|
|
First = First.keep_front(Off);
|
|
BinaryStreamReader W1{First};
|
|
BinaryStreamReader W2{Second};
|
|
return std::make_pair(W1, W2);
|
|
} |