diff options
author | Ted Kremenek <kremenek@apple.com> | 2010-11-15 23:31:32 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2010-11-15 23:31:32 +0000 |
commit | a4c27ec73bc51ad0d614ad5ec82208f18c334511 (patch) | |
tree | 2410e5b9158cce5f32310c43a6061b170d164bfa /clang/tools/libclang/CIndex.cpp | |
parent | 8d69a2160e48b73a4515c9401e67971fb8c14e07 (diff) | |
download | bcm5719-llvm-a4c27ec73bc51ad0d614ad5ec82208f18c334511.tar.gz bcm5719-llvm-a4c27ec73bc51ad0d614ad5ec82208f18c334511.zip |
CursorVisitor: cache worklists created for data-recursion to reduce malloc() traffic.
llvm-svn: 119290
Diffstat (limited to 'clang/tools/libclang/CIndex.cpp')
-rw-r--r-- | clang/tools/libclang/CIndex.cpp | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index 9962bd21517..b573c067a80 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/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; } //===----------------------------------------------------------------------===// |