This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: RFA: Fix calculation of size of builtin setjmp buffer
- From: Nicholas Clifton <nickc at redhat dot com>
- To: Eric Botcazou <ebotcazou at adacore dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Fri, 16 May 2014 09:29:47 +0100
- Subject: Re: RFA: Fix calculation of size of builtin setjmp buffer
- Authentication-results: sourceware.org; auth=none
- References: <87wqdzjccp dot fsf at redhat dot com> <3114307 dot feqyCiYPCg at polaris> <53737067 dot 2030608 at redhat dot com> <2347976 dot UgdYmbUUr8 at polaris>
Hi Eric,
OK - here is your version of the patch, extended with a comment which
I think is helpful for other people reading the code, and with the
changes to builtins.c and md.texi removed, since the size of the buffer
is not changing.
Is this version OK to apply ?
Cheers
Nick
gcc/ChangeLog
2014-05-16 Nick Clifton <nickc@redhat.com>
* except.c (init_eh): Correct computation of the size of a builtin
setjmp buffer for when pointers are bigger than words.
Index: gcc/except.c
===================================================================
--- gcc/except.c (revision 210490)
+++ gcc/except.c (working copy)
@@ -286,9 +286,22 @@
tmp = size_int (FIRST_PSEUDO_REGISTER + 2 - 1);
#endif
#else
- /* builtin_setjmp takes a pointer to 5 words. */
- tmp = size_int (5 * BITS_PER_WORD / POINTER_SIZE - 1);
+ /* Compute a minimally sized jump buffer. We need room to store at
+ least 3 pointers - stack pointer, frame pointer and return address.
+ Plus for some targets we need room for an extra pointer - in the
+ case of MIPS this is the global pointer. This makes a total of four
+ pointers, but to be safe we actually allocate room for 5.
+
+ If pointers are smaller than words then we allocate enough room for
+ 5 words, just in case the backend needs this much room. For more
+ discussion on this issue see:
+ http://gcc.gnu.org/ml/gcc-patches/2014-05/msg00313.html. */
+ if (POINTER_SIZE > BITS_PER_WORD)
+ tmp = size_int (5 - 1);
+ else
+ tmp = size_int ((5 * BITS_PER_WORD / POINTER_SIZE) - 1);
#endif
tmp = build_index_type (tmp);
tmp = build_array_type (ptr_type_node, tmp);