aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2010-11-15 23:31:32 +0000
committerTed Kremenek <kremenek@apple.com>2010-11-15 23:31:32 +0000
commitd1ded66c4eda8d170222071dec7ebba78bd86ea4 (patch)
treee50df39ad466bfc1ca970149f4bb6698ea949d04
parent7cd7d1ad33fdf49eef83942e8855fe20d95aa1b9 (diff)
CursorVisitor: cache worklists created for data-recursion to reduce malloc() traffic.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@119290 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--tools/libclang/CIndex.cpp29
1 files changed, 26 insertions, 3 deletions
diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp
index 9962bd2151..b573c067a8 100644
--- a/tools/libclang/CIndex.cpp
+++ b/tools/libclang/CIndex.cpp
@@ -177,6 +177,10 @@ class CursorVisitor : public DeclVisitor<CursorVisitor, bool>,
DeclContext::decl_iterator *DI_current;
DeclContext::decl_iterator DE_current;
+ // Cache of pre-allocated worklists for data-recursion walk of Stmts.
+ llvm::SmallVector<VisitorWorkList*, 5> WorkListFreeList;
+ llvm::SmallVector<VisitorWorkList*, 5> WorkListCache;
+
using DeclVisitor<CursorVisitor, bool>::Visit;
using TypeLocVisitor<CursorVisitor, bool>::Visit;
using StmtVisitor<CursorVisitor, bool>::Visit;
@@ -223,6 +227,14 @@ public:
StmtParent = 0;
}
+ ~CursorVisitor() {
+ // Free the pre-allocated worklists for data-recursion.
+ for (llvm::SmallVectorImpl<VisitorWorkList*>::iterator
+ I = WorkListCache.begin(), E = WorkListCache.end(); I != E; ++I) {
+ delete *I;
+ }
+ }
+
ASTUnit *getASTUnit() const { return TU; }
bool Visit(CXCursor Cursor, bool CheckedRegionOfInterest = false);
@@ -2019,9 +2031,20 @@ bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) {
}
bool CursorVisitor::VisitDataRecursive(Stmt *S) {
- VisitorWorkList WL;
- EnqueueWorkList(WL, S);
- return RunVisitorWorkList(WL);
+ VisitorWorkList *WL = 0;
+ if (!WorkListFreeList.empty()) {
+ WL = WorkListFreeList.back();
+ WL->clear();
+ WorkListFreeList.pop_back();
+ }
+ else {
+ WL = new VisitorWorkList();
+ WorkListCache.push_back(WL);
+ }
+ EnqueueWorkList(*WL, S);
+ bool result = RunVisitorWorkList(*WL);
+ WorkListFreeList.push_back(WL);
+ return result;
}
//===----------------------------------------------------------------------===//