1//=-- MemProfSummaryBuilder.cpp - MemProf summary building ---------------=//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file contains MemProf summary builder.
10//
11//===----------------------------------------------------------------------===//
12
13#include "llvm/ProfileData/MemProfSummaryBuilder.h"
14#include "llvm/ProfileData/MemProfCommon.h"
15
16using namespace llvm;
17using namespace llvm::memprof;
18
19std::unique_ptr<MemProfSummary> MemProfSummaryBuilder::getSummary() {
20 return std::make_unique<MemProfSummary>(args&: NumContexts, args&: NumColdContexts,
21 args&: NumHotContexts, args&: MaxColdTotalSize,
22 args&: MaxWarmTotalSize, args&: MaxHotTotalSize);
23}
24
25void MemProfSummaryBuilder::addRecord(uint64_t CSId,
26 const PortableMemInfoBlock &Info) {
27 auto I = Contexts.insert(V: CSId);
28 if (!I.second)
29 return;
30 NumContexts++;
31 auto AllocType = getAllocType(TotalLifetimeAccessDensity: Info.getTotalLifetimeAccessDensity(),
32 AllocCount: Info.getAllocCount(), TotalLifetime: Info.getTotalLifetime());
33 auto TotalSize = Info.getTotalSize();
34 switch (AllocType) {
35 case AllocationType::Cold:
36 NumColdContexts++;
37 if (TotalSize > MaxColdTotalSize)
38 MaxColdTotalSize = TotalSize;
39 break;
40 case AllocationType::NotCold:
41 if (TotalSize > MaxWarmTotalSize)
42 MaxWarmTotalSize = TotalSize;
43 break;
44 case AllocationType::Hot:
45 NumHotContexts++;
46 if (TotalSize > MaxHotTotalSize)
47 MaxHotTotalSize = TotalSize;
48 break;
49 default:
50 assert(false);
51 }
52}
53
54void MemProfSummaryBuilder::addRecord(const IndexedMemProfRecord &Record) {
55 for (auto &Alloc : Record.AllocSites)
56 addRecord(CSId: Alloc.CSId, Info: Alloc.Info);
57}
58
59void MemProfSummaryBuilder::addRecord(const MemProfRecord &Record) {
60 for (auto &Alloc : Record.AllocSites)
61 addRecord(CSId: computeFullStackId(CallStack: Alloc.CallStack), Info: Alloc.Info);
62}
63