re PR target/51872 (Shrink-wrapping with -mminimal-toc causes bootstrap failure)

PR bootstrap/51872
	* hard-reg-set.h (struct hard_reg_set_container): New type.
	* target.h (struct hard_reg_set_container): Forward declare.
	* target.def (set_up_by_prologue): New target hook.
	* doc/tm.texi.in (TARGET_SET_UP_BY_PROLOGUE): Document it.
	* doc/tm.texi: Regenerated.
	* function.c (thread_prologue_and_epilogue_insns): Change
	set_up_by_prologue HARD_REG_SET into struct hard_reg_set_container.
	Call targetm.set_up_by_prologue on it.
	* config/rs6000/rs6000.c (rs6000_set_up_by_prologue): New function.
	(TARGET_SET_UP_BY_PROLOGUE): Redefine to it.

From-SVN: r183254
This commit is contained in:
Jakub Jelinek 2012-01-17 17:21:49 +01:00 committed by Jakub Jelinek
parent 3b4f05ec1e
commit ee3d2ecdc5
8 changed files with 72 additions and 14 deletions

View File

@ -1,3 +1,17 @@
2012-01-17 Jakub Jelinek <jakub@redhat.com>
PR bootstrap/51872
* hard-reg-set.h (struct hard_reg_set_container): New type.
* target.h (struct hard_reg_set_container): Forward declare.
* target.def (set_up_by_prologue): New target hook.
* doc/tm.texi.in (TARGET_SET_UP_BY_PROLOGUE): Document it.
* doc/tm.texi: Regenerated.
* function.c (thread_prologue_and_epilogue_insns): Change
set_up_by_prologue HARD_REG_SET into struct hard_reg_set_container.
Call targetm.set_up_by_prologue on it.
* config/rs6000/rs6000.c (rs6000_set_up_by_prologue): New function.
(TARGET_SET_UP_BY_PROLOGUE): Redefine to it.
2012-01-17 Nick Clifton <nickc@redhat.com> 2012-01-17 Nick Clifton <nickc@redhat.com>
* config/rx/rx.c (rx_can_use_simple_return): New function. * config/rx/rx.c (rx_can_use_simple_return): New function.

View File

@ -1227,6 +1227,7 @@ static bool rs6000_cannot_force_const_mem (enum machine_mode, rtx);
static bool rs6000_legitimate_constant_p (enum machine_mode, rtx); static bool rs6000_legitimate_constant_p (enum machine_mode, rtx);
static bool rs6000_save_toc_in_prologue_p (void); static bool rs6000_save_toc_in_prologue_p (void);
static void rs6000_code_end (void) ATTRIBUTE_UNUSED; static void rs6000_code_end (void) ATTRIBUTE_UNUSED;
static void rs6000_set_up_by_prologue (struct hard_reg_set_container *);
/* Hash table stuff for keeping track of TOC entries. */ /* Hash table stuff for keeping track of TOC entries. */
@ -1392,6 +1393,9 @@ static const struct attribute_spec rs6000_attribute_table[] =
#define TARGET_ASM_ASSEMBLE_VISIBILITY rs6000_assemble_visibility #define TARGET_ASM_ASSEMBLE_VISIBILITY rs6000_assemble_visibility
#endif #endif
#undef TARGET_SET_UP_BY_PROLOGUE
#define TARGET_SET_UP_BY_PROLOGUE rs6000_set_up_by_prologue
#undef TARGET_HAVE_TLS #undef TARGET_HAVE_TLS
#define TARGET_HAVE_TLS HAVE_AS_TLS #define TARGET_HAVE_TLS HAVE_AS_TLS
@ -27903,6 +27907,19 @@ rs6000_code_end (void)
current_function_decl = NULL; current_function_decl = NULL;
} }
/* Add r30 to hard reg set if the prologue sets it up and it is not
pic_offset_table_rtx. */
static void
rs6000_set_up_by_prologue (struct hard_reg_set_container *set)
{
if (!TARGET_SINGLE_PIC_BASE
&& TARGET_TOC
&& TARGET_MINIMAL_TOC
&& get_pool_size () != 0)
add_to_hard_reg_set (&set->set, Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
}
struct gcc_target targetm = TARGET_INITIALIZER; struct gcc_target targetm = TARGET_INITIALIZER;
#include "gt-rs6000.h" #include "gt-rs6000.h"

View File

@ -1,5 +1,5 @@
@c Copyright (C) 1988,1989,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001, @c Copyright (C) 1988,1989,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,
@c 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 @c 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
@c Free Software Foundation, Inc. @c Free Software Foundation, Inc.
@c This is part of the GCC manual. @c This is part of the GCC manual.
@c For copying conditions, see the file gcc.texi. @c For copying conditions, see the file gcc.texi.
@ -4959,6 +4959,10 @@ TARGET_STRUCT_VALUE_RTX, FRAME_POINTER_REGNUM, EH_USES,
FRAME_POINTER_REGNUM, ARG_POINTER_REGNUM, and the PIC_OFFSET_TABLE_REGNUM. FRAME_POINTER_REGNUM, ARG_POINTER_REGNUM, and the PIC_OFFSET_TABLE_REGNUM.
@end deftypefn @end deftypefn
@deftypefn {Target Hook} void TARGET_SET_UP_BY_PROLOGUE (struct hard_reg_set_container *@var{})
This hook should add additional registers that are computed by the prologue to the hard regset for shrink-wrapping optimization purposes.
@end deftypefn
@node Stack Smashing Protection @node Stack Smashing Protection
@subsection Stack smashing protection @subsection Stack smashing protection
@cindex stack smashing protection @cindex stack smashing protection

View File

@ -1,5 +1,5 @@
@c Copyright (C) 1988,1989,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001, @c Copyright (C) 1988,1989,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,
@c 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 @c 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
@c Free Software Foundation, Inc. @c Free Software Foundation, Inc.
@c This is part of the GCC manual. @c This is part of the GCC manual.
@c For copying conditions, see the file gcc.texi. @c For copying conditions, see the file gcc.texi.
@ -4906,6 +4906,8 @@ TARGET_STRUCT_VALUE_RTX, FRAME_POINTER_REGNUM, EH_USES,
FRAME_POINTER_REGNUM, ARG_POINTER_REGNUM, and the PIC_OFFSET_TABLE_REGNUM. FRAME_POINTER_REGNUM, ARG_POINTER_REGNUM, and the PIC_OFFSET_TABLE_REGNUM.
@end deftypefn @end deftypefn
@hook TARGET_SET_UP_BY_PROLOGUE
@node Stack Smashing Protection @node Stack Smashing Protection
@subsection Stack smashing protection @subsection Stack smashing protection
@cindex stack smashing protection @cindex stack smashing protection

View File

@ -1,7 +1,7 @@
/* Expands front end tree to back end RTL for GCC. /* Expands front end tree to back end RTL for GCC.
Copyright (C) 1987, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, Copyright (C) 1987, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
2010, 2011 Free Software Foundation, Inc. 2010, 2011, 2012 Free Software Foundation, Inc.
This file is part of GCC. This file is part of GCC.
@ -5899,7 +5899,7 @@ thread_prologue_and_epilogue_insns (void)
&& nonempty_prologue && !crtl->calls_eh_return) && nonempty_prologue && !crtl->calls_eh_return)
{ {
HARD_REG_SET prologue_clobbered, prologue_used, live_on_edge; HARD_REG_SET prologue_clobbered, prologue_used, live_on_edge;
HARD_REG_SET set_up_by_prologue; struct hard_reg_set_container set_up_by_prologue;
rtx p_insn; rtx p_insn;
VEC(basic_block, heap) *vec; VEC(basic_block, heap) *vec;
basic_block bb; basic_block bb;
@ -5939,18 +5939,22 @@ thread_prologue_and_epilogue_insns (void)
vec = VEC_alloc (basic_block, heap, n_basic_blocks); vec = VEC_alloc (basic_block, heap, n_basic_blocks);
CLEAR_HARD_REG_SET (set_up_by_prologue); CLEAR_HARD_REG_SET (set_up_by_prologue.set);
add_to_hard_reg_set (&set_up_by_prologue, Pmode, STACK_POINTER_REGNUM); add_to_hard_reg_set (&set_up_by_prologue.set, Pmode,
add_to_hard_reg_set (&set_up_by_prologue, Pmode, ARG_POINTER_REGNUM); STACK_POINTER_REGNUM);
add_to_hard_reg_set (&set_up_by_prologue.set, Pmode, ARG_POINTER_REGNUM);
if (frame_pointer_needed) if (frame_pointer_needed)
add_to_hard_reg_set (&set_up_by_prologue, Pmode, add_to_hard_reg_set (&set_up_by_prologue.set, Pmode,
HARD_FRAME_POINTER_REGNUM); HARD_FRAME_POINTER_REGNUM);
if (pic_offset_table_rtx) if (pic_offset_table_rtx)
add_to_hard_reg_set (&set_up_by_prologue, Pmode, add_to_hard_reg_set (&set_up_by_prologue.set, Pmode,
PIC_OFFSET_TABLE_REGNUM); PIC_OFFSET_TABLE_REGNUM);
if (stack_realign_drap && crtl->drap_reg) if (stack_realign_drap && crtl->drap_reg)
add_to_hard_reg_set (&set_up_by_prologue, GET_MODE (crtl->drap_reg), add_to_hard_reg_set (&set_up_by_prologue.set,
GET_MODE (crtl->drap_reg),
REGNO (crtl->drap_reg)); REGNO (crtl->drap_reg));
if (targetm.set_up_by_prologue)
targetm.set_up_by_prologue (&set_up_by_prologue);
/* We don't use a different max size depending on /* We don't use a different max size depending on
optimize_bb_for_speed_p because increasing shrink-wrapping optimize_bb_for_speed_p because increasing shrink-wrapping
@ -5968,7 +5972,7 @@ thread_prologue_and_epilogue_insns (void)
if (NONDEBUG_INSN_P (insn)) if (NONDEBUG_INSN_P (insn))
{ {
if (requires_stack_frame_p (insn, prologue_used, if (requires_stack_frame_p (insn, prologue_used,
set_up_by_prologue)) set_up_by_prologue.set))
{ {
if (bb == entry_edge->dest) if (bb == entry_edge->dest)
goto fail_shrinkwrap; goto fail_shrinkwrap;

View File

@ -1,6 +1,6 @@
/* Sets (bit vectors) of hard registers, and operations on them. /* Sets (bit vectors) of hard registers, and operations on them.
Copyright (C) 1987, 1992, 1994, 2000, 2003, 2004, 2005, 2007, 2008, 2009, Copyright (C) 1987, 1992, 1994, 2000, 2003, 2004, 2005, 2007, 2008, 2009,
2010 Free Software Foundation, Inc. 2010, 2012 Free Software Foundation, Inc.
This file is part of GCC This file is part of GCC
@ -54,6 +54,14 @@ typedef HARD_REG_ELT_TYPE HARD_REG_SET[HARD_REG_SET_LONGS];
#endif #endif
/* HARD_REG_SET wrapped into a structure, to make it possible to
use HARD_REG_SET even in APIs that should not include
hard-reg-set.h. */
struct hard_reg_set_container
{
HARD_REG_SET set;
};
/* HARD_CONST is used to cast a constant to the appropriate type /* HARD_CONST is used to cast a constant to the appropriate type
for use with a HARD_REG_SET. */ for use with a HARD_REG_SET. */

View File

@ -1,6 +1,6 @@
/* Target hook definitions. /* Target hook definitions.
Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
2011 2011, 2012
Free Software Foundation, Inc. Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
@ -2644,6 +2644,14 @@ DEFHOOK
void, (bitmap regs), void, (bitmap regs),
hook_void_bitmap) hook_void_bitmap)
/* Fill in additional registers set up by prologue into a regset. */
DEFHOOK
(set_up_by_prologue,
"This hook should add additional registers that are computed by the prologue\
to the hard regset for shrink-wrapping optimization purposes.",
void, (struct hard_reg_set_container *),
NULL)
/* Determine the type of unwind info to emit for debugging. */ /* Determine the type of unwind info to emit for debugging. */
DEFHOOK DEFHOOK
(debug_unwind_info, (debug_unwind_info,

View File

@ -1,6 +1,6 @@
/* Data structure definitions for a generic GCC target. /* Data structure definitions for a generic GCC target.
Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
2011 2011, 2012
Free Software Foundation, Inc. Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify it This program is free software; you can redistribute it and/or modify it
@ -92,6 +92,7 @@ extern bool target_default_pointer_address_modes_p (void);
struct stdarg_info; struct stdarg_info;
struct spec_info_def; struct spec_info_def;
struct hard_reg_set_container;
/* The struct used by the secondary_reload target hook. */ /* The struct used by the secondary_reload target hook. */
typedef struct secondary_reload_info typedef struct secondary_reload_info