59 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9#include "support/MemoryTree.h"10#include "Trace.h"11#include "llvm/ADT/StringRef.h"12#include <cstddef>13 14namespace clang {15namespace clangd {16 17namespace {18 19size_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(Entry.getSecond(), ComponentName, Out);28 ComponentName.resize(OriginalLen + 1);29 }30 ComponentName.resize(OriginalLen);31 Out.record(Total, ComponentName);32 return Total;33}34} // namespace35 36MemoryTree &MemoryTree::createChild(llvm::StringRef Name) {37 auto &Child = Children.try_emplace(Name, DetailAlloc).first->getSecond();38 return Child;39}40 41const llvm::DenseMap<llvm::StringRef, MemoryTree> &42MemoryTree::children() const {43 return Children;44}45 46size_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 53void record(const MemoryTree &MT, std::string RootName,54 const trace::Metric &Out) {55 traverseTree(MT, RootName, Out);56}57} // namespace clangd58} // namespace clang59