brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.6 KiB · be4488e Raw
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