87 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			3.1 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/ADT/Optional.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>
 | |
| 
 | |
| 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.
 | |
|   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) {}
 | |
| 
 | |
|   /// 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 */
 |