Convert MEMBER_TYPE_FORCES_BLK to target hook
* stor-layout.c (compute_record_mode): Replace MEMBER_TYPE_FORCES_BLK with targetm.member_type_forces_blk. (layout_type): Likewise. * system.h: Poison MEMBER_TYPE_FORCES_BLK. * target.def (member_type_forces_blk): New target hook. * targhooks.c (default_member_type_forces_blk): New. * targhooks.h (default_member_type_forces_blk): Likewise. * doc/tm.texi.in (MEMBER_TYPE_FORCES_BLK): Removed. (TARGET_MEMBER_TYPE_FORCES_BLK): New hook. * doc/tm.texi: Regenerated. * config/ia64/hpux.h (MEMBER_TYPE_FORCES_BLK): Removed. * config/ia64/ia64.c (ia64_member_type_forces_blk): New function. (TARGET_MEMBER_TYPE_FORCES_BLK): New macro. * config/rs6000/rs6000.c (TARGET_MEMBER_TYPE_FORCES_BLK): New macro. (rs6000_member_type_forces_blk): New function. * config/rs6000/rs6000.h (MEMBER_TYPE_FORCES_BLK): Removed. * config/xtensa/xtensa.c (xtensa_member_type_forces_blk): New function. (TARGET_MEMBER_TYPE_FORCES_BLK): New macro. * config/xtensa/xtensa.h (MEMBER_TYPE_FORCES_BLK): Removed. From-SVN: r190488
This commit is contained in:
parent
4a8f754619
commit
d9886a9e04
|
@ -1,3 +1,38 @@
|
|||
2012-08-17 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* stor-layout.c (compute_record_mode): Replace
|
||||
MEMBER_TYPE_FORCES_BLK with targetm.member_type_forces_blk.
|
||||
(layout_type): Likewise.
|
||||
|
||||
* system.h: Poison MEMBER_TYPE_FORCES_BLK.
|
||||
|
||||
* target.def (member_type_forces_blk): New target hook.
|
||||
|
||||
* targhooks.c (default_member_type_forces_blk): New.
|
||||
* targhooks.h (default_member_type_forces_blk): Likewise.
|
||||
|
||||
* doc/tm.texi.in (MEMBER_TYPE_FORCES_BLK): Removed.
|
||||
(TARGET_MEMBER_TYPE_FORCES_BLK): New hook.
|
||||
* doc/tm.texi: Regenerated.
|
||||
|
||||
* config/ia64/hpux.h (MEMBER_TYPE_FORCES_BLK): Removed.
|
||||
|
||||
* config/ia64/ia64.c (ia64_member_type_forces_blk): New
|
||||
function.
|
||||
(TARGET_MEMBER_TYPE_FORCES_BLK): New macro.
|
||||
|
||||
* config/rs6000/rs6000.c (TARGET_MEMBER_TYPE_FORCES_BLK): New
|
||||
macro.
|
||||
(rs6000_member_type_forces_blk): New function.
|
||||
|
||||
* config/rs6000/rs6000.h (MEMBER_TYPE_FORCES_BLK): Removed.
|
||||
|
||||
* config/xtensa/xtensa.c (xtensa_member_type_forces_blk): New
|
||||
function.
|
||||
(TARGET_MEMBER_TYPE_FORCES_BLK): New macro.
|
||||
|
||||
* config/xtensa/xtensa.h (MEMBER_TYPE_FORCES_BLK): Removed.
|
||||
|
||||
2012-08-17 Diego Novillo <dnovillo@google.com>
|
||||
|
||||
PR bootstrap/54281
|
||||
|
|
|
@ -115,9 +115,6 @@ do { \
|
|||
#define TARGET_DEFAULT \
|
||||
(MASK_DWARF2_ASM | MASK_BIG_ENDIAN | MASK_ILP32)
|
||||
|
||||
/* ??? Might not be needed anymore. */
|
||||
#define MEMBER_TYPE_FORCES_BLK(FIELD, MODE) ((MODE) == TFmode)
|
||||
|
||||
/* ASM_OUTPUT_EXTERNAL_LIBCALL defaults to just a globalize_label call,
|
||||
but that doesn't put out the @function type information which causes
|
||||
shared library problems. */
|
||||
|
|
|
@ -319,6 +319,7 @@ static const char *ia64_invalid_binary_op (int, const_tree, const_tree);
|
|||
static enum machine_mode ia64_c_mode_for_suffix (char);
|
||||
static void ia64_trampoline_init (rtx, tree, rtx);
|
||||
static void ia64_override_options_after_change (void);
|
||||
static bool ia64_member_type_forces_blk (const_tree, enum machine_mode);
|
||||
|
||||
static tree ia64_builtin_decl (unsigned, bool);
|
||||
|
||||
|
@ -570,6 +571,9 @@ static const struct attribute_spec ia64_attribute_table[] =
|
|||
#undef TARGET_GET_RAW_ARG_MODE
|
||||
#define TARGET_GET_RAW_ARG_MODE ia64_get_reg_raw_mode
|
||||
|
||||
#undef TARGET_MEMBER_TYPE_FORCES_BLK
|
||||
#define TARGET_MEMBER_TYPE_FORCES_BLK ia64_member_type_forces_blk
|
||||
|
||||
#undef TARGET_GIMPLIFY_VA_ARG_EXPR
|
||||
#define TARGET_GIMPLIFY_VA_ARG_EXPR ia64_gimplify_va_arg
|
||||
|
||||
|
@ -11153,6 +11157,15 @@ ia64_get_reg_raw_mode (int regno)
|
|||
return default_get_reg_raw_mode(regno);
|
||||
}
|
||||
|
||||
/* Implement TARGET_MEMBER_TYPE_FORCES_BLK. ??? Might not be needed
|
||||
anymore. */
|
||||
|
||||
bool
|
||||
ia64_member_type_forces_blk (const_tree, enum machine_mode mode)
|
||||
{
|
||||
return TARGET_HPUX && mode == TFmode;
|
||||
}
|
||||
|
||||
/* Always default to .text section until HP-UX linker is fixed. */
|
||||
|
||||
ATTRIBUTE_UNUSED static section *
|
||||
|
|
|
@ -1302,6 +1302,9 @@ static const struct attribute_spec rs6000_attribute_table[] =
|
|||
#undef TARGET_INIT_DWARF_REG_SIZES_EXTRA
|
||||
#define TARGET_INIT_DWARF_REG_SIZES_EXTRA rs6000_init_dwarf_reg_sizes_extra
|
||||
|
||||
#undef TARGET_MEMBER_TYPE_FORCES_BLK
|
||||
#define TARGET_MEMBER_TYPE_FORCES_BLK rs6000_member_type_forces_blk
|
||||
|
||||
/* On rs6000, function arguments are promoted, as are function return
|
||||
values. */
|
||||
#undef TARGET_PROMOTE_FUNCTION_MODE
|
||||
|
@ -7259,6 +7262,26 @@ rs6000_emit_move (rtx dest, rtx source, enum machine_mode mode)
|
|||
emit_set:
|
||||
emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1]));
|
||||
}
|
||||
|
||||
/* Return true if a structure, union or array containing FIELD should be
|
||||
accessed using `BLKMODE'.
|
||||
|
||||
For the SPE, simd types are V2SI, and gcc can be tempted to put the
|
||||
entire thing in a DI and use subregs to access the internals.
|
||||
store_bit_field() will force (subreg:DI (reg:V2SI x))'s to the
|
||||
back-end. Because a single GPR can hold a V2SI, but not a DI, the
|
||||
best thing to do is set structs to BLKmode and avoid Severe Tire
|
||||
Damage.
|
||||
|
||||
On e500 v2, DF and DI modes suffer from the same anomaly. DF can
|
||||
fit into 1, whereas DI still needs two. */
|
||||
|
||||
static bool
|
||||
rs6000_member_type_forces_blk (const_tree field, enum machine_mode mode)
|
||||
{
|
||||
return ((TARGET_SPE && TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE)
|
||||
|| (TARGET_E500_DOUBLE && mode == DFmode));
|
||||
}
|
||||
|
||||
/* Nonzero if we can use a floating-point register to pass this arg. */
|
||||
#define USE_FP_FOR_ARG_P(CUM,MODE,TYPE) \
|
||||
|
|
|
@ -695,22 +695,6 @@ extern unsigned rs6000_pointer_size;
|
|||
/* Every structure's size must be a multiple of this. */
|
||||
#define STRUCTURE_SIZE_BOUNDARY 8
|
||||
|
||||
/* Return 1 if a structure or array containing FIELD should be
|
||||
accessed using `BLKMODE'.
|
||||
|
||||
For the SPE, simd types are V2SI, and gcc can be tempted to put the
|
||||
entire thing in a DI and use subregs to access the internals.
|
||||
store_bit_field() will force (subreg:DI (reg:V2SI x))'s to the
|
||||
back-end. Because a single GPR can hold a V2SI, but not a DI, the
|
||||
best thing to do is set structs to BLKmode and avoid Severe Tire
|
||||
Damage.
|
||||
|
||||
On e500 v2, DF and DI modes suffer from the same anomaly. DF can
|
||||
fit into 1, whereas DI still needs two. */
|
||||
#define MEMBER_TYPE_FORCES_BLK(FIELD, MODE) \
|
||||
((TARGET_SPE && TREE_CODE (TREE_TYPE (FIELD)) == VECTOR_TYPE) \
|
||||
|| (TARGET_E500_DOUBLE && (MODE) == DFmode))
|
||||
|
||||
/* A bit-field declared as `int' forces `int' alignment for the struct. */
|
||||
#define PCC_BITFIELD_TYPE_MATTERS 1
|
||||
|
||||
|
|
|
@ -175,6 +175,9 @@ static reg_class_t xtensa_secondary_reload (bool, rtx, reg_class_t,
|
|||
static bool constantpool_address_p (const_rtx addr);
|
||||
static bool xtensa_legitimate_constant_p (enum machine_mode, rtx);
|
||||
|
||||
static bool xtensa_member_type_forces_blk (const_tree,
|
||||
enum machine_mode mode);
|
||||
|
||||
static const int reg_nonleaf_alloc_order[FIRST_PSEUDO_REGISTER] =
|
||||
REG_ALLOC_ORDER;
|
||||
|
||||
|
@ -210,6 +213,9 @@ static const int reg_nonleaf_alloc_order[FIRST_PSEUDO_REGISTER] =
|
|||
#undef TARGET_ADDRESS_COST
|
||||
#define TARGET_ADDRESS_COST hook_int_rtx_bool_0
|
||||
|
||||
#undef TARGET_MEMBER_TYPE_FORCES_BLK
|
||||
#define TARGET_MEMBER_TYPE_FORCES_BLK xtensa_member_type_forces_blk
|
||||
|
||||
#undef TARGET_BUILD_BUILTIN_VA_LIST
|
||||
#define TARGET_BUILD_BUILTIN_VA_LIST xtensa_build_builtin_va_list
|
||||
|
||||
|
@ -2738,6 +2744,18 @@ xtensa_return_addr (int count, rtx frame)
|
|||
return result;
|
||||
}
|
||||
|
||||
/* Disable the use of word-sized or smaller complex modes for structures,
|
||||
and for function arguments in particular, where they cause problems with
|
||||
register a7. The xtensa_copy_incoming_a7 function assumes that there is
|
||||
a single reference to an argument in a7, but with small complex modes the
|
||||
real and imaginary components may be extracted separately, leading to two
|
||||
uses of the register, only one of which would be replaced. */
|
||||
|
||||
static bool
|
||||
xtensa_member_type_forces_blk (const_tree, enum machine_mode mode)
|
||||
{
|
||||
return mode == CQImode || mode == CHImode;
|
||||
}
|
||||
|
||||
/* Create the va_list data type.
|
||||
|
||||
|
|
|
@ -165,15 +165,6 @@ extern unsigned xtensa_current_frame_size;
|
|||
bitfields and the structures that contain them. */
|
||||
#define PCC_BITFIELD_TYPE_MATTERS 1
|
||||
|
||||
/* Disable the use of word-sized or smaller complex modes for structures,
|
||||
and for function arguments in particular, where they cause problems with
|
||||
register a7. The xtensa_copy_incoming_a7 function assumes that there is
|
||||
a single reference to an argument in a7, but with small complex modes the
|
||||
real and imaginary components may be extracted separately, leading to two
|
||||
uses of the register, only one of which would be replaced. */
|
||||
#define MEMBER_TYPE_FORCES_BLK(FIELD, MODE) \
|
||||
((MODE) == CQImode || (MODE) == CHImode)
|
||||
|
||||
/* Align string constants and constructors to at least a word boundary.
|
||||
The typical use of this macro is to increase alignment for string
|
||||
constants to be word aligned so that 'strcpy' calls that copy
|
||||
|
|
|
@ -1262,9 +1262,9 @@ these accesses should use the bitfield container type.
|
|||
The default is @code{!TARGET_STRICT_ALIGN}.
|
||||
@end deftypefn
|
||||
|
||||
@defmac MEMBER_TYPE_FORCES_BLK (@var{field}, @var{mode})
|
||||
Return 1 if a structure or array containing @var{field} should be accessed using
|
||||
@code{BLKMODE}.
|
||||
@deftypefn {Target Hook} bool TARGET_MEMBER_TYPE_FORCES_BLK (const_tree @var{field}, enum machine_mode @var{mode})
|
||||
Return true if a structure, union or array containing @var{field} should
|
||||
be accessed using @code{BLKMODE}.
|
||||
|
||||
If @var{field} is the only field in the structure, @var{mode} is its
|
||||
mode, otherwise @var{mode} is VOIDmode. @var{mode} is provided in the
|
||||
|
@ -1272,7 +1272,7 @@ case where structures of one field would require the structure's mode to
|
|||
retain the field's mode.
|
||||
|
||||
Normally, this is not needed.
|
||||
@end defmac
|
||||
@end deftypefn
|
||||
|
||||
@defmac ROUND_TYPE_ALIGN (@var{type}, @var{computed}, @var{specified})
|
||||
Define this macro as an expression for the alignment of a type (given
|
||||
|
|
|
@ -1240,9 +1240,9 @@ these accesses should use the bitfield container type.
|
|||
The default is @code{!TARGET_STRICT_ALIGN}.
|
||||
@end deftypefn
|
||||
|
||||
@defmac MEMBER_TYPE_FORCES_BLK (@var{field}, @var{mode})
|
||||
Return 1 if a structure or array containing @var{field} should be accessed using
|
||||
@code{BLKMODE}.
|
||||
@hook TARGET_MEMBER_TYPE_FORCES_BLK
|
||||
Return true if a structure, union or array containing @var{field} should
|
||||
be accessed using @code{BLKMODE}.
|
||||
|
||||
If @var{field} is the only field in the structure, @var{mode} is its
|
||||
mode, otherwise @var{mode} is VOIDmode. @var{mode} is provided in the
|
||||
|
@ -1250,7 +1250,7 @@ case where structures of one field would require the structure's mode to
|
|||
retain the field's mode.
|
||||
|
||||
Normally, this is not needed.
|
||||
@end defmac
|
||||
@end deftypefn
|
||||
|
||||
@defmac ROUND_TYPE_ALIGN (@var{type}, @var{computed}, @var{specified})
|
||||
Define this macro as an expression for the alignment of a type (given
|
||||
|
|
|
@ -1627,13 +1627,10 @@ compute_record_mode (tree type)
|
|||
if (simple_cst_equal (TYPE_SIZE (type), DECL_SIZE (field)))
|
||||
mode = DECL_MODE (field);
|
||||
|
||||
#ifdef MEMBER_TYPE_FORCES_BLK
|
||||
/* With some targets, eg. c4x, it is sub-optimal
|
||||
to access an aligned BLKmode structure as a scalar. */
|
||||
|
||||
if (MEMBER_TYPE_FORCES_BLK (field, mode))
|
||||
/* With some targets, it is sub-optimal to access an aligned
|
||||
BLKmode structure as a scalar. */
|
||||
if (targetm.member_type_forces_blk (field, mode))
|
||||
return;
|
||||
#endif /* MEMBER_TYPE_FORCES_BLK */
|
||||
}
|
||||
|
||||
/* If we only have one real field; use its mode if that mode's size
|
||||
|
@ -2270,9 +2267,7 @@ layout_type (tree type)
|
|||
TYPE_USER_ALIGN (type) = TYPE_USER_ALIGN (element);
|
||||
SET_TYPE_MODE (type, BLKmode);
|
||||
if (TYPE_SIZE (type) != 0
|
||||
#ifdef MEMBER_TYPE_FORCES_BLK
|
||||
&& ! MEMBER_TYPE_FORCES_BLK (type, VOIDmode)
|
||||
#endif
|
||||
&& ! targetm.member_type_forces_blk (type, VOIDmode)
|
||||
/* BLKmode elements force BLKmode aggregate;
|
||||
else extract/store fields may lose. */
|
||||
&& (TYPE_MODE (TREE_TYPE (type)) != BLKmode
|
||||
|
|
|
@ -808,7 +808,7 @@ extern void fancy_abort (const char *, int, const char *) ATTRIBUTE_NORETURN;
|
|||
CAN_DEBUG_WITHOUT_FP UNLIKELY_EXECUTED_TEXT_SECTION_NAME \
|
||||
HOT_TEXT_SECTION_NAME LEGITIMATE_CONSTANT_P ALWAYS_STRIP_DOTDOT \
|
||||
OUTPUT_ADDR_CONST_EXTRA SMALL_REGISTER_CLASSES ASM_OUTPUT_IDENT \
|
||||
ASM_BYTE_OP
|
||||
ASM_BYTE_OP MEMBER_TYPE_FORCES_BLK
|
||||
|
||||
/* Target macros only used for code built for the target, that have
|
||||
moved to libgcc-tm.h or have never been present elsewhere. */
|
||||
|
|
|
@ -2332,6 +2332,14 @@ DEFHOOK
|
|||
tree, (tree type, tree expr),
|
||||
hook_tree_tree_tree_null)
|
||||
|
||||
/* True if a structure, union or array with MODE containing FIELD should
|
||||
be accessed using BLKmode. */
|
||||
DEFHOOK
|
||||
(member_type_forces_blk,
|
||||
"",
|
||||
bool, (const_tree field, enum machine_mode mode),
|
||||
default_member_type_forces_blk)
|
||||
|
||||
/* Return the class for a secondary reload, and fill in extra information. */
|
||||
DEFHOOK
|
||||
(secondary_reload,
|
||||
|
|
|
@ -1513,4 +1513,12 @@ default_pch_valid_p (const void *data_p, size_t len)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/* Default version of member_type_forces_blk. */
|
||||
|
||||
bool
|
||||
default_member_type_forces_blk (const_tree, enum machine_mode)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
#include "gt-targhooks.h"
|
||||
|
|
|
@ -189,3 +189,4 @@ extern const char *default_pch_valid_p (const void *, size_t);
|
|||
|
||||
extern void default_asm_output_ident_directive (const char*);
|
||||
|
||||
extern bool default_member_type_forces_blk (const_tree, enum machine_mode);
|
||||
|
|
Loading…
Reference in New Issue