As proposed on llvm-dev:
http://lists.llvm.org/pipermail/llvm-dev/2016-October/106595.html
This change also fixes an API oddity where BitstreamCursor::Read() would
return zero for the first read past the end of the bitstream, but would
report_fatal_error for subsequent reads. Now we always report_fatal_error
for all reads past the end. Updated clients to check for the end of the
bitstream before reading from it.
I also needed to add padding to the invalid bitcode tests in
test/Bitcode/. This is because the streaming interface was not checking that
the file size is a multiple of 4.
Differential Revision: https://reviews.llvm.org/D26219
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@285773
91177308-0d34-0410-b5e6-
96231b3b80d8
if ((!IsCOFF && Name == "__clangast") || (IsCOFF && Name == "clangast")) {
StringRef Buf;
Section.getContents(Buf);
- return StreamFile.init((const unsigned char *)Buf.begin(),
- (const unsigned char *)Buf.end());
+ StreamFile = llvm::BitstreamReader(Buf);
+ return;
}
}
}
if (EIB.convertToErrorCode() ==
llvm::object::object_error::invalid_file_type)
// As a fallback, treat the buffer as a raw AST.
- StreamFile.init((const unsigned char *)Buffer.getBufferStart(),
- (const unsigned char *)Buffer.getBufferEnd());
+ StreamFile = llvm::BitstreamReader(Buffer);
else
EIB.log(llvm::errs());
});
void RawPCHContainerReader::ExtractPCH(
llvm::MemoryBufferRef Buffer, llvm::BitstreamReader &StreamFile) const {
- StreamFile.init((const unsigned char *)Buffer.getBufferStart(),
- (const unsigned char *)Buffer.getBufferEnd());
+ StreamFile = llvm::BitstreamReader(Buffer);
}
PCHContainerOperations::PCHContainerOperations() {
if (!Buffer)
return SDError::CouldNotLoad;
- llvm::BitstreamReader StreamFile;
- StreamFile.init((const unsigned char *)(*Buffer)->getBufferStart(),
- (const unsigned char *)(*Buffer)->getBufferEnd());
-
+ llvm::BitstreamReader StreamFile(**Buffer);
llvm::BitstreamCursor Stream(StreamFile);
// Sniff for the signature.
/// \brief Whether \p Stream starts with the AST/PCH file magic number 'CPCH'.
static bool startsWithASTFileMagic(BitstreamCursor &Stream) {
- return Stream.Read(8) == 'C' &&
+ return Stream.canSkipToPos(4) &&
+ Stream.Read(8) == 'C' &&
Stream.Read(8) == 'P' &&
Stream.Read(8) == 'C' &&
Stream.Read(8) == 'H';
std::unique_ptr<llvm::MemoryBuffer> Buffer = std::move(BufferOrErr.get());
/// \brief The bitstream reader from which we'll read the AST file.
- llvm::BitstreamReader Reader((const unsigned char *)Buffer->getBufferStart(),
- (const unsigned char *)Buffer->getBufferEnd());
+ llvm::BitstreamReader Reader(*Buffer);
/// \brief The main bitstream cursor for the main block.
llvm::BitstreamCursor Cursor(Reader);