summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2015-11-24 07:13:06 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2015-11-24 07:13:06 +0000
commit812465436bb1ac9fe7652d0df01c0b3d77dddb9e (patch)
treecd6161b4e517bb730b2051fea4b0259bf45ea3c6 /clang
parent5d2bffdd575cfeac9ad087f79d71d9e5f782db6c (diff)
downloadbcm5719-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.h37
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;
}
OpenPOWER on IntegriCloud