Commit 5cd0f915 by Richard Sandiford Committed by Richard Sandiford

tm.texi (DWARF_ALT_FRAME_RETURN_COLUMN): Do not require…

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
parent 4fe70b31
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> 2007-02-04 Zdenek Dvorak <dvorakz@suse.cz>
* cfgcleanup.c (try_optimize_cfg): Avoid removing ENTRY_BLOCK_PTR. * cfgcleanup.c (try_optimize_cfg): Avoid removing ENTRY_BLOCK_PTR.
......
...@@ -1092,7 +1092,15 @@ do { if (cc_prev_status.flags & CC_IN_68881) \ ...@@ -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 /* We must not use the DBX register numbers for the DWARF 2 CFA column
numbers because that maps to numbers beyond FIRST_PSEUDO_REGISTER. numbers because that maps to numbers beyond FIRST_PSEUDO_REGISTER.
Instead use the identity mapping. */ 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). */ /* Before the prologue, the top of the frame is at 4(%sp). */
#define INCOMING_FRAME_SP_OFFSET 4 #define INCOMING_FRAME_SP_OFFSET 4
......
...@@ -3092,10 +3092,14 @@ If this RTL is a @code{REG}, you should also define ...@@ -3092,10 +3092,14 @@ If this RTL is a @code{REG}, you should also define
@defmac DWARF_ALT_FRAME_RETURN_COLUMN @defmac DWARF_ALT_FRAME_RETURN_COLUMN
A C expression whose value is an integer giving a DWARF 2 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 number that may be used as an alternative return column. The column
be defined only if @code{DWARF_FRAME_RETURN_COLUMN} is set to a must not correspond to any gcc hard register (that is, it must not
general register, but an alternate column needs to be used for be in the range of @code{DWARF_FRAME_REGNUM}).
signal frames.
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 @end defmac
@defmac DWARF_ZERO_REG @defmac DWARF_ZERO_REG
......
...@@ -443,6 +443,17 @@ stripattributes (const char *s) ...@@ -443,6 +443,17 @@ stripattributes (const char *s)
return stripped; 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. */ /* Generate code to initialize the register size table. */
void void
...@@ -481,21 +492,12 @@ expand_builtin_init_dwarf_reg_sizes (tree address) ...@@ -481,21 +492,12 @@ expand_builtin_init_dwarf_reg_sizes (tree address)
} }
} }
if (!wrote_return_column)
init_return_column_size (mode, mem, DWARF_FRAME_RETURN_COLUMN);
#ifdef DWARF_ALT_FRAME_RETURN_COLUMN #ifdef DWARF_ALT_FRAME_RETURN_COLUMN
gcc_assert (wrote_return_column); init_return_column_size (mode, mem, DWARF_ALT_FRAME_RETURN_COLUMN);
i = DWARF_ALT_FRAME_RETURN_COLUMN;
wrote_return_column = false;
#else
i = DWARF_FRAME_RETURN_COLUMN;
#endif #endif
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));
}
} }
/* Convert a DWARF call frame info. operation to its string name */ /* Convert a DWARF call frame info. operation to its string name */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment