xref: /llvm-project/llvm/include/llvm/Remarks/RemarkParser.h (revision a81a0c97f1a0016686fdc5c5d10644fa2628b376)
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