2010-08-19 Joseph Myers <joseph@codesourcery.com>
gcc/
* doc/tm.texi.in (PIC_OFFSET_TABLE_REG_CALL_CLOBBERED): Document to
be zero or nonzero.
* doc/tm.texi: Regenerate.
* defaults.h (PIC_OFFSET_TABLE_REG_CALL_CLOBBERED): Define.
* df-scan.c (df_get_exit_block_use_set), reginfo.c
(init_reg_sets_1), rtlanal.c (rtx_unstable_p, rtx_varies_p):
Handle new PIC_OFFSET_TABLE_REG_CALL_CLOBBERED semantics.
* config/ia64/ia64.h (PIC_OFFSET_TABLE_REG_CALL_CLOBBERED): Define
to 1.
---
src/gcc-mainline/gcc/config/ia64/ia64.h | 2 +-
src/gcc-mainline/gcc/defaults.h | 4 ++++
src/gcc-mainline/gcc/df-scan.c | 5 ++---
src/gcc-mainline/gcc/doc/tm.texi | 5 +++--
src/gcc-mainline/gcc/doc/tm.texi.in | 5 +++--
src/gcc-mainline/gcc/reginfo.c | 5 ++---
src/gcc-mainline/gcc/rtlanal.c | 9 ++-------
7 files changed, 17 insertions(+), 18 deletions(-)
@@ -1359,7 +1359,7 @@ do { \
/* Define this macro if the register defined by `PIC_OFFSET_TABLE_REGNUM' is
clobbered by calls. */
-#define PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
+#define PIC_OFFSET_TABLE_REG_CALL_CLOBBERED 1
/* The Overall Framework of an Assembler File. */
@@ -722,6 +722,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#define PIC_OFFSET_TABLE_REGNUM INVALID_REGNUM
#endif
+#ifndef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
+#define PIC_OFFSET_TABLE_REG_CALL_CLOBBERED 0
+#endif
+
#ifndef TARGET_DLLIMPORT_DECL_ATTRIBUTES
#define TARGET_DLLIMPORT_DECL_ATTRIBUTES 0
#endif
@@ -4032,14 +4032,13 @@ df_get_exit_block_use_set (bitmap exit_block_uses)
#endif
}
-#ifndef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
/* Many architectures have a GP register even without flag_pic.
Assume the pic register is not in use, or will be handled by
other means, if it is not fixed. */
- if ((unsigned) PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
+ if (!PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
+ && (unsigned) PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
&& fixed_regs[PIC_OFFSET_TABLE_REGNUM])
bitmap_set_bit (exit_block_uses, PIC_OFFSET_TABLE_REGNUM);
-#endif
/* Mark all global registers, and all registers used by the
epilogue as being live at the end of the function since they
@@ -7128,8 +7128,9 @@ when @code{flag_pic} is true).
@end defmac
@defmac PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
-Define this macro if the register defined by
-@code{PIC_OFFSET_TABLE_REGNUM} is clobbered by calls. Do not define
+A C expression that is nonzero if the register defined by
+@code{PIC_OFFSET_TABLE_REGNUM} is clobbered by calls. If not defined,
+the default is zero. Do not define
this macro if @code{PIC_OFFSET_TABLE_REGNUM} is not defined.
@end defmac
@@ -7123,8 +7123,9 @@ when @code{flag_pic} is true).
@end defmac
@defmac PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
-Define this macro if the register defined by
-@code{PIC_OFFSET_TABLE_REGNUM} is clobbered by calls. Do not define
+A C expression that is nonzero if the register defined by
+@code{PIC_OFFSET_TABLE_REGNUM} is clobbered by calls. If not defined,
+the default is zero. Do not define
this macro if @code{PIC_OFFSET_TABLE_REGNUM} is not defined.
@end defmac
@@ -495,10 +495,9 @@ init_reg_sets_1 (void)
else if (i == ARG_POINTER_REGNUM && fixed_regs[i])
;
#endif
-#ifndef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
- else if (i == (unsigned) PIC_OFFSET_TABLE_REGNUM && fixed_regs[i])
+ else if (!PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
+ && i == (unsigned) PIC_OFFSET_TABLE_REGNUM && fixed_regs[i])
;
-#endif
else if (CALL_REALLY_USED_REGNO_P (i))
{
SET_HARD_REG_BIT (regs_invalidated_by_call, i);
@@ -118,13 +118,11 @@ rtx_unstable_p (const_rtx x)
/* The arg pointer varies if it is not a fixed register. */
|| (x == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM]))
return 0;
-#ifndef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
/* ??? When call-clobbered, the value is stable modulo the restore
that must happen after a call. This currently screws up local-alloc
into believing that the restore is not needed. */
- if (x == pic_offset_table_rtx)
+ if (!PIC_OFFSET_TABLE_REG_CALL_CLOBBERED && x == pic_offset_table_rtx)
return 0;
-#endif
return 1;
case ASM_OPERANDS:
@@ -197,14 +195,11 @@ rtx_varies_p (const_rtx x, bool for_alias)
|| (x == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM]))
return 0;
if (x == pic_offset_table_rtx
-#ifdef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
/* ??? When call-clobbered, the value is stable modulo the restore
that must happen after a call. This currently screws up
local-alloc into believing that the restore is not needed, so we
must return 0 only if we are called from alias analysis. */
- && for_alias
-#endif
- )
+ && (!PIC_OFFSET_TABLE_REG_CALL_CLOBBERED || for_alias))
return 0;
return 1;