|  | //===-- 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 */ |