1//===-- llvm/Remarks/Remark.h - The remark type -----------------*- C++/-*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// This file provides an interface for parsing remarks in LLVM. 10// 11//===----------------------------------------------------------------------===// 12 13#ifndef LLVM_REMARKS_REMARKPARSER_H 14#define LLVM_REMARKS_REMARKPARSER_H 15 16#include "llvm/ADT/StringRef.h" 17#include "llvm/Remarks/RemarkFormat.h" 18#include "llvm/Support/Error.h" 19#include <memory> 20#include <optional> 21 22namespace llvm { 23namespace remarks { 24 25struct Remark; 26 27class EndOfFileError : public ErrorInfo<EndOfFileError> { 28public: 29 static char ID; 30 31 EndOfFileError() = default; 32 33 void log(raw_ostream &OS) const override { OS << "End of file reached."; } 34 std::error_code convertToErrorCode() const override { 35 return inconvertibleErrorCode(); 36 } 37}; 38 39/// Parser used to parse a raw buffer to remarks::Remark objects. 40struct RemarkParser { 41 /// The format of the parser. 42 Format ParserFormat; 43 /// Path to prepend when opening an external remark file. 44 std::string ExternalFilePrependPath; 45 46 RemarkParser(Format ParserFormat) : ParserFormat(ParserFormat) {} 47 48 /// If no error occurs, this returns a valid Remark object. 49 /// If an error of type EndOfFileError occurs, it is safe to recover from it 50 /// by stopping the parsing. 51 /// If any other error occurs, it should be propagated to the user. 52 /// The pointer should never be null. 53 virtual Expected<std::unique_ptr<Remark>> next() = 0; 54 55 virtual ~RemarkParser() = default; 56}; 57 58/// In-memory representation of the string table parsed from a buffer (e.g. the 59/// remarks section). 60struct ParsedStringTable { 61 /// The buffer mapped from the section contents. 62 StringRef Buffer; 63 /// This object has high changes to be std::move'd around, so don't use a 64 /// SmallVector for once. 65 std::vector<size_t> Offsets; 66 67 ParsedStringTable(StringRef Buffer); 68 /// Disable copy. 69 ParsedStringTable(const ParsedStringTable &) = delete; 70 ParsedStringTable &operator=(const ParsedStringTable &) = delete; 71 /// Should be movable. 72 ParsedStringTable(ParsedStringTable &&) = default; 73 ParsedStringTable &operator=(ParsedStringTable &&) = default; 74 75 size_t size() const { return Offsets.size(); } 76 Expected<StringRef> operator[](size_t Index) const; 77}; 78 79Expected<std::unique_ptr<RemarkParser>> createRemarkParser(Format ParserFormat, 80 StringRef Buf); 81 82Expected<std::unique_ptr<RemarkParser>> 83createRemarkParser(Format ParserFormat, StringRef Buf, 84 ParsedStringTable StrTab); 85 86Expected<std::unique_ptr<RemarkParser>> createRemarkParserFromMeta( 87 Format ParserFormat, StringRef Buf, 88 std::optional<ParsedStringTable> StrTab = std::nullopt, 89 std::optional<StringRef> ExternalFilePrependPath = std::nullopt); 90 91} // end namespace remarks 92} // end namespace llvm 93 94#endif // LLVM_REMARKS_REMARKPARSER_H 95