summaryrefslogtreecommitdiff
path: root/libiberty/stack-limit.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@gcc.gnu.org>2011-07-22 11:21:49 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2011-07-22 11:21:49 +0200
commit679debeea3913242cd756be013e329ed8ab92af4 (patch)
treef7e71ba3ab802ea17dc5cf71aa00ee0e6f8acc76 /libiberty/stack-limit.c
parent50823f95fd725137d863850e8d5e765ad8c2df67 (diff)
downloadgcc-679debeea3913242cd756be013e329ed8ab92af4.tar.gz
re PR c++/49756 (g++ ICE)
PR c++/49756 * libiberty.h (stack_limit_increase): New prototype. * stack-limit.c: New file. * Makefile.in: Regenerate deps. (CFILES): Add stack-limit.c. (REQUIRED_OFILES): Add ./stack-limit.$(objext). * configure.ac (checkfuncs): Add getrlimit and setrlimit. (AC_CHECK_FUNCS): Likewise. * configure: Regenerated. * config.in: Regenerated. * gcc.c (main): Call stack_limit_increase (64MB). * toplev.c (toplev_main): Likewise. From-SVN: r176622
Diffstat (limited to 'libiberty/stack-limit.c')
-rw-r--r--libiberty/stack-limit.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/libiberty/stack-limit.c b/libiberty/stack-limit.c
new file mode 100644
index 00000000000..28541b1d423
--- /dev/null
+++ b/libiberty/stack-limit.c
@@ -0,0 +1,59 @@
+/* Increase stack size limit if possible.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+This file is part of the libiberty library. This library is free
+software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU CC; see the file COPYING. If not, write to
+the Free Software Foundation, 51 Franklin Street - Fifth Floor,
+Boston, MA 02110-1301, USA.
+
+As a special exception, if you link this library with files
+compiled with a GNU compiler to produce an executable, this does not cause
+the resulting executable to be covered by the GNU General Public License.
+This exception does not however invalidate any other reasons why
+the executable file might be covered by the GNU General Public License. */
+
+/*
+
+@deftypefn Extension void stack_limit_increase (unsigned long @var{pref})
+
+Attempt to increase stack size limit to @var{pref} bytes if possible.
+
+@end deftypefn
+
+*/
+
+#include "config.h"
+
+#ifdef HAVE_SYS_RESOURCE_H
+#include <sys/resource.h>
+#endif
+
+void
+stack_limit_increase (unsigned long pref)
+{
+#if defined(HAVE_SETRLIMIT) && defined(HAVE_GETRLIMIT) \
+ && defined(RLIMIT_STACK) && defined(RLIM_INFINITY)
+ struct rlimit rlim;
+ if (getrlimit (RLIMIT_STACK, &rlim) == 0
+ && rlim.rlim_cur != RLIM_INFINITY
+ && rlim.rlim_cur < pref
+ && (rlim.rlim_max == RLIM_INFINITY || rlim.rlim_cur < rlim.rlim_max))
+ {
+ rlim.rlim_cur = pref;
+ if (rlim.rlim_max != RLIM_INFINITY && rlim.rlim_cur > rlim.rlim_max)
+ rlim.rlim_cur = rlim.rlim_max;
+ setrlimit (RLIMIT_STACK, &rlim);
+ }
+#endif
+}