summaryrefslogtreecommitdiff
path: root/gcc/except.c
diff options
context:
space:
mode:
authornickc <nickc@138bc75d-0d04-0410-961f-82ee72b054a4>2014-05-19 13:27:25 +0000
committernickc <nickc@138bc75d-0d04-0410-961f-82ee72b054a4>2014-05-19 13:27:25 +0000
commit755fa8c261c618500e10f735bbfd449f5cd7f722 (patch)
treed9e926e92becdcc52937f952332b22bbeb3bde5a /gcc/except.c
parent42081cd697956537fcf0e39387030ecfe0bdc8ba (diff)
downloadgcc-755fa8c261c618500e10f735bbfd449f5cd7f722.tar.gz
* except.c (init_eh): Fix computation of builtin setjmp buffer
size to allow for targets where POINTER_SIZE > BITS_PER_WORD. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@210612 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/except.c')
-rw-r--r--gcc/except.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/gcc/except.c b/gcc/except.c
index 49ebaae9dd6..82985938b66 100644
--- a/gcc/except.c
+++ b/gcc/except.c
@@ -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,