1 | //===--- MemoryTree.h - A special tree for components and sizes -----------===// |
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 | #include "support/MemoryTree.h" |
10 | #include "Trace.h" |
11 | #include "llvm/ADT/StringRef.h" |
12 | #include <cstddef> |
13 | |
14 | namespace clang { |
15 | namespace clangd { |
16 | |
17 | namespace { |
18 | |
19 | size_t traverseTree(const MemoryTree &MT, std::string &ComponentName, |
20 | const trace::Metric &Out) { |
21 | size_t OriginalLen = ComponentName.size(); |
22 | if (!ComponentName.empty()) |
23 | ComponentName += '.'; |
24 | size_t Total = MT.self(); |
25 | for (const auto &Entry : MT.children()) { |
26 | ComponentName += Entry.first; |
27 | Total += traverseTree(MT: Entry.getSecond(), ComponentName, Out); |
28 | ComponentName.resize(n: OriginalLen + 1); |
29 | } |
30 | ComponentName.resize(n: OriginalLen); |
31 | Out.record(Value: Total, Label: ComponentName); |
32 | return Total; |
33 | } |
34 | } // namespace |
35 | |
36 | MemoryTree &MemoryTree::createChild(llvm::StringRef Name) { |
37 | auto &Child = Children.try_emplace(Key: Name, Args&: DetailAlloc).first->getSecond(); |
38 | return Child; |
39 | } |
40 | |
41 | const llvm::DenseMap<llvm::StringRef, MemoryTree> & |
42 | MemoryTree::children() const { |
43 | return Children; |
44 | } |
45 | |
46 | size_t MemoryTree::total() const { |
47 | size_t Total = Size; |
48 | for (const auto &Entry : Children) |
49 | Total += Entry.getSecond().total(); |
50 | return Total; |
51 | } |
52 | |
53 | void record(const MemoryTree &MT, std::string RootName, |
54 | const trace::Metric &Out) { |
55 | traverseTree(MT, ComponentName&: RootName, Out); |
56 | } |
57 | } // namespace clangd |
58 | } // namespace clang |
59 | |