[NFC][MemProf] Move IndexedMemProfData to its own header. (#140503)

Part of a larger refactoring with the following goals
1. Reduce the size of MemProf.h 
2. Avoid including ModuleSummaryIndex just for a couple of types
This commit is contained in:
Snehasish Kumar
2025-05-19 16:21:51 -07:00
committed by GitHub
parent ad3c1d2091
commit 0528848def
11 changed files with 75 additions and 69 deletions

View File

@@ -6,18 +6,84 @@
//
//===----------------------------------------------------------------------===//
//
// MemProf data is serialized in writeMemProf provided in this header file.
// This file implements IndexedMemProfData, a data structure to hold MemProf
// in a space optimized format. It also provides utility methods for writing
// MemProf data.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_PROFILEDATA_INDEXEDMEMPROFDATA_H
#define LLVM_PROFILEDATA_INDEXEDMEMPROFDATA_H
#include "llvm/ProfileData/InstrProf.h"
#include "llvm/ProfileData/MemProf.h"
namespace llvm {
namespace memprof {
struct IndexedMemProfData {
// A map to hold memprof data per function. The lower 64 bits obtained from
// the md5 hash of the function name is used to index into the map.
llvm::MapVector<GlobalValue::GUID, IndexedMemProfRecord> Records;
// A map to hold frame id to frame mappings. The mappings are used to
// convert IndexedMemProfRecord to MemProfRecords with frame information
// inline.
llvm::MapVector<FrameId, Frame> Frames;
// A map to hold call stack id to call stacks.
llvm::MapVector<CallStackId, llvm::SmallVector<FrameId>> CallStacks;
FrameId addFrame(const Frame &F) {
const FrameId Id = hashFrame(F);
Frames.try_emplace(Id, F);
return Id;
}
CallStackId addCallStack(ArrayRef<FrameId> CS) {
CallStackId CSId = hashCallStack(CS);
CallStacks.try_emplace(CSId, CS);
return CSId;
}
CallStackId addCallStack(SmallVector<FrameId> &&CS) {
CallStackId CSId = hashCallStack(CS);
CallStacks.try_emplace(CSId, std::move(CS));
return CSId;
}
private:
// Return a hash value based on the contents of the frame. Here we use a
// cryptographic hash function to minimize the chance of hash collisions. We
// do persist FrameIds as part of memprof formats up to Version 2, inclusive.
// However, the deserializer never calls this function; it uses FrameIds
// merely as keys to look up Frames proper.
FrameId hashFrame(const Frame &F) const {
llvm::HashBuilder<llvm::TruncatedBLAKE3<8>, llvm::endianness::little>
HashBuilder;
HashBuilder.add(F.Function, F.LineOffset, F.Column, F.IsInlineFrame);
llvm::BLAKE3Result<8> Hash = HashBuilder.final();
FrameId Id;
std::memcpy(&Id, Hash.data(), sizeof(Hash));
return Id;
}
// Compute a CallStackId for a given call stack.
CallStackId hashCallStack(ArrayRef<FrameId> CS) const {
llvm::HashBuilder<llvm::TruncatedBLAKE3<8>, llvm::endianness::little>
HashBuilder;
for (FrameId F : CS)
HashBuilder.add(F);
llvm::BLAKE3Result<8> Hash = HashBuilder.final();
CallStackId CSId;
std::memcpy(&CSId, Hash.data(), sizeof(Hash));
return CSId;
}
};
} // namespace memprof
// Write the MemProf data to OS.
Error writeMemProf(ProfOStream &OS, memprof::IndexedMemProfData &MemProfData,
memprof::IndexedVersion MemProfVersionRequested,
bool MemProfFullSchema);
} // namespace llvm
#endif

View File

@@ -19,8 +19,8 @@
#include "llvm/ADT/StringMap.h"
#include "llvm/IR/GlobalValue.h"
#include "llvm/Object/BuildID.h"
#include "llvm/ProfileData/IndexedMemProfData.h"
#include "llvm/ProfileData/InstrProf.h"
#include "llvm/ProfileData/MemProf.h"
#include "llvm/Support/Error.h"
#include <cstdint>
#include <memory>

View File

@@ -842,57 +842,6 @@ struct LineLocation {
// A pair of a call site location and its corresponding callee GUID.
using CallEdgeTy = std::pair<LineLocation, uint64_t>;
struct IndexedMemProfData {
// A map to hold memprof data per function. The lower 64 bits obtained from
// the md5 hash of the function name is used to index into the map.
llvm::MapVector<GlobalValue::GUID, IndexedMemProfRecord> Records;
// A map to hold frame id to frame mappings. The mappings are used to
// convert IndexedMemProfRecord to MemProfRecords with frame information
// inline.
llvm::MapVector<FrameId, Frame> Frames;
// A map to hold call stack id to call stacks.
llvm::MapVector<CallStackId, llvm::SmallVector<FrameId>> CallStacks;
FrameId addFrame(const Frame &F) {
const FrameId Id = hashFrame(F);
Frames.try_emplace(Id, F);
return Id;
}
CallStackId addCallStack(ArrayRef<FrameId> CS) {
CallStackId CSId = hashCallStack(CS);
CallStacks.try_emplace(CSId, CS);
return CSId;
}
CallStackId addCallStack(SmallVector<FrameId> &&CS) {
CallStackId CSId = hashCallStack(CS);
CallStacks.try_emplace(CSId, std::move(CS));
return CSId;
}
private:
// Return a hash value based on the contents of the frame. Here we use a
// cryptographic hash function to minimize the chance of hash collisions. We
// do persist FrameIds as part of memprof formats up to Version 2, inclusive.
// However, the deserializer never calls this function; it uses FrameIds
// merely as keys to look up Frames proper.
FrameId hashFrame(const Frame &F) const {
llvm::HashBuilder<llvm::TruncatedBLAKE3<8>, llvm::endianness::little>
HashBuilder;
HashBuilder.add(F.Function, F.LineOffset, F.Column, F.IsInlineFrame);
llvm::BLAKE3Result<8> Hash = HashBuilder.final();
FrameId Id;
std::memcpy(&Id, Hash.data(), sizeof(Hash));
return Id;
}
// Compute a CallStackId for a given call stack.
CallStackId hashCallStack(ArrayRef<FrameId> CS) const;
};
} // namespace memprof
} // namespace llvm

View File

@@ -13,6 +13,7 @@
#ifndef LLVM_PROFILEDATA_MEMPROFRADIXTREE_H
#define LLVM_PROFILEDATA_MEMPROFRADIXTREE_H
#include "llvm/ProfileData/IndexedMemProfData.h"
#include "llvm/ProfileData/MemProf.h"
namespace llvm {

View File

@@ -21,6 +21,7 @@
#include "llvm/IR/GlobalValue.h"
#include "llvm/Object/Binary.h"
#include "llvm/Object/ObjectFile.h"
#include "llvm/ProfileData/IndexedMemProfData.h"
#include "llvm/ProfileData/InstrProfReader.h"
#include "llvm/ProfileData/MemProfData.inc"
#include "llvm/ProfileData/MemProfRadixTree.h"

View File

@@ -61,6 +61,7 @@
#include "llvm/MC/StringTableBuilder.h"
#include "llvm/MC/TargetRegistry.h"
#include "llvm/Object/IRSymtab.h"
#include "llvm/ProfileData/IndexedMemProfData.h"
#include "llvm/ProfileData/MemProf.h"
#include "llvm/ProfileData/MemProfRadixTree.h"
#include "llvm/Support/AtomicOrdering.h"

View File

@@ -18,7 +18,6 @@
#include "llvm/IR/ProfileSummary.h"
#include "llvm/ProfileData/IndexedMemProfData.h"
#include "llvm/ProfileData/InstrProf.h"
#include "llvm/ProfileData/MemProf.h"
#include "llvm/ProfileData/ProfileCommon.h"
#include "llvm/Support/Compression.h"
#include "llvm/Support/Endian.h"

View File

@@ -3,10 +3,8 @@
#include "llvm/IR/Function.h"
#include "llvm/ProfileData/InstrProf.h"
#include "llvm/ProfileData/SampleProf.h"
#include "llvm/Support/BLAKE3.h"
#include "llvm/Support/Endian.h"
#include "llvm/Support/EndianStream.h"
#include "llvm/Support/HashBuilder.h"
namespace llvm {
namespace memprof {
@@ -384,16 +382,5 @@ Expected<MemProfSchema> readMemProfSchema(const unsigned char *&Buffer) {
Buffer = Ptr;
return Result;
}
CallStackId IndexedMemProfData::hashCallStack(ArrayRef<FrameId> CS) const {
llvm::HashBuilder<llvm::TruncatedBLAKE3<8>, llvm::endianness::little>
HashBuilder;
for (FrameId F : CS)
HashBuilder.add(F);
llvm::BLAKE3Result<8> Hash = HashBuilder.final();
CallStackId CSId;
std::memcpy(&CSId, Hash.data(), sizeof(Hash));
return CSId;
}
} // namespace memprof
} // namespace llvm

View File

@@ -12,6 +12,7 @@
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/ProfileData/IndexedMemProfData.h"
#include "llvm/ProfileData/InstrProfReader.h"
#include "llvm/ProfileData/InstrProfWriter.h"
#include "llvm/ProfileData/MemProf.h"

View File

@@ -14,10 +14,10 @@
#include "llvm/DebugInfo/Symbolize/SymbolizableModule.h"
#include "llvm/IR/Value.h"
#include "llvm/Object/ObjectFile.h"
#include "llvm/ProfileData/IndexedMemProfData.h"
#include "llvm/ProfileData/MemProfData.inc"
#include "llvm/ProfileData/MemProfRadixTree.h"
#include "llvm/ProfileData/MemProfReader.h"
#include "llvm/ProfileData/MemProfYAML.h"
#include "llvm/Support/raw_ostream.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"

View File

@@ -11,6 +11,7 @@
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/Passes/PassBuilder.h"
#include "llvm/ProfileData/IndexedMemProfData.h"
#include "llvm/ProfileData/InstrProfReader.h"
#include "llvm/ProfileData/InstrProfWriter.h"
#include "llvm/ProfileData/MemProf.h"