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