]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
except.c (init_eh): Fix computation of builtin setjmp buffer size to allow for target...
authorNick Clifton <nickc@redhat.com>
Mon, 19 May 2014 13:27:25 +0000 (13:27 +0000)
committerNick Clifton <nickc@gcc.gnu.org>
Mon, 19 May 2014 13:27:25 +0000 (13:27 +0000)
* except.c (init_eh): Fix computation of builtin setjmp buffer
size to allow for targets where POINTER_SIZE > BITS_PER_WORD.

From-SVN: r210612

gcc/ChangeLog
gcc/except.c

index c69a30cff516fe0dad401dbafceca6cef79b47e9..4f48f5d3b35c5a387b1426ba55999474e89ec625 100644 (file)
@@ -1,3 +1,8 @@
+2014-05-19  Nick Clifton  <nickc@redhat.com>
+
+       * except.c (init_eh): Fix computation of builtin setjmp buffer
+       size to allow for targets where POINTER_SIZE > BITS_PER_WORD.
+
 2014-05-19  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/61184
index 49ebaae9dd6b23e5758969fef1f749cf93b3fee4..82985938b665857c377ff2721f8186001a8d6379 100644 (file)
@@ -286,9 +286,22 @@ init_eh (void)
       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);
       f_jbuf = build_decl (BUILTINS_LOCATION,