aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <richard@codesourcery.com>2007-02-05 10:38:46 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2007-02-05 10:38:46 +0000
commit5cd0f9153d5ae7d646006fc21bb967de4e262d8d (patch)
tree0564697bf3a64211ba6d737dea5a615ec299e0f2
parent4fe70b3151497166c316c45e5eec842f9de3a3f2 (diff)
downloadgcc-5cd0f9153d5ae7d646006fc21bb967de4e262d8d.zip
gcc-5cd0f9153d5ae7d646006fc21bb967de4e262d8d.tar.gz
gcc-5cd0f9153d5ae7d646006fc21bb967de4e262d8d.tar.bz2
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
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/config/m68k/m68k.h10
-rw-r--r--gcc/doc/tm.texi12
-rw-r--r--gcc/dwarf2out.c28
4 files changed, 45 insertions, 18 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f458ac7..ad824be 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/config/m68k/m68k.h b/gcc/config/m68k/m68k.h
index 39a5878..d832564 100644
--- a/gcc/config/m68k/m68k.h
+++ b/gcc/config/m68k/m68k.h
@@ -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
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index 7c2eca5..c9f6cb8 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -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
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 861ede5..6cbf9d3 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -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)
}
}
+ if (!wrote_return_column)
+ init_return_column_size (mode, mem, DWARF_FRAME_RETURN_COLUMN);
+
#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;
+ init_return_column_size (mode, mem, DWARF_ALT_FRAME_RETURN_COLUMN);
#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 */