jansvoboda11 created this revision. jansvoboda11 added a reviewer: benlangmuir. Herald added a subscriber: ributzka. Herald added a project: All. jansvoboda11 requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
This patch makes use of the infrastructure established in D157046 <https://reviews.llvm.org/D157046> to speed up computation of the canonical context hash in the dependency scanner. This is somewhat hot code, since it's ran for all modules in the dependency graph of every TU. I also tried an alternative approach that tried to avoid allocations as much as possible (essentially doing `HashBuilder.add(Arg.toStringRef(ArgVec))`), but that turned out to be slower than approach in this patch. Note that this is not problematic in the same way command-line hashing used to be prior D143027 <https://reviews.llvm.org/D143027>. The lambda is now being called even for constant strings. Depends on D157046 <https://reviews.llvm.org/D157046>. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D157052 Files: clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp Index: clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp =================================================================== --- clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp +++ clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp @@ -269,12 +269,13 @@ HashBuilder.add(serialization::VERSION_MAJOR, serialization::VERSION_MINOR); // Hash the BuildInvocation without any input files. - SmallVector<const char *, 32> Args; - llvm::BumpPtrAllocator Alloc; - llvm::StringSaver Saver(Alloc); - CI.generateCC1CommandLine( - Args, [&](const Twine &Arg) { return Saver.save(Arg).data(); }); - HashBuilder.addRange(Args); + SmallString<0> ArgVec; + ArgVec.reserve(4096); + CI.generateCC1CommandLine([&](const Twine &Arg) { + Arg.toVector(ArgVec); + ArgVec.push_back('\0'); + }); + HashBuilder.add(ArgVec); // Hash the module dependencies. These paths may differ even if the invocation // is identical if they depend on the contents of the files in the TU -- for
Index: clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp =================================================================== --- clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp +++ clang/lib/Tooling/DependencyScanning/ModuleDepCollector.cpp @@ -269,12 +269,13 @@ HashBuilder.add(serialization::VERSION_MAJOR, serialization::VERSION_MINOR); // Hash the BuildInvocation without any input files. - SmallVector<const char *, 32> Args; - llvm::BumpPtrAllocator Alloc; - llvm::StringSaver Saver(Alloc); - CI.generateCC1CommandLine( - Args, [&](const Twine &Arg) { return Saver.save(Arg).data(); }); - HashBuilder.addRange(Args); + SmallString<0> ArgVec; + ArgVec.reserve(4096); + CI.generateCC1CommandLine([&](const Twine &Arg) { + Arg.toVector(ArgVec); + ArgVec.push_back('\0'); + }); + HashBuilder.add(ArgVec); // Hash the module dependencies. These paths may differ even if the invocation // is identical if they depend on the contents of the files in the TU -- for
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits