diff options
Diffstat (limited to 'lib/Remarks/BitstreamRemarkParser.h')
-rw-r--r-- | lib/Remarks/BitstreamRemarkParser.h | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/lib/Remarks/BitstreamRemarkParser.h b/lib/Remarks/BitstreamRemarkParser.h new file mode 100644 index 000000000000..7c9cc2f1e7db --- /dev/null +++ b/lib/Remarks/BitstreamRemarkParser.h @@ -0,0 +1,83 @@ +//===-- 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/ADT/Optional.h" +#include "llvm/ADT/SmallVector.h" +#include "llvm/Remarks/BitstreamRemarkParser.h" +#include "llvm/Remarks/RemarkFormat.h" +#include "llvm/Remarks/RemarkParser.h" +#include "llvm/Support/raw_ostream.h" +#include <memory> +#include <string> + +namespace llvm { +namespace remarks { +/// 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. + 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; + uint64_t RemarkVersion; + BitstreamRemarkContainerType ContainerType; + /// 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. + BitstreamRemarkParser(StringRef Buf) + : RemarkParser(Format::Bitstream), ParserHelper(Buf) {} + + /// Create a parser that uses a pre-parsed string table. + BitstreamRemarkParser(StringRef Buf, ParsedStringTable StrTab) + : RemarkParser(Format::Bitstream), ParserHelper(Buf), + StrTab(std::move(StrTab)) {} + + 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(Optional<StringRef> ExternalFilePath); +}; + +Expected<std::unique_ptr<BitstreamRemarkParser>> createBitstreamParserFromMeta( + StringRef Buf, Optional<ParsedStringTable> StrTab = None, + Optional<StringRef> ExternalFilePrependPath = None); + +} // end namespace remarks +} // end namespace llvm + +#endif /* LLVM_LIB_REMARKS_BITSTREAM_REMARK_PARSER_H */ |