#include "support/MemoryTree.h" #include "Trace.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringRef.h" #include namespace clang { namespace clangd { namespace { size_t traverseTree(const MemoryTree &MT, std::string &ComponentName, const trace::Metric &Out) { size_t OriginalLen = ComponentName.size(); if (!ComponentName.empty()) ComponentName += '.'; size_t Total = MT.self(); for (const auto &Entry : MT.children()) { ComponentName += Entry.first; Total += traverseTree(Entry.getSecond(), ComponentName, Out); ComponentName.resize(OriginalLen + 1); } ComponentName.resize(OriginalLen); Out.record(Total, ComponentName); return Total; } } // namespace MemoryTree &MemoryTree::createChild(llvm::StringRef Name) { auto &Child = Children.try_emplace(Name, DetailAlloc).first->getSecond(); return Child; } const llvm::DenseMap & MemoryTree::children() const { return Children; } size_t MemoryTree::total() const { size_t Total = Size; for (const auto &Entry : Children) Total += Entry.getSecond().total(); return Total; } void record(const MemoryTree &MT, std::string RootName, const trace::Metric &Out) { traverseTree(MT, RootName, Out); } } // namespace clangd } // namespace clang