On Fri, Feb 2, 2018 at 9:53 AM, Eric Botcazou <ebotca...@adacore.com> wrote:
>> 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

Some targets need more than Pmode.  ia64/ia64.h has

/* We need 32 bytes, so we can save the sp, ar.rnat, ar.bsp, and ar.pfs of
   the function containing a non-local goto target.  */

#define STACK_SAVEAREA_MODE(LEVEL) \
  ((LEVEL) == SAVE_NONLOCAL ? OImode : Pmode)

> 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:
>          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);
>

My only changes STACK_SAVEAREA_MODE for x86.  Other targets
are unchanged.

-- 
H.J.

Reply via email to