kadircet added inline comments.

================
Comment at: clang-tools-extra/clangd/support/MemoryTree.h:36
+  /// No copy of the \p Name.
+  MemoryTree *addChild(llvm::StringLiteral Name) { return &createChild(Name); }
+
----------------
sammccall wrote:
> sammccall wrote:
> > actually, why do these return pointers rather than references?
> reading call sites, `child()` might be both more fluent and more accurate 
> than `addChild` - we're not calling it for the side effect and there may or 
> may not be one.
> actually, why do these return pointers rather than references?

It is to make usage with `auto` safer, as it won't capture ref by default and 
make a copy. e.g. `auto child = MT.child(); child.addusage(1)` won't work as 
expected.

I suppose we can make the object non-copyable and prevent such misuse.


================
Comment at: clang-tools-extra/clangd/support/MemoryTree.h:41
+  MemoryTree *addDetail(llvm::StringRef Name) {
+    return Alloc ? &createChild(llvm::StringSaver(*Alloc).save(Name)) : this;
+  }
----------------
sammccall wrote:
> nit: `Name.copy(*Alloc)` is a little more direct
ah thanks, didn't know that!


================
Comment at: clang-tools-extra/clangd/support/MemoryTree.h:31
+  /// detail to root, and doesn't report any descendants.
+  void traverseTree(bool CollapseDetails,
+                    llvm::function_ref<void(size_t /*Size*/,
----------------
sammccall wrote:
> kadircet wrote:
> > sammccall wrote:
> > > sammccall wrote:
> > > > In earlier discussions we talked about avoiding the cost of 
> > > > *assembling* the detailed tree, not just summarizing it at output time.
> > > > 
> > > > This requires `CollapseDetails` to be passed into the profiling 
> > > > function, which in turn suggests making it part of a tree and passing a 
> > > > reference to the tree in. e.g. an API like
> > > > 
> > > > ```
> > > > class MemoryTree {
> > > >   MemoryTree(bool Detailed);
> > > >   MemoryTree* addChild(StringLiteral); // no copy
> > > >   MemoryTree* addDetail(StringRef); // returns `this` unless detailed
> > > >   void addUsage(size_t);
> > > > }
> > > > ```
> > > It's hard to evaluate a tree-traversal API without its usages... how will 
> > > this be used?
> > you can find some in https://reviews.llvm.org/D88414
> I guess you mean D88417?
> 
> This works well when exporting all nodes somewhere keyed by dotted path, but 
> it's pretty awkward+inefficient if you want to - totally hypothetical example 
> here - dump the memory tree as a JSON structure over RPC.
> 
> So I think we need a more flexible API, at which point... maybe we should 
> punt, expose `const DenseMap<StringRef, MemoryTree> &children() const`, and 
> move the traverse implementation to the metrics exporter?
SGTM.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D88411/new/

https://reviews.llvm.org/D88411

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to