]> granicus.if.org Git - clang/commitdiff
Reduce stack usage of TreeTransform.
authorEli Friedman <eli.friedman@gmail.com>
Fri, 6 Sep 2013 01:13:30 +0000 (01:13 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Fri, 6 Sep 2013 01:13:30 +0000 (01:13 +0000)
Without this patch, TreeTransform::TransformExpr uses a ridiculous amount of
stack space (around 5000 bytes).  Preventing inlining brings the stack usage
down to something sane.

On a testcase I have, on my computer, this allows changing -ftemplate-depth
from 210 to around 750 before we crash.  I'm not sure I should commit the
testcase, though: I don't want to cause test failures on platforms with less
stack space available.

<rdar://problem/14098189>.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@190114 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/TreeTransform.h

index 165a1aff3b4457ada200c6b2b0c97278fef46e48..cd0ffdd8e962f158c0972a8fbad62c4ee30812a3 100644 (file)
@@ -598,14 +598,19 @@ public:
   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
                                                 bool IsAddressOfOperand);
 
+// FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
+// amount of stack usage with clang.
 #define STMT(Node, Parent)                        \
+  LLVM_ATTRIBUTE_NOINLINE \
   StmtResult Transform##Node(Node *S);
 #define EXPR(Node, Parent)                        \
+  LLVM_ATTRIBUTE_NOINLINE \
   ExprResult Transform##Node(Node *E);
 #define ABSTRACT_STMT(Stmt)
 #include "clang/AST/StmtNodes.inc"
 
 #define OPENMP_CLAUSE(Name, Class)                        \
+  LLVM_ATTRIBUTE_NOINLINE \
   OMPClause *Transform ## Class(Class *S);
 #include "clang/Basic/OpenMPKinds.def"