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