This patch adds a target macro to allow a backend to override the size
of a dwarf frame register.  This is already supported to some extent
by allowing the HARD_REGNO_CALL_PART_CLOBBERED to reduce the size of
a specific register to only that which is saved.  However, for the
new MIPS O32 FP64 ABI extension I need more control.

The standard MIPS O32 ABI has 32-bit floating point-registers which
are saved as pairs to form 64-bit values.  The FP64 extension widens
all floating-point registers to 64-bit but only saves the even numbered
registers thus not increasing the callee-saved state.  In order to
support interlinking between the standard O32 ABI and the extension I
must keep the layout of the frame information the same.  The dwarf
frame registers are therefore re-interpreted to refer to the low and
high parts of even numbered 64-bit registers rather than 32 32-bit
registers.  To achieve this I must artificially reduce the size of the
frame registers for the widened 64-bit registers down to 32-bit but
cannot use the HARD_REGNO_CALL_PART_CLOBBERED macro to achieve this.

Thanks,
Matthew

gcc/
        * dwarf2cfi (DWARF_REG_MODE): Define with default implementation.
        (expand_builtin_init_dwarf_reg_sizes): Use DWARF_REG_MODE.
        * doc/tm.texi.in (DWARF_REG_MODE): Document.
        * doc/tm.texi: Regenerate.
---
 gcc/doc/tm.texi.in | 9 +++++++++
 gcc/dwarf2cfi.c    | 5 +++++
 2 files changed, 14 insertions(+)

diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
index dd72b98..71799f7 100644
--- a/gcc/doc/tm.texi.in
+++ b/gcc/doc/tm.texi.in
@@ -2809,6 +2809,12 @@ in DWARF 2 debug information.  The default is zero.  A 
different value
 may reduce the size of debug information on some ports.
 @end defmac
 
+@defmac DWARF_REG_MODE (@var{N}, @var{mode})
+If defined, a C expression whose value is a mode that should be used
+to represent the @var{N}th DWARF frame register.  By default this is
+the same @var{mode} as the hard register it relates to.
+@end defmac
+
 @node Exception Handling
 @subsection Exception Handling Support
 @cindex exception handling
diff --git a/gcc/dwarf2cfi.c b/gcc/dwarf2cfi.c
index 85cfb60..163db5d 100644
--- a/gcc/dwarf2cfi.c
+++ b/gcc/dwarf2cfi.c
@@ -252,6 +252,10 @@ init_return_column_size (enum machine_mode mode, rtx mem, 
unsigned int c)
                  gen_int_mode (size, mode));
 }
 
+#ifndef DWARF_REG_MODE
+#define DWARF_REG_MODE(REGNO, MODE) (MODE)
+#endif
+
 /* Generate code to initialize the register size table.  */
 
 void
@@ -276,6 +280,7 @@ expand_builtin_init_dwarf_reg_sizes (tree address)
 
          if (HARD_REGNO_CALL_PART_CLOBBERED (i, save_mode))
            save_mode = choose_hard_reg_mode (i, 1, true);
+         save_mode = DWARF_REG_MODE (i, save_mode);
          if (dnum == DWARF_FRAME_RETURN_COLUMN)
            {
              if (save_mode == VOIDmode)
-- 
1.9.4

Reply via email to