[llvm] r371106 - [Remarks] Don't serialize metadata if a string table is not used
Francis Visoiu Mistrih via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 5 11:30:20 PDT 2019
Author: thegameg
Date: Thu Sep 5 11:30:20 2019
New Revision: 371106
URL: http://llvm.org/viewvc/llvm-project?rev=371106&view=rev
Log:
[Remarks] Don't serialize metadata if a string table is not used
For YAML remarks with no string table, the mode should not affect the
output.
Modified:
llvm/trunk/include/llvm/Remarks/YAMLRemarkSerializer.h
llvm/trunk/lib/Remarks/YAMLRemarkSerializer.cpp
llvm/trunk/unittests/Remarks/YAMLRemarksSerializerTest.cpp
Modified: llvm/trunk/include/llvm/Remarks/YAMLRemarkSerializer.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Remarks/YAMLRemarkSerializer.h?rev=371106&r1=371105&r2=371106&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Remarks/YAMLRemarkSerializer.h (original)
+++ llvm/trunk/include/llvm/Remarks/YAMLRemarkSerializer.h Thu Sep 5 11:30:20 2019
@@ -40,9 +40,6 @@ struct YAMLRemarkSerializer : public Rem
std::unique_ptr<MetaSerializer>
metaSerializer(raw_ostream &OS,
Optional<StringRef> ExternalFilename = None) override;
-
-protected:
- bool DidEmitMeta = false;
};
struct YAMLMetaSerializer : public MetaSerializer {
@@ -58,6 +55,10 @@ struct YAMLMetaSerializer : public MetaS
/// like the regular YAML remark but instead of string entries it's using
/// numbers that map to an index in the string table.
struct YAMLStrTabRemarkSerializer : public YAMLRemarkSerializer {
+ /// Wether we already emitted the metadata in standalone mode.
+ /// This should be set to true after the first invocation of `emit`.
+ bool DidEmitMeta = false;
+
YAMLStrTabRemarkSerializer(raw_ostream &OS, SerializerMode Mode)
: YAMLRemarkSerializer(OS, Mode) {
// Having a string table set up enables the serializer to use it.
@@ -68,6 +69,10 @@ struct YAMLStrTabRemarkSerializer : publ
: YAMLRemarkSerializer(OS, Mode) {
StrTab = std::move(StrTabIn);
}
+
+ /// Override to emit the metadata if necessary.
+ void emit(const Remark &Remark) override;
+
std::unique_ptr<MetaSerializer>
metaSerializer(raw_ostream &OS,
Optional<StringRef> ExternalFilename = None) override;
Modified: llvm/trunk/lib/Remarks/YAMLRemarkSerializer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Remarks/YAMLRemarkSerializer.cpp?rev=371106&r1=371105&r2=371106&view=diff
==============================================================================
--- llvm/trunk/lib/Remarks/YAMLRemarkSerializer.cpp (original)
+++ llvm/trunk/lib/Remarks/YAMLRemarkSerializer.cpp Thu Sep 5 11:30:20 2019
@@ -153,15 +153,6 @@ YAMLRemarkSerializer::YAMLRemarkSerializ
: RemarkSerializer(OS, Mode), YAMLOutput(OS, reinterpret_cast<void *>(this)) {}
void YAMLRemarkSerializer::emit(const Remark &Remark) {
- // In standalone mode, emit the metadata first and set DidEmitMeta to avoid
- // emitting it again.
- if (Mode == SerializerMode::Standalone) {
- std::unique_ptr<MetaSerializer> MetaSerializer =
- metaSerializer(OS, /*ExternalFilename=*/None);
- MetaSerializer->emit();
- DidEmitMeta = true;
- }
-
// Again, YAMLTraits expect a non-const object for inputting, but we're not
// using that here.
auto R = const_cast<remarks::Remark *>(&Remark);
@@ -174,6 +165,20 @@ YAMLRemarkSerializer::metaSerializer(raw
return std::make_unique<YAMLMetaSerializer>(OS, ExternalFilename);
}
+void YAMLStrTabRemarkSerializer::emit(const Remark &Remark) {
+ // In standalone mode, for the serializer with a string table, emit the
+ // metadata first and set DidEmitMeta to avoid emitting it again.
+ if (Mode == SerializerMode::Standalone && !DidEmitMeta) {
+ std::unique_ptr<MetaSerializer> MetaSerializer =
+ metaSerializer(OS, /*ExternalFilename=*/None);
+ MetaSerializer->emit();
+ DidEmitMeta = true;
+ }
+
+ // Then do the usual remark emission.
+ YAMLRemarkSerializer::emit(Remark);
+}
+
std::unique_ptr<MetaSerializer> YAMLStrTabRemarkSerializer::metaSerializer(
raw_ostream &OS, Optional<StringRef> ExternalFilename) {
assert(StrTab);
Modified: llvm/trunk/unittests/Remarks/YAMLRemarksSerializerTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Remarks/YAMLRemarksSerializerTest.cpp?rev=371106&r1=371105&r2=371106&view=diff
==============================================================================
--- llvm/trunk/unittests/Remarks/YAMLRemarksSerializerTest.cpp (original)
+++ llvm/trunk/unittests/Remarks/YAMLRemarksSerializerTest.cpp Thu Sep 5 11:30:20 2019
@@ -21,7 +21,7 @@
using namespace llvm;
-static void check(remarks::SerializerMode Mode, const remarks::Remark &R,
+static void check(remarks::SerializerMode Mode, ArrayRef<remarks::Remark> Rs,
StringRef ExpectedR, Optional<StringRef> ExpectedMeta,
bool UseStrTab = false,
Optional<remarks::StringTable> StrTab = None) {
@@ -40,7 +40,8 @@ static void check(remarks::SerializerMod
EXPECT_FALSE(errorToBool(MaybeS.takeError()));
std::unique_ptr<remarks::RemarkSerializer> S = std::move(*MaybeS);
- S->emit(R);
+ for (const remarks::Remark &R : Rs)
+ S->emit(R);
EXPECT_EQ(OS.str(), ExpectedR);
if (ExpectedMeta) {
@@ -55,14 +56,14 @@ static void check(remarks::SerializerMod
static void check(const remarks::Remark &R, StringRef ExpectedR,
StringRef ExpectedMeta, bool UseStrTab = false,
Optional<remarks::StringTable> StrTab = None) {
- return check(remarks::SerializerMode::Separate, R, ExpectedR, ExpectedMeta,
+ return check(remarks::SerializerMode::Separate, makeArrayRef(&R, &R + 1), ExpectedR, ExpectedMeta,
UseStrTab, std::move(StrTab));
}
static void checkStandalone(const remarks::Remark &R, StringRef ExpectedR,
Optional<remarks::StringTable> StrTab = None) {
bool UseStrTab = StrTab.hasValue();
- return check(remarks::SerializerMode::Standalone, R, ExpectedR,
+ return check(remarks::SerializerMode::Standalone, makeArrayRef(&R, &R +1), ExpectedR,
/*ExpectedMeta=*/None, UseStrTab, std::move(StrTab));
}
@@ -117,10 +118,7 @@ TEST(YAMLRemarks, SerializerRemarkStanda
R.Args.back().Loc = remarks::RemarkLocation{"argpath", 6, 7};
checkStandalone(
R,
- StringRef("REMARKS\0"
- "\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0"
- "--- !Missed\n"
+ StringRef("--- !Missed\n"
"Pass: pass\n"
"Name: name\n"
"DebugLoc: { File: path, Line: 3, Column: 4 }\n"
@@ -130,8 +128,7 @@ TEST(YAMLRemarks, SerializerRemarkStanda
" - key: value\n"
" - keydebug: valuedebug\n"
" DebugLoc: { File: argpath, Line: 6, Column: 7 }\n"
- "...\n",
- 301));
+ "...\n"));
}
TEST(YAMLRemarks, SerializerRemarkStrTab) {
@@ -246,3 +243,56 @@ TEST(YAMLRemarks, SerializerRemarkParsed
315),
std::move(PreFilledStrTab));
}
+
+TEST(YAMLRemarks, SerializerRemarkParsedStrTabStandaloneMultipleRemarks) {
+ StringRef StrTab("pass\0name\0func\0path\0value\0valuedebug\0argpath\0", 45);
+ remarks::ParsedStringTable ParsedStrTab(StrTab);
+ remarks::StringTable PreFilledStrTab(ParsedStrTab);
+ SmallVector<remarks::Remark, 2> Rs;
+ remarks::Remark R;
+ R.RemarkType = remarks::Type::Missed;
+ R.PassName = "pass";
+ R.RemarkName = "name";
+ R.FunctionName = "func";
+ R.Loc = remarks::RemarkLocation{"path", 3, 4};
+ R.Hotness = 5;
+ R.Args.emplace_back();
+ R.Args.back().Key = "key";
+ R.Args.back().Val = "value";
+ R.Args.emplace_back();
+ R.Args.back().Key = "keydebug";
+ R.Args.back().Val = "valuedebug";
+ R.Args.back().Loc = remarks::RemarkLocation{"argpath", 6, 7};
+ Rs.emplace_back(R.clone());
+ Rs.emplace_back(std::move(R));
+ check(remarks::SerializerMode::Standalone, Rs,
+ StringRef("REMARKS\0"
+ "\0\0\0\0\0\0\0\0"
+ "\x2d\0\0\0\0\0\0\0"
+ "pass\0name\0func\0path\0value\0valuedebug\0argpath\0"
+ "--- !Missed\n"
+ "Pass: 0\n"
+ "Name: 1\n"
+ "DebugLoc: { File: 3, Line: 3, Column: 4 }\n"
+ "Function: 2\n"
+ "Hotness: 5\n"
+ "Args:\n"
+ " - key: 4\n"
+ " - keydebug: 5\n"
+ " DebugLoc: { File: 6, Line: 6, Column: 7 }\n"
+ "...\n"
+ "--- !Missed\n"
+ "Pass: 0\n"
+ "Name: 1\n"
+ "DebugLoc: { File: 3, Line: 3, Column: 4 }\n"
+ "Function: 2\n"
+ "Hotness: 5\n"
+ "Args:\n"
+ " - key: 4\n"
+ " - keydebug: 5\n"
+ " DebugLoc: { File: 6, Line: 6, Column: 7 }\n"
+ "...\n",
+ 561),
+ /*ExpectedMeta=*/None,
+ /*UseStrTab=*/true, std::move(PreFilledStrTab));
+}
More information about the llvm-commits
mailing list