[llvm] 962db7d - [memprof] Update summary output.

Snehasish Kumar via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 1 19:15:47 PDT 2022


Author: Snehasish Kumar
Date: 2022-06-02T02:15:42Z
New Revision: 962db7de84d47b0aa461884f3f72844ef9a3f216

URL: https://github.com/llvm/llvm-project/commit/962db7de84d47b0aa461884f3f72844ef9a3f216
DIFF: https://github.com/llvm/llvm-project/commit/962db7de84d47b0aa461884f3f72844ef9a3f216.diff

LOG: [memprof] Update summary output.

Update the YAML format print out of the profile to include a summary
instead of displaying the headers in the raw file buffer. This allows us
to release the raw buffer early saving memory.

Reviewed By: tejohnson

Differential Revision: https://reviews.llvm.org/D126834

Added: 
    

Modified: 
    llvm/include/llvm/ProfileData/RawMemProfReader.h
    llvm/lib/ProfileData/RawMemProfReader.cpp
    llvm/test/tools/llvm-profdata/memprof-basic.test
    llvm/test/tools/llvm-profdata/memprof-inline.test
    llvm/test/tools/llvm-profdata/memprof-multi.test

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/ProfileData/RawMemProfReader.h b/llvm/include/llvm/ProfileData/RawMemProfReader.h
index a81db8ee3d995..34f78063aa42a 100644
--- a/llvm/include/llvm/ProfileData/RawMemProfReader.h
+++ b/llvm/include/llvm/ProfileData/RawMemProfReader.h
@@ -38,8 +38,6 @@ using CallStackMap = llvm::DenseMap<uint64_t, llvm::SmallVector<uint64_t>>;
 
 class RawMemProfReader {
 public:
-  RawMemProfReader(std::unique_ptr<MemoryBuffer> DataBuffer)
-      : DataBuffer(std::move(DataBuffer)) {}
   RawMemProfReader(const RawMemProfReader &) = delete;
   RawMemProfReader &operator=(const RawMemProfReader &) = delete;
 
@@ -103,12 +101,12 @@ class RawMemProfReader {
   }
 
 private:
-  RawMemProfReader(std::unique_ptr<MemoryBuffer> DataBuffer,
-                   object::OwningBinary<object::Binary> &&Bin, bool KeepName)
-      : DataBuffer(std::move(DataBuffer)), Binary(std::move(Bin)),
-        KeepSymbolName(KeepName) {}
-  Error initialize();
-  Error readRawProfile();
+  RawMemProfReader(object::OwningBinary<object::Binary> &&Bin, bool KeepName)
+      : Binary(std::move(Bin)), KeepSymbolName(KeepName) {}
+  // Initializes the RawMemProfReader with the contents in `DataBuffer`.
+  Error initialize(std::unique_ptr<MemoryBuffer> DataBuffer);
+  // Read and parse the contents of the `DataBuffer` as a binary format profile.
+  Error readRawProfile(std::unique_ptr<MemoryBuffer> DataBuffer);
   // Symbolize and cache all the virtual addresses we encounter in the
   // callstacks from the raw profile. Also prune callstack frames which we can't
   // symbolize or those that belong to the runtime. For profile entries where
@@ -127,11 +125,7 @@ class RawMemProfReader {
   }
 
   object::SectionedAddress getModuleOffset(uint64_t VirtualAddress);
-  // Prints aggregate counts for each raw profile parsed from the DataBuffer in
-  // YAML format.
-  void printSummaries(raw_ostream &OS) const;
 
-  std::unique_ptr<MemoryBuffer> DataBuffer;
   object::OwningBinary<object::Binary> Binary;
   std::unique_ptr<llvm::symbolize::SymbolizableModule> Symbolizer;
 

diff  --git a/llvm/lib/ProfileData/RawMemProfReader.cpp b/llvm/lib/ProfileData/RawMemProfReader.cpp
index 96ed9bbe5a768..aa92912032015 100644
--- a/llvm/lib/ProfileData/RawMemProfReader.cpp
+++ b/llvm/lib/ProfileData/RawMemProfReader.cpp
@@ -36,34 +36,12 @@
 namespace llvm {
 namespace memprof {
 namespace {
-
-struct Summary {
-  uint64_t Version;
-  uint64_t TotalSizeBytes;
-  uint64_t NumSegments;
-  uint64_t NumMIBInfo;
-  uint64_t NumStackOffsets;
-};
-
 template <class T = uint64_t> inline T alignedRead(const char *Ptr) {
   static_assert(std::is_pod<T>::value, "Not a pod type.");
   assert(reinterpret_cast<size_t>(Ptr) % sizeof(T) == 0 && "Unaligned Read");
   return *reinterpret_cast<const T *>(Ptr);
 }
 
-Summary computeSummary(const char *Start) {
-  auto *H = reinterpret_cast<const Header *>(Start);
-
-  // Check alignment while reading the number of items in each section.
-  return Summary{
-      H->Version,
-      H->TotalSize,
-      alignedRead(Start + H->SegmentOffset),
-      alignedRead(Start + H->MIBOffset),
-      alignedRead(Start + H->StackOffset),
-  };
-}
-
 Error checkBuffer(const MemoryBuffer &Buffer) {
   if (!RawMemProfReader::hasFormat(Buffer))
     return make_error<InstrProfError>(instrprof_error::bad_magic);
@@ -196,9 +174,9 @@ RawMemProfReader::create(const Twine &Path, const StringRef ProfiledBinary,
   }
 
   // Use new here since constructor is private.
-  std::unique_ptr<RawMemProfReader> Reader(new RawMemProfReader(
-      std::move(Buffer), std::move(BinaryOr.get()), KeepName));
-  if (Error E = Reader->initialize()) {
+  std::unique_ptr<RawMemProfReader> Reader(
+      new RawMemProfReader(std::move(BinaryOr.get()), KeepName));
+  if (Error E = Reader->initialize(std::move(Buffer))) {
     return std::move(E);
   }
   return std::move(Reader);
@@ -223,11 +201,22 @@ bool RawMemProfReader::hasFormat(const MemoryBuffer &Buffer) {
 }
 
 void RawMemProfReader::printYAML(raw_ostream &OS) {
+  uint64_t NumAllocFunctions = 0, NumMibInfo = 0;
+  for (const auto &KV : FunctionProfileData) {
+    const size_t NumAllocSites = KV.second.AllocSites.size();
+    if (NumAllocSites > 0) {
+      NumAllocFunctions++;
+      NumMibInfo += NumAllocSites;
+    }
+  }
+
   OS << "MemprofProfile:\n";
-  // TODO: Update printSummaries to print out the data after the profile has
-  // been symbolized and pruned. We can parse some raw profile characteristics
-  // from the data buffer for additional information.
-  printSummaries(OS);
+  OS << "  Summary:\n";
+  OS << "    Version: " << MEMPROF_RAW_VERSION << "\n";
+  OS << "    NumSegments: " << SegmentInfo.size() << "\n";
+  OS << "    NumMibInfo: " << NumMibInfo << "\n";
+  OS << "    NumAllocFunctions: " << NumAllocFunctions << "\n";
+  OS << "    NumStackOffsets: " << StackMap.size() << "\n";
   // Print out the merged contents of the profiles.
   OS << "  Records:\n";
   for (const auto &Entry : *this) {
@@ -237,26 +226,7 @@ void RawMemProfReader::printYAML(raw_ostream &OS) {
   }
 }
 
-void RawMemProfReader::printSummaries(raw_ostream &OS) const {
-  const char *Next = DataBuffer->getBufferStart();
-  while (Next < DataBuffer->getBufferEnd()) {
-    auto Summary = computeSummary(Next);
-    OS << "  -\n";
-    OS << "  Header:\n";
-    OS << "    Version: " << Summary.Version << "\n";
-    OS << "    TotalSizeBytes: " << Summary.TotalSizeBytes << "\n";
-    OS << "    NumSegments: " << Summary.NumSegments << "\n";
-    OS << "    NumMibInfo: " << Summary.NumMIBInfo << "\n";
-    OS << "    NumStackOffsets: " << Summary.NumStackOffsets << "\n";
-    // TODO: Print the build ids once we can record them using the
-    // sanitizer_procmaps library for linux.
-
-    auto *H = reinterpret_cast<const Header *>(Next);
-    Next += H->TotalSize;
-  }
-}
-
-Error RawMemProfReader::initialize() {
+Error RawMemProfReader::initialize(std::unique_ptr<MemoryBuffer> DataBuffer) {
   const StringRef FileName = Binary.getBinary()->getFileName();
 
   auto *ElfObject = dyn_cast<object::ELFObjectFileBase>(Binary.getBinary());
@@ -283,7 +253,7 @@ Error RawMemProfReader::initialize() {
     return report(SOFOr.takeError(), FileName);
   Symbolizer = std::move(SOFOr.get());
 
-  if (Error E = readRawProfile())
+  if (Error E = readRawProfile(std::move(DataBuffer)))
     return E;
 
   if (Error E = symbolizeAndFilterStackFrames())
@@ -452,7 +422,8 @@ Error RawMemProfReader::symbolizeAndFilterStackFrames() {
   return Error::success();
 }
 
-Error RawMemProfReader::readRawProfile() {
+Error RawMemProfReader::readRawProfile(
+    std::unique_ptr<MemoryBuffer> DataBuffer) {
   const char *Next = DataBuffer->getBufferStart();
 
   while (Next < DataBuffer->getBufferEnd()) {

diff  --git a/llvm/test/tools/llvm-profdata/memprof-basic.test b/llvm/test/tools/llvm-profdata/memprof-basic.test
index 5ec22e29ada3c..cd2b607ff5eb0 100644
--- a/llvm/test/tools/llvm-profdata/memprof-basic.test
+++ b/llvm/test/tools/llvm-profdata/memprof-basic.test
@@ -36,14 +36,13 @@ RUN: llvm-profdata show --memory %p/Inputs/basic.memprofraw --profiled-binary %p
 We expect 2 MIB entries, 1 each for the malloc calls in the program. Any
 additional allocations which do not originate from the main binary are pruned.
 
-CHECK: MemprofProfile:
-CHECK-NEXT:   -
-CHECK-NEXT:   Header:
+CHECK:  MemprofProfile:
+CHECK-NEXT:   Summary:
 CHECK-NEXT:     Version: 1
-CHECK-NEXT:     TotalSizeBytes: 1016
 CHECK-NEXT:     NumSegments: 9
-CHECK-NEXT:     NumMibInfo: 3
-CHECK-NEXT:     NumStackOffsets: 3
+CHECK-NEXT:     NumMibInfo: 2
+CHECK-NEXT:     NumAllocFunctions: 1
+CHECK-NEXT:     NumStackOffsets: 2
 CHECK-NEXT:   Records:
 CHECK-NEXT:   -
 CHECK-NEXT:     FunctionGUID: {{[0-9]+}}

diff  --git a/llvm/test/tools/llvm-profdata/memprof-inline.test b/llvm/test/tools/llvm-profdata/memprof-inline.test
index 5f34d5ac0d817..49f39ac65a333 100644
--- a/llvm/test/tools/llvm-profdata/memprof-inline.test
+++ b/llvm/test/tools/llvm-profdata/memprof-inline.test
@@ -38,13 +38,12 @@ env MEMPROF_OPTIONS=log_path=stdout ./memprof-inline.exe > inline.memprofraw
 RUN: llvm-profdata show --memory %p/Inputs/inline.memprofraw --profiled-binary %p/Inputs/inline.memprofexe | FileCheck %s
 
 CHECK:  MemprofProfile:
-CHECK-NEXT:  -
-CHECK-NEXT:  Header:
+CHECK-NEXT:  Summary:
 CHECK-NEXT:    Version: 1
-CHECK-NEXT:    TotalSizeBytes: 880
 CHECK-NEXT:    NumSegments: 9
 CHECK-NEXT:    NumMibInfo: 2
-CHECK-NEXT:    NumStackOffsets: 2
+CHECK-NEXT:    NumAllocFunctions: 2
+CHECK-NEXT:    NumStackOffsets: 1
 CHECK-NEXT:  Records:
 CHECK-NEXT:  -
 CHECK-NEXT:    FunctionGUID: 15505678318020221912

diff  --git a/llvm/test/tools/llvm-profdata/memprof-multi.test b/llvm/test/tools/llvm-profdata/memprof-multi.test
index 17641136dcbed..7463b13299513 100644
--- a/llvm/test/tools/llvm-profdata/memprof-multi.test
+++ b/llvm/test/tools/llvm-profdata/memprof-multi.test
@@ -37,18 +37,18 @@ RUN: llvm-profdata show --memory %p/Inputs/multi.memprofraw --profiled-binary %p
 
 We expect 2 MIB entries, 1 each for the malloc calls in the program.
 
-CHECK: MemprofProfile:
-CHECK-NEXT:   -
-CHECK-NEXT:   Header:
-CHECK-NEXT:     Version: 1
-CHECK-NEXT:     TotalSizeBytes: 864
-CHECK-NEXT:     NumSegments: 9
-CHECK-NEXT:     NumMibInfo: 2
-CHECK-NEXT:     NumStackOffsets: 2
-CHECK-NEXT:   -
-CHECK-NEXT:   Header:
-CHECK-NEXT:     Version: 1
-CHECK-NEXT:     TotalSizeBytes: 864
-CHECK-NEXT:     NumSegments: 9
-CHECK-NEXT:     NumMibInfo: 2
-CHECK-NEXT:     NumStackOffsets: 2
+CHECK:  MemprofProfile:
+CHECK-NEXT:  Summary:
+CHECK-NEXT:    Version: 1
+CHECK-NEXT:    NumSegments: 9
+CHECK-NEXT:    NumMibInfo: 2
+CHECK-NEXT:    NumAllocFunctions: 1
+CHECK-NEXT:    NumStackOffsets: 2
+
+CHECK:        SymbolName: main
+CHECK-NEXT:     LineOffset: 1
+CHECK-NEXT:     Column: 21
+
+CHECK:        SymbolName: main
+CHECK-NEXT:     LineOffset: 5
+CHECK-NEXT:     Column: 15


        


More information about the llvm-commits mailing list