diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-11-24 07:13:06 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2015-11-24 07:13:06 +0000 |
| commit | 812465436bb1ac9fe7652d0df01c0b3d77dddb9e (patch) | |
| tree | cd6161b4e517bb730b2051fea4b0259bf45ea3c6 /clang | |
| parent | 5d2bffdd575cfeac9ad087f79d71d9e5f782db6c (diff) | |
| download | bcm5719-llvm-812465436bb1ac9fe7652d0df01c0b3d77dddb9e.tar.gz bcm5719-llvm-812465436bb1ac9fe7652d0df01c0b3d77dddb9e.zip | |
Reduce the stack usage per recursive step when RecursiveASTVisitor cannot perform data recursion.
llvm-svn: 253958
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/include/clang/AST/RecursiveASTVisitor.h | 37 |
1 files changed, 16 insertions, 21 deletions
diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h b/clang/include/clang/AST/RecursiveASTVisitor.h index f029c78bea9..4da2f67493f 100644 --- a/clang/include/clang/AST/RecursiveASTVisitor.h +++ b/clang/include/clang/AST/RecursiveASTVisitor.h @@ -471,28 +471,10 @@ private: /// \brief Process clauses with list of variables. template <typename T> bool VisitOMPClauseList(T *Node); - bool dataTraverse(Stmt *S); bool dataTraverseNode(Stmt *S, DataRecursionQueue *Queue); }; template <typename Derived> -bool RecursiveASTVisitor<Derived>::dataTraverse(Stmt *S) { - SmallVector<Stmt*, 16> Queue; - Queue.push_back(S); - - while (!Queue.empty()) { - Stmt *CurrS = Queue.pop_back_val(); - - size_t N = Queue.size(); - TRY_TO(dataTraverseNode(CurrS, &Queue)); - // Process new children in the order they were added. - std::reverse(Queue.begin() + N, Queue.end()); - } - - return true; -} - -template <typename Derived> bool RecursiveASTVisitor<Derived>::dataTraverseNode(Stmt *S, DataRecursionQueue *Queue) { #define DISPATCH_STMT(NAME, CLASS, VAR) \ @@ -561,10 +543,23 @@ bool RecursiveASTVisitor<Derived>::TraverseStmt(Stmt *S, &RecursiveASTVisitor::TraverseStmt>::value) return dataTraverseNode(S, nullptr); - if (!Queue) - return dataTraverse(S); + if (Queue) { + Queue->push_back(S); + return true; + } + + SmallVector<Stmt *, 8> LocalQueue; + LocalQueue.push_back(S); + + while (!LocalQueue.empty()) { + Stmt *CurrS = LocalQueue.pop_back_val(); + + size_t N = LocalQueue.size(); + TRY_TO(dataTraverseNode(CurrS, &LocalQueue)); + // Process new children in the order they were added. + std::reverse(LocalQueue.begin() + N, LocalQueue.end()); + } - Queue->push_back(S); return true; } |

