LLVM  10.0.0svn
YAMLRemarkParser.h
Go to the documentation of this file.
1 //===-- YAMLRemarkParser.h - Parser for YAML remarks ------------*- C++/-*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file provides the impementation of the YAML remark parser.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_REMARKS_YAML_REMARK_PARSER_H
14 #define LLVM_REMARKS_YAML_REMARK_PARSER_H
15 
16 #include "llvm/ADT/Optional.h"
17 #include "llvm/ADT/SmallVector.h"
18 #include "llvm/Remarks/Remark.h"
20 #include "llvm/Support/Error.h"
22 #include "llvm/Support/SourceMgr.h"
26 #include <string>
27 
28 namespace llvm {
29 namespace remarks {
30 
31 class YAMLParseError : public ErrorInfo<YAMLParseError> {
32 public:
33  static char ID;
34 
35  YAMLParseError(StringRef Message, SourceMgr &SM, yaml::Stream &Stream,
36  yaml::Node &Node);
37 
38  YAMLParseError(StringRef Message) : Message(Message) {}
39 
40  void log(raw_ostream &OS) const override { OS << Message; }
41  std::error_code convertToErrorCode() const override {
42  return inconvertibleErrorCode();
43  }
44 
45 private:
46  std::string Message;
47 };
48 
49 /// Regular YAML to Remark parser.
50 struct YAMLRemarkParser : public RemarkParser {
51  /// The string table used for parsing strings.
53  /// Last error message that can come from the YAML parser diagnostics.
54  /// We need this for catching errors in the constructor.
55  std::string LastErrorMessage;
56  /// Source manager for better error messages.
58  /// Stream for yaml parsing.
60  /// Iterator in the YAML stream.
62  /// If we parse remark metadata in separate mode, we need to open a new file
63  /// and parse that.
64  std::unique_ptr<MemoryBuffer> SeparateBuf;
65 
67 
68  Expected<std::unique_ptr<Remark>> next() override;
69 
70  static bool classof(const RemarkParser *P) {
71  return P->ParserFormat == Format::YAML;
72  }
73 
74 protected:
76  /// Create a YAMLParseError error from an existing error generated by the YAML
77  /// parser.
78  /// If there is no error, this returns Success.
79  Error error();
80  /// Create a YAMLParseError error referencing a specific node.
81  Error error(StringRef Message, yaml::Node &Node);
82  /// Parse a YAML remark to a remarks::Remark object.
84  /// Parse the type of a remark to an enum type.
86  /// Parse one key to a string.
88  /// Parse one value to a string.
89  virtual Expected<StringRef> parseStr(yaml::KeyValueNode &Node);
90  /// Parse one value to an unsigned.
91  Expected<unsigned> parseUnsigned(yaml::KeyValueNode &Node);
92  /// Parse a debug location.
93  Expected<RemarkLocation> parseDebugLoc(yaml::KeyValueNode &Node);
94  /// Parse an argument.
95  Expected<Argument> parseArg(yaml::Node &Node);
96 };
97 
98 /// YAML with a string table to Remark parser.
101  : YAMLRemarkParser(Buf, std::move(StrTab)) {}
102 
103  static bool classof(const RemarkParser *P) {
104  return P->ParserFormat == Format::YAMLStrTab;
105  }
106 
107 protected:
108  /// Parse one value to a string.
109  Expected<StringRef> parseStr(yaml::KeyValueNode &Node) override;
110 };
111 
115  Optional<StringRef> ExternalFilePrependPath = None);
116 
117 } // end namespace remarks
118 } // end namespace llvm
119 
120 #endif /* LLVM_REMARKS_YAML_REMARK_PARSER_H */
const NoneType None
Definition: None.h:23
Regular YAML to Remark parser.
SourceMgr SM
Source manager for better error messages.
This class represents lattice values for constants.
Definition: AllocatorList.h:23
static bool classof(const RemarkParser *P)
yaml::document_iterator YAMLIt
Iterator in the YAML stream.
#define error(X)
YAMLParseError(StringRef Message, SourceMgr &SM, yaml::Stream &Stream, yaml::Node &Node)
std::unique_ptr< MemoryBuffer > SeparateBuf
If we parse remark metadata in separate mode, we need to open a new file and parse that...
Definition: BitVector.h:937
A remark type used for both emission and parsing.
Definition: Remark.h:67
Tagged union holding either a T or a Error.
Definition: yaml2obj.h:21
Optional< ParsedStringTable > StrTab
The string table used for parsing strings.
std::error_code convertToErrorCode() const override
Convert this error to a std::error_code.
A key and value pair.
Definition: YAMLParser.h:279
In-memory representation of the string table parsed from a buffer (e.g.
Definition: RemarkParser.h:59
#define P(N)
This owns the files read by a parser, handles include stacks, and handles diagnostic wrangling...
Definition: SourceMgr.h:41
YAML with a string table to Remark parser.
YAMLParseError(StringRef Message)
YAMLStrTabRemarkParser(StringRef Buf, ParsedStringTable StrTab)
This class represents a YAML stream potentially containing multiple documents.
Definition: YAMLParser.h:83
Base class for user error types.
Definition: Error.h:344
Format ParserFormat
The format of the parser.
Definition: RemarkParser.h:41
Parser used to parse a raw buffer to remarks::Remark objects.
Definition: RemarkParser.h:39
std::string LastErrorMessage
Last error message that can come from the YAML parser diagnostics.
void log(raw_ostream &OS) const override
Print an error message to an output stream.
Represents a YAML map created from either a block map for a flow map.
Definition: YAMLParser.h:404
Iterator abstraction for Documents over a Stream.
Definition: YAMLParser.h:579
yaml::Stream Stream
Stream for yaml parsing.
Lightweight error class with error context and mandatory checking.
Definition: Error.h:157
This class implements an extremely fast bulk output stream that can only output to a stream...
Definition: raw_ostream.h:45
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:48
Type * parseType(StringRef Asm, SMDiagnostic &Err, const Module &M, const SlotMapping *Slots=nullptr)
Parse a type in the given string.
Definition: Parser.cpp:159
A YAML Stream is a sequence of Documents.
Definition: YAMLParser.h:522
static bool classof(const RemarkParser *P)
Expected< std::unique_ptr< YAMLRemarkParser > > createYAMLParserFromMeta(StringRef Buf, Optional< ParsedStringTable > StrTab=None, Optional< StringRef > ExternalFilePrependPath=None)
std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
Definition: Error.cpp:77
Abstract base class for all Nodes.
Definition: YAMLParser.h:113