
Background: The yaml-strtab format looks just like the yaml format, except that the values in the key/value pairs of the remarks are deduplicated and replaced by indices into a string table (see removed test cases for examples). The motivation behind this format was to reduce size of the remarks files. However, it was quickly superseded by the bitstream format. Therefore, remove the yaml-strtab format, as it doesn't have a good usecase anymore: - It isn't particularly efficient - It isn't human-readable - It isn't straightforward to parse in external tools that can't use the remarks library. We don't even support it in opt-viewer. llvm-remarkutil is also missing options to parse/convert yaml-strtab, so the chance that anyone is actually using this format is low.
82 lines
2.9 KiB
C++
82 lines
2.9 KiB
C++
//===-- BitstreamRemarkParser.h - Parser for Bitstream remarks --*- 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 the impementation of the Bitstream remark parser.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_REMARKS_BITSTREAM_REMARK_PARSER_H
|
|
#define LLVM_LIB_REMARKS_BITSTREAM_REMARK_PARSER_H
|
|
|
|
#include "llvm/Remarks/BitstreamRemarkContainer.h"
|
|
#include "llvm/Remarks/BitstreamRemarkParser.h"
|
|
#include "llvm/Remarks/RemarkFormat.h"
|
|
#include "llvm/Remarks/RemarkParser.h"
|
|
#include <cstdint>
|
|
#include <memory>
|
|
#include <optional>
|
|
|
|
namespace llvm {
|
|
namespace remarks {
|
|
|
|
struct Remark;
|
|
|
|
/// Parses and holds the state of the latest parsed remark.
|
|
struct BitstreamRemarkParser : public RemarkParser {
|
|
/// The buffer to parse.
|
|
BitstreamParserHelper ParserHelper;
|
|
/// The string table used for parsing strings.
|
|
std::optional<ParsedStringTable> StrTab;
|
|
/// Temporary remark buffer used when the remarks are stored separately.
|
|
std::unique_ptr<MemoryBuffer> TmpRemarkBuffer;
|
|
/// The common metadata used to decide how to parse the buffer.
|
|
/// This is filled when parsing the metadata block.
|
|
uint64_t ContainerVersion = 0;
|
|
uint64_t RemarkVersion = 0;
|
|
BitstreamRemarkContainerType ContainerType =
|
|
BitstreamRemarkContainerType::Standalone;
|
|
/// Wether the parser is ready to parse remarks.
|
|
bool ReadyToParseRemarks = false;
|
|
|
|
/// Create a parser that expects to find a string table embedded in the
|
|
/// stream.
|
|
explicit BitstreamRemarkParser(StringRef Buf)
|
|
: RemarkParser(Format::Bitstream), ParserHelper(Buf) {}
|
|
|
|
Expected<std::unique_ptr<Remark>> next() override;
|
|
|
|
static bool classof(const RemarkParser *P) {
|
|
return P->ParserFormat == Format::Bitstream;
|
|
}
|
|
|
|
/// Parse and process the metadata of the buffer.
|
|
Error parseMeta();
|
|
|
|
/// Parse a Bitstream remark.
|
|
Expected<std::unique_ptr<Remark>> parseRemark();
|
|
|
|
private:
|
|
/// Helper functions.
|
|
Error processCommonMeta(BitstreamMetaParserHelper &Helper);
|
|
Error processStandaloneMeta(BitstreamMetaParserHelper &Helper);
|
|
Error processSeparateRemarksFileMeta(BitstreamMetaParserHelper &Helper);
|
|
Error processSeparateRemarksMetaMeta(BitstreamMetaParserHelper &Helper);
|
|
Expected<std::unique_ptr<Remark>>
|
|
processRemark(BitstreamRemarkParserHelper &Helper);
|
|
Error processExternalFilePath(std::optional<StringRef> ExternalFilePath);
|
|
};
|
|
|
|
Expected<std::unique_ptr<BitstreamRemarkParser>> createBitstreamParserFromMeta(
|
|
StringRef Buf,
|
|
std::optional<StringRef> ExternalFilePrependPath = std::nullopt);
|
|
|
|
} // end namespace remarks
|
|
} // end namespace llvm
|
|
|
|
#endif /* LLVM_LIB_REMARKS_BITSTREAM_REMARK_PARSER_H */
|