summaryrefslogtreecommitdiff
path: root/llvm/lib/Remarks/BitstreamRemarkParser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Remarks/BitstreamRemarkParser.cpp')
-rw-r--r--llvm/lib/Remarks/BitstreamRemarkParser.cpp37
1 files changed, 22 insertions, 15 deletions
diff --git a/llvm/lib/Remarks/BitstreamRemarkParser.cpp b/llvm/lib/Remarks/BitstreamRemarkParser.cpp
index 99a82e1ee3af..4c4508879114 100644
--- a/llvm/lib/Remarks/BitstreamRemarkParser.cpp
+++ b/llvm/lib/Remarks/BitstreamRemarkParser.cpp
@@ -174,7 +174,7 @@ static Error parseBlock(T &ParserHelper, unsigned BlockID,
// Stop when there is nothing to read anymore or when we encounter an
// END_BLOCK.
while (!Stream.AtEndOfStream()) {
- Expected<BitstreamEntry> Next = Stream.advance();
+ Next = Stream.advance();
if (!Next)
return Next.takeError();
switch (Next->Kind) {
@@ -278,19 +278,20 @@ Expected<bool> BitstreamParserHelper::isRemarkBlock() {
return isBlock(Stream, META_BLOCK_ID);
}
-static Error validateMagicNumber(StringRef Magic) {
- if (Magic != remarks::ContainerMagic)
+static Error validateMagicNumber(StringRef MagicNumber) {
+ if (MagicNumber != remarks::ContainerMagic)
return createStringError(std::make_error_code(std::errc::invalid_argument),
"Unknown magic number: expecting %s, got %.4s.",
- remarks::ContainerMagic.data(), Magic.data());
+ remarks::ContainerMagic.data(), MagicNumber.data());
return Error::success();
}
static Error advanceToMetaBlock(BitstreamParserHelper &Helper) {
- Expected<std::array<char, 4>> Magic = Helper.parseMagic();
- if (!Magic)
- return Magic.takeError();
- if (Error E = validateMagicNumber(StringRef(Magic->data(), Magic->size())))
+ Expected<std::array<char, 4>> MagicNumber = Helper.parseMagic();
+ if (!MagicNumber)
+ return MagicNumber.takeError();
+ if (Error E = validateMagicNumber(
+ StringRef(MagicNumber->data(), MagicNumber->size())))
return E;
if (Error E = Helper.parseBlockInfoBlock())
return E;
@@ -309,11 +310,12 @@ remarks::createBitstreamParserFromMeta(
StringRef Buf, Optional<ParsedStringTable> StrTab,
Optional<StringRef> ExternalFilePrependPath) {
BitstreamParserHelper Helper(Buf);
- Expected<std::array<char, 4>> Magic = Helper.parseMagic();
- if (!Magic)
- return Magic.takeError();
+ Expected<std::array<char, 4>> MagicNumber = Helper.parseMagic();
+ if (!MagicNumber)
+ return MagicNumber.takeError();
- if (Error E = validateMagicNumber(StringRef(Magic->data(), Magic->size())))
+ if (Error E = validateMagicNumber(
+ StringRef(MagicNumber->data(), MagicNumber->size())))
return std::move(E);
auto Parser =
@@ -364,15 +366,15 @@ Error BitstreamRemarkParser::parseMeta() {
}
Error BitstreamRemarkParser::processCommonMeta(
- BitstreamMetaParserHelper &MetaHelper) {
- if (Optional<uint64_t> Version = MetaHelper.ContainerVersion)
+ BitstreamMetaParserHelper &Helper) {
+ if (Optional<uint64_t> Version = Helper.ContainerVersion)
ContainerVersion = *Version;
else
return createStringError(
std::make_error_code(std::errc::illegal_byte_sequence),
"Error while parsing BLOCK_META: missing container version.");
- if (Optional<uint8_t> Type = MetaHelper.ContainerType) {
+ if (Optional<uint8_t> Type = Helper.ContainerType) {
// Always >= BitstreamRemarkContainerType::First since it's unsigned.
if (*Type > static_cast<uint8_t>(BitstreamRemarkContainerType::Last))
return createStringError(
@@ -426,8 +428,13 @@ Error BitstreamRemarkParser::processExternalFilePath(
MemoryBuffer::getFile(FullPath);
if (std::error_code EC = BufferOrErr.getError())
return createFileError(FullPath, EC);
+
TmpRemarkBuffer = std::move(*BufferOrErr);
+ // Don't try to parse the file if it's empty.
+ if (TmpRemarkBuffer->getBufferSize() == 0)
+ return make_error<EndOfFileError>();
+
// Create a separate parser used for parsing the separate file.
ParserHelper = BitstreamParserHelper(TmpRemarkBuffer->getBuffer());
// Advance and check until we can parse the meta block.