diff --git a/llvm/include/llvm/ProfileData/MemProf.h b/llvm/include/llvm/ProfileData/MemProf.h index fe017913f6de2..5af460efb6ddf 100644 --- a/llvm/include/llvm/ProfileData/MemProf.h +++ b/llvm/include/llvm/ProfileData/MemProf.h @@ -1177,6 +1177,10 @@ template <> struct MappingTraits { (void)Column; (void)IsInlineFrame; } + + // Request the inline notation for brevity: + // { Function: 123, LineOffset: 11, Column: 10; IsInlineFrame: true } + static const bool flow = true; }; template <> struct CustomMappingTraits { @@ -1201,8 +1205,13 @@ template <> struct CustomMappingTraits { Io.setError("Key is not a valid validation event"); } - static void output(IO &Io, memprof::PortableMemInfoBlock &VI) { - llvm_unreachable("To be implemented"); + static void output(IO &Io, memprof::PortableMemInfoBlock &MIB) { + auto Schema = MIB.getSchema(); +#define MIBEntryDef(NameTag, Name, Type) \ + if (Schema.test(llvm::to_underlying(memprof::Meta::Name))) \ + Io.mapRequired(#Name, MIB.Name); +#include "llvm/ProfileData/MIBEntryDef.inc" +#undef MIBEntryDef } }; diff --git a/llvm/unittests/ProfileData/MemProfTest.cpp b/llvm/unittests/ProfileData/MemProfTest.cpp index 2f8589bbfbb96..83383eeaa3fe6 100644 --- a/llvm/unittests/ProfileData/MemProfTest.cpp +++ b/llvm/unittests/ProfileData/MemProfTest.cpp @@ -807,4 +807,40 @@ TEST(MemProf, YAMLParser) { EXPECT_THAT(Record.CallSiteIds, ElementsAre(hashCallStack(CS3), hashCallStack(CS4))); } + +template std::string serializeInYAML(T &Val) { + std::string Out; + llvm::raw_string_ostream OS(Out); + llvm::yaml::Output Yout(OS); + Yout << Val; + return Out; +} + +TEST(MemProf, YAMLWriterFrame) { + Frame F(11, 22, 33, true); + + std::string Out = serializeInYAML(F); + EXPECT_EQ(Out, R"YAML(--- +{ Function: 11, LineOffset: 22, Column: 33, Inline: true } +... +)YAML"); +} + +TEST(MemProf, YAMLWriterMIB) { + MemInfoBlock MIB; + MIB.AllocCount = 111; + MIB.TotalSize = 222; + MIB.TotalLifetime = 333; + MIB.TotalLifetimeAccessDensity = 444; + PortableMemInfoBlock PMIB(MIB, llvm::memprof::getHotColdSchema()); + + std::string Out = serializeInYAML(PMIB); + EXPECT_EQ(Out, R"YAML(--- +AllocCount: 111 +TotalSize: 222 +TotalLifetime: 333 +TotalLifetimeAccessDensity: 444 +... +)YAML"); +} } // namespace