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