llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang-tools-extra Author: None (PeterChou1) <details> <summary>Changes</summary> This patch adds a short circuit which address performance problem referenced in issue: https://github.com/llvm/llvm-project/issues/96570 >From my local testing it cut the runtime of generating LLVM docs from 10 hours >to 30 mins --- Full diff: https://github.com/llvm/llvm-project/pull/96809.diff 1 Files Affected: - (modified) clang-tools-extra/clang-doc/Mapper.cpp (+19-1) ``````````diff diff --git a/clang-tools-extra/clang-doc/Mapper.cpp b/clang-tools-extra/clang-doc/Mapper.cpp index bb8b7952980ac..b9ca6edd03b8c 100644 --- a/clang-tools-extra/clang-doc/Mapper.cpp +++ b/clang-tools-extra/clang-doc/Mapper.cpp @@ -12,11 +12,17 @@ #include "clang/AST/Comment.h" #include "clang/Index/USRGeneration.h" #include "llvm/ADT/StringExtras.h" -#include "llvm/Support/Error.h" +#include "llvm/Support/Mutex.h" +#include <unordered_set> namespace clang { namespace doc { + +static std::unordered_set<std::string> USRVisited; + +static llvm::sys::Mutex USRVisitedGuard; + void MapASTVisitor::HandleTranslationUnit(ASTContext &Context) { TraverseDecl(Context.getTranslationUnitDecl()); } @@ -34,6 +40,17 @@ template <typename T> bool MapASTVisitor::mapDecl(const T *D) { // If there is an error generating a USR for the decl, skip this decl. if (index::generateUSRForDecl(D, USR)) return true; + + // Prevent Visiting USR twice + { + std::lock_guard<llvm::sys::Mutex> Guard(USRVisitedGuard); + std::string Visited = USR.str().str(); + if (USRVisited.count(Visited)) { + return true; + } + USRVisited.insert(Visited); + } + bool IsFileInRootDir; llvm::SmallString<128> File = getFile(D, D->getASTContext(), CDCtx.SourceRoot, IsFileInRootDir); @@ -41,6 +58,7 @@ template <typename T> bool MapASTVisitor::mapDecl(const T *D) { getLine(D, D->getASTContext()), File, IsFileInRootDir, CDCtx.PublicOnly); + // A null in place of I indicates that the serializer is skipping this decl // for some reason (e.g. we're only reporting public decls). if (I.first) `````````` </details> https://github.com/llvm/llvm-project/pull/96809 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits