15a05cc0eSFrancis Visoiu Mistrih //===-- llvm/Remarks/Remark.h - The remark type -----------------*- C++/-*-===// 25a05cc0eSFrancis Visoiu Mistrih // 35a05cc0eSFrancis Visoiu Mistrih // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 45a05cc0eSFrancis Visoiu Mistrih // See https://llvm.org/LICENSE.txt for license information. 55a05cc0eSFrancis Visoiu Mistrih // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65a05cc0eSFrancis Visoiu Mistrih // 75a05cc0eSFrancis Visoiu Mistrih //===----------------------------------------------------------------------===// 85a05cc0eSFrancis Visoiu Mistrih // 95a05cc0eSFrancis Visoiu Mistrih // This file provides an interface for parsing remarks in LLVM. 105a05cc0eSFrancis Visoiu Mistrih // 115a05cc0eSFrancis Visoiu Mistrih //===----------------------------------------------------------------------===// 125a05cc0eSFrancis Visoiu Mistrih 13aa5c09beSKazu Hirata #ifndef LLVM_REMARKS_REMARKPARSER_H 14aa5c09beSKazu Hirata #define LLVM_REMARKS_REMARKPARSER_H 155a05cc0eSFrancis Visoiu Mistrih 165a05cc0eSFrancis Visoiu Mistrih #include "llvm/ADT/StringRef.h" 17cc909812SFrancis Visoiu Mistrih #include "llvm/Remarks/RemarkFormat.h" 185a05cc0eSFrancis Visoiu Mistrih #include "llvm/Support/Error.h" 195a05cc0eSFrancis Visoiu Mistrih #include <memory> 20*a81a0c97SKrzysztof Parzyszek #include <optional> 215a05cc0eSFrancis Visoiu Mistrih 225a05cc0eSFrancis Visoiu Mistrih namespace llvm { 235a05cc0eSFrancis Visoiu Mistrih namespace remarks { 245a05cc0eSFrancis Visoiu Mistrih 2525991aadSserge-sans-paille struct Remark; 2625991aadSserge-sans-paille 2794bad22cSFrancis Visoiu Mistrih class EndOfFileError : public ErrorInfo<EndOfFileError> { 2894bad22cSFrancis Visoiu Mistrih public: 2994bad22cSFrancis Visoiu Mistrih static char ID; 3094bad22cSFrancis Visoiu Mistrih 31152d61a8SKazu Hirata EndOfFileError() = default; 3294bad22cSFrancis Visoiu Mistrih log(raw_ostream & OS)3394bad22cSFrancis Visoiu Mistrih void log(raw_ostream &OS) const override { OS << "End of file reached."; } convertToErrorCode()3494bad22cSFrancis Visoiu Mistrih std::error_code convertToErrorCode() const override { 3594bad22cSFrancis Visoiu Mistrih return inconvertibleErrorCode(); 3694bad22cSFrancis Visoiu Mistrih } 3794bad22cSFrancis Visoiu Mistrih }; 3894bad22cSFrancis Visoiu Mistrih 395a05cc0eSFrancis Visoiu Mistrih /// Parser used to parse a raw buffer to remarks::Remark objects. 40ab56cf89SFrancis Visoiu Mistrih struct RemarkParser { 4194bad22cSFrancis Visoiu Mistrih /// The format of the parser. 4294bad22cSFrancis Visoiu Mistrih Format ParserFormat; 43684605ecSFrancis Visoiu Mistrih /// Path to prepend when opening an external remark file. 44684605ecSFrancis Visoiu Mistrih std::string ExternalFilePrependPath; 455a05cc0eSFrancis Visoiu Mistrih RemarkParserRemarkParser46ab56cf89SFrancis Visoiu Mistrih RemarkParser(Format ParserFormat) : ParserFormat(ParserFormat) {} 475a05cc0eSFrancis Visoiu Mistrih 4894bad22cSFrancis Visoiu Mistrih /// If no error occurs, this returns a valid Remark object. 4994bad22cSFrancis Visoiu Mistrih /// If an error of type EndOfFileError occurs, it is safe to recover from it 5094bad22cSFrancis Visoiu Mistrih /// by stopping the parsing. 5194bad22cSFrancis Visoiu Mistrih /// If any other error occurs, it should be propagated to the user. 5294bad22cSFrancis Visoiu Mistrih /// The pointer should never be null. 5394bad22cSFrancis Visoiu Mistrih virtual Expected<std::unique_ptr<Remark>> next() = 0; 547fee2b89SFrancis Visoiu Mistrih 55ab56cf89SFrancis Visoiu Mistrih virtual ~RemarkParser() = default; 565a05cc0eSFrancis Visoiu Mistrih }; 575a05cc0eSFrancis Visoiu Mistrih 587fee2b89SFrancis Visoiu Mistrih /// In-memory representation of the string table parsed from a buffer (e.g. the 597fee2b89SFrancis Visoiu Mistrih /// remarks section). 607fee2b89SFrancis Visoiu Mistrih struct ParsedStringTable { 617fee2b89SFrancis Visoiu Mistrih /// The buffer mapped from the section contents. 627fee2b89SFrancis Visoiu Mistrih StringRef Buffer; 634287c95bSFrancis Visoiu Mistrih /// This object has high changes to be std::move'd around, so don't use a 644287c95bSFrancis Visoiu Mistrih /// SmallVector for once. 654287c95bSFrancis Visoiu Mistrih std::vector<size_t> Offsets; 667fee2b89SFrancis Visoiu Mistrih 677fee2b89SFrancis Visoiu Mistrih ParsedStringTable(StringRef Buffer); 684287c95bSFrancis Visoiu Mistrih /// Disable copy. 694287c95bSFrancis Visoiu Mistrih ParsedStringTable(const ParsedStringTable &) = delete; 704287c95bSFrancis Visoiu Mistrih ParsedStringTable &operator=(const ParsedStringTable &) = delete; 714287c95bSFrancis Visoiu Mistrih /// Should be movable. 724287c95bSFrancis Visoiu Mistrih ParsedStringTable(ParsedStringTable &&) = default; 734287c95bSFrancis Visoiu Mistrih ParsedStringTable &operator=(ParsedStringTable &&) = default; 744287c95bSFrancis Visoiu Mistrih sizeParsedStringTable754287c95bSFrancis Visoiu Mistrih size_t size() const { return Offsets.size(); } 764287c95bSFrancis Visoiu Mistrih Expected<StringRef> operator[](size_t Index) const; 777fee2b89SFrancis Visoiu Mistrih }; 787fee2b89SFrancis Visoiu Mistrih 79ab56cf89SFrancis Visoiu Mistrih Expected<std::unique_ptr<RemarkParser>> createRemarkParser(Format ParserFormat, 80c5b5cc45SFrancis Visoiu Mistrih StringRef Buf); 81c5b5cc45SFrancis Visoiu Mistrih 82ab56cf89SFrancis Visoiu Mistrih Expected<std::unique_ptr<RemarkParser>> 83ab56cf89SFrancis Visoiu Mistrih createRemarkParser(Format ParserFormat, StringRef Buf, 844287c95bSFrancis Visoiu Mistrih ParsedStringTable StrTab); 8594bad22cSFrancis Visoiu Mistrih 86aadaafacSKazu Hirata Expected<std::unique_ptr<RemarkParser>> createRemarkParserFromMeta( 87aadaafacSKazu Hirata Format ParserFormat, StringRef Buf, 88*a81a0c97SKrzysztof Parzyszek std::optional<ParsedStringTable> StrTab = std::nullopt, 89*a81a0c97SKrzysztof Parzyszek std::optional<StringRef> ExternalFilePrependPath = std::nullopt); 9064a5f9e1SFrancis Visoiu Mistrih 915a05cc0eSFrancis Visoiu Mistrih } // end namespace remarks 925a05cc0eSFrancis Visoiu Mistrih } // end namespace llvm 935a05cc0eSFrancis Visoiu Mistrih 94aa5c09beSKazu Hirata #endif // LLVM_REMARKS_REMARKPARSER_H 95