28  for (
const auto Id : Schema)
 
 
   39        *MemProfCallStackIndexes = 
nullptr) {
 
   41                                          MemProfCallStackIndexes);
 
   44  for (
auto &[GUID, 
Record] : MemProfRecordData) {
 
   46    RecordTableGenerator.insert(GUID, 
Record, RecordWriter);
 
   49  MemProfRecordData.
clear();
 
   54  return RecordTableGenerator.
Emit(OS.
OS, RecordWriter);
 
 
   63  for (
auto &[FrameId, Frame] : MemProfFrameData) {
 
   65    FrameTableGenerator.insert(FrameId, Frame);
 
   68  MemProfFrameData.
clear();
 
   70  return FrameTableGenerator.
Emit(OS.
OS);
 
 
   92  std::vector<std::pair<memprof::FrameId, const memprof::Frame *>> FrameIdOrder;
 
   93  FrameIdOrder.reserve(MemProfFrameData.
size());
 
   94  for (
const auto &[Id, Frame] : MemProfFrameData)
 
   95    FrameIdOrder.emplace_back(Id, &Frame);
 
   96  assert(MemProfFrameData.
size() == FrameIdOrder.size());
 
   98             [&](
const std::pair<memprof::FrameId, const memprof::Frame *> &L,
 
   99                 const std::pair<memprof::FrameId, const memprof::Frame *> &R) {
 
  100               const auto &SL = FrameHistogram[L.first];
 
  101               const auto &SR = FrameHistogram[R.first];
 
  103               if (SL.Count != SR.Count)
 
  104                 return SL.Count > SR.Count;
 
  107               if (SL.PositionSum != SR.PositionSum)
 
  108                 return SL.PositionSum < SR.PositionSum;
 
  110               return L.first < R.first;
 
  115  MemProfFrameIndexes.
reserve(FrameIdOrder.size());
 
  116  for (
const auto &[Id, 
F] : FrameIdOrder) {
 
  118    MemProfFrameIndexes.
insert({Id, Index});
 
  125  MemProfFrameData.
clear();
 
  127  return MemProfFrameIndexes;
 
 
  133        &MemProfCallStackData) {
 
  135      CallStackTableGenerator;
 
  136  for (
auto &[CSId, CallStack] : MemProfCallStackData)
 
  137    CallStackTableGenerator.insert(CSId, CallStack);
 
  139  MemProfCallStackData.clear();
 
  141  return CallStackTableGenerator.
Emit(OS.
OS);
 
 
  148        &MemProfCallStackData,
 
  150        &MemProfFrameIndexes,
 
  152    unsigned &NumElements) {
 
  154      MemProfCallStackIndexes;
 
  157  Builder.
build(std::move(MemProfCallStackData), &MemProfFrameIndexes,
 
  159  for (
auto I : Builder.getRadixArray())
 
  161  NumElements = Builder.getRadixArray().size();
 
  162  MemProfCallStackIndexes = Builder.takeCallStackPos();
 
  165  MemProfCallStackData.
clear();
 
  167  return MemProfCallStackIndexes;
 
 
  187                            bool MemProfFullSchema) {
 
  197  if (MemProfFullSchema)
 
  212      RecordTableOffset,      FramePayloadOffset,   FrameTableOffset,
 
  213      CallStackPayloadOffset, CallStackTableOffset,
 
  215  OS.
patch({{HeaderUpdatePos, Header}});
 
 
  223    std::unique_ptr<memprof::DataAccessProfData> DataAccessProfileData =
 
  225    std::unique_ptr<memprof::MemProfSummary> MemProfSum = 
nullptr) {
 
  227         "Unsupported version for radix tree format");
 
  237    MemProfSum->write(OS);
 
  241  if (MemProfFullSchema)
 
  254  unsigned NumElements = 0;
 
  256      MemProfCallStackIndexes =
 
  258                                     MemProfFrameIndexes, FrameHistogram,
 
  263      OS, MemProfData.
Records, &Schema, 
Version, &MemProfCallStackIndexes);
 
  266  if (DataAccessProfileData != 
nullptr) {
 
  268           "Data access profiles are added starting from v4");
 
  269    DataAccessProfOffset = OS.
tell();
 
  270    if (
Error E = DataAccessProfileData->serialize(OS))
 
  276  assert(CallStackPayloadOffset +
 
  278         RecordPayloadOffset);
 
  281      CallStackPayloadOffset,
 
  288  OS.
patch({{HeaderUpdatePos, Header}});
 
 
  296                            bool MemProfFullSchema) {
 
 
  304    bool MemProfFullSchema,
 
  305    std::unique_ptr<memprof::DataAccessProfData> DataAccessProfileData,
 
  306    std::unique_ptr<memprof::MemProfSummary> MemProfSum) {
 
  309      std::move(DataAccessProfileData), std::move(MemProfSum));
 
 
  316    std::unique_ptr<memprof::DataAccessProfData> DataAccessProfileData,
 
  317    std::unique_ptr<memprof::MemProfSummary> MemProfSum) {
 
  318  switch (MemProfVersionRequested) {
 
  325                          std::move(DataAccessProfileData),
 
  326                          std::move(MemProfSum));
 
  331      formatv(
"MemProf version {} not supported; " 
  332              "requires version between {} and {}, inclusive",
 
 
  337Error IndexedMemProfReader::deserializeV2(
const unsigned char *Start,
 
  338                                          const unsigned char *
Ptr) {
 
  352  uint64_t CallStackPayloadOffset = 0;
 
  356    CallStackPayloadOffset =
 
  358    CallStackTableOffset =
 
  365    return SchemaOr.takeError();
 
  366  Schema = SchemaOr.get();
 
  370      Start + RecordTableOffset,
 
  372      Start, memprof::RecordLookupTrait(Version, Schema)));
 
  376      Start + FrameTableOffset,
 
  377      Start + FramePayloadOffset,
 
  382        Start + CallStackTableOffset,
 
  383        Start + CallStackPayloadOffset,
 
  389Error IndexedMemProfReader::deserializeRadixTreeBased(
 
  390    const unsigned char *Start, 
const unsigned char *
Ptr,
 
  393         "Unsupported version for radix tree format");
 
  396  const uint64_t CallStackPayloadOffset =
 
  399  const uint64_t RecordPayloadOffset =
 
  402  const uint64_t RecordTableOffset =
 
  405  uint64_t DataAccessProfOffset = 0;
 
  407    DataAccessProfOffset =
 
  415    return SchemaOr.takeError();
 
  416  Schema = SchemaOr.get();
 
  419  CallStackBase = 
Start + CallStackPayloadOffset;
 
  424  RadixTreeSize = (RecordPayloadOffset - CallStackPayloadOffset) /
 
  429      Start + RecordTableOffset,
 
  430      Start + RecordPayloadOffset,
 
  431      Start, memprof::RecordLookupTrait(Version, Schema)));
 
  433  assert((!DataAccessProfOffset || DataAccessProfOffset > RecordTableOffset) &&
 
  434         "Data access profile is either empty or after the record table");
 
  435  if (DataAccessProfOffset > RecordTableOffset) {
 
  436    DataAccessProfileData = std::make_unique<memprof::DataAccessProfData>();
 
  437    const unsigned char *DAPPtr = 
Start + DataAccessProfOffset;
 
  438    if (
Error E = DataAccessProfileData->deserialize(DAPPtr))
 
  447  const unsigned char *
Ptr = Start + MemProfOffset;
 
  461        formatv(
"MemProf version {} not supported; " 
  462                "requires version between {} and {}, inclusive",
 
  475    if (
Error E = deserializeRadixTreeBased(Start, 
Ptr, Version))
 
 
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
 
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
 
Defines facilities for reading and writing on-disk hash tables.
 
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
 
void reserve(size_type NumEntries)
Grow the densemap so that it can contain at least NumEntries items before resizing again.
 
Lightweight error class with error context and mandatory checking.
 
static ErrorSuccess success()
Create a success value.
 
LLVM_ABI Error deserialize(const unsigned char *Start, uint64_t MemProfOffset)
 
This class implements a map that also provides access to all stored values in a deterministic order.
 
Generates an on disk hash table.
 
offset_type Emit(raw_ostream &Out)
Emit the table to Out, which must not be at offset 0.
 
static OnDiskIterableChainedHashTable * Create(const unsigned char *Buckets, const unsigned char *const Payload, const unsigned char *const Base, const memprof::RecordLookupTrait &InfoObj=memprof::RecordLookupTrait())
 
LLVM_ABI uint64_t tell() const
 
LLVM_ABI void patch(ArrayRef< PatchItem > P)
 
LLVM_ABI void write32(uint32_t V)
 
LLVM_ABI void write(uint64_t V)
 
void push_back(const T &Elt)
 
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
 
void build(llvm::MapVector< CallStackId, llvm::SmallVector< FrameIdTy > > &&MemProfCallStackData, const llvm::DenseMap< FrameIdTy, LinearFrameId > *MemProfFrameIndexes, llvm::DenseMap< FrameIdTy, FrameStat > &FrameHistogram)
 
static LLVM_ABI std::unique_ptr< MemProfSummary > deserialize(const unsigned char *&)
Read from indexed MemProf profile.
 
constexpr uint64_t MaximumSupportedVersion
 
LLVM_ABI MemProfSchema getHotColdSchema()
 
llvm::SmallVector< Meta, static_cast< int >(Meta::Size)> MemProfSchema
 
constexpr uint64_t MinimumSupportedVersion
 
LLVM_ABI MemProfSchema getFullSchema()
 
LLVM_ABI Expected< MemProfSchema > readMemProfSchema(const unsigned char *&Buffer)
 
llvm::DenseMap< FrameIdTy, FrameStat > computeFrameHistogram(llvm::MapVector< CallStackId, llvm::SmallVector< FrameIdTy > > &MemProfCallStackData)
 
value_type readNext(const CharT *&memory, endianness endian)
Read a value of a particular endianness from a buffer, and increment the buffer past that value.
 
This is an optimization pass for GlobalISel generic memory operations.
 
static void writeMemProfSchema(ProfOStream &OS, const memprof::MemProfSchema &Schema)
 
static Error writeMemProfV3(ProfOStream &OS, memprof::IndexedMemProfData &MemProfData, bool MemProfFullSchema)
 
auto formatv(bool Validate, const char *Fmt, Ts &&...Vals)
 
FunctionAddr VTableAddr uintptr_t uintptr_t Version
 
void sort(IteratorTy Start, IteratorTy End)
 
static llvm::DenseMap< memprof::CallStackId, memprof::LinearCallStackId > writeMemProfCallStackArray(ProfOStream &OS, llvm::MapVector< memprof::CallStackId, llvm::SmallVector< memprof::FrameId > > &MemProfCallStackData, llvm::DenseMap< memprof::FrameId, memprof::LinearFrameId > &MemProfFrameIndexes, llvm::DenseMap< memprof::FrameId, memprof::FrameStat > &FrameHistogram, unsigned &NumElements)
 
static llvm::DenseMap< memprof::FrameId, memprof::LinearFrameId > writeMemProfFrameArray(ProfOStream &OS, llvm::MapVector< memprof::FrameId, memprof::Frame > &MemProfFrameData, llvm::DenseMap< memprof::FrameId, memprof::FrameStat > &FrameHistogram)
 
static Error writeMemProfV4(ProfOStream &OS, memprof::IndexedMemProfData &MemProfData, bool MemProfFullSchema, std::unique_ptr< memprof::DataAccessProfData > DataAccessProfileData, std::unique_ptr< memprof::MemProfSummary > MemProfSum)
 
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
 
static Error writeMemProfRadixTreeBased(ProfOStream &OS, memprof::IndexedMemProfData &MemProfData, memprof::IndexedVersion Version, bool MemProfFullSchema, std::unique_ptr< memprof::DataAccessProfData > DataAccessProfileData=nullptr, std::unique_ptr< memprof::MemProfSummary > MemProfSum=nullptr)
 
static Error writeMemProfV2(ProfOStream &OS, memprof::IndexedMemProfData &MemProfData, bool MemProfFullSchema)
 
static uint64_t writeMemProfCallStacks(ProfOStream &OS, llvm::MapVector< memprof::CallStackId, llvm::SmallVector< memprof::FrameId > > &MemProfCallStackData)
 
static uint64_t writeMemProfRecords(ProfOStream &OS, llvm::MapVector< GlobalValue::GUID, memprof::IndexedMemProfRecord > &MemProfRecordData, memprof::MemProfSchema *Schema, memprof::IndexedVersion Version, llvm::DenseMap< memprof::CallStackId, memprof::LinearCallStackId > *MemProfCallStackIndexes=nullptr)
 
LLVM_ABI Error writeMemProf(ProfOStream &OS, memprof::IndexedMemProfData &MemProfData, memprof::IndexedVersion MemProfVersionRequested, bool MemProfFullSchema, std::unique_ptr< memprof::DataAccessProfData > DataAccessProfileData, std::unique_ptr< memprof::MemProfSummary > MemProfSum)
 
static uint64_t writeMemProfFrames(ProfOStream &OS, llvm::MapVector< memprof::FrameId, memprof::Frame > &MemProfFrameData)
 
llvm::MapVector< CallStackId, llvm::SmallVector< FrameId > > CallStacks
 
llvm::MapVector< GlobalValue::GUID, IndexedMemProfRecord > Records
 
llvm::MapVector< FrameId, Frame > Frames