diff --git a/llvm/include/llvm/ProfileData/MemProf.h b/llvm/include/llvm/ProfileData/MemProf.h --- a/llvm/include/llvm/ProfileData/MemProf.h +++ b/llvm/include/llvm/ProfileData/MemProf.h @@ -161,7 +161,7 @@ bool operator!=(const Frame &Other) const { return !operator==(Other); } // Write the contents of the frame to the ostream \p OS. - void write(raw_ostream & OS) const { + void serialize(raw_ostream & OS) const { using namespace support; endian::Writer LE(OS, little); @@ -176,6 +176,22 @@ LE.write(Column); LE.write(IsInlineFrame); } + + // Read a frame from char data which has been serialized as little endian. + static Frame deserialize(const unsigned char *Ptr) { + using namespace support; + return Frame( + /*Function=*/endian::readNext(Ptr), + /*LineOffset=*/endian::readNext(Ptr), + /*Column=*/endian::readNext(Ptr), + /*IsInlineFrame=*/endian::readNext(Ptr)); + } + + // Returns the size of the frame information. + static constexpr size_t serializedSize() { + return sizeof(Frame::Function) + sizeof(Frame::LineOffset) + + sizeof(Frame::Column) + sizeof(Frame::IsInlineFrame); + } }); // The dynamic calling context for the allocation. diff --git a/llvm/lib/ProfileData/MemProf.cpp b/llvm/lib/ProfileData/MemProf.cpp --- a/llvm/lib/ProfileData/MemProf.cpp +++ b/llvm/lib/ProfileData/MemProf.cpp @@ -15,7 +15,7 @@ for (const MemProfRecord &MR : Records) { LE.write(MR.CallStack.size()); for (const MemProfRecord::Frame &F : MR.CallStack) { - F.write(OS); + F.serialize(OS); } MR.Info.serialize(Schema, OS); } @@ -33,8 +33,8 @@ const uint64_t NumFrames = endian::readNext(Ptr); for (uint64_t J = 0; J < NumFrames; J++) { - const auto F = *reinterpret_cast(Ptr); - Ptr += sizeof(MemProfRecord::Frame); + const auto F = MemProfRecord::Frame::deserialize(Ptr); + Ptr += MemProfRecord::Frame::serializedSize(); MR.CallStack.push_back(F); } MR.Info.deserialize(Schema, Ptr);