https://github.com/snehasish updated 
https://github.com/llvm/llvm-project/pull/150375

>From 733f040d1e113d71a328bacce5dc5abcc61a9258 Mon Sep 17 00:00:00 2001
From: Snehasish Kumar <snehasi...@google.com>
Date: Thu, 24 Jul 2025 06:10:55 +0000
Subject: [PATCH 1/3] Write out raw profile bytes in little endian.

Instead of writing out in native endian, write out the raw profile bytes
in little endian. Also update the MIB data in little endian. Also clean
up some lint and unused includes in rawprofile.cpp.
---
 .../lib/memprof/memprof_rawprofile.cpp        | 17 +++++----
 llvm/lib/ProfileData/MemProfReader.cpp        | 35 +++++++++++++++++--
 2 files changed, 44 insertions(+), 8 deletions(-)

diff --git a/compiler-rt/lib/memprof/memprof_rawprofile.cpp 
b/compiler-rt/lib/memprof/memprof_rawprofile.cpp
index f909d78f5f36a..fbcfee3d655eb 100644
--- a/compiler-rt/lib/memprof/memprof_rawprofile.cpp
+++ b/compiler-rt/lib/memprof/memprof_rawprofile.cpp
@@ -7,10 +7,7 @@
 #include "sanitizer_common/sanitizer_allocator_internal.h"
 #include "sanitizer_common/sanitizer_array_ref.h"
 #include "sanitizer_common/sanitizer_common.h"
-#include "sanitizer_common/sanitizer_linux.h"
-#include "sanitizer_common/sanitizer_procmaps.h"
 #include "sanitizer_common/sanitizer_stackdepot.h"
-#include "sanitizer_common/sanitizer_stackdepotbase.h"
 #include "sanitizer_common/sanitizer_stacktrace.h"
 #include "sanitizer_common/sanitizer_vector.h"
 
@@ -23,7 +20,16 @@ using ::llvm::memprof::encodeHistogramCount;
 
 namespace {
 template <class T> char *WriteBytes(const T &Pod, char *Buffer) {
-  *(T *)Buffer = Pod;
+  static_assert(is_trivially_copyable<T>::value, "T must be POD");
+  const uint8_t *Src = reinterpret_cast<const uint8_t *>(&Pod);
+  for (size_t I = 0; I < sizeof(T); ++I) {
+    Buffer[I] = Src[I];
+  }
+#if defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+  for (size_t i = 0; i < sizeof(T) / 2; ++i) {
+    std::swap(buffer[i], buffer[sizeof(T) - 1 - i]);
+  }
+#endif
   return Buffer + sizeof(T);
 }
 
@@ -33,7 +39,6 @@ void RecordStackId(const uptr Key, UNUSED LockedMemInfoBlock 
*const &MIB,
   auto *StackIds = reinterpret_cast<Vector<u64> *>(Arg);
   StackIds->PushBack(Key);
 }
-} // namespace
 
 u64 SegmentSizeBytes(ArrayRef<LoadedModule> Modules) {
   u64 NumSegmentsToRecord = 0;
@@ -184,6 +189,7 @@ void SerializeMIBInfoToBuffer(MIBMapTy &MIBMap, const 
Vector<u64> &StackIds,
   CHECK(ExpectedNumBytes >= static_cast<u64>(Ptr - Buffer) &&
         "Expected num bytes != actual bytes written");
 }
+} // namespace
 
 // Format
 // ---------- Header
@@ -288,5 +294,4 @@ u64 SerializeToRawProfile(MIBMapTy &MIBMap, 
ArrayRef<LoadedModule> Modules,
 
   return TotalSizeBytes;
 }
-
 } // namespace __memprof
diff --git a/llvm/lib/ProfileData/MemProfReader.cpp 
b/llvm/lib/ProfileData/MemProfReader.cpp
index 9db699712d6f3..3fc0dbfd8e69d 100644
--- a/llvm/lib/ProfileData/MemProfReader.cpp
+++ b/llvm/lib/ProfileData/MemProfReader.cpp
@@ -146,8 +146,39 @@ readMemInfoBlocksCommon(const char *Ptr, bool 
IsHistogramEncoded = false) {
     const uint64_t Id =
         endian::readNext<uint64_t, llvm::endianness::little, unaligned>(Ptr);
 
-    MemInfoBlock MIB = *reinterpret_cast<const MemInfoBlock *>(Ptr);
-    Ptr += sizeof(MemInfoBlock);
+    MemInfoBlock MIB;
+#define READ_MIB_FIELD(FIELD)                                                  
\
+  MIB.FIELD = endian::readNext<decltype(MIB.FIELD), llvm::endianness::little,  
\
+                               unaligned>(Ptr)
+
+    READ_MIB_FIELD(AllocCount);
+    READ_MIB_FIELD(TotalAccessCount);
+    READ_MIB_FIELD(MinAccessCount);
+    READ_MIB_FIELD(MaxAccessCount);
+    READ_MIB_FIELD(TotalSize);
+    READ_MIB_FIELD(MinSize);
+    READ_MIB_FIELD(MaxSize);
+    READ_MIB_FIELD(AllocTimestamp);
+    READ_MIB_FIELD(DeallocTimestamp);
+    READ_MIB_FIELD(TotalLifetime);
+    READ_MIB_FIELD(MinLifetime);
+    READ_MIB_FIELD(MaxLifetime);
+    READ_MIB_FIELD(AllocCpuId);
+    READ_MIB_FIELD(DeallocCpuId);
+    READ_MIB_FIELD(NumMigratedCpu);
+    READ_MIB_FIELD(NumLifetimeOverlaps);
+    READ_MIB_FIELD(NumSameAllocCpu);
+    READ_MIB_FIELD(NumSameDeallocCpu);
+    READ_MIB_FIELD(DataTypeId);
+    READ_MIB_FIELD(TotalAccessDensity);
+    READ_MIB_FIELD(MinAccessDensity);
+    READ_MIB_FIELD(MaxAccessDensity);
+    READ_MIB_FIELD(TotalLifetimeAccessDensity);
+    READ_MIB_FIELD(MinLifetimeAccessDensity);
+    READ_MIB_FIELD(MaxLifetimeAccessDensity);
+    READ_MIB_FIELD(AccessHistogramSize);
+    READ_MIB_FIELD(AccessHistogram);
+#undef READ_MIB_FIELD
 
     if (MIB.AccessHistogramSize > 0) {
       // The in-memory representation uses uint64_t for histogram entries.

>From 4f3fc5e1eef921d5fa0058cf91a2c139ba7af249 Mon Sep 17 00:00:00 2001
From: Snehasish Kumar <snehasi...@google.com>
Date: Wed, 30 Jul 2025 00:35:20 +0000
Subject: [PATCH 2/3] Address comment

---
 compiler-rt/lib/memprof/memprof_rawprofile.cpp | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/compiler-rt/lib/memprof/memprof_rawprofile.cpp 
b/compiler-rt/lib/memprof/memprof_rawprofile.cpp
index fbcfee3d655eb..bf04afa679c9c 100644
--- a/compiler-rt/lib/memprof/memprof_rawprofile.cpp
+++ b/compiler-rt/lib/memprof/memprof_rawprofile.cpp
@@ -22,13 +22,13 @@ namespace {
 template <class T> char *WriteBytes(const T &Pod, char *Buffer) {
   static_assert(is_trivially_copyable<T>::value, "T must be POD");
   const uint8_t *Src = reinterpret_cast<const uint8_t *>(&Pod);
-  for (size_t I = 0; I < sizeof(T); ++I) {
-    Buffer[I] = Src[I];
-  }
+
+  for (size_t I = 0; I < sizeof(T); ++I)
 #if defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
-  for (size_t i = 0; i < sizeof(T) / 2; ++i) {
-    std::swap(buffer[i], buffer[sizeof(T) - 1 - i]);
-  }
+  // Reverse byte order since reader is little-endian.
+    Buffer[I] = Src[sizeof(T) - 1 - I];
+#else
+    Buffer[I] = Src[I];
 #endif
   return Buffer + sizeof(T);
 }

>From e815865beb9f90425986937d9fb57383d104ea67 Mon Sep 17 00:00:00 2001
From: Snehasish Kumar <snehasi...@google.com>
Date: Wed, 30 Jul 2025 00:40:40 +0000
Subject: [PATCH 3/3] Format.

---
 compiler-rt/lib/memprof/memprof_rawprofile.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/compiler-rt/lib/memprof/memprof_rawprofile.cpp 
b/compiler-rt/lib/memprof/memprof_rawprofile.cpp
index bf04afa679c9c..f579e12b15d0a 100644
--- a/compiler-rt/lib/memprof/memprof_rawprofile.cpp
+++ b/compiler-rt/lib/memprof/memprof_rawprofile.cpp
@@ -25,7 +25,7 @@ template <class T> char *WriteBytes(const T &Pod, char 
*Buffer) {
 
   for (size_t I = 0; I < sizeof(T); ++I)
 #if defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
-  // Reverse byte order since reader is little-endian.
+    // Reverse byte order since reader is little-endian.
     Buffer[I] = Src[sizeof(T) - 1 - I];
 #else
     Buffer[I] = Src[I];

_______________________________________________
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to