| //===-- 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/ADT/Optional.h" |
| #include "llvm/ADT/SmallVector.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/YAMLTraits.h" |
| #include "llvm/Support/raw_ostream.h" |
| #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. |
| 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, 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, |
| Optional<ParsedStringTable> StrTab = None, |
| Optional<StringRef> ExternalFilePrependPath = None); |
| |
| } // end namespace remarks |
| } // end namespace llvm |
| |
| #endif /* LLVM_REMARKS_YAML_REMARK_PARSER_H */ |