Reland: [Remarks] Support parsing remark metadata in the YAML remark parser
This adds support to the yaml remark parser to be able to parse remarks
directly from the metadata.
This supports parsing separate metadata and following the external file
with the associated metadata, and also a standalone file containing
metadata + remarks all together.
Original llvm-svn: 367148
Revert llvm-svn: 367151
This has a fix for gcc builds.
llvm-svn: 367155
diff --git a/llvm/unittests/Remarks/YAMLRemarksParsingTest.cpp b/llvm/unittests/Remarks/YAMLRemarksParsingTest.cpp
index 967ac96..eb5f24e 100644
--- a/llvm/unittests/Remarks/YAMLRemarksParsingTest.cpp
+++ b/llvm/unittests/Remarks/YAMLRemarksParsingTest.cpp
@@ -29,6 +29,22 @@
EXPECT_TRUE(errorToBool(std::move(E))); // Check for parsing errors.
}
+void parseGoodMeta(StringRef Buf) {
+ Expected<std::unique_ptr<remarks::RemarkParser>> MaybeParser =
+ remarks::createRemarkParserFromMeta(remarks::Format::YAML, Buf);
+ EXPECT_FALSE(errorToBool(MaybeParser.takeError()));
+ EXPECT_TRUE(*MaybeParser != nullptr);
+
+ remarks::RemarkParser &Parser = **MaybeParser;
+ Expected<std::unique_ptr<remarks::Remark>> Remark = Parser.next();
+ EXPECT_FALSE(errorToBool(Remark.takeError())); // Check for parsing errors.
+ EXPECT_TRUE(*Remark != nullptr); // At least one remark.
+ Remark = Parser.next();
+ Error E = Remark.takeError();
+ EXPECT_TRUE(E.isA<remarks::EndOfFileError>());
+ EXPECT_TRUE(errorToBool(std::move(E))); // Check for parsing errors.
+}
+
template <size_t N>
bool parseExpectError(const char (&Buf)[N], const char *Error) {
Expected<std::unique_ptr<remarks::RemarkParser>> MaybeParser =
@@ -47,6 +63,17 @@
return StringRef(Stream.str()).contains(Error);
}
+void parseExpectErrorMeta(StringRef Buf, const char *Error) {
+ std::string ErrorStr;
+ raw_string_ostream Stream(ErrorStr);
+
+ Expected<std::unique_ptr<remarks::RemarkParser>> MaybeParser =
+ remarks::createRemarkParserFromMeta(remarks::Format::YAML, Buf);
+ handleAllErrors(MaybeParser.takeError(),
+ [&](const ErrorInfoBase &EIB) { EIB.log(Stream); });
+ EXPECT_EQ(Stream.str(), Error);
+}
+
TEST(YAMLRemarks, ParsingEmpty) {
EXPECT_TRUE(parseExpectError("\n\n", "document root is not of mapping type."));
}
@@ -619,3 +646,62 @@
StringRef(Stream.str())
.contains("String with index 50 is out of bounds (size = 1)."));
}
+
+TEST(YAMLRemarks, ParsingGoodMeta) {
+ // No metadata should also work.
+ parseGoodMeta("--- !Missed\n"
+ "Pass: inline\n"
+ "Name: NoDefinition\n"
+ "Function: foo\n");
+
+ // No string table.
+ parseGoodMeta(StringRef("REMARKS\0"
+ "\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0"
+ "--- !Missed\n"
+ "Pass: inline\n"
+ "Name: NoDefinition\n"
+ "Function: foo\n",
+ 82));
+
+ // Use the string table from the metadata.
+ parseGoodMeta(StringRef("REMARKS\0"
+ "\0\0\0\0\0\0\0\0"
+ "\x02\0\0\0\0\0\0\0"
+ "a\0"
+ "--- !Missed\n"
+ "Pass: 0\n"
+ "Name: 0\n"
+ "Function: 0\n",
+ 66));
+}
+
+TEST(YAMLRemarks, ParsingBadMeta) {
+ parseExpectErrorMeta(StringRef("REMARKSS", 9),
+ "Expecting \\0 after magic number.");
+
+ parseExpectErrorMeta(StringRef("REMARKS\0", 8), "Expecting version number.");
+
+ parseExpectErrorMeta(StringRef("REMARKS\0"
+ "\x09\0\0\0\0\0\0\0",
+ 16),
+ "Mismatching remark version. Got 9, expected 0.");
+
+ parseExpectErrorMeta(StringRef("REMARKS\0"
+ "\0\0\0\0\0\0\0\0",
+ 16),
+ "Expecting string table size.");
+
+ parseExpectErrorMeta(StringRef("REMARKS\0"
+ "\0\0\0\0\0\0\0\0"
+ "\x01\0\0\0\0\0\0\0",
+ 24),
+ "Expecting string table.");
+
+ parseExpectErrorMeta(StringRef("REMARKS\0"
+ "\0\0\0\0\0\0\0\0"
+ "\0\0\0\0\0\0\0\0"
+ "/path/",
+ 28),
+ "No such file or directory");
+}