| //===-- YAMLRemarkParser.h - Parser for YAML remarks ------------*- C++/-*-===// | 
 | // | 
 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
 | // See https://llvm.org/LICENSE.txt for license information. | 
 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 | // | 
 | // This file provides the impementation of the YAML remark parser. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | #ifndef LLVM_REMARKS_YAML_REMARK_PARSER_H | 
 | #define LLVM_REMARKS_YAML_REMARK_PARSER_H | 
 |  | 
 | #include "llvm/Remarks/Remark.h" | 
 | #include "llvm/Remarks/RemarkParser.h" | 
 | #include "llvm/Support/Error.h" | 
 | #include "llvm/Support/MemoryBuffer.h" | 
 | #include "llvm/Support/SourceMgr.h" | 
 | #include "llvm/Support/YAMLParser.h" | 
 | #include "llvm/Support/raw_ostream.h" | 
 | #include <optional> | 
 | #include <string> | 
 |  | 
 | namespace llvm { | 
 | namespace remarks { | 
 |  | 
 | class YAMLParseError : public ErrorInfo<YAMLParseError> { | 
 | public: | 
 |   static char ID; | 
 |  | 
 |   YAMLParseError(StringRef Message, SourceMgr &SM, yaml::Stream &Stream, | 
 |                  yaml::Node &Node); | 
 |  | 
 |   YAMLParseError(StringRef Message) : Message(std::string(Message)) {} | 
 |  | 
 |   void log(raw_ostream &OS) const override { OS << Message; } | 
 |   std::error_code convertToErrorCode() const override { | 
 |     return inconvertibleErrorCode(); | 
 |   } | 
 |  | 
 | private: | 
 |   std::string Message; | 
 | }; | 
 |  | 
 | /// Regular YAML to Remark parser. | 
 | struct YAMLRemarkParser : public RemarkParser { | 
 |   /// The string table used for parsing strings. | 
 |   std::optional<ParsedStringTable> StrTab; | 
 |   /// Last error message that can come from the YAML parser diagnostics. | 
 |   /// We need this for catching errors in the constructor. | 
 |   std::string LastErrorMessage; | 
 |   /// Source manager for better error messages. | 
 |   SourceMgr SM; | 
 |   /// Stream for yaml parsing. | 
 |   yaml::Stream Stream; | 
 |   /// Iterator in the YAML stream. | 
 |   yaml::document_iterator YAMLIt; | 
 |   /// If we parse remark metadata in separate mode, we need to open a new file | 
 |   /// and parse that. | 
 |   std::unique_ptr<MemoryBuffer> SeparateBuf; | 
 |  | 
 |   YAMLRemarkParser(StringRef Buf); | 
 |  | 
 |   Expected<std::unique_ptr<Remark>> next() override; | 
 |  | 
 |   static bool classof(const RemarkParser *P) { | 
 |     return P->ParserFormat == Format::YAML; | 
 |   } | 
 |  | 
 | protected: | 
 |   YAMLRemarkParser(StringRef Buf, std::optional<ParsedStringTable> StrTab); | 
 |   /// Create a YAMLParseError error from an existing error generated by the YAML | 
 |   /// parser. | 
 |   /// If there is no error, this returns Success. | 
 |   Error error(); | 
 |   /// Create a YAMLParseError error referencing a specific node. | 
 |   Error error(StringRef Message, yaml::Node &Node); | 
 |   /// Parse a YAML remark to a remarks::Remark object. | 
 |   Expected<std::unique_ptr<Remark>> parseRemark(yaml::Document &Remark); | 
 |   /// Parse the type of a remark to an enum type. | 
 |   Expected<Type> parseType(yaml::MappingNode &Node); | 
 |   /// Parse one key to a string. | 
 |   Expected<StringRef> parseKey(yaml::KeyValueNode &Node); | 
 |   /// Parse one value to a string. | 
 |   virtual Expected<StringRef> parseStr(yaml::KeyValueNode &Node); | 
 |   /// Parse one value to an unsigned. | 
 |   Expected<unsigned> parseUnsigned(yaml::KeyValueNode &Node); | 
 |   /// Parse a debug location. | 
 |   Expected<RemarkLocation> parseDebugLoc(yaml::KeyValueNode &Node); | 
 |   /// Parse an argument. | 
 |   Expected<Argument> parseArg(yaml::Node &Node); | 
 | }; | 
 |  | 
 | /// YAML with a string table to Remark parser. | 
 | struct YAMLStrTabRemarkParser : public YAMLRemarkParser { | 
 |   YAMLStrTabRemarkParser(StringRef Buf, ParsedStringTable StrTab) | 
 |       : YAMLRemarkParser(Buf, std::move(StrTab)) {} | 
 |  | 
 |   static bool classof(const RemarkParser *P) { | 
 |     return P->ParserFormat == Format::YAMLStrTab; | 
 |   } | 
 |  | 
 | protected: | 
 |   /// Parse one value to a string. | 
 |   Expected<StringRef> parseStr(yaml::KeyValueNode &Node) override; | 
 | }; | 
 |  | 
 | Expected<std::unique_ptr<YAMLRemarkParser>> createYAMLParserFromMeta( | 
 |     StringRef Buf, std::optional<ParsedStringTable> StrTab = std::nullopt, | 
 |     std::optional<StringRef> ExternalFilePrependPath = std::nullopt); | 
 |  | 
 | } // end namespace remarks | 
 | } // end namespace llvm | 
 |  | 
 | #endif /* LLVM_REMARKS_YAML_REMARK_PARSER_H */ |