1*4d006520SSam McCall //===--- MemoryTree.h - A special tree for components and sizes -----------===//
2*4d006520SSam McCall //
3*4d006520SSam McCall // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*4d006520SSam McCall // See https://llvm.org/LICENSE.txt for license information.
5*4d006520SSam McCall // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*4d006520SSam McCall //
7*4d006520SSam McCall //===----------------------------------------------------------------------===//
8*4d006520SSam McCall
9f9317f7bSKadir Cetinkaya #include "support/MemoryTree.h"
10c9d2876dSKadir Cetinkaya #include "Trace.h"
11f9317f7bSKadir Cetinkaya #include "llvm/ADT/StringRef.h"
12f9317f7bSKadir Cetinkaya #include <cstddef>
13f9317f7bSKadir Cetinkaya
14f9317f7bSKadir Cetinkaya namespace clang {
15f9317f7bSKadir Cetinkaya namespace clangd {
16f9317f7bSKadir Cetinkaya
17c9d2876dSKadir Cetinkaya namespace {
18c9d2876dSKadir Cetinkaya
traverseTree(const MemoryTree & MT,std::string & ComponentName,const trace::Metric & Out)19c9d2876dSKadir Cetinkaya size_t traverseTree(const MemoryTree &MT, std::string &ComponentName,
20c9d2876dSKadir Cetinkaya const trace::Metric &Out) {
21c9d2876dSKadir Cetinkaya size_t OriginalLen = ComponentName.size();
22c9d2876dSKadir Cetinkaya if (!ComponentName.empty())
23c9d2876dSKadir Cetinkaya ComponentName += '.';
24c9d2876dSKadir Cetinkaya size_t Total = MT.self();
25c9d2876dSKadir Cetinkaya for (const auto &Entry : MT.children()) {
26c9d2876dSKadir Cetinkaya ComponentName += Entry.first;
27c9d2876dSKadir Cetinkaya Total += traverseTree(Entry.getSecond(), ComponentName, Out);
28c9d2876dSKadir Cetinkaya ComponentName.resize(OriginalLen + 1);
29c9d2876dSKadir Cetinkaya }
30c9d2876dSKadir Cetinkaya ComponentName.resize(OriginalLen);
31c9d2876dSKadir Cetinkaya Out.record(Total, ComponentName);
32c9d2876dSKadir Cetinkaya return Total;
33c9d2876dSKadir Cetinkaya }
34c9d2876dSKadir Cetinkaya } // namespace
35c9d2876dSKadir Cetinkaya
createChild(llvm::StringRef Name)36f9317f7bSKadir Cetinkaya MemoryTree &MemoryTree::createChild(llvm::StringRef Name) {
37f9317f7bSKadir Cetinkaya auto &Child = Children.try_emplace(Name, DetailAlloc).first->getSecond();
38f9317f7bSKadir Cetinkaya return Child;
39f9317f7bSKadir Cetinkaya }
40f9317f7bSKadir Cetinkaya
41f9317f7bSKadir Cetinkaya const llvm::DenseMap<llvm::StringRef, MemoryTree> &
children() const42f9317f7bSKadir Cetinkaya MemoryTree::children() const {
43f9317f7bSKadir Cetinkaya return Children;
44f9317f7bSKadir Cetinkaya }
45f9317f7bSKadir Cetinkaya
total() const46f9317f7bSKadir Cetinkaya size_t MemoryTree::total() const {
47f9317f7bSKadir Cetinkaya size_t Total = Size;
48f9317f7bSKadir Cetinkaya for (const auto &Entry : Children)
49f9317f7bSKadir Cetinkaya Total += Entry.getSecond().total();
50f9317f7bSKadir Cetinkaya return Total;
51f9317f7bSKadir Cetinkaya }
52c9d2876dSKadir Cetinkaya
record(const MemoryTree & MT,std::string RootName,const trace::Metric & Out)53c9d2876dSKadir Cetinkaya void record(const MemoryTree &MT, std::string RootName,
54c9d2876dSKadir Cetinkaya const trace::Metric &Out) {
55c9d2876dSKadir Cetinkaya traverseTree(MT, RootName, Out);
56c9d2876dSKadir Cetinkaya }
57f9317f7bSKadir Cetinkaya } // namespace clangd
58f9317f7bSKadir Cetinkaya } // namespace clang
59