121 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===-- 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 */
 |