[PATCH] D92133: [clangd] Cache .clang-tidy files again.

Nathan James via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Nov 26 16:10:46 PST 2020


njames93 added inline comments.


================
Comment at: clang-tools-extra/clangd/TidyProvider.cpp:34
+  llvm::Optional<tidy::ClangTidyOptions>
+  get(const ThreadsafeFS &TFS,
+      std::chrono::steady_clock::time_point FreshTime) const {
----------------
sammccall wrote:
> njames93 wrote:
> > To save a copy, could this not return a const pointer to whats stored in `Value`, nullptr if `Value` is empty.
> > In `DotClangTidyTree`, `OptionStack` could then store pointers instead of values.
> > Considering the size of ClangTidyOptions (312 bytes in x64 with libstdc++) this is definitely a worthwhile saving.
> > 
> > One slight issue is I'm not sure how nicely this approach would play with the mutex.
> You're right, and 312 bytes understates it - it contains strings and stuff that likely allocate on the heap when copied.
> 
> The issue with a pointer is that the underlying value may not live long enough (or to put it another way, the pointer will point to the cache slot which may be concurrently modified).
> 
> I think the fix for that is to store and return a `shared_ptr<const ClangTidyOptions>`. I'll give that a try.
That sounds like a good resolve. I'm guessing in the common case where the config file doesn't change, this would never mutate. 


================
Comment at: clang-tools-extra/clangd/TidyProvider.cpp:84-87
+      // Avoid weird non-substring cases like phantom "." components.
+      // In practice, Component is a substring for all "normal" ancestors.
+      if (I->end() < Parent.begin() && I->end() > Parent.end())
+        continue;
----------------
sammccall wrote:
> njames93 wrote:
> > How does this work with `..` components. Or does clangd ensure all absolute paths have those removed?
> Right, paths are always canonical.
If that's the case, aren't these checks redundant. Maybe put some asserts in so we don't pay for them in release builds


================
Comment at: clang-tools-extra/clangd/TidyProvider.cpp:113
+        OptionStack.push_back(std::move(*Config));
+        if (!OptionStack.back().InheritParentConfig)
+          break;
----------------
sammccall wrote:
> njames93 wrote:
> > This will result in incorrect behaviour if a config specifies `InheritParentConfig` as `false`
> Whoops, thanks!
> (Why is this optional<bool> rather than bool?)
I'm honestly not sure. Personally I don't think it should belong in ClangTidyOptions. Its only used when reading configuration from files(or command line). Maybe I'll rustle something up for that.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D92133



More information about the cfe-commits mailing list