summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/Remarks/RemarkParser.h11
-rw-r--r--llvm/lib/Remarks/RemarkParser.cpp28
-rw-r--r--llvm/lib/Remarks/RemarkParserImpl.h10
-rw-r--r--llvm/lib/Remarks/YAMLRemarkParser.h4
-rw-r--r--llvm/tools/llvm-opt-report/OptReport.cpp2
-rw-r--r--llvm/unittests/Remarks/YAMLRemarksParsingTest.cpp10
6 files changed, 44 insertions, 21 deletions
diff --git a/llvm/include/llvm/Remarks/RemarkParser.h b/llvm/include/llvm/Remarks/RemarkParser.h
index 0d8607cd4c0..457b2fbaa5f 100644
--- a/llvm/include/llvm/Remarks/RemarkParser.h
+++ b/llvm/include/llvm/Remarks/RemarkParser.h
@@ -25,19 +25,22 @@ namespace remarks {
struct ParserImpl;
struct ParsedStringTable;
+enum class ParserFormat { YAML };
+
/// Parser used to parse a raw buffer to remarks::Remark objects.
struct Parser {
/// The hidden implementation of the parser.
std::unique_ptr<ParserImpl> Impl;
/// Create a parser parsing \p Buffer to Remark objects.
- /// This constructor should be only used for parsing YAML remarks.
- Parser(StringRef Buffer);
+ /// This constructor should be only used for parsing remarks without a string
+ /// table.
+ Parser(ParserFormat Format, StringRef Buffer);
/// 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, const ParsedStringTable &StrTab);
+ Parser(ParserFormat Format, StringRef Buffer,
+ const ParsedStringTable &StrTab);
// Needed because ParserImpl is an incomplete type.
~Parser();
diff --git a/llvm/lib/Remarks/RemarkParser.cpp b/llvm/lib/Remarks/RemarkParser.cpp
index 1e14ca8a697..8bd2b94d73a 100644
--- a/llvm/lib/Remarks/RemarkParser.cpp
+++ b/llvm/lib/Remarks/RemarkParser.cpp
@@ -20,10 +20,29 @@
using namespace llvm;
using namespace llvm::remarks;
-Parser::Parser(StringRef Buf) : Impl(llvm::make_unique<YAMLParserImpl>(Buf)) {}
+static std::unique_ptr<ParserImpl> formatToParserImpl(ParserFormat Format,
+ StringRef Buf) {
+ switch (Format) {
+ case ParserFormat::YAML:
+ return llvm::make_unique<YAMLParserImpl>(Buf);
+ };
+}
+
+static std::unique_ptr<ParserImpl>
+formatToParserImpl(ParserFormat Format, StringRef Buf,
+ const ParsedStringTable &StrTab) {
+ switch (Format) {
+ case ParserFormat::YAML:
+ return llvm::make_unique<YAMLParserImpl>(Buf, &StrTab);
+ };
+}
+
+Parser::Parser(ParserFormat Format, StringRef Buf)
+ : Impl(formatToParserImpl(Format, Buf)) {}
-Parser::Parser(StringRef Buf, const ParsedStringTable &StrTab)
- : Impl(llvm::make_unique<YAMLParserImpl>(Buf, &StrTab)) {}
+Parser::Parser(ParserFormat Format, StringRef Buf,
+ const ParsedStringTable &StrTab)
+ : Impl(formatToParserImpl(Format, Buf, StrTab)) {}
Parser::~Parser() = default;
@@ -90,7 +109,8 @@ DEFINE_SIMPLE_CONVERSION_FUNCTIONS(remarks::Parser, LLVMRemarkParserRef)
extern "C" LLVMRemarkParserRef LLVMRemarkParserCreateYAML(const void *Buf,
uint64_t Size) {
return wrap(
- new remarks::Parser(StringRef(static_cast<const char *>(Buf), Size)));
+ new remarks::Parser(remarks::ParserFormat::YAML,
+ StringRef(static_cast<const char *>(Buf), Size)));
}
static void handleYAMLError(remarks::YAMLParserImpl &Impl, Error E) {
diff --git a/llvm/lib/Remarks/RemarkParserImpl.h b/llvm/lib/Remarks/RemarkParserImpl.h
index b4c106badf6..6b9329b1815 100644
--- a/llvm/lib/Remarks/RemarkParserImpl.h
+++ b/llvm/lib/Remarks/RemarkParserImpl.h
@@ -13,19 +13,19 @@
#ifndef LLVM_REMARKS_REMARK_PARSER_IMPL_H
#define LLVM_REMARKS_REMARK_PARSER_IMPL_H
+#include "llvm/Remarks/RemarkParser.h"
+
namespace llvm {
namespace remarks {
/// This is used as a base for any parser implementation.
struct ParserImpl {
- enum class Kind { YAML };
-
- explicit ParserImpl(Kind TheParserKind) : ParserKind(TheParserKind) {}
+ explicit ParserImpl(ParserFormat Format) : Format(Format) {}
// Virtual destructor prevents mismatched deletes
virtual ~ParserImpl() {}
- // The parser kind. This is used as a tag to safely cast between
+ // The parser format. This is used as a tag to safely cast between
// implementations.
- Kind ParserKind;
+ ParserFormat Format;
};
} // end namespace remarks
} // end namespace llvm
diff --git a/llvm/lib/Remarks/YAMLRemarkParser.h b/llvm/lib/Remarks/YAMLRemarkParser.h
index fb25f241975..9ed18eebe77 100644
--- a/llvm/lib/Remarks/YAMLRemarkParser.h
+++ b/llvm/lib/Remarks/YAMLRemarkParser.h
@@ -127,11 +127,11 @@ struct YAMLParserImpl : public ParserImpl {
YAMLParserImpl(StringRef Buf,
Optional<const ParsedStringTable *> StrTab = None)
- : ParserImpl{ParserImpl::Kind::YAML}, YAMLParser(Buf, StrTab),
+ : ParserImpl{ParserFormat::YAML}, YAMLParser(Buf, StrTab),
YAMLIt(YAMLParser.Stream.begin()), HasErrors(false) {}
static bool classof(const ParserImpl *PI) {
- return PI->ParserKind == ParserImpl::Kind::YAML;
+ return PI->Format == ParserFormat::YAML;
}
};
} // end namespace remarks
diff --git a/llvm/tools/llvm-opt-report/OptReport.cpp b/llvm/tools/llvm-opt-report/OptReport.cpp
index a6ca6146b48..b263d9a4fb6 100644
--- a/llvm/tools/llvm-opt-report/OptReport.cpp
+++ b/llvm/tools/llvm-opt-report/OptReport.cpp
@@ -150,7 +150,7 @@ static bool readLocationInfo(LocationInfoTy &LocationInfo) {
return false;
}
- remarks::Parser Parser((*Buf)->getBuffer());
+ remarks::Parser Parser(remarks::ParserFormat::YAML, (*Buf)->getBuffer());
while (true) {
Expected<const remarks::Remark *> RemarkOrErr = Parser.getNext();
diff --git a/llvm/unittests/Remarks/YAMLRemarksParsingTest.cpp b/llvm/unittests/Remarks/YAMLRemarksParsingTest.cpp
index b1a819e44a2..6cca4c5ce8c 100644
--- a/llvm/unittests/Remarks/YAMLRemarksParsingTest.cpp
+++ b/llvm/unittests/Remarks/YAMLRemarksParsingTest.cpp
@@ -14,7 +14,7 @@
using namespace llvm;
template <size_t N> void parseGood(const char (&Buf)[N]) {
- remarks::Parser Parser({Buf, N - 1});
+ remarks::Parser Parser(remarks::ParserFormat::YAML, {Buf, N - 1});
Expected<const remarks::Remark *> Remark = Parser.getNext();
EXPECT_FALSE(errorToBool(Remark.takeError())); // Check for parsing errors.
EXPECT_TRUE(*Remark != nullptr); // At least one remark.
@@ -25,7 +25,7 @@ template <size_t N> void parseGood(const char (&Buf)[N]) {
template <size_t N>
bool parseExpectError(const char (&Buf)[N], const char *Error) {
- remarks::Parser Parser({Buf, N - 1});
+ remarks::Parser Parser(remarks::ParserFormat::YAML, {Buf, N - 1});
Expected<const remarks::Remark *> Remark = Parser.getNext();
EXPECT_FALSE(Remark); // Expect an error here.
@@ -354,7 +354,7 @@ TEST(YAMLRemarks, Contents) {
" - String: ' because its definition is unavailable'\n"
"\n";
- remarks::Parser Parser(Buf);
+ remarks::Parser Parser(remarks::ParserFormat::YAML, Buf);
Expected<const remarks::Remark *> RemarkOrErr = Parser.getNext();
EXPECT_FALSE(errorToBool(RemarkOrErr.takeError()));
EXPECT_TRUE(*RemarkOrErr != nullptr);
@@ -516,7 +516,7 @@ TEST(YAMLRemarks, ContentsStrTab) {
115);
remarks::ParsedStringTable StrTab(StrTabBuf);
- remarks::Parser Parser(Buf, StrTab);
+ remarks::Parser Parser(remarks::ParserFormat::YAML, Buf, StrTab);
Expected<const remarks::Remark *> RemarkOrErr = Parser.getNext();
EXPECT_FALSE(errorToBool(RemarkOrErr.takeError()));
EXPECT_TRUE(*RemarkOrErr != nullptr);
@@ -584,7 +584,7 @@ TEST(YAMLRemarks, ParsingBadStringTableIndex) {
StringRef StrTabBuf = StringRef("inline");
remarks::ParsedStringTable StrTab(StrTabBuf);
- remarks::Parser Parser(Buf, StrTab);
+ remarks::Parser Parser(remarks::ParserFormat::YAML, Buf, StrTab);
Expected<const remarks::Remark *> Remark = Parser.getNext();
EXPECT_FALSE(Remark); // Expect an error here.
OpenPOWER on IntegriCloud