forked from llvm-mirror/llvm
-
Notifications
You must be signed in to change notification settings - Fork 16
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Remarks] Add parser for bitstream remarks
The bitstream remark serializer landed in r367372. This adds a bitstream remark parser that parser bitstream remark files to llvm::remarks::Remark objects through the RemarkParser interface. A few interesting things to point out: * There are parsing helpers to parse the different types of blocks * The main parsing helper allows us to parse remark metadata and open an external file containing the encoded remarks * This adds a dependency from the Remarks library to the BitstreamReader library * The testing strategy is to create a remark entry through YAML, parse it, serialize it to bitstream, parse that back and compare the objects. * There are close to no tests for malformed bitstream remarks, due to the lack of textual format for the bitstream format. * This adds a new C API for parsing bitstream remarks: LLVMRemarkParserCreateBitstream. * This bumps the REMARKS_API_VERSION to 1. Differential Revision: https://reviews.llvm.org/D67134 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@371429 91177308-0d34-0410-b5e6-96231b3b80d8
- Loading branch information
Showing
11 changed files
with
1,217 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
//===-- BitstreamRemarkParser.h - Bitstream parser --------------*- C++ -*-===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This file provides an implementation of the remark parser using the LLVM | ||
// Bitstream format. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef LLVM_REMARKS_BITSTREAM_REMARK_PARSER_H | ||
#define LLVM_REMARKS_BITSTREAM_REMARK_PARSER_H | ||
|
||
#include "llvm/ADT/StringRef.h" | ||
#include "llvm/Bitstream/BitstreamReader.h" | ||
#include "llvm/Remarks/BitstreamRemarkContainer.h" | ||
#include "llvm/Remarks/Remark.h" | ||
#include "llvm/Remarks/RemarkParser.h" | ||
#include "llvm/Support/Error.h" | ||
#include <array> | ||
|
||
namespace llvm { | ||
namespace remarks { | ||
|
||
/// Helper to parse a META_BLOCK for a bitstream remark container. | ||
struct BitstreamMetaParserHelper { | ||
/// The Bitstream reader. | ||
BitstreamCursor &Stream; | ||
/// Reference to the storage for the block info. | ||
BitstreamBlockInfo &BlockInfo; | ||
/// The parsed content: depending on the container type, some fields might be | ||
/// empty. | ||
Optional<uint64_t> ContainerVersion; | ||
Optional<uint8_t> ContainerType; | ||
Optional<StringRef> StrTabBuf; | ||
Optional<StringRef> ExternalFilePath; | ||
Optional<uint64_t> RemarkVersion; | ||
|
||
/// Continue parsing with \p Stream. \p Stream is expected to contain a | ||
/// ENTER_SUBBLOCK to the META_BLOCK at the current position. | ||
/// \p Stream is expected to have a BLOCKINFO_BLOCK set. | ||
BitstreamMetaParserHelper(BitstreamCursor &Stream, | ||
BitstreamBlockInfo &BlockInfo); | ||
|
||
/// Parse the META_BLOCK and fill the available entries. | ||
/// This helper does not check for the validity of the fields. | ||
Error parse(); | ||
}; | ||
|
||
/// Helper to parse a REMARK_BLOCK for a bitstream remark container. | ||
struct BitstreamRemarkParserHelper { | ||
/// The Bitstream reader. | ||
BitstreamCursor &Stream; | ||
/// The parsed content: depending on the remark, some fields might be empty. | ||
Optional<uint8_t> Type; | ||
Optional<uint64_t> RemarkNameIdx; | ||
Optional<uint64_t> PassNameIdx; | ||
Optional<uint64_t> FunctionNameIdx; | ||
Optional<uint64_t> SourceFileNameIdx; | ||
Optional<uint32_t> SourceLine; | ||
Optional<uint32_t> SourceColumn; | ||
Optional<uint64_t> Hotness; | ||
struct Argument { | ||
Optional<uint64_t> KeyIdx; | ||
Optional<uint64_t> ValueIdx; | ||
Optional<uint64_t> SourceFileNameIdx; | ||
Optional<uint32_t> SourceLine; | ||
Optional<uint32_t> SourceColumn; | ||
}; | ||
Optional<ArrayRef<Argument>> Args; | ||
/// Avoid re-allocating a vector every time. | ||
SmallVector<Argument, 8> TmpArgs; | ||
|
||
/// Continue parsing with \p Stream. \p Stream is expected to contain a | ||
/// ENTER_SUBBLOCK to the REMARK_BLOCK at the current position. | ||
/// \p Stream is expected to have a BLOCKINFO_BLOCK set and to have already | ||
/// parsed the META_BLOCK. | ||
BitstreamRemarkParserHelper(BitstreamCursor &Stream); | ||
|
||
/// Parse the REMARK_BLOCK and fill the available entries. | ||
/// This helper does not check for the validity of the fields. | ||
Error parse(); | ||
}; | ||
|
||
/// Helper to parse any bitstream remark container. | ||
struct BitstreamParserHelper { | ||
/// The Bitstream reader. | ||
BitstreamCursor Stream; | ||
/// The block info block. | ||
BitstreamBlockInfo BlockInfo; | ||
/// Start parsing at \p Buffer. | ||
BitstreamParserHelper(StringRef Buffer); | ||
/// Parse the magic number. | ||
Expected<std::array<char, 4>> parseMagic(); | ||
/// Parse the block info block containing all the abbrevs. | ||
/// This needs to be called before calling any other parsing function. | ||
Error parseBlockInfoBlock(); | ||
/// Return true if the next block is a META_BLOCK. This function does not move | ||
/// the cursor. | ||
Expected<bool> isMetaBlock(); | ||
/// Return true if the next block is a REMARK_BLOCK. This function does not | ||
/// move the cursor. | ||
Expected<bool> isRemarkBlock(); | ||
/// Return true if the parser reached the end of the stream. | ||
bool atEndOfStream() { return Stream.AtEndOfStream(); } | ||
/// Jump to the end of the stream, skipping everything. | ||
void skipToEnd() { return Stream.skipToEnd(); } | ||
}; | ||
|
||
} // end namespace remarks | ||
} // end namespace llvm | ||
|
||
#endif /* LLVM_REMARKS_BITSTREAM_REMARK_PARSER_H */ |
Oops, something went wrong.