[clang-tools-extra] [clang-doc] Improve performance by adding a short circuit (PR #96809)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Jun 26 11:39:16 PDT 2024
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
More information about the cfe-commits
mailing list