]> granicus.if.org Git - llvm/commitdiff
[Remarks][NFC] Move the string table parsing out of the parser constructor
authorFrancis Visoiu Mistrih <francisvm@yahoo.com>
Thu, 4 Jul 2019 00:30:58 +0000 (00:30 +0000)
committerFrancis Visoiu Mistrih <francisvm@yahoo.com>
Thu, 4 Jul 2019 00:30:58 +0000 (00:30 +0000)
Make the parser take an already-parsed string table.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@365101 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Remarks/RemarkParser.h
lib/Remarks/RemarkParser.cpp
lib/Remarks/YAMLRemarkParser.cpp
lib/Remarks/YAMLRemarkParser.h
unittests/Remarks/YAMLRemarksParsingTest.cpp

index aa6f04a51ce4b42060b410336a2798c25ffca107..0d8607cd4c0fbd4c0b4f1ca78288ebee857ff614 100644 (file)
@@ -23,6 +23,7 @@ namespace llvm {
 namespace remarks {
 
 struct ParserImpl;
+struct ParsedStringTable;
 
 /// Parser used to parse a raw buffer to remarks::Remark objects.
 struct Parser {
@@ -33,10 +34,10 @@ struct Parser {
   /// This constructor should be only used for parsing YAML remarks.
   Parser(StringRef Buffer);
 
-  /// Create a parser parsing \p Buffer to Remark objects, using \p StrTabBuf as
+  /// Create a parser parsing \p Buffer to Remark objects, using \p StrTab as a
   /// string table.
   /// This constructor should be only used for parsing YAML remarks.
-  Parser(StringRef Buffer, StringRef StrTabBuf);
+  Parser(StringRef Buffer, const ParsedStringTable &StrTab);
 
   // Needed because ParserImpl is an incomplete type.
   ~Parser();
@@ -54,7 +55,7 @@ struct ParsedStringTable {
   /// Collection of offsets in the buffer for each string entry.
   SmallVector<size_t, 8> Offsets;
 
-  Expected<StringRef> operator[](size_t Index);
+  Expected<StringRef> operator[](size_t Index) const;
   ParsedStringTable(StringRef Buffer);
 };
 
index 144f08f6feb97befc2c9de09fea1650b49af2713..1e14ca8a6974365ddf9421716e0f2f8716c0f262 100644 (file)
@@ -22,8 +22,8 @@ using namespace llvm::remarks;
 
 Parser::Parser(StringRef Buf) : Impl(llvm::make_unique<YAMLParserImpl>(Buf)) {}
 
-Parser::Parser(StringRef Buf, StringRef StrTabBuf)
-    : Impl(llvm::make_unique<YAMLParserImpl>(Buf, StrTabBuf)) {}
+Parser::Parser(StringRef Buf, const ParsedStringTable &StrTab)
+    : Impl(llvm::make_unique<YAMLParserImpl>(Buf, &StrTab)) {}
 
 Parser::~Parser() = default;
 
@@ -69,7 +69,7 @@ ParsedStringTable::ParsedStringTable(StringRef InBuffer) : Buffer(InBuffer) {
   }
 }
 
-Expected<StringRef> ParsedStringTable::operator[](size_t Index) {
+Expected<StringRef> ParsedStringTable::operator[](size_t Index) const {
   if (Index >= Offsets.size())
     return createStringError(
         std::make_error_code(std::errc::invalid_argument),
index 0c265856d28c843a63b357efbc007eac707670f9..c70eef556ffd582c0932b5ed875a6f68b4c34725 100644 (file)
@@ -42,7 +42,7 @@ Error YAMLRemarkParser::parseStr(T &Result, yaml::KeyValueNode &Node) {
     unsigned StrID = 0;
     if (Error E = parseUnsigned(StrID, Node))
       return E;
-    if (Expected<StringRef> Str = (*StrTab)[StrID])
+    if (Expected<StringRef> Str = (**StrTab)[StrID])
       Tmp = *Str;
     else
       return Str.takeError();
index 5fd17865b69bf110226ac2faa41db926607afabf..fb25f241975a310eaa0f664b0443fbc48ec72348 100644 (file)
@@ -40,7 +40,7 @@ struct YAMLRemarkParser {
   /// Temporary parsing buffer for the arguments.
   SmallVector<Argument, 8> TmpArgs;
   /// The string table used for parsing strings.
-  Optional<ParsedStringTable> StrTab;
+  Optional<const ParsedStringTable *> StrTab;
   /// The state used by the parser to parse a remark entry. Invalidated with
   /// every call to `parseYAMLElement`.
   struct ParseState {
@@ -59,13 +59,11 @@ struct YAMLRemarkParser {
   /// not be containing any value.
   Optional<ParseState> State;
 
-  YAMLRemarkParser(StringRef Buf, Optional<StringRef> StrTabBuf = None)
+  YAMLRemarkParser(StringRef Buf,
+                   Optional<const ParsedStringTable *> StrTab = None)
       : SM(), Stream(Buf, SM), ErrorString(), ErrorStream(ErrorString),
-        TmpArgs(), StrTab() {
+        TmpArgs(), StrTab(StrTab) {
     SM.setDiagHandler(YAMLRemarkParser::HandleDiagnostic, this);
-
-    if (StrTabBuf)
-      StrTab.emplace(*StrTabBuf);
   }
 
   /// Parse a YAML element.
@@ -127,8 +125,9 @@ struct YAMLParserImpl : public ParserImpl {
   /// Set to `true` if we had any errors during parsing.
   bool HasErrors = false;
 
-  YAMLParserImpl(StringRef Buf, Optional<StringRef> StrTabBuf = None)
-      : ParserImpl{ParserImpl::Kind::YAML}, YAMLParser(Buf, StrTabBuf),
+  YAMLParserImpl(StringRef Buf,
+                 Optional<const ParsedStringTable *> StrTab = None)
+      : ParserImpl{ParserImpl::Kind::YAML}, YAMLParser(Buf, StrTab),
         YAMLIt(YAMLParser.Stream.begin()), HasErrors(false) {}
 
   static bool classof(const ParserImpl *PI) {
index 1a6267c9785a35ff36921fb3f26776ccf9e43494..b1a819e44a2e533c785362e7fda6440718b3485c 100644 (file)
@@ -515,7 +515,8 @@ TEST(YAMLRemarks, ContentsStrTab) {
                 "unavailable",
                 115);
 
-  remarks::Parser Parser(Buf, StrTabBuf);
+  remarks::ParsedStringTable StrTab(StrTabBuf);
+  remarks::Parser Parser(Buf, StrTab);
   Expected<const remarks::Remark *> RemarkOrErr = Parser.getNext();
   EXPECT_FALSE(errorToBool(RemarkOrErr.takeError()));
   EXPECT_TRUE(*RemarkOrErr != nullptr);
@@ -582,7 +583,8 @@ TEST(YAMLRemarks, ParsingBadStringTableIndex) {
 
   StringRef StrTabBuf = StringRef("inline");
 
-  remarks::Parser Parser(Buf, StrTabBuf);
+  remarks::ParsedStringTable StrTab(StrTabBuf);
+  remarks::Parser Parser(Buf, StrTab);
   Expected<const remarks::Remark *> Remark = Parser.getNext();
   EXPECT_FALSE(Remark); // Expect an error here.