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