> We currently read and write beyond the builtin jmpbuf on ILP32 targets
> where Pmode == DImode and ptr_mode == SImode. Since the builtin jmpbuf
> is an array of 5 pointers, ptr_mode should be used to save and restore
> frame and program pointers. Since x86 only saves stack pointer in
> stack save area, STACK_SAVEAREA_MODE should be ptr_mode, not Pmode.
I think that some targets really need Pmode. And the buffer should be able to
accomodate up to 5 words, see init_eh:
/* 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:
if (POINTER_SIZE > BITS_PER_WORD)
tmp = size_int (5 - 1);
tmp = size_int ((5 * BITS_PER_WORD / POINTER_SIZE) - 1);