r253958 - Reduce the stack usage per recursive step when RecursiveASTVisitor cannot perform data recursion.

Alexey Samsonov via cfe-commits cfe-commits at lists.llvm.org
Tue Nov 24 17:15:02 PST 2015


Unfortunately, that change breaks the Clang compilation, see r254041 review
thread.

On Tue, Nov 24, 2015 at 3:54 PM, Richard Smith <richard at metafoo.co.uk>
wrote:

> On Tue, Nov 24, 2015 at 1:16 PM, Alexey Samsonov <vonosmas at gmail.com>
> wrote:
>
>> Looks like Clang::Index/index-many-call-ops.cpp still uses too much stack
>> in ASan mode:
>>
>> http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap/builds/10177/steps/check-clang%20asan/logs/stdio
>>
>> ASan increases the stack usage, so do you think there's more to fix here,
>> or we should just disable the test under ASan?
>>
>
> I think this should work even under ASan conditions; fixed in r254041.
>
>
>> On Mon, Nov 23, 2015 at 11:13 PM, Richard Smith via cfe-commits <
>> cfe-commits at lists.llvm.org> wrote:
>>
>>> Author: rsmith
>>> Date: Tue Nov 24 01:13:06 2015
>>> New Revision: 253958
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=253958&view=rev
>>> Log:
>>> Reduce the stack usage per recursive step when RecursiveASTVisitor
>>> cannot perform data recursion.
>>>
>>> Modified:
>>>     cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
>>>
>>> Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=253958&r1=253957&r2=253958&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original)
>>> +++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Tue Nov 24
>>> 01:13:06 2015
>>> @@ -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>::Trave
>>>
>>>  &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;
>>>  }
>>>
>>>
>>>
>>> _______________________________________________
>>> cfe-commits mailing list
>>> cfe-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>
>>
>>
>>
>> --
>> Alexey Samsonov
>> vonosmas at gmail.com
>>
>
>


-- 
Alexey Samsonov
vonosmas at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20151124/dc97cc88/attachment.html>


More information about the cfe-commits mailing list