tm.texi (DWARF_ALT_FRAME_RETURN_COLUMN): Do not require DWARF_FRAME_RETURN_COLUMN to be a general register.

gcc/
	* doc/tm.texi (DWARF_ALT_FRAME_RETURN_COLUMN): Do not require
	DWARF_FRAME_RETURN_COLUMN to be a general register.
	* dwarf2out.c (init_return_column_size): New function, split from...
	(expand_builtin_init_dwarf_reg_sizes): ...here.  Allow both
	DWARF_FRAME_RETURN_COLUMN and DWARF_ALT_FRAME_RETURN_COLUMN
	to be nongeneral registers.
	* config/m68k/m68k.h (DWARF_FRAME_REGNUM): Only map FP and
	integer registers.
	(DWARF_FRAME_REGISTERS, DWARF_FRAME_RETURN_COLUMN): Define.
	(DWARF_ALT_FRAME_RETURN_COLUMN): Define.

From-SVN: r121593
This commit is contained in:
Richard Sandiford 2007-02-05 10:38:46 +00:00 committed by Richard Sandiford
parent 4fe70b3151
commit 5cd0f9153d
4 changed files with 46 additions and 19 deletions

View File

@ -1,3 +1,16 @@
2007-02-05 Richard Sandiford <richard@codesourcery.com>
* doc/tm.texi (DWARF_ALT_FRAME_RETURN_COLUMN): Do not require
DWARF_FRAME_RETURN_COLUMN to be a general register.
* dwarf2out.c (init_return_column_size): New function, split from...
(expand_builtin_init_dwarf_reg_sizes): ...here. Allow both
DWARF_FRAME_RETURN_COLUMN and DWARF_ALT_FRAME_RETURN_COLUMN
to be nongeneral registers.
* config/m68k/m68k.h (DWARF_FRAME_REGNUM): Only map FP and
integer registers.
(DWARF_FRAME_REGISTERS, DWARF_FRAME_RETURN_COLUMN): Define.
(DWARF_ALT_FRAME_RETURN_COLUMN): Define.
2007-02-04 Zdenek Dvorak <dvorakz@suse.cz>
* cfgcleanup.c (try_optimize_cfg): Avoid removing ENTRY_BLOCK_PTR.

View File

@ -1092,7 +1092,15 @@ do { if (cc_prev_status.flags & CC_IN_68881) \
/* We must not use the DBX register numbers for the DWARF 2 CFA column
numbers because that maps to numbers beyond FIRST_PSEUDO_REGISTER.
Instead use the identity mapping. */
#define DWARF_FRAME_REGNUM(REG) REG
#define DWARF_FRAME_REGNUM(REG) \
(INT_REGNO_P (REG) || FP_REGNO_P (REG) ? (REG) : INVALID_REGNUM)
/* The return column was originally 24, but gcc used 25 for a while too.
Define both registers 24 and 25 as Pmode ones and use 24 in our own
unwind information. */
#define DWARF_FRAME_REGISTERS 25
#define DWARF_FRAME_RETURN_COLUMN 24
#define DWARF_ALT_FRAME_RETURN_COLUMN 25
/* Before the prologue, the top of the frame is at 4(%sp). */
#define INCOMING_FRAME_SP_OFFSET 4

View File

@ -3092,10 +3092,14 @@ If this RTL is a @code{REG}, you should also define
@defmac DWARF_ALT_FRAME_RETURN_COLUMN
A C expression whose value is an integer giving a DWARF 2 column
number that may be used as an alternate return column. This should
be defined only if @code{DWARF_FRAME_RETURN_COLUMN} is set to a
general register, but an alternate column needs to be used for
signal frames.
number that may be used as an alternative return column. The column
must not correspond to any gcc hard register (that is, it must not
be in the range of @code{DWARF_FRAME_REGNUM}).
This macro can be useful if @code{DWARF_FRAME_RETURN_COLUMN} is set to a
general register, but an alternative column needs to be used for signal
frames. Some targets have also used different frame return columns
over time.
@end defmac
@defmac DWARF_ZERO_REG

View File

@ -443,6 +443,17 @@ stripattributes (const char *s)
return stripped;
}
/* MEM is a memory reference for the register size table, each element of
which has mode MODE. Initialize column C as a return address column. */
static void
init_return_column_size (enum machine_mode mode, rtx mem, unsigned int c)
{
HOST_WIDE_INT offset = c * GET_MODE_SIZE (mode);
HOST_WIDE_INT size = GET_MODE_SIZE (Pmode);
emit_move_insn (adjust_address (mem, mode, offset), GEN_INT (size));
}
/* Generate code to initialize the register size table. */
void
@ -481,21 +492,12 @@ expand_builtin_init_dwarf_reg_sizes (tree address)
}
}
#ifdef DWARF_ALT_FRAME_RETURN_COLUMN
gcc_assert (wrote_return_column);
i = DWARF_ALT_FRAME_RETURN_COLUMN;
wrote_return_column = false;
#else
i = DWARF_FRAME_RETURN_COLUMN;
#endif
if (!wrote_return_column)
init_return_column_size (mode, mem, DWARF_FRAME_RETURN_COLUMN);
if (! wrote_return_column)
{
enum machine_mode save_mode = Pmode;
HOST_WIDE_INT offset = i * GET_MODE_SIZE (mode);
HOST_WIDE_INT size = GET_MODE_SIZE (save_mode);
emit_move_insn (adjust_address (mem, mode, offset), GEN_INT (size));
}
#ifdef DWARF_ALT_FRAME_RETURN_COLUMN
init_return_column_size (mode, mem, DWARF_ALT_FRAME_RETURN_COLUMN);
#endif
}
/* Convert a DWARF call frame info. operation to its string name */