Convert STARTING_FRAME_OFFSET to a hook
authorRichard Sandiford <richard.sandiford@linaro.org>
Mon, 23 Oct 2017 09:48:31 +0000 (09:48 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Mon, 23 Oct 2017 09:48:31 +0000 (09:48 +0000)
I took the documentation of the FRAME_GROWS_DOWNWARD behaviour from the
version that was in most header files, since the one in the manual seemed
less clear.

The patch deliberately keeps FIRST_PARM_OFFSET(FNDECL) in
microblaze_starting_frame_offset; this seems to be a port-local
convention and takes advantage of the fact that FIRST_PARM_OFFSET
doesn't read FNDECL.

2017-10-23  Richard Sandiford  <richard.sandiford@linaro.org>

gcc/
* target.def (starting_frame_offset): New hook.
* doc/tm.texi (STARTING_FRAME_OFFSET): Remove in favor of...
(TARGET_STARTING_FRAME_OFFSET): ...this new hook.
* doc/tm.texi.in: Regenerate.
* hooks.h (hook_hwi_void_0): Declare.
* hooks.c (hook_hwi_void_0): New function.
* doc/rtl.texi: Refer to TARGET_STARTING_FRAME_OFFSET instead of
STARTING_FRAME_OFFSET.
* builtins.c (expand_builtin_setjmp_receiver): Likewise.
* reload1.c (reload): Likewise.
* cfgexpand.c (expand_used_vars): Use targetm.starting_frame_offset
instead of STARTING_FRAME_OFFSET.
* function.c (try_fit_stack_local): Likewise.
(assign_stack_local_1): Likewise
(instantiate_virtual_regs): Likewise.
* rtlanal.c (rtx_addr_can_trap_p_1): Likewise.
* config/avr/avr.md (nonlocal_goto_receiver): Likewise.
* config/aarch64/aarch64.h (STARTING_FRAME_OFFSET): Delete.
* config/alpha/alpha.h (STARTING_FRAME_OFFSET): Likewise.
* config/arc/arc.h (STARTING_FRAME_OFFSET): Likewise.
* config/arm/arm.h (STARTING_FRAME_OFFSET): Likewise.
* config/bfin/bfin.h (STARTING_FRAME_OFFSET): Likewise.
* config/c6x/c6x.h (STARTING_FRAME_OFFSET): Likewise.
* config/cr16/cr16.h (STARTING_FRAME_OFFSET): Likewise.
* config/cris/cris.h (STARTING_FRAME_OFFSET): Likewise.
* config/fr30/fr30.h (STARTING_FRAME_OFFSET): Likewise.
* config/frv/frv.h (STARTING_FRAME_OFFSET): Likewise.
* config/ft32/ft32.h (STARTING_FRAME_OFFSET): Likewise.
* config/h8300/h8300.h (STARTING_FRAME_OFFSET): Likewise.
* config/i386/i386.h (STARTING_FRAME_OFFSET): Likewise.
* config/ia64/ia64.h (STARTING_FRAME_OFFSET): Likewise.
* config/m32c/m32c.h (STARTING_FRAME_OFFSET): Likewise.
* config/m68k/m68k.h (STARTING_FRAME_OFFSET): Likewise.
* config/mcore/mcore.h (STARTING_FRAME_OFFSET): Likewise.
* config/mn10300/mn10300.h (STARTING_FRAME_OFFSET): Likewise.
* config/moxie/moxie.h (STARTING_FRAME_OFFSET): Likewise.
* config/msp430/msp430.h (STARTING_FRAME_OFFSET): Likewise.
* config/nds32/nds32.h (STARTING_FRAME_OFFSET): Likewise.
* config/nios2/nios2.h (STARTING_FRAME_OFFSET): Likewise.
* config/nvptx/nvptx.h (STARTING_FRAME_OFFSET): Likewise.
* config/pdp11/pdp11.h (STARTING_FRAME_OFFSET): Likewise.
* config/riscv/riscv.h (STARTING_FRAME_OFFSET): Likewise.
* config/rl78/rl78.h (STARTING_FRAME_OFFSET): Likewise.
* config/rx/rx.h (STARTING_FRAME_OFFSET): Likewise.
* config/s390/s390.h (STARTING_FRAME_OFFSET): Likewise.
* config/sh/sh.h (STARTING_FRAME_OFFSET): Likewise.
* config/sparc/sparc.c (sparc_compute_frame_size): Likewise.
* config/sparc/sparc.h (STARTING_FRAME_OFFSET): Likewise.
* config/spu/spu.h (STARTING_FRAME_OFFSET): Likewise.
* config/stormy16/stormy16.h (STARTING_FRAME_OFFSET): Likewise.
* config/tilegx/tilegx.h (STARTING_FRAME_OFFSET): Likewise.
* config/tilepro/tilepro.h (STARTING_FRAME_OFFSET): Likewise.
* config/v850/v850.h (STARTING_FRAME_OFFSET): Likewise.
* config/visium/visium.h (STARTING_FRAME_OFFSET): Likewise.
* config/avr/avr.h (STARTING_FRAME_OFFSET): Likewise.
* config/avr/avr-protos.h (avr_starting_frame_offset): Likewise.
* config/avr/avr.c (avr_starting_frame_offset): Make static and
return a HOST_WIDE_INT.
(avr_builtin_setjmp_frame_value): Use it instead of
STARTING_FRAME_OFFSET.
(TARGET_STARTING_FRAME_OFFSET): Redefine.
* config/epiphany/epiphany.h (STARTING_FRAME_OFFSET): Delete.
* config/epiphany/epiphany.c (epiphany_starting_frame_offset):
New function.
(TARGET_STARTING_FRAME_OFFSET): Redefine.
* config/iq2000/iq2000.h (STARTING_FRAME_OFFSET): Delete.
* config/iq2000/iq2000.c (iq2000_starting_frame_offset): New function.
(TARGET_CONSTANT_ALIGNMENT): Redefine.
* config/lm32/lm32.h (STARTING_FRAME_OFFSET): Delete.
* config/lm32/lm32.c (lm32_starting_frame_offset): New function.
(TARGET_STARTING_FRAME_OFFSET): Redefine.
* config/m32r/m32r.h (STARTING_FRAME_OFFSET): Delete.
* config/m32r/m32r.c (m32r_starting_frame_offset): New function.
(TARGET_STARTING_FRAME_OFFSET): Redefine.
* config/microblaze/microblaze.h (STARTING_FRAME_OFFSET): Delete.
* config/microblaze/microblaze.c (microblaze_starting_frame_offset):
New function.
(TARGET_STARTING_FRAME_OFFSET): Redefine.
* config/mips/mips.h (STARTING_FRAME_OFFSET): Delete.
* config/mips/mips.c (mips_compute_frame_info): Refer to
TARGET_STARTING_FRAME_OFFSET instead of STARTING_FRAME_OFFSET.
(mips_starting_frame_offset): New function.
(TARGET_STARTING_FRAME_OFFSET): Redefine.
* config/mmix/mmix.h (STARTING_FRAME_OFFSET): Delete.
* config/mmix/mmix-protos.h (mmix_starting_frame_offset): Delete.
* config/mmix/mmix.c (mmix_starting_frame_offset): Make static
and return a HOST_WIDE_INT.
(TARGET_STARTING_FRAME_OFFSET): Redefine.
(mmix_initial_elimination_offset): Refer to
TARGET_STARTING_FRAME_OFFSET instead of STARTING_FRAME_OFFSET.
* config/pa/pa.h (STARTING_FRAME_OFFSET): Delete.
* config/pa/pa.c (pa_starting_frame_offset): New function.
(pa_compute_frame_size): Use it instead of STARTING_FRAME_OFFSET.
(pa_expand_prologue): Likewise.
(TARGET_STARTING_FRAME_OFFSET): Redefine.
* config/powerpcspe/aix.h (STARTING_FRAME_OFFSET): Split out
!FRAME_GROWS_DOWNWARD handling to...
(RS6000_STARTING_FRAME_OFFSET): ...this new macro.
* config/powerpcspe/darwin.h (STARTING_FRAME_OFFSET): Split out
!FRAME_GROWS_DOWNWARD handling to...
(RS6000_STARTING_FRAME_OFFSET): ...this new macro.
* config/powerpcspe/powerpcspe.h (STARTING_FRAME_OFFSET): Split out
!FRAME_GROWS_DOWNWARD handling to...
(RS6000_STARTING_FRAME_OFFSET): ...this new macro.
* config/powerpcspe/powerpcspe.c (TARGET_STARTING_FRAME_OFFSET):
Redefine.
(rs6000_starting_frame_offset): New function.
* config/rs6000/aix.h (STARTING_FRAME_OFFSET): Split out
!FRAME_GROWS_DOWNWARD handling to...
(RS6000_STARTING_FRAME_OFFSET): ...this new macro.
* config/rs6000/darwin.h (STARTING_FRAME_OFFSET): Split out
!FRAME_GROWS_DOWNWARD handling to...
(RS6000_STARTING_FRAME_OFFSET): ...this new macro.
* config/rs6000/rs6000.h (STARTING_FRAME_OFFSET): Split out
!FRAME_GROWS_DOWNWARD handling to...
(RS6000_STARTING_FRAME_OFFSET): ...this new macro.
* config/rs6000/rs6000.c (TARGET_STARTING_FRAME_OFFSET): Refine.
(rs6000_starting_frame_offset): New function.
* config/vax/elf.h (STARTING_FRAME_OFFSET): Delete.
* config/vax/vax.h (STARTING_FRAME_OFFSET): Delete.
* config/vax/vax.c (vax_starting_frame_offset): New function.
(vax_expand_prologue): Use it instead of STARTING_FRAME_OFFSET.
(TARGET_STARTING_FRAME_OFFSET): Redefine.
* config/xtensa/xtensa.h (STARTING_FRAME_OFFSET): Delete.
* config/xtensa/xtensa.c (xtensa_starting_frame_offset): New function.
(TARGET_STARTING_FRAME_OFFSET): Redefine.
* system.h (STARTING_FRAME_OFFSET): Poison.

From-SVN: r254003

84 files changed:
gcc/ChangeLog
gcc/builtins.c
gcc/cfgexpand.c
gcc/config/aarch64/aarch64.h
gcc/config/alpha/alpha.h
gcc/config/arc/arc.h
gcc/config/arm/arm.h
gcc/config/avr/avr-protos.h
gcc/config/avr/avr.c
gcc/config/avr/avr.h
gcc/config/avr/avr.md
gcc/config/bfin/bfin.h
gcc/config/c6x/c6x.h
gcc/config/cr16/cr16.h
gcc/config/cris/cris.h
gcc/config/epiphany/epiphany.c
gcc/config/epiphany/epiphany.h
gcc/config/fr30/fr30.h
gcc/config/frv/frv.h
gcc/config/ft32/ft32.h
gcc/config/h8300/h8300.h
gcc/config/i386/i386.h
gcc/config/ia64/ia64.h
gcc/config/iq2000/iq2000.c
gcc/config/iq2000/iq2000.h
gcc/config/lm32/lm32.c
gcc/config/lm32/lm32.h
gcc/config/m32c/m32c.h
gcc/config/m32r/m32r.c
gcc/config/m32r/m32r.h
gcc/config/m68k/m68k.h
gcc/config/mcore/mcore.h
gcc/config/microblaze/microblaze.c
gcc/config/microblaze/microblaze.h
gcc/config/mips/mips.c
gcc/config/mips/mips.h
gcc/config/mmix/mmix-protos.h
gcc/config/mmix/mmix.c
gcc/config/mmix/mmix.h
gcc/config/mn10300/mn10300.h
gcc/config/moxie/moxie.h
gcc/config/msp430/msp430.h
gcc/config/nds32/nds32.h
gcc/config/nios2/nios2.h
gcc/config/nvptx/nvptx.h
gcc/config/pa/pa.c
gcc/config/pa/pa.h
gcc/config/pdp11/pdp11.h
gcc/config/powerpcspe/aix.h
gcc/config/powerpcspe/darwin.h
gcc/config/powerpcspe/powerpcspe.c
gcc/config/powerpcspe/powerpcspe.h
gcc/config/riscv/riscv.h
gcc/config/rl78/rl78.h
gcc/config/rs6000/aix.h
gcc/config/rs6000/darwin.h
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.h
gcc/config/rx/rx.h
gcc/config/s390/s390.h
gcc/config/sh/sh.h
gcc/config/sparc/sparc.c
gcc/config/sparc/sparc.h
gcc/config/spu/spu.h
gcc/config/stormy16/stormy16.h
gcc/config/tilegx/tilegx.h
gcc/config/tilepro/tilepro.h
gcc/config/v850/v850.h
gcc/config/vax/elf.h
gcc/config/vax/vax.c
gcc/config/vax/vax.h
gcc/config/visium/visium.h
gcc/config/xtensa/xtensa.c
gcc/config/xtensa/xtensa.h
gcc/doc/rtl.texi
gcc/doc/tm.texi
gcc/doc/tm.texi.in
gcc/function.c
gcc/hooks.c
gcc/hooks.h
gcc/reload1.c
gcc/rtlanal.c
gcc/system.h
gcc/target.def

index 3fc03ad08cd3a86281fe12d2bf8a89d1d154537c..ebda3cd5500f71d009452524826cf69d7c6236db 100644 (file)
@@ -1,3 +1,133 @@
+2017-10-23  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       * target.def (starting_frame_offset): New hook.
+       * doc/tm.texi (STARTING_FRAME_OFFSET): Remove in favor of...
+       (TARGET_STARTING_FRAME_OFFSET): ...this new hook.
+       * doc/tm.texi.in: Regenerate.
+       * hooks.h (hook_hwi_void_0): Declare.
+       * hooks.c (hook_hwi_void_0): New function.
+       * doc/rtl.texi: Refer to TARGET_STARTING_FRAME_OFFSET instead of
+       STARTING_FRAME_OFFSET.
+       * builtins.c (expand_builtin_setjmp_receiver): Likewise.
+       * reload1.c (reload): Likewise.
+       * cfgexpand.c (expand_used_vars): Use targetm.starting_frame_offset
+       instead of STARTING_FRAME_OFFSET.
+       * function.c (try_fit_stack_local): Likewise.
+       (assign_stack_local_1): Likewise
+       (instantiate_virtual_regs): Likewise.
+       * rtlanal.c (rtx_addr_can_trap_p_1): Likewise.
+       * config/avr/avr.md (nonlocal_goto_receiver): Likewise.
+       * config/aarch64/aarch64.h (STARTING_FRAME_OFFSET): Delete.
+       * config/alpha/alpha.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/arc/arc.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/arm/arm.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/bfin/bfin.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/c6x/c6x.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/cr16/cr16.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/cris/cris.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/fr30/fr30.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/frv/frv.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/ft32/ft32.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/h8300/h8300.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/i386/i386.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/ia64/ia64.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/m32c/m32c.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/m68k/m68k.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/mcore/mcore.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/mn10300/mn10300.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/moxie/moxie.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/msp430/msp430.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/nds32/nds32.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/nios2/nios2.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/nvptx/nvptx.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/pdp11/pdp11.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/riscv/riscv.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/rl78/rl78.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/rx/rx.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/s390/s390.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/sh/sh.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/sparc/sparc.c (sparc_compute_frame_size): Likewise.
+       * config/sparc/sparc.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/spu/spu.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/stormy16/stormy16.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/tilegx/tilegx.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/tilepro/tilepro.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/v850/v850.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/visium/visium.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/avr/avr.h (STARTING_FRAME_OFFSET): Likewise.
+       * config/avr/avr-protos.h (avr_starting_frame_offset): Likewise.
+       * config/avr/avr.c (avr_starting_frame_offset): Make static and
+       return a HOST_WIDE_INT.
+       (avr_builtin_setjmp_frame_value): Use it instead of
+       STARTING_FRAME_OFFSET.
+       (TARGET_STARTING_FRAME_OFFSET): Redefine.
+       * config/epiphany/epiphany.h (STARTING_FRAME_OFFSET): Delete.
+       * config/epiphany/epiphany.c (epiphany_starting_frame_offset):
+       New function.
+       (TARGET_STARTING_FRAME_OFFSET): Redefine.
+       * config/iq2000/iq2000.h (STARTING_FRAME_OFFSET): Delete.
+       * config/iq2000/iq2000.c (iq2000_starting_frame_offset): New function.
+       (TARGET_CONSTANT_ALIGNMENT): Redefine.
+       * config/lm32/lm32.h (STARTING_FRAME_OFFSET): Delete.
+       * config/lm32/lm32.c (lm32_starting_frame_offset): New function.
+       (TARGET_STARTING_FRAME_OFFSET): Redefine.
+       * config/m32r/m32r.h (STARTING_FRAME_OFFSET): Delete.
+       * config/m32r/m32r.c (m32r_starting_frame_offset): New function.
+       (TARGET_STARTING_FRAME_OFFSET): Redefine.
+       * config/microblaze/microblaze.h (STARTING_FRAME_OFFSET): Delete.
+       * config/microblaze/microblaze.c (microblaze_starting_frame_offset):
+       New function.
+       (TARGET_STARTING_FRAME_OFFSET): Redefine.
+       * config/mips/mips.h (STARTING_FRAME_OFFSET): Delete.
+       * config/mips/mips.c (mips_compute_frame_info): Refer to
+       TARGET_STARTING_FRAME_OFFSET instead of STARTING_FRAME_OFFSET.
+       (mips_starting_frame_offset): New function.
+       (TARGET_STARTING_FRAME_OFFSET): Redefine.
+       * config/mmix/mmix.h (STARTING_FRAME_OFFSET): Delete.
+       * config/mmix/mmix-protos.h (mmix_starting_frame_offset): Delete.
+       * config/mmix/mmix.c (mmix_starting_frame_offset): Make static
+       and return a HOST_WIDE_INT.
+       (TARGET_STARTING_FRAME_OFFSET): Redefine.
+       (mmix_initial_elimination_offset): Refer to
+       TARGET_STARTING_FRAME_OFFSET instead of STARTING_FRAME_OFFSET.
+       * config/pa/pa.h (STARTING_FRAME_OFFSET): Delete.
+       * config/pa/pa.c (pa_starting_frame_offset): New function.
+       (pa_compute_frame_size): Use it instead of STARTING_FRAME_OFFSET.
+       (pa_expand_prologue): Likewise.
+       (TARGET_STARTING_FRAME_OFFSET): Redefine.
+       * config/powerpcspe/aix.h (STARTING_FRAME_OFFSET): Split out
+       !FRAME_GROWS_DOWNWARD handling to...
+       (RS6000_STARTING_FRAME_OFFSET): ...this new macro.
+       * config/powerpcspe/darwin.h (STARTING_FRAME_OFFSET): Split out
+       !FRAME_GROWS_DOWNWARD handling to...
+       (RS6000_STARTING_FRAME_OFFSET): ...this new macro.
+       * config/powerpcspe/powerpcspe.h (STARTING_FRAME_OFFSET): Split out
+       !FRAME_GROWS_DOWNWARD handling to...
+       (RS6000_STARTING_FRAME_OFFSET): ...this new macro.
+       * config/powerpcspe/powerpcspe.c (TARGET_STARTING_FRAME_OFFSET):
+       Redefine.
+       (rs6000_starting_frame_offset): New function.
+       * config/rs6000/aix.h (STARTING_FRAME_OFFSET): Split out
+       !FRAME_GROWS_DOWNWARD handling to...
+       (RS6000_STARTING_FRAME_OFFSET): ...this new macro.
+       * config/rs6000/darwin.h (STARTING_FRAME_OFFSET): Split out
+       !FRAME_GROWS_DOWNWARD handling to...
+       (RS6000_STARTING_FRAME_OFFSET): ...this new macro.
+       * config/rs6000/rs6000.h (STARTING_FRAME_OFFSET): Split out
+       !FRAME_GROWS_DOWNWARD handling to...
+       (RS6000_STARTING_FRAME_OFFSET): ...this new macro.
+       * config/rs6000/rs6000.c (TARGET_STARTING_FRAME_OFFSET): Refine.
+       (rs6000_starting_frame_offset): New function.
+       * config/vax/elf.h (STARTING_FRAME_OFFSET): Delete.
+       * config/vax/vax.h (STARTING_FRAME_OFFSET): Delete.
+       * config/vax/vax.c (vax_starting_frame_offset): New function.
+       (vax_expand_prologue): Use it instead of STARTING_FRAME_OFFSET.
+       (TARGET_STARTING_FRAME_OFFSET): Redefine.
+       * config/xtensa/xtensa.h (STARTING_FRAME_OFFSET): Delete.
+       * config/xtensa/xtensa.c (xtensa_starting_frame_offset): New function.
+       (TARGET_STARTING_FRAME_OFFSET): Redefine.
+       * system.h (STARTING_FRAME_OFFSET): Poison.
+
 2017-10-23  Richard Sandiford  <richard.sandiford@linaro.org>
 
        * tree-vect-loop.c (vect_create_epilog_for_reduction): Use
index d3498bb16c47995e68a0d6406ecf6f3d227ce74e..29778fc50c34f9ccff4b0283321e3b671706b94e 100644 (file)
@@ -900,7 +900,7 @@ expand_builtin_setjmp_receiver (rtx receiver_label)
         to the underlying register (fp in this case) that makes
         the original assignment true.
         So the following insn will actually be decrementing fp by
-        STARTING_FRAME_OFFSET.  */
+        TARGET_STARTING_FRAME_OFFSET.  */
       emit_move_insn (virtual_stack_vars_rtx, hard_frame_pointer_rtx);
 
       /* Restoring the frame pointer also modifies the hard frame pointer.
index 79204bd49e4c5a60183f450a26c7ee9483175f76..00efe14121364a73fa2f6750a375a0ee0ff9f905 100644 (file)
@@ -2025,7 +2025,7 @@ expand_used_vars (void)
   /* Compute the phase of the stack frame for this function.  */
   {
     int align = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
-    int off = STARTING_FRAME_OFFSET % align;
+    int off = targetm.starting_frame_offset () % align;
     frame_phase = off ? align - off : 0;
   }
 
index 98d93c69e23b6ddcf77985f142eeec3684826739..75fda01a6f4331c004199ccb9acc67779e820d1c 100644 (file)
@@ -541,8 +541,6 @@ extern enum aarch64_processor aarch64_tune;
 
 #define FRAME_GROWS_DOWNWARD   1
 
-#define STARTING_FRAME_OFFSET  0
-
 #define ACCUMULATE_OUTGOING_ARGS       1
 
 #define FIRST_PARM_OFFSET(FNDECL) 0
index a2878c64e94bae3a72e176c7caadb1be886aa11b..257c1de2422b69a0fbb2810ebee455b4088a0a57 100644 (file)
@@ -493,13 +493,6 @@ enum reg_class {
    goes at a more negative offset in the frame.  */
 /* #define FRAME_GROWS_DOWNWARD 0 */
 
-/* Offset within stack frame to start allocating local variables at.
-   If FRAME_GROWS_DOWNWARD, this is the offset to the END of the
-   first local allocated.  Otherwise, it is the offset to the BEGINNING
-   of the first local allocated.  */
-
-#define STARTING_FRAME_OFFSET 0
-
 /* If we generate an insn to push BYTES bytes,
    this says how many the stack pointer really advances by.
    On Alpha, don't define this because there are no push insns.  */
index 91a4c90ac93c1c4e4afbb590f46b0026dc9ddefe..1d9063ad74a0240f28c6f7f851c6abdcdb662ac1 100644 (file)
@@ -658,12 +658,6 @@ extern enum reg_class arc_regno_reg_class[];
    goes at a more negative offset in the frame.  */
 #define FRAME_GROWS_DOWNWARD 1
 
-/* Offset within stack frame to start allocating local variables at.
-   If FRAME_GROWS_DOWNWARD, this is the offset to the END of the
-   first local allocated.  Otherwise, it is the offset to the BEGINNING
-   of the first local allocated.  */
-#define STARTING_FRAME_OFFSET 0
-
 /* Offset from the stack pointer register to the first location at which
    outgoing arguments are placed.  */
 #define STACK_POINTER_OFFSET (0)
index 7e1eeb5254c2ce32ced2abdb43d1733ee1a45cd5..9567f6df73a960ab08b3766fcf3677629658a5ab 100644 (file)
@@ -1256,12 +1256,6 @@ enum reg_class
    && crtl->outgoing_args_size != 0            \
    ? UNITS_PER_WORD : 0)
 
-/* Offset within stack frame to start allocating local variables at.
-   If FRAME_GROWS_DOWNWARD, this is the offset to the END of the
-   first local allocated.  Otherwise, it is the offset to the BEGINNING
-   of the first local allocated.  */
-#define STARTING_FRAME_OFFSET  0
-
 /* If we generate an insn to push BYTES bytes,
    this says how many the stack pointer really advances by.  */
 /* The push insns do not do this rounding implicitly.
index e4306ea5d63f5b2649276edd67d8ca4568ca259e..9ed94800797c6d313fb5d9bf5704b6ae43d31a11 100644 (file)
@@ -84,7 +84,6 @@ extern void avr_expand_prologue (void);
 extern void avr_expand_epilogue (bool);
 extern bool avr_emit_movmemhi (rtx*);
 extern int avr_epilogue_uses (int regno);
-extern int avr_starting_frame_offset (void);
 
 extern void avr_output_addr_vec (rtx_insn*, rtx);
 extern const char *avr_out_sbxx_branch (rtx_insn *insn, rtx operands[]);
index d9c8277eff547a698f65e9b2bad30ac7d06a9d70..b1d8a84d154d757ec9348f3156093d6f9260b02f 100644 (file)
@@ -1153,11 +1153,11 @@ avr_outgoing_args_size (void)
 }
 
 
-/* Implement `STARTING_FRAME_OFFSET'.  */
+/* Implement TARGET_STARTING_FRAME_OFFSET.  */
 /* This is the offset from the frame pointer register to the first stack slot
    that contains a variable living in the frame.  */
 
-int
+static HOST_WIDE_INT
 avr_starting_frame_offset (void)
 {
   return 1 + avr_outgoing_args_size ();
@@ -1314,8 +1314,8 @@ avr_build_builtin_va_list (void)
 
 /* Implement `TARGET_BUILTIN_SETJMP_FRAME_VALUE'.  */
 /* Actual start of frame is virtual_stack_vars_rtx this is offset from
-   frame pointer by +STARTING_FRAME_OFFSET.
-   Using saved frame = virtual_stack_vars_rtx - STARTING_FRAME_OFFSET
+   frame pointer by +TARGET_STARTING_FRAME_OFFSET.
+   Using saved frame = virtual_stack_vars_rtx - TARGET_STARTING_FRAME_OFFSET
    avoids creating add/sub of offset in nonlocal goto and setjmp.  */
 
 static rtx
@@ -1323,7 +1323,7 @@ avr_builtin_setjmp_frame_value (void)
 {
   rtx xval = gen_reg_rtx (Pmode);
   emit_insn (gen_subhi3 (xval, virtual_stack_vars_rtx,
-                         gen_int_mode (STARTING_FRAME_OFFSET, Pmode)));
+                         gen_int_mode (avr_starting_frame_offset (), Pmode)));
   return xval;
 }
 
@@ -14789,6 +14789,9 @@ avr_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED, tree *arg,
 #undef  TARGET_LEGITIMATE_COMBINED_INSN
 #define TARGET_LEGITIMATE_COMBINED_INSN avr_legitimate_combined_insn
 
+#undef  TARGET_STARTING_FRAME_OFFSET
+#define TARGET_STARTING_FRAME_OFFSET avr_starting_frame_offset
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 \f
index 6d00dbd5d6ed83dd8e003c6a2d4633e8eaf5a7d0..2272df4afcc1ae02883434767149ae7ac72c94b3 100644 (file)
@@ -284,8 +284,6 @@ enum reg_class {
 
 #define STACK_GROWS_DOWNWARD 1
 
-#define STARTING_FRAME_OFFSET avr_starting_frame_offset()
-
 #define STACK_POINTER_OFFSET 1
 
 #define FIRST_PARM_OFFSET(FUNDECL) 0
index 436f036704ae4ddb7866809f5fdddfa034310997..14f9298f30541f774ad70883cb2bd4c110ba93d6 100644 (file)
         (unspec_volatile:HI [(const_int 0)] UNSPECV_GOTO_RECEIVER))]
   ""
   {
+    rtx offset = gen_int_mode (targetm.starting_frame_offset (), Pmode);
     emit_move_insn (virtual_stack_vars_rtx,
-                    gen_rtx_PLUS (Pmode, hard_frame_pointer_rtx,
-                                  gen_int_mode (STARTING_FRAME_OFFSET,
-                                                Pmode)));
+                    gen_rtx_PLUS (Pmode, hard_frame_pointer_rtx, offset));
     /* ; This might change the hard frame pointer in ways that aren't
        ; apparent to early optimization passes, so force a clobber.  */
     emit_clobber (hard_frame_pointer_rtx);
index 787600f3308d3294215e0e9311274d7ee7924252..e15a05d8784e3e4c56a9055a6047599f8a0e2cea 100644 (file)
@@ -252,12 +252,6 @@ extern const char *bfin_library_id_string;
    it. */
 #define FIRST_PARM_OFFSET(DECL) 0
 
-/* Offset within stack frame to start allocating local variables at.
-   If FRAME_GROWS_DOWNWARD, this is the offset to the END of the
-   first local allocated.  Otherwise, it is the offset to the BEGINNING
-   of the first local allocated.  */
-#define STARTING_FRAME_OFFSET 0
-
 /* Register to use for pushing function arguments.  */
 #define STACK_POINTER_REGNUM REG_P6
 
index c8c407369d3e03ae80a317879b6f9799fd1462db..233ac13fc8c5eee3f46095a7d35862de7b912ffb 100644 (file)
@@ -298,7 +298,6 @@ enum reg_class
 #define STACK_POINTER_OFFSET 4
 /* Likewise for AP (which is the incoming stack pointer).  */
 #define FIRST_PARM_OFFSET(fundecl) 4
-#define STARTING_FRAME_OFFSET 0
 #define FRAME_GROWS_DOWNWARD 1
 #define STACK_GROWS_DOWNWARD 1
 
index 143a1dbfda35af680c2c35e1eb271f4a8f82fc93..29f5b852ff60e4d9819752cd644aa78c25b6719b 100644 (file)
@@ -349,8 +349,6 @@ enum reg_class
 /* Stack layout and calling conventions.  */
 #define STACK_GROWS_DOWNWARD 1
 
-#define STARTING_FRAME_OFFSET   0
-
 #define STACK_POINTER_REGNUM    15
 
 #define FRAME_POINTER_REGNUM    13
index 570e2d9defe99228f6c2f7b01931a5bc7e7f1244..f9149c717a7ab96bc4c6cf3813a87136e06ef893 100644 (file)
@@ -589,10 +589,6 @@ enum reg_class
 #define STACK_GROWS_DOWNWARD 1
 #define FRAME_GROWS_DOWNWARD 1
 
-/* It seems to be indicated in the code (at least 2.1) that this is
-   better a constant, and best 0.  */
-#define STARTING_FRAME_OFFSET 0
-
 #define FIRST_PARM_OFFSET(FNDECL) 0
 
 #define RETURN_ADDR_RTX(COUNT, FRAMEADDR) \
index d1d9ee9998df6a43102128050a3effd216db028c..26b0f3cca74441dac2472d886e08340e742a5149 100644 (file)
@@ -176,6 +176,9 @@ static rtx_insn *frame_insn (rtx);
 
 #undef TARGET_CONSTANT_ALIGNMENT
 #define TARGET_CONSTANT_ALIGNMENT epiphany_constant_alignment
+
+#undef TARGET_STARTING_FRAME_OFFSET
+#define TARGET_STARTING_FRAME_OFFSET epiphany_starting_frame_offset
 \f
 bool
 epiphany_is_interrupt_p (tree decl)
@@ -3028,4 +3031,12 @@ epiphany_constant_alignment (const_tree exp, HOST_WIDE_INT align)
   return align;
 }
 
+/* Implement TARGET_STARTING_FRAME_OFFSET.  */
+
+static HOST_WIDE_INT
+epiphany_starting_frame_offset (void)
+{
+  return epiphany_stack_offset;
+}
+
 struct gcc_target targetm = TARGET_INITIALIZER;
index 290ea20a58377fa34996466d62fb0d038a3590d1..c0767b4642ad15b470e55f87b49db6148c8c2c1f 100644 (file)
@@ -447,12 +447,6 @@ typedef struct GTY (()) machine_function
    goes at a more negative offset in the frame.  */
 #define FRAME_GROWS_DOWNWARD 1
 
-/* Offset within stack frame to start allocating local variables at.
-   If FRAME_GROWS_DOWNWARD, this is the offset to the END of the
-   first local allocated.  Otherwise, it is the offset to the BEGINNING
-   of the first local allocated.  */
-#define STARTING_FRAME_OFFSET epiphany_stack_offset
-
 /* Offset from the stack pointer register to the first location at which
    outgoing arguments are placed.  */
 #define STACK_POINTER_OFFSET epiphany_stack_offset
index c4485096f0f8e67eb5302eec1538fc4c69698df8..8bcabf59299adc7e9f1b56d40498c39f3e21e255 100644 (file)
@@ -345,15 +345,6 @@ enum reg_class
    are at negative offsets from the frame pointer.  */
 #define FRAME_GROWS_DOWNWARD 1
 
-/* Offset from the frame pointer to the first local variable slot to be
-   allocated.
-
-   If `FRAME_GROWS_DOWNWARD', find the next slot's offset by subtracting the
-   first slot's length from `STARTING_FRAME_OFFSET'.  Otherwise, it is found by
-   adding the length of the first slot to the value `STARTING_FRAME_OFFSET'.  */
-/* #define STARTING_FRAME_OFFSET -4 */
-#define STARTING_FRAME_OFFSET 0
-
 /* Offset from the stack pointer register to the first location at which
    outgoing arguments are placed.  If not specified, the default value of zero
    is used.  This is the proper value for most machines.
index 44a73e08f902da0373ea3182968090f2ad3245da..7403e1ae62103b7dd42d1a8da289d2db6a37df1f 100644 (file)
@@ -966,14 +966,6 @@ typedef struct frv_stack {
    are at negative offsets from the frame pointer.  */
 #define FRAME_GROWS_DOWNWARD 1
 
-/* Offset from the frame pointer to the first local variable slot to be
-   allocated.
-
-   If `FRAME_GROWS_DOWNWARD', find the next slot's offset by subtracting the
-   first slot's length from `STARTING_FRAME_OFFSET'.  Otherwise, it is found by
-   adding the length of the first slot to the value `STARTING_FRAME_OFFSET'.  */
-#define STARTING_FRAME_OFFSET 0
-
 /* Offset from the stack pointer register to the first location at which
    outgoing arguments are placed.  If not specified, the default value of zero
    is used.  This is the proper value for most machines.
index 32aa32095eafd9f060a0bf0376aaeec1362fa723..d52bb9af17c660a91a1c7b557f3f9bfbab9dad4a 100644 (file)
@@ -233,10 +233,6 @@ enum reg_class
    pointer to a smaller address.  */
 #define STACK_GROWS_DOWNWARD 1
 
-/* Offset from the frame pointer to the first local variable slot to
-   be allocated.  */
-#define STARTING_FRAME_OFFSET 0
-
 /* Offset from the argument pointer register to the first argument's
    address.  On some machines it may depend on the data type of the
    function.  */
index 8ff38605a236cc2f909d19428cb9ee6d27a139ba..9ba82a76ab9275e891f1eeadaa14551488108b21 100644 (file)
@@ -352,13 +352,6 @@ enum reg_class {
 
 #define FRAME_GROWS_DOWNWARD 1
 
-/* Offset within stack frame to start allocating local variables at.
-   If FRAME_GROWS_DOWNWARD, this is the offset to the END of the
-   first local allocated.  Otherwise, it is the offset to the BEGINNING
-   of the first local allocated.  */
-
-#define STARTING_FRAME_OFFSET 0
-
 /* If we generate an insn to push BYTES bytes,
    this says how many the stack pointer really advances by.
 
index 8fbad16b4081b0510d64c7635068646056137d74..4a71977808e180b7a6e6b020a97cfdbb71c18626 100644 (file)
@@ -1523,12 +1523,6 @@ enum reg_class
    goes at a more negative offset in the frame.  */
 #define FRAME_GROWS_DOWNWARD 1
 
-/* Offset within stack frame to start allocating local variables at.
-   If FRAME_GROWS_DOWNWARD, this is the offset to the END of the
-   first local allocated.  Otherwise, it is the offset to the BEGINNING
-   of the first local allocated.  */
-#define STARTING_FRAME_OFFSET 0
-
 /* If we generate an insn to push BYTES bytes, this says how many the stack
    pointer really advances by.  On 386, we have pushw instruction that
    decrements by exactly 2 no matter what the position was, there is no pushb.
index 4a9313e1d49ae1cb592ca87f3df6b9651e115f10..e7073d1cf20174cad2c47bf321ea057c53857a02 100644 (file)
@@ -779,10 +779,6 @@ enum reg_class
    are at negative offsets from the frame pointer.  */
 #define FRAME_GROWS_DOWNWARD 0
 
-/* Offset from the frame pointer to the first local variable slot to
-   be allocated.  */
-#define STARTING_FRAME_OFFSET 0
-
 /* Offset from the stack pointer register to the first location at which
    outgoing arguments are placed.  If not specified, the default value of zero
    is used.  This is the proper value for most machines.  */
index 297bd2bb0d4d65b876386be33796d7f7416f729f..2e0c6f6a975e4b2adb2af8175aad6e2b510b52c7 100644 (file)
@@ -181,6 +181,7 @@ static bool iq2000_print_operand_punct_valid_p (unsigned char code);
 static bool iq2000_hard_regno_mode_ok (unsigned int, machine_mode);
 static bool iq2000_modes_tieable_p (machine_mode, machine_mode);
 static HOST_WIDE_INT iq2000_constant_alignment (const_tree, HOST_WIDE_INT);
+static HOST_WIDE_INT iq2000_starting_frame_offset (void);
 
 #undef  TARGET_INIT_BUILTINS
 #define TARGET_INIT_BUILTINS           iq2000_init_builtins
@@ -268,6 +269,9 @@ static HOST_WIDE_INT iq2000_constant_alignment (const_tree, HOST_WIDE_INT);
 #undef  TARGET_CONSTANT_ALIGNMENT
 #define TARGET_CONSTANT_ALIGNMENT      iq2000_constant_alignment
 
+#undef  TARGET_STARTING_FRAME_OFFSET
+#define TARGET_STARTING_FRAME_OFFSET   iq2000_starting_frame_offset
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 \f
 /* Return nonzero if we split the address into high and low parts.  */
@@ -3546,4 +3550,12 @@ iq2000_constant_alignment (const_tree exp, HOST_WIDE_INT align)
   return align;
 }
 
+/* Implement TARGET_STARTING_FRAME_OFFSET.  */
+
+static HOST_WIDE_INT
+iq2000_starting_frame_offset (void)
+{
+  return crtl->outgoing_args_size;
+}
+
 #include "gt-iq2000.h"
index 58c3597fd7802498f0f7941aa0f183cfd9258290..72122e27577660e8e623418fea216c75f554ae0b 100644 (file)
@@ -215,9 +215,6 @@ enum reg_class
 
 #define FRAME_GROWS_DOWNWARD 0
 
-#define STARTING_FRAME_OFFSET                                          \
-  (crtl->outgoing_args_size)
-
 /* Use the default value zero.  */
 /* #define STACK_POINTER_OFFSET 0 */
 
index a4aade494d6f0e20d5108d28cf54e3a5840a9f8b..1d6cfa0dc8a988840d7cf1f862f157e40ffe484c 100644 (file)
@@ -79,6 +79,7 @@ static void lm32_function_arg_advance (cumulative_args_t cum,
                                       const_tree type, bool named);
 static bool lm32_hard_regno_mode_ok (unsigned int, machine_mode);
 static bool lm32_modes_tieable_p (machine_mode, machine_mode);
+static HOST_WIDE_INT lm32_starting_frame_offset (void);
 
 #undef TARGET_OPTION_OVERRIDE
 #define TARGET_OPTION_OVERRIDE lm32_option_override
@@ -116,6 +117,9 @@ static bool lm32_modes_tieable_p (machine_mode, machine_mode);
 #undef TARGET_CONSTANT_ALIGNMENT
 #define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings
 
+#undef TARGET_STARTING_FRAME_OFFSET
+#define TARGET_STARTING_FRAME_OFFSET lm32_starting_frame_offset
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 /* Current frame information calculated by lm32_compute_frame_size.  */
@@ -1249,3 +1253,11 @@ lm32_modes_tieable_p (machine_mode mode1, machine_mode mode2)
          && GET_MODE_SIZE (mode1) <= UNITS_PER_WORD
          && GET_MODE_SIZE (mode2) <= UNITS_PER_WORD);
 }
+
+/* Implement TARGET_STARTING_FRAME_OFFSET.  */
+
+static HOST_WIDE_INT
+lm32_starting_frame_offset (void)
+{
+  return UNITS_PER_WORD;
+}
index 605bd68ca7cbd7f12006e22a02bf8cffb2e76730..8f2035455ae856f6923bd768e691dab56c71c01c 100644 (file)
@@ -204,8 +204,6 @@ enum reg_class
 
 #define STACK_POINTER_OFFSET (UNITS_PER_WORD)
 
-#define STARTING_FRAME_OFFSET (UNITS_PER_WORD)
-
 #define FIRST_PARM_OFFSET(FNDECL) (UNITS_PER_WORD)
 
 #define STACK_POINTER_REGNUM SP_REGNUM
index 594288b76e90c79b2495be73bee55d585eceabbc..4bf67fb9c6726c7f2a6865431084b3eb235d6afa 100644 (file)
@@ -421,7 +421,6 @@ enum reg_class
 #define STACK_PUSH_CODE PRE_DEC
 #define FRAME_GROWS_DOWNWARD 1
 
-#define STARTING_FRAME_OFFSET 0
 #define FIRST_PARM_OFFSET(F) 0
 
 #define RETURN_ADDR_RTX(COUNT,FA) m32c_return_addr_rtx (COUNT)
index aefab935c34f1e1c34226ee52c5c340ec3c681bb..f1044575550b19aa7c815fb5f153f73a4e5062d2 100644 (file)
@@ -104,6 +104,7 @@ static bool m32r_legitimate_constant_p (machine_mode, rtx);
 static bool m32r_attribute_identifier (const_tree);
 static bool m32r_hard_regno_mode_ok (unsigned int, machine_mode);
 static bool m32r_modes_tieable_p (machine_mode, machine_mode);
+static HOST_WIDE_INT m32r_starting_frame_offset (void);
 \f
 /* M32R specific attributes.  */
 
@@ -220,6 +221,9 @@ static const struct attribute_spec m32r_attribute_table[] =
 #undef TARGET_CONSTANT_ALIGNMENT
 #define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings
 
+#undef TARGET_STARTING_FRAME_OFFSET
+#define TARGET_STARTING_FRAME_OFFSET m32r_starting_frame_offset
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 \f
 /* Called by m32r_option_override to initialize various things.  */
@@ -2959,3 +2963,12 @@ m32r_legitimate_constant_p (machine_mode mode ATTRIBUTE_UNUSED, rtx x)
           && CONST_INT_P (XEXP (XEXP (x, 0), 1))
           && UINTVAL (XEXP (XEXP (x, 0), 1)) > 32767);
 }
+
+/* Implement TARGET_STARTING_FRAME_OFFSET.  The frame pointer points at
+   the same place as the stack pointer, except if alloca has been called.  */
+
+static HOST_WIDE_INT
+m32r_starting_frame_offset (void)
+{
+  return M32R_STACK_ALIGN (crtl->outgoing_args_size);
+}
index 5b2a93bfca8b315c8f1c7d77d139636dedde9a70..0fa4c5f24e17ff2512c2dd13873261f71c4129b4 100644 (file)
@@ -492,15 +492,6 @@ extern enum reg_class m32r_regno_reg_class[FIRST_PSEUDO_REGISTER];
    pointer to a smaller address.  */
 #define STACK_GROWS_DOWNWARD 1
 
-/* Offset from frame pointer to start allocating local variables at.
-   If FRAME_GROWS_DOWNWARD, this is the offset to the END of the
-   first local allocated.  Otherwise, it is the offset to the BEGINNING
-   of the first local allocated.  */
-/* The frame pointer points at the same place as the stack pointer, except if
-   alloca has been called.  */
-#define STARTING_FRAME_OFFSET \
-  M32R_STACK_ALIGN (crtl->outgoing_args_size)
-
 /* Offset from the stack pointer register to the first location at which
    outgoing arguments are placed.  */
 #define STACK_POINTER_OFFSET 0
index 2fefc7251ba13c979c90d03095a7a77a578f5835..97693cbf54984a53aa6c35061ca723dae6d1a7b3 100644 (file)
@@ -467,7 +467,6 @@ extern enum reg_class regno_reg_class[];
 
 #define STACK_GROWS_DOWNWARD 1
 #define FRAME_GROWS_DOWNWARD 1
-#define STARTING_FRAME_OFFSET 0
 
 /* On the 680x0, sp@- in a byte insn really pushes a word.
    On the ColdFire, sp@- in a byte insn pushes just a byte.  */
index f411186e56720c2afe27ef3a626ddb80f2277f40..50d087c1cd5255ef4c3f19c3f73ac3958c8e92bc 100644 (file)
@@ -390,12 +390,6 @@ extern const enum reg_class regno_reg_class[FIRST_PSEUDO_REGISTER];
    makes the stack pointer a smaller address.  */
 #define STACK_GROWS_DOWNWARD 1
 
-/* Offset within stack frame to start allocating local variables at.
-   If FRAME_GROWS_DOWNWARD, this is the offset to the END of the
-   first local allocated.  Otherwise, it is the offset to the BEGINNING
-   of the first local allocated.  */
-#define STARTING_FRAME_OFFSET  0
-
 /* If defined, the maximum amount of space required for outgoing arguments
    will be computed and placed into the variable
    `crtl->outgoing_args_size'.  No space will be pushed
index 53ca016ce658f31f098ced6492ca86e86286ae6c..74875238774f0d806e400b4996ebcecb58ff75e7 100644 (file)
@@ -3810,6 +3810,14 @@ microblaze_constant_alignment (const_tree exp, HOST_WIDE_INT align)
     return MAX (align, BITS_PER_WORD);
   return align;
 }
+
+/* Implement TARGET_STARTING_FRAME_OFFSET.  */
+
+static HOST_WIDE_INT
+microblaze_starting_frame_offset (void)
+{
+  return (crtl->outgoing_args_size + FIRST_PARM_OFFSET(FNDECL));
+}
 \f
 #undef TARGET_ENCODE_SECTION_INFO
 #define TARGET_ENCODE_SECTION_INFO      microblaze_encode_section_info
@@ -3917,6 +3925,9 @@ microblaze_constant_alignment (const_tree exp, HOST_WIDE_INT align)
 #undef TARGET_CONSTANT_ALIGNMENT
 #define TARGET_CONSTANT_ALIGNMENT microblaze_constant_alignment
 
+#undef TARGET_STARTING_FRAME_OFFSET
+#define TARGET_STARTING_FRAME_OFFSET microblaze_starting_frame_offset
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 \f
 #include "gt-microblaze.h"
index 2fc7fc50a15ec98ed9dda975d9702dc72790e9f5..59cc1cc2e37b7b8c49a56def5f45db261469f579 100644 (file)
@@ -402,10 +402,6 @@ extern enum reg_class microblaze_regno_to_class[];
 
 #define STACK_GROWS_DOWNWARD 1
 
-/* Changed the starting frame offset to including the new link stuff */
-#define STARTING_FRAME_OFFSET                                          \
-   (crtl->outgoing_args_size + FIRST_PARM_OFFSET(FNDECL))
-
 /* The return address for the current frame is in r31 if this is a leaf
    function.  Otherwise, it is on the stack.  It is at a variable offset
    from sp/fp/ap, so we define a fake hard register rap which is a
index 41333755b841596f1193254702defb869536dcc4..149ad8ebd818bc1bcd93544b345300d259f348f6 100644 (file)
@@ -10956,7 +10956,7 @@ mips_compute_frame_info (void)
      if we know that none of the called functions will use this space.
 
      But if the target-independent frame size is nonzero, we have already
-     committed to allocating these in STARTING_FRAME_OFFSET for
+     committed to allocating these in TARGET_STARTING_FRAME_OFFSET for
      !FRAME_GROWS_DOWNWARD.  */
 
   if ((size == 0 || FRAME_GROWS_DOWNWARD)
@@ -22346,6 +22346,17 @@ mips_constant_alignment (const_tree exp, HOST_WIDE_INT align)
     return MAX (align, BITS_PER_WORD);
   return align;
 }
+
+/* Implement TARGET_STARTING_FRAME_OFFSET.  See mips_compute_frame_info
+   for details about the frame layout.  */
+
+static HOST_WIDE_INT
+mips_starting_frame_offset (void)
+{
+  if (FRAME_GROWS_DOWNWARD)
+    return 0;
+  return crtl->outgoing_args_size + MIPS_GP_SAVE_AREA_SIZE;
+}
 \f
 /* Initialize the GCC target structure.  */
 #undef TARGET_ASM_ALIGNED_HI_OP
@@ -22647,6 +22658,9 @@ mips_constant_alignment (const_tree exp, HOST_WIDE_INT align)
 #undef TARGET_CONSTANT_ALIGNMENT
 #define TARGET_CONSTANT_ALIGNMENT mips_constant_alignment
 
+#undef TARGET_STARTING_FRAME_OFFSET
+#define TARGET_STARTING_FRAME_OFFSET mips_starting_frame_offset
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 \f
 #include "gt-mips.h"
index a2d8c7c135025be04bbb1798e78c6e4cbcaa21d0..550d283158e6d14aa6ed80b853a27851e4fc8d9b 100644 (file)
@@ -2298,14 +2298,6 @@ enum reg_class
 #define MIPS_GP_SAVE_AREA_SIZE \
   (TARGET_CALL_CLOBBERED_GP ? MIPS_STACK_ALIGN (UNITS_PER_WORD) : 0)
 
-/* The offset of the first local variable from the frame pointer.  See
-   mips_compute_frame_info for details about the frame layout.  */
-
-#define STARTING_FRAME_OFFSET                          \
-  (FRAME_GROWS_DOWNWARD                                        \
-   ? 0                                                 \
-   : crtl->outgoing_args_size + MIPS_GP_SAVE_AREA_SIZE)
-
 #define RETURN_ADDR_RTX mips_return_addr
 
 /* Mask off the MIPS16 ISA bit in unwind addresses.
index 6c38924f479c1e9ec02cca8b0d1a9018f85b5626..4e3a752076574d1bae984acd972da108c847c2b3 100644 (file)
@@ -21,7 +21,6 @@ along with GCC; see the file COPYING3.  If not see
 extern void mmix_init_expanders (void);
 extern int mmix_eh_return_data_regno (int);
 extern int mmix_initial_elimination_offset (int, int);
-extern int mmix_starting_frame_offset (void);
 extern int mmix_function_arg_regno_p (int, int);
 extern void mmix_function_profiler (FILE *, int);
 extern int mmix_reversible_cc_mode (machine_mode);
index 09e752dca0dad3c3130151db6e89dc8b8a5cd859..e9115941e1e94f7d89645a7c77d0e53f57552622 100644 (file)
@@ -169,6 +169,7 @@ static void mmix_print_operand_address (FILE *, machine_mode, rtx);
 static bool mmix_print_operand_punct_valid_p (unsigned char);
 static void mmix_conditional_register_usage (void);
 static HOST_WIDE_INT mmix_constant_alignment (const_tree, HOST_WIDE_INT);
+static HOST_WIDE_INT mmix_starting_frame_offset (void);
 
 /* Target structure macros.  Listed by node.  See `Using and Porting GCC'
    for a general description.  */
@@ -286,6 +287,9 @@ static HOST_WIDE_INT mmix_constant_alignment (const_tree, HOST_WIDE_INT);
 #undef TARGET_CONSTANT_ALIGNMENT
 #define TARGET_CONSTANT_ALIGNMENT mmix_constant_alignment
 
+#undef TARGET_STARTING_FRAME_OFFSET
+#define TARGET_STARTING_FRAME_OFFSET mmix_starting_frame_offset
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 /* Functions that are expansions for target macros.
@@ -498,9 +502,9 @@ mmix_dynamic_chain_address (rtx frame)
   return plus_constant (Pmode, frame, -8);
 }
 
-/* STARTING_FRAME_OFFSET.  */
+/* Implement TARGET_STARTING_FRAME_OFFSET.  */
 
-int
+static HOST_WIDE_INT
 mmix_starting_frame_offset (void)
 {
   /* The old frame pointer is in the slot below the new one, so
@@ -566,7 +570,7 @@ mmix_initial_elimination_offset (int fromreg, int toreg)
      counted; the others go on the register stack.
 
      The frame-pointer is counted too if it is what is eliminated, as we
-     need to balance the offset for it from STARTING_FRAME_OFFSET.
+     need to balance the offset for it from TARGET_STARTING_FRAME_OFFSET.
 
      Also add in the slot for the register stack pointer we save if we
      have a landing pad.
index 7d1e83c28e0be855b8d317f8e65815c9e5f9e12c..5dafe2dbf982b04f97b4dab6bd1f7c38731a03cf 100644 (file)
@@ -437,9 +437,6 @@ enum reg_class
 #define STACK_GROWS_DOWNWARD 1
 #define FRAME_GROWS_DOWNWARD 1
 
-#define STARTING_FRAME_OFFSET \
-  mmix_starting_frame_offset ()
-
 #define FIRST_PARM_OFFSET(FUNDECL) 0
 
 #define DYNAMIC_CHAIN_ADDRESS(FRAMEADDR) \
index 1078b45c30aa136fcf10db6296e8d433230be4ec..b074540f7b1902aa258174a72fcb11b99049056c 100644 (file)
@@ -392,13 +392,6 @@ enum reg_class
 
 #define FRAME_GROWS_DOWNWARD 1
 
-/* Offset within stack frame to start allocating local variables at.
-   If FRAME_GROWS_DOWNWARD, this is the offset to the END of the
-   first local allocated.  Otherwise, it is the offset to the BEGINNING
-   of the first local allocated.  */
-
-#define STARTING_FRAME_OFFSET 0
-
 /* Offset of first parameter from the argument pointer register value.  */
 /* Is equal to the size of the saved fp + pc, even if an fp isn't
    saved since the value is used before we know.  */
index 29442fb47e8f3cb1d2dbe0cc3bcdad87257d0a10..3742967d01c67b03483799c64b2906f1197ed17f 100644 (file)
@@ -226,10 +226,6 @@ enum reg_class
    pointer to a smaller address.  */
 #define STACK_GROWS_DOWNWARD 1
 
-/* Offset from the frame pointer to the first local variable slot to
-   be allocated.  */
-#define STARTING_FRAME_OFFSET 0
-
 /* Define this if the above stack space is to be considered part of the
    space allocated by the caller.  */
 #define OUTGOING_REG_PARM_STACK_SPACE(FNTYPE) 1
index 5a997670700d4d420610238c2a3027b7f5f08f8b..d422725914822425c35e2ac91b920f39416143d8 100644 (file)
@@ -196,7 +196,6 @@ extern const char * msp430_select_hwmult_lib (int, const char **);
 #define WORD_REGISTER_OPERATIONS       1
 
 #define MOVE_MAX                       8
-#define STARTING_FRAME_OFFSET          0
 
 #define INCOMING_RETURN_ADDR_RTX \
   msp430_incoming_return_addr_rtx ()
index d33237c004cd5a516de17284de2b88a85551ed87..81522b848c86d708bd88ddb32ad8aa359daec946 100644 (file)
@@ -681,8 +681,6 @@ enum reg_class
 
 #define FRAME_GROWS_DOWNWARD 1
 
-#define STARTING_FRAME_OFFSET 0
-
 #define STACK_POINTER_OFFSET 0
 
 #define FIRST_PARM_OFFSET(fundecl) \
index 10bebfbcdd30fbd671943b1f1333f76ca37af5d4..420543e4f46874f34f1ac13bd3662fdacd63ec52 100644 (file)
@@ -252,7 +252,6 @@ enum reg_class
 
 /* Stack layout.  */
 #define STACK_GROWS_DOWNWARD 1
-#define STARTING_FRAME_OFFSET 0
 #define FIRST_PARM_OFFSET(FUNDECL) 0
 
 /* Before the prologue, RA lives in r31.  */
index d02e8541b6b5e35cf1eff700c6a5ffbfec6f9d9d..f81b9e2ae697753bf599ca523d4fc3b89ff0ca53 100644 (file)
@@ -122,7 +122,6 @@ enum reg_class             {  NO_REGS,    ALL_REGS, LIM_REG_CLASSES };
 
 /* Stack and Calling.  */
 
-#define STARTING_FRAME_OFFSET 0
 #define FRAME_GROWS_DOWNWARD 0
 #define STACK_GROWS_DOWNWARD 1
 
index 5e945fc2f3b3852d40db02891808cee5a87a6ca4..3e2ef9d865c2ec0c1aff89d4f8d07b1eff4603dd 100644 (file)
@@ -203,6 +203,7 @@ static unsigned int pa_hard_regno_nregs (unsigned int, machine_mode);
 static bool pa_hard_regno_mode_ok (unsigned int, machine_mode);
 static bool pa_modes_tieable_p (machine_mode, machine_mode);
 static bool pa_can_change_mode_class (machine_mode, machine_mode, reg_class_t);
+static HOST_WIDE_INT pa_starting_frame_offset (void);
 
 /* The following extra sections are only used for SOM.  */
 static GTY(()) section *som_readonly_data_section;
@@ -422,6 +423,9 @@ static size_t n_deferred_plabels = 0;
 #undef TARGET_CONSTANT_ALIGNMENT
 #define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings
 
+#undef TARGET_STARTING_FRAME_OFFSET
+#define TARGET_STARTING_FRAME_OFFSET pa_starting_frame_offset
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 \f
 /* Parse the -mfixed-range= option string.  */
@@ -3779,11 +3783,11 @@ pa_compute_frame_size (HOST_WIDE_INT size, int *fregs_live)
   size = (size + UNITS_PER_WORD - 1) & ~(UNITS_PER_WORD - 1);
 
   /* Space for previous frame pointer + filler.  If any frame is
-     allocated, we need to add in the STARTING_FRAME_OFFSET.  We
+     allocated, we need to add in the TARGET_STARTING_FRAME_OFFSET.  We
      waste some space here for the sake of HP compatibility.  The
      first slot is only used when the frame pointer is needed.  */
   if (size || frame_pointer_needed)
-    size += STARTING_FRAME_OFFSET;
+    size += pa_starting_frame_offset ();
   
   /* If the current function calls __builtin_eh_return, then we need
      to allocate stack space for registers that will hold data for
@@ -3918,7 +3922,7 @@ pa_expand_prologue (void)
      and must be changed in tandem with this code.  */
   local_fsize = (size + UNITS_PER_WORD - 1) & ~(UNITS_PER_WORD - 1);
   if (local_fsize || frame_pointer_needed)
-    local_fsize += STARTING_FRAME_OFFSET;
+    local_fsize += pa_starting_frame_offset ();
 
   actual_fsize = pa_compute_frame_size (size, &save_fregs);
   if (flag_stack_usage_info)
@@ -10809,4 +10813,17 @@ pa_hard_regno_mode_ok (unsigned int regno, machine_mode mode)
   return PA_HARD_REGNO_MODE_OK (regno, mode);
 }
 
+/* Implement TARGET_STARTING_FRAME_OFFSET.
+
+   On the 32-bit ports, we reserve one slot for the previous frame
+   pointer and one fill slot.  The fill slot is for compatibility
+   with HP compiled programs.  On the 64-bit ports, we reserve one
+   slot for the previous frame pointer.  */
+
+static HOST_WIDE_INT
+pa_starting_frame_offset (void)
+{
+  return 8;
+}
+
 #include "gt-pa.h"
index cf95789b59941f84f02685ed34ae7e62bc7a5e85..7bd1f112471ce4268b8a4229cdcdd3cf36c5a37a 100644 (file)
@@ -494,17 +494,6 @@ extern rtx hppa_pic_save_rtx (void);
    goes at a more negative offset in the frame.  */
 #define FRAME_GROWS_DOWNWARD 0
 
-/* Offset within stack frame to start allocating local variables at.
-   If FRAME_GROWS_DOWNWARD, this is the offset to the END of the
-   first local allocated.  Otherwise, it is the offset to the BEGINNING
-   of the first local allocated.
-
-   On the 32-bit ports, we reserve one slot for the previous frame
-   pointer and one fill slot.  The fill slot is for compatibility
-   with HP compiled programs.  On the 64-bit ports, we reserve one
-   slot for the previous frame pointer.  */
-#define STARTING_FRAME_OFFSET 8
-
 /* Define STACK_ALIGNMENT_NEEDED to zero to disable final alignment
    of the stack.  The default is to align it to STACK_BOUNDARY.  */
 #define STACK_ALIGNMENT_NEEDED 0
index 3c89327c9837566eec338ac5f19af929e088c5c7..115bb5b83a020cbfad42a449989d85ea7aaef680 100644 (file)
@@ -257,12 +257,6 @@ enum reg_class { NO_REGS, MUL_REGS, GENERAL_REGS, LOAD_FPU_REGS, NO_LOAD_FPU_REG
 */
 #define FRAME_GROWS_DOWNWARD 1
 
-/* Offset within stack frame to start allocating local variables at.
-   If FRAME_GROWS_DOWNWARD, this is the offset to the END of the
-   first local allocated.  Otherwise, it is the offset to the BEGINNING
-   of the first local allocated.  */
-#define STARTING_FRAME_OFFSET 0
-
 /* If we generate an insn to push BYTES bytes,
    this says how many the stack pointer really advances by.
    On the pdp11, the stack is on an even boundary */
index 6c91a90cc0025754dd42695998d00038ca2de837..607b42c0a40e56767e2d876b054d09c3f4c43392 100644 (file)
    sizes of the fixed area and the parameter area must be a multiple of
    STACK_BOUNDARY.  */
 
-#undef STARTING_FRAME_OFFSET
-#define STARTING_FRAME_OFFSET                                          \
-  (FRAME_GROWS_DOWNWARD                                                        \
-   ? 0                                                                 \
-   : (cfun->calls_alloca                                               \
-      ? RS6000_ALIGN (crtl->outgoing_args_size + RS6000_SAVE_AREA, 16) \
-      : (RS6000_ALIGN (crtl->outgoing_args_size, 16) + RS6000_SAVE_AREA)))
+#undef RS6000_STARTING_FRAME_OFFSET
+#define RS6000_STARTING_FRAME_OFFSET                                   \
+  (cfun->calls_alloca                                                  \
+   ? RS6000_ALIGN (crtl->outgoing_args_size + RS6000_SAVE_AREA, 16)    \
+   : (RS6000_ALIGN (crtl->outgoing_args_size, 16) + RS6000_SAVE_AREA))
 
 /* Offset from the stack pointer register to an item dynamically
    allocated on the stack, e.g., by `alloca'.
index 51474ae00c717e925cacfa41823cd2faaaea4384..ac268dcab238426a8d01ee35d1d54544ec35d70b 100644 (file)
@@ -148,12 +148,10 @@ extern int darwin_emit_branch_islands;
 
 /* Pad the outgoing args area to 16 bytes instead of the usual 8.  */
 
-#undef STARTING_FRAME_OFFSET
-#define STARTING_FRAME_OFFSET                                          \
-  (FRAME_GROWS_DOWNWARD                                                        \
-   ? 0                                                                 \
-   : (RS6000_ALIGN (crtl->outgoing_args_size, 16)              \
-      + RS6000_SAVE_AREA))
+#undef RS6000_STARTING_FRAME_OFFSET
+#define RS6000_STARTING_FRAME_OFFSET                                   \
+  (RS6000_ALIGN (crtl->outgoing_args_size, 16)                         \
+   + RS6000_SAVE_AREA)
 
 #undef STACK_DYNAMIC_OFFSET
 #define STACK_DYNAMIC_OFFSET(FUNDECL)                                  \
index 0f90e95f1e0ae38914c5c44132b20152f130fc1e..b39a8f8559f7c82897ab1ff8fc087b0e35bda798 100644 (file)
@@ -1987,6 +1987,9 @@ static const struct attribute_spec rs6000_attribute_table[] =
 
 #undef TARGET_CONSTANT_ALIGNMENT
 #define TARGET_CONSTANT_ALIGNMENT rs6000_constant_alignment
+
+#undef TARGET_STARTING_FRAME_OFFSET
+#define TARGET_STARTING_FRAME_OFFSET rs6000_starting_frame_offset
 \f
 
 /* Processor table.  */
@@ -43772,6 +43775,16 @@ rs6000_constant_alignment (const_tree exp, HOST_WIDE_INT align)
     return MAX (align, BITS_PER_WORD);
   return align;
 }
+
+/* Implement TARGET_STARTING_FRAME_OFFSET.  */
+
+static HOST_WIDE_INT
+rs6000_starting_frame_offset (void)
+{
+  if (FRAME_GROWS_DOWNWARD)
+    return 0;
+  return RS6000_STARTING_FRAME_OFFSET;
+}
 \f
 struct gcc_target targetm = TARGET_INITIALIZER;
 
index 8381785067c48a05a55f8aeeea83ea886b5d2c3a..bc37c6f17e588aaa0b50271c0f0bdd06b0dc6002 100644 (file)
@@ -1648,15 +1648,13 @@ extern enum reg_class rs6000_constraints[RS6000_CONSTRAINT_MAX];
    sizes of the fixed area and the parameter area must be a multiple of
    STACK_BOUNDARY.  */
 
-#define STARTING_FRAME_OFFSET                                          \
-  (FRAME_GROWS_DOWNWARD                                                        \
-   ? 0                                                                 \
-   : (cfun->calls_alloca                                               \
-      ? (RS6000_ALIGN (crtl->outgoing_args_size + RS6000_SAVE_AREA,    \
-                      (TARGET_ALTIVEC || TARGET_VSX) ? 16 : 8 ))       \
-      : (RS6000_ALIGN (crtl->outgoing_args_size,                       \
-                      (TARGET_ALTIVEC || TARGET_VSX) ? 16 : 8)         \
-        + RS6000_SAVE_AREA)))
+#define RS6000_STARTING_FRAME_OFFSET                                   \
+  (cfun->calls_alloca                                                  \
+   ? (RS6000_ALIGN (crtl->outgoing_args_size + RS6000_SAVE_AREA,       \
+                   (TARGET_ALTIVEC || TARGET_VSX) ? 16 : 8 ))          \
+   : (RS6000_ALIGN (crtl->outgoing_args_size,                          \
+                   (TARGET_ALTIVEC || TARGET_VSX) ? 16 : 8)            \
+      + RS6000_SAVE_AREA))
 
 /* Offset from the stack pointer register to an item dynamically
    allocated on the stack, e.g., by `alloca'.
index c31d2cc99579c94ac84e6069f5ecafa164859b96..e53555efe82fbcece81c18adf22bab5c06edef0d 100644 (file)
@@ -446,8 +446,6 @@ enum reg_class
 
 #define FRAME_GROWS_DOWNWARD 1
 
-#define STARTING_FRAME_OFFSET 0
-
 #define RETURN_ADDR_RTX riscv_return_addr
 
 #define ELIMINABLE_REGS                                                        \
index 30dfee89e6b1551f5af8c921f61f6b174e227899..e6b640986533251cbee504698794af1f2b89ed6d 100644 (file)
 #define HAS_LONG_UNCOND_BRANCH         0
 
 #define MOVE_MAX                       2
-#define STARTING_FRAME_OFFSET          0
 
 #define ADDR_SPACE_NEAR                        1
 #define ADDR_SPACE_FAR                 2
index 6c91a90cc0025754dd42695998d00038ca2de837..607b42c0a40e56767e2d876b054d09c3f4c43392 100644 (file)
    sizes of the fixed area and the parameter area must be a multiple of
    STACK_BOUNDARY.  */
 
-#undef STARTING_FRAME_OFFSET
-#define STARTING_FRAME_OFFSET                                          \
-  (FRAME_GROWS_DOWNWARD                                                        \
-   ? 0                                                                 \
-   : (cfun->calls_alloca                                               \
-      ? RS6000_ALIGN (crtl->outgoing_args_size + RS6000_SAVE_AREA, 16) \
-      : (RS6000_ALIGN (crtl->outgoing_args_size, 16) + RS6000_SAVE_AREA)))
+#undef RS6000_STARTING_FRAME_OFFSET
+#define RS6000_STARTING_FRAME_OFFSET                                   \
+  (cfun->calls_alloca                                                  \
+   ? RS6000_ALIGN (crtl->outgoing_args_size + RS6000_SAVE_AREA, 16)    \
+   : (RS6000_ALIGN (crtl->outgoing_args_size, 16) + RS6000_SAVE_AREA))
 
 /* Offset from the stack pointer register to an item dynamically
    allocated on the stack, e.g., by `alloca'.
index aeb4762387f2be60ddcbc0e91478b404d5c31505..9a88a8d9e5e9d30bc79d4e829ce0fd0dc3400094 100644 (file)
@@ -148,12 +148,10 @@ extern int darwin_emit_branch_islands;
 
 /* Pad the outgoing args area to 16 bytes instead of the usual 8.  */
 
-#undef STARTING_FRAME_OFFSET
-#define STARTING_FRAME_OFFSET                                          \
-  (FRAME_GROWS_DOWNWARD                                                        \
-   ? 0                                                                 \
-   : (RS6000_ALIGN (crtl->outgoing_args_size, 16)              \
-      + RS6000_SAVE_AREA))
+#undef RS6000_STARTING_FRAME_OFFSET
+#define RS6000_STARTING_FRAME_OFFSET                                   \
+  (RS6000_ALIGN (crtl->outgoing_args_size, 16)                         \
+   + RS6000_SAVE_AREA)
 
 #undef STACK_DYNAMIC_OFFSET
 #define STACK_DYNAMIC_OFFSET(FUNDECL)                                  \
index 4837e14a0e62d7408cf515e80051ebba610df244..06713ad2b32acddee5936bd46afcff5dde554cde 100644 (file)
@@ -1958,6 +1958,9 @@ static const struct attribute_spec rs6000_attribute_table[] =
 
 #undef TARGET_CONSTANT_ALIGNMENT
 #define TARGET_CONSTANT_ALIGNMENT rs6000_constant_alignment
+
+#undef TARGET_STARTING_FRAME_OFFSET
+#define TARGET_STARTING_FRAME_OFFSET rs6000_starting_frame_offset
 \f
 
 /* Processor table.  */
@@ -39497,6 +39500,16 @@ rs6000_constant_alignment (const_tree exp, HOST_WIDE_INT align)
     return MAX (align, BITS_PER_WORD);
   return align;
 }
+
+/* Implement TARGET_STARTING_FRAME_OFFSET.  */
+
+static HOST_WIDE_INT
+rs6000_starting_frame_offset (void)
+{
+  if (FRAME_GROWS_DOWNWARD)
+    return 0;
+  return RS6000_STARTING_FRAME_OFFSET;
+}
 \f
 struct gcc_target targetm = TARGET_INITIALIZER;
 
index 5a5244aff853077c09779cefc765e077d30f6d26..198110485c893251d90b33b1f780e6eff347dd60 100644 (file)
@@ -1550,15 +1550,13 @@ extern enum reg_class rs6000_constraints[RS6000_CONSTRAINT_MAX];
    sizes of the fixed area and the parameter area must be a multiple of
    STACK_BOUNDARY.  */
 
-#define STARTING_FRAME_OFFSET                                          \
-  (FRAME_GROWS_DOWNWARD                                                        \
-   ? 0                                                                 \
-   : (cfun->calls_alloca                                               \
-      ? (RS6000_ALIGN (crtl->outgoing_args_size + RS6000_SAVE_AREA,    \
-                      (TARGET_ALTIVEC || TARGET_VSX) ? 16 : 8 ))       \
-      : (RS6000_ALIGN (crtl->outgoing_args_size,                       \
-                      (TARGET_ALTIVEC || TARGET_VSX) ? 16 : 8)         \
-        + RS6000_SAVE_AREA)))
+#define RS6000_STARTING_FRAME_OFFSET                                   \
+  (cfun->calls_alloca                                                  \
+   ? (RS6000_ALIGN (crtl->outgoing_args_size + RS6000_SAVE_AREA,       \
+                   (TARGET_ALTIVEC || TARGET_VSX) ? 16 : 8 ))          \
+   : (RS6000_ALIGN (crtl->outgoing_args_size,                          \
+                   (TARGET_ALTIVEC || TARGET_VSX) ? 16 : 8)            \
+      + RS6000_SAVE_AREA))
 
 /* Offset from the stack pointer register to an item dynamically
    allocated on the stack, e.g., by `alloca'.
index 4bc43c2ef5cca6348162522c9a4f32f5fffa3e00..850033c1ee75e557d50788b4ce3cbc1efe82b2bc 100644 (file)
 #define HAS_LONG_UNCOND_BRANCH         0
 
 #define MOVE_MAX                       4
-#define STARTING_FRAME_OFFSET          0
 
 #define HAVE_PRE_DECREMENT             1
 #define HAVE_POST_INCREMENT            1
index 52eee948bdf92e644f944277b19f2ee9eea5db09..15d33906023603e1a4d30a5e9697aa78a167534a 100644 (file)
@@ -590,9 +590,6 @@ extern const enum reg_class regclass_map[FIRST_PSEUDO_REGISTER];
 /* Offset from stack-pointer to first location of outgoing args.  */
 #define STACK_POINTER_OFFSET (TARGET_64BIT ? 160 : 96)
 
-/* Offset within stack frame to start allocating local variables at.  */
-#define STARTING_FRAME_OFFSET 0
-
 /* Offset from the stack pointer register to an item dynamically
    allocated on the stack, e.g., by `alloca'.  */
 #define STACK_DYNAMIC_OFFSET(FUNDECL) \
index 339bf284862abd0811eb7ccaac05e87829484118..f5d80da1451745e990461f5794c360878df62db2 100644 (file)
@@ -1109,10 +1109,6 @@ extern enum reg_class regno_reg_class[FIRST_PSEUDO_REGISTER];
     are at negative offsets from the frame pointer.  */
 #define FRAME_GROWS_DOWNWARD 1
 
-/* Offset from the frame pointer to the first local variable slot to
-   be allocated.  */
-#define STARTING_FRAME_OFFSET  0
-
 /* If we generate an insn to push BYTES bytes,
    this says how many the stack pointer really advances by.  */
 /* Don't define PUSH_ROUNDING, since the hardware doesn't do this.
index d3f002d8198e0a4875fa42a90badedae8fa39c84..a9945e2b13bd62b19daf688c8bf4d3f5eab3f0c2 100644 (file)
@@ -5276,8 +5276,9 @@ sparc_compute_frame_size (HOST_WIDE_INT size, int leaf_function)
     frame_size = apparent_frame_size = 0;
   else
     {
-      /* We subtract STARTING_FRAME_OFFSET, remember it's negative.  */
-      apparent_frame_size = ROUND_UP (size - STARTING_FRAME_OFFSET, 8);
+      /* We subtract TARGET_STARTING_FRAME_OFFSET, remember it's negative.  */
+      apparent_frame_size
+       = ROUND_UP (size - targetm.starting_frame_offset (), 8);
       apparent_frame_size += n_global_fp_regs * 4;
 
       /* We need to add the size of the outgoing argument area.  */
index 9ac741f569be2b07a32b38e608970f1051f31864..a0b56126fd51fe4eedd6677cbac744fb0d443340 100644 (file)
@@ -1043,12 +1043,6 @@ extern char leaf_reg_remap[];
    goes at a more negative offset in the frame.  */
 #define FRAME_GROWS_DOWNWARD 1
 
-/* Offset within stack frame to start allocating local variables at.
-   If FRAME_GROWS_DOWNWARD, this is the offset to the END of the
-   first local allocated.  Otherwise, it is the offset to the BEGINNING
-   of the first local allocated.  */
-#define STARTING_FRAME_OFFSET 0
-
 /* Offset of first parameter from the argument pointer register value.
    !v9: This is 64 for the ins and locals, plus 4 for the struct-return reg
    even if this function isn't going to use it.
index de4aa99f2761e02337735efd91971f3cc306e3ef..cf99b88b6acf29c438311db4e412aa7b35090e88 100644 (file)
@@ -222,8 +222,6 @@ targetm.resolve_overloaded_builtin = spu_resolve_overloaded_builtin;        \
 
 #define FRAME_GROWS_DOWNWARD 1
 
-#define STARTING_FRAME_OFFSET (0)
-
 #define STACK_POINTER_OFFSET 32
 
 #define FIRST_PARM_OFFSET(FNDECL) (0)
index 31d6156cc2676c4240219a907f5f09bad1d3c5bb..3f8a53551757c7a6d00071efde7ba0d302c9d274 100644 (file)
@@ -216,8 +216,6 @@ enum reg_class
 
 #define ARGS_GROW_DOWNWARD 1
 
-#define STARTING_FRAME_OFFSET 0
-
 #define FIRST_PARM_OFFSET(FUNDECL) 0
 
 #define RETURN_ADDR_RTX(COUNT, FRAMEADDR)      \
index 066c34d2155c7b9b648db344385d89f092ad0a56..ea3c1b308c723b2ce0ebeb669c2aee12c65f7829 100644 (file)
@@ -242,7 +242,6 @@ enum reg_class
 
 #define STACK_GROWS_DOWNWARD 1
 #define FRAME_GROWS_DOWNWARD 1
-#define STARTING_FRAME_OFFSET 0
 
 #define DYNAMIC_CHAIN_ADDRESS(FRAME) \
   plus_constant (Pmode, (FRAME), UNITS_PER_WORD)
index 5ab8be49be0909c3f216cf04cf66fa267d4e4a3b..3aa6dc8cd677fba2ba677a64c2b97358562a1fc2 100644 (file)
@@ -205,7 +205,6 @@ enum reg_class
 
 #define STACK_GROWS_DOWNWARD 1
 #define FRAME_GROWS_DOWNWARD 1
-#define STARTING_FRAME_OFFSET 0
 
 #define DYNAMIC_CHAIN_ADDRESS(FRAME) \
   plus_constant (Pmode, (FRAME), UNITS_PER_WORD)
index da096f708b40f09aba518a0f67e6f20e15432c81..5eb2e8828fa187e13f1fe6a551106ed6c60860d2 100644 (file)
@@ -398,13 +398,6 @@ enum reg_class
 
 #define FRAME_GROWS_DOWNWARD 1
 
-/* Offset within stack frame to start allocating local variables at.
-   If FRAME_GROWS_DOWNWARD, this is the offset to the END of the
-   first local allocated.  Otherwise, it is the offset to the BEGINNING
-   of the first local allocated.  */
-
-#define STARTING_FRAME_OFFSET 0
-
 /* Offset of first parameter from the argument pointer register value.  */
 /* Is equal to the size of the saved fp + pc, even if an fp isn't
    saved since the value is used before we know.  */
index 1ff1814cc1a602e8a1161770152ccfe0547485d8..e699c12943c8accee4b477b332fae95bb1370c4e 100644 (file)
@@ -66,10 +66,6 @@ along with GCC; see the file COPYING3.  If not see
                              16))
 
 
-/* Reserve the top of the stack for exception handler stackadj value.  */
-#undef STARTING_FRAME_OFFSET
-#define STARTING_FRAME_OFFSET -4
-
 /* The VAX wants no space between the case instruction and the jump table.  */
 #undef  ASM_OUTPUT_BEFORE_CASE_LABEL
 #define ASM_OUTPUT_BEFORE_CASE_LABEL(FILE, PREFIX, NUM, TABLE)
index 5989607be75bee7149c72a34165e5eebaa61f445..82f13da1c994741aca94748035546fbc15f36f29 100644 (file)
@@ -62,6 +62,7 @@ static void vax_asm_trampoline_template (FILE *);
 static void vax_trampoline_init (rtx, tree, rtx);
 static int vax_return_pops_args (tree, tree, int);
 static bool vax_mode_dependent_address_p (const_rtx, addr_space_t);
+static HOST_WIDE_INT vax_starting_frame_offset (void);
 \f
 /* Initialize the GCC target structure.  */
 #undef TARGET_ASM_ALIGNED_HI_OP
@@ -120,6 +121,9 @@ static bool vax_mode_dependent_address_p (const_rtx, addr_space_t);
 #undef TARGET_OPTION_OVERRIDE
 #define TARGET_OPTION_OVERRIDE vax_option_override
 
+#undef TARGET_STARTING_FRAME_OFFSET
+#define TARGET_STARTING_FRAME_OFFSET vax_starting_frame_offset
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 \f
 /* Set global variables as needed for the options enabled.  */
@@ -208,7 +212,7 @@ vax_expand_prologue (void)
 
   /* Allocate the local stack frame.  */
   size = get_frame_size ();
-  size -= STARTING_FRAME_OFFSET;
+  size -= vax_starting_frame_offset ();
   emit_insn (gen_addsi3 (stack_pointer_rtx,
                         stack_pointer_rtx, GEN_INT (-size)));
 
@@ -2179,3 +2183,12 @@ vax_function_arg_advance (cumulative_args_t cum_v, machine_mode mode,
           ? (GET_MODE_SIZE (mode) + 3) & ~3
           : (int_size_in_bytes (type) + 3) & ~3);
 }
+
+static HOST_WIDE_INT
+vax_starting_frame_offset (void)
+{
+  /* On ELF targets, reserve the top of the stack for exception handler
+     stackadj value.  */
+  return TARGET_ELF ? -4 : 0;
+}
+
index 04a865cfa643ce0ae4854be03993822c9c3e3f27..990140df869337c8e1e3f905c774fbf78a43ca1c 100644 (file)
@@ -228,12 +228,6 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
    goes at a more negative offset in the frame.  */
 #define FRAME_GROWS_DOWNWARD 1
 
-/* Offset within stack frame to start allocating local variables at.
-   If FRAME_GROWS_DOWNWARD, this is the offset to the END of the
-   first local allocated.  Otherwise, it is the offset to the BEGINNING
-   of the first local allocated.  */
-#define STARTING_FRAME_OFFSET 0
-
 /* Given an rtx for the address of a frame,
    return an rtx for the address of the word in the frame
    that holds the dynamic chain--the previous frame's address.  */
index 3cc0bc41280fde7f26f42eeead887a41823e9484..3b229f1a1e61473773608cd170503152b4b758fe 100644 (file)
@@ -727,17 +727,6 @@ enum reg_class
    pointer to a smaller address.  */
 #define STACK_GROWS_DOWNWARD 1
 
-/* `STARTING_FRAME_OFFSET'
-
-   Offset from the frame pointer to the first local variable slot to
-   be allocated.
-
-   If `FRAME_GROWS_DOWNWARD', find the next slot's offset by
-   subtracting the first slot's length from `STARTING_FRAME_OFFSET'.
-   Otherwise, it is found by adding the length of the first slot to
-   the value `STARTING_FRAME_OFFSET'. */
-#define STARTING_FRAME_OFFSET 0
-
 /* `FIRST_PARM_OFFSET (FUNDECL)'
 
    Offset from the argument pointer register to the first argument's
index 3d60e317e6c7b4b793f9b39e1fb464d5ab724b98..1e73b2f4405da25a9766e4271483ca2b9033f159 100644 (file)
@@ -182,6 +182,7 @@ static unsigned int xtensa_hard_regno_nregs (unsigned int, machine_mode);
 static bool xtensa_hard_regno_mode_ok (unsigned int, machine_mode);
 static bool xtensa_modes_tieable_p (machine_mode, machine_mode);
 static HOST_WIDE_INT xtensa_constant_alignment (const_tree, HOST_WIDE_INT);
+static HOST_WIDE_INT xtensa_starting_frame_offset (void);
 
 \f
 
@@ -321,6 +322,9 @@ static HOST_WIDE_INT xtensa_constant_alignment (const_tree, HOST_WIDE_INT);
 #undef TARGET_CONSTANT_ALIGNMENT
 #define TARGET_CONSTANT_ALIGNMENT xtensa_constant_alignment
 
+#undef TARGET_STARTING_FRAME_OFFSET
+#define TARGET_STARTING_FRAME_OFFSET xtensa_starting_frame_offset
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 \f
@@ -4399,4 +4403,14 @@ xtensa_constant_alignment (const_tree exp, HOST_WIDE_INT align)
   return align;
 }
 
+/* Implement TARGET_STARTING_FRAME_OFFSET.  */
+
+static HOST_WIDE_INT
+xtensa_starting_frame_offset (void)
+{
+  if (FRAME_GROWS_DOWNWARD)
+    return 0;
+  return crtl->outgoing_args_size;
+}
+
 #include "gt-xtensa.h"
index f9216391e25c0ab8af39ee2c48585b1d8acba70a..b4cf53708b3eb4a60846cf24003ae7b82f9aee99 100644 (file)
@@ -432,10 +432,6 @@ enum reg_class
 
 #define FRAME_GROWS_DOWNWARD flag_stack_protect
 
-/* Offset within stack frame to start allocating local variables at.  */
-#define STARTING_FRAME_OFFSET                                          \
-  (FRAME_GROWS_DOWNWARD ? 0 : crtl->outgoing_args_size)
-
 /* The ARG_POINTER and FRAME_POINTER are not real Xtensa registers, so
    they are eliminated to either the stack pointer or hard frame pointer.  */
 #define ELIMINABLE_REGS                                                        \
index 8b474160030548d5ca0e371b6274278e81c5a02a..7f67685074650c4f18c87f84c27e31e2f6a9702c 100644 (file)
@@ -1786,11 +1786,11 @@ If @code{FRAME_GROWS_DOWNWARD} is defined to a nonzero value, this points
 to immediately above the first variable on the stack.  Otherwise, it points
 to the first variable on the stack.
 
-@cindex @code{STARTING_FRAME_OFFSET} and virtual registers
+@cindex @code{TARGET_STARTING_FRAME_OFFSET} and virtual registers
 @cindex @code{FRAME_POINTER_REGNUM} and virtual registers
 @code{VIRTUAL_STACK_VARS_REGNUM} is replaced with the sum of the
 register given by @code{FRAME_POINTER_REGNUM} and the value
-@code{STARTING_FRAME_OFFSET}.
+@code{TARGET_STARTING_FRAME_OFFSET}.
 
 @findex VIRTUAL_STACK_DYNAMIC_REGNUM
 @item VIRTUAL_STACK_DYNAMIC_REGNUM
index 03772177d0dee6a55dbe8ffc45d9ec68500f2aaa..8484c1d3602f4eb6a4d219c4028145807f92845b 100644 (file)
@@ -2966,22 +2966,19 @@ Define this macro if successive arguments to a function occupy decreasing
 addresses on the stack.
 @end defmac
 
-@defmac STARTING_FRAME_OFFSET
-Offset from the frame pointer to the first local variable slot to be allocated.
-
-If @code{FRAME_GROWS_DOWNWARD}, find the next slot's offset by
-subtracting the first slot's length from @code{STARTING_FRAME_OFFSET}.
-Otherwise, it is found by adding the length of the first slot to the
-value @code{STARTING_FRAME_OFFSET}.
-@c i'm not sure if the above is still correct.. had to change it to get
-@c rid of an overfull.  --mew 2feb93
-@end defmac
+@deftypefn {Target Hook} HOST_WIDE_INT TARGET_STARTING_FRAME_OFFSET (void)
+This hook returns the offset from the frame pointer to the first local
+variable slot to be allocated.  If @code{FRAME_GROWS_DOWNWARD}, it is the
+offset to @emph{end} of the first slot allocated, otherwise it is the
+offset to @emph{beginning} of the first slot allocated.  The default
+implementation returns 0.
+@end deftypefn
 
 @defmac STACK_ALIGNMENT_NEEDED
 Define to zero to disable final alignment of the stack during reload.
 The nonzero default for this macro is suitable for most ports.
 
-On ports where @code{STARTING_FRAME_OFFSET} is nonzero or where there
+On ports where @code{TARGET_STARTING_FRAME_OFFSET} is nonzero or where there
 is a register save block following the local block that doesn't require
 alignment to @code{STACK_BOUNDARY}, it may be beneficial to disable
 stack alignment and do it in the backend.
index d2cf68fee00867effb2aaac76f8a15a29a3a98f5..015f59eac2e2fba93cbbe7aedc27b1059e37fbc6 100644 (file)
@@ -2411,22 +2411,13 @@ Define this macro if successive arguments to a function occupy decreasing
 addresses on the stack.
 @end defmac
 
-@defmac STARTING_FRAME_OFFSET
-Offset from the frame pointer to the first local variable slot to be allocated.
-
-If @code{FRAME_GROWS_DOWNWARD}, find the next slot's offset by
-subtracting the first slot's length from @code{STARTING_FRAME_OFFSET}.
-Otherwise, it is found by adding the length of the first slot to the
-value @code{STARTING_FRAME_OFFSET}.
-@c i'm not sure if the above is still correct.. had to change it to get
-@c rid of an overfull.  --mew 2feb93
-@end defmac
+@hook TARGET_STARTING_FRAME_OFFSET
 
 @defmac STACK_ALIGNMENT_NEEDED
 Define to zero to disable final alignment of the stack during reload.
 The nonzero default for this macro is suitable for most ports.
 
-On ports where @code{STARTING_FRAME_OFFSET} is nonzero or where there
+On ports where @code{TARGET_STARTING_FRAME_OFFSET} is nonzero or where there
 is a register save block following the local block that doesn't require
 alignment to @code{STACK_BOUNDARY}, it may be beneficial to disable
 stack alignment and do it in the backend.
index 10bcefb2cfe617ae8012b0f1a70bceec7aeca53d..339419ee1da41b882d89ec790caea168d89f4422 100644 (file)
@@ -294,7 +294,7 @@ try_fit_stack_local (HOST_WIDE_INT start, HOST_WIDE_INT length,
   /* Calculate how many bytes the start of local variables is off from
      stack alignment.  */
   frame_alignment = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
-  frame_off = STARTING_FRAME_OFFSET % frame_alignment;
+  frame_off = targetm.starting_frame_offset () % frame_alignment;
   frame_phase = frame_off ? frame_alignment - frame_off : 0;
 
   /* Round the frame offset to the specified alignment.  */
@@ -499,7 +499,7 @@ assign_stack_local_1 (machine_mode mode, HOST_WIDE_INT size,
     addr = plus_constant (Pmode, frame_pointer_rtx,
                          trunc_int_for_mode
                          (slot_offset + bigend_correction
-                          + STARTING_FRAME_OFFSET, Pmode));
+                          + targetm.starting_frame_offset (), Pmode));
   else
     addr = plus_constant (Pmode, virtual_stack_vars_rtx,
                          trunc_int_for_mode
@@ -1930,7 +1930,7 @@ instantiate_virtual_regs (void)
 
   /* Compute the offsets to use for this function.  */
   in_arg_offset = FIRST_PARM_OFFSET (current_function_decl);
-  var_offset = STARTING_FRAME_OFFSET;
+  var_offset = targetm.starting_frame_offset ();
   dynamic_offset = STACK_DYNAMIC_OFFSET (current_function_decl);
   out_arg_offset = STACK_POINTER_OFFSET;
 #ifdef FRAME_POINTER_CFA_OFFSET
index d383926c32933c335bdc392cfe06fe69335b423d..61ff890b45b36813c55ac4e67efdb8c822488fcb 100644 (file)
@@ -259,6 +259,12 @@ hook_uint_void_0 (void)
   return 0;
 }
 
+HOST_WIDE_INT
+hook_hwi_void_0 (void)
+{
+  return 0;
+}
+
 void
 hook_void_tree (tree)
 {
index 711d0e2bf0c75ff34b2d4625fba7f0720b42724d..8dbfd78717f6b7c51d3d2b1b3162b58ed121f31c 100644 (file)
@@ -98,6 +98,8 @@ extern int hook_int_rtx_bool_0 (rtx, bool);
 extern int hook_int_rtx_mode_as_bool_0 (rtx, machine_mode, addr_space_t,
                                        bool);
 
+extern HOST_WIDE_INT hook_hwi_void_0 (void);
+
 extern tree hook_tree_const_tree_null (const_tree);
 extern tree hook_tree_void_null (void);
 
index 27f37166b0354ca225468369f7199ebdb2e5ab92..e2ee2feda93b3122e0d650cb6741991fb4aa68da 100644 (file)
@@ -963,7 +963,7 @@ reload (rtx_insn *first, int global)
             then repeat the elimination bookkeeping.  We don't
             realign when there is no stack, as that will cause a
             stack frame when none is needed should
-            STARTING_FRAME_OFFSET not be already aligned to
+            TARGET_STARTING_FRAME_OFFSET not be already aligned to
             STACK_BOUNDARY.  */
          assign_stack_local (BLKmode, 0, crtl->stack_alignment_needed);
        }
index 92fc7b81cebb44d6722145a17645d1ca9171fa5b..560bfd43c1cfa330c1756de641e5341ebc6003b6 100644 (file)
@@ -551,12 +551,12 @@ rtx_addr_can_trap_p_1 (const_rtx x, HOST_WIDE_INT offset, HOST_WIDE_INT size,
            {
              if (FRAME_GROWS_DOWNWARD)
                {
-                 high_bound = STARTING_FRAME_OFFSET;
+                 high_bound = targetm.starting_frame_offset ();
                  low_bound  = high_bound - get_frame_size ();
                }
              else
                {
-                 low_bound  = STARTING_FRAME_OFFSET;
+                 low_bound  = targetm.starting_frame_offset ();
                  high_bound = low_bound + get_frame_size ();
                }
            }
index f0664e93fc88ca5aebfa6c6619e638dd7e62e346..01bc134d1cca5c97986979fdb43676a5d8cd5748 100644 (file)
@@ -915,7 +915,8 @@ extern void fancy_abort (const char *, int, const char *)
        MODES_TIEABLE_P FUNCTION_ARG_PADDING SLOW_UNALIGNED_ACCESS      \
        HARD_REGNO_NREGS SECONDARY_MEMORY_NEEDED_MODE                   \
        SECONDARY_MEMORY_NEEDED CANNOT_CHANGE_MODE_CLASS                \
-       TRULY_NOOP_TRUNCATION FUNCTION_ARG_OFFSET CONSTANT_ALIGNMENT
+       TRULY_NOOP_TRUNCATION FUNCTION_ARG_OFFSET CONSTANT_ALIGNMENT    \
+       STARTING_FRAME_OFFSET
 
 /* Target macros only used for code built for the target, that have
    moved to libgcc-tm.h or have never been present elsewhere.  */
index aac5d2711a838cd4a19f024fe2c750b96455d2a3..b7dda5b5f2eae899cf35697a79a2de3124e4e3aa 100644 (file)
@@ -5688,6 +5688,16 @@ five otherwise.  This is best for most machines.",
  unsigned int, (void),
  default_case_values_threshold)
 
+DEFHOOK
+(starting_frame_offset,
+ "This hook returns the offset from the frame pointer to the first local\n\
+variable slot to be allocated.  If @code{FRAME_GROWS_DOWNWARD}, it is the\n\
+offset to @emph{end} of the first slot allocated, otherwise it is the\n\
+offset to @emph{beginning} of the first slot allocated.  The default\n\
+implementation returns 0.",
+ HOST_WIDE_INT, (void),
+ hook_hwi_void_0)
+
 /* Optional callback to advise the target to compute the frame layout.  */
 DEFHOOK
 (compute_frame_layout,