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 | |
16 | using namespace llvm; |
17 | using namespace llvm::memprof; |
18 | |
19 | std::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 | |
25 | void 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 | |
54 | void MemProfSummaryBuilder::addRecord(const IndexedMemProfRecord &Record) { |
55 | for (auto &Alloc : Record.AllocSites) |
56 | addRecord(CSId: Alloc.CSId, Info: Alloc.Info); |
57 | } |
58 | |
59 | void MemProfSummaryBuilder::addRecord(const MemProfRecord &Record) { |
60 | for (auto &Alloc : Record.AllocSites) |
61 | addRecord(CSId: computeFullStackId(CallStack: Alloc.CallStack), Info: Alloc.Info); |
62 | } |
63 | |