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 22 namespace llvm { 23 namespace remarks { 24 25 struct Remark; 26 27 class EndOfFileError : public ErrorInfo<EndOfFileError> { 28 public: 29 static char ID; 30 31 EndOfFileError() = default; 32 log(raw_ostream & OS)33 void log(raw_ostream &OS) const override { OS << "End of file reached."; } convertToErrorCode()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. 40 struct 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 RemarkParserRemarkParser46 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). 60 struct 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 sizeParsedStringTable75 size_t size() const { return Offsets.size(); } 76 Expected<StringRef> operator[](size_t Index) const; 77 }; 78 79 Expected<std::unique_ptr<RemarkParser>> createRemarkParser(Format ParserFormat, 80 StringRef Buf); 81 82 Expected<std::unique_ptr<RemarkParser>> 83 createRemarkParser(Format ParserFormat, StringRef Buf, 84 ParsedStringTable StrTab); 85 86 Expected<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