//=-- MemProfSummaryBuilder.cpp - MemProf summary building ---------------=// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file contains MemProf summary builder. // //===----------------------------------------------------------------------===// #include "llvm/ProfileData/MemProfSummaryBuilder.h" #include "llvm/ProfileData/MemProfCommon.h" using namespace llvm; using namespace llvm::memprof; std::unique_ptr MemProfSummaryBuilder::getSummary() { return std::make_unique(NumContexts, NumColdContexts, NumHotContexts, MaxColdTotalSize, MaxWarmTotalSize, MaxHotTotalSize); } void MemProfSummaryBuilder::addRecord(uint64_t CSId, const PortableMemInfoBlock &Info) { auto I = Contexts.insert(CSId); if (!I.second) return; NumContexts++; auto AllocType = getAllocType(Info.getTotalLifetimeAccessDensity(), Info.getAllocCount(), Info.getTotalLifetime()); auto TotalSize = Info.getTotalSize(); switch (AllocType) { case AllocationType::Cold: NumColdContexts++; if (TotalSize > MaxColdTotalSize) MaxColdTotalSize = TotalSize; break; case AllocationType::NotCold: if (TotalSize > MaxWarmTotalSize) MaxWarmTotalSize = TotalSize; break; case AllocationType::Hot: NumHotContexts++; if (TotalSize > MaxHotTotalSize) MaxHotTotalSize = TotalSize; break; default: assert(false); } } void MemProfSummaryBuilder::addRecord(const IndexedMemProfRecord &Record) { for (auto &Alloc : Record.AllocSites) addRecord(Alloc.CSId, Alloc.Info); } void MemProfSummaryBuilder::addRecord(const MemProfRecord &Record) { for (auto &Alloc : Record.AllocSites) addRecord(computeFullStackId(Alloc.CallStack), Alloc.Info); }