diff options
Diffstat (limited to 'gcc/config/spu/spu.c')
| -rw-r--r-- | gcc/config/spu/spu.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/gcc/config/spu/spu.c b/gcc/config/spu/spu.c index 52c8e9c..7e3e687 100644 --- a/gcc/config/spu/spu.c +++ b/gcc/config/spu/spu.c @@ -129,6 +129,7 @@ static unsigned char spu_function_ok_for_sibcall (tree decl, tree exp); static void spu_init_libfuncs (void); static bool spu_return_in_memory (tree type, tree fntype); static void fix_range (const char *); +static void spu_encode_section_info (tree, rtx, int); extern const char *reg_names[]; rtx spu_compare_op0, spu_compare_op1; @@ -244,6 +245,9 @@ const struct attribute_spec spu_attribute_table[]; #undef TARGET_RETURN_IN_MEMORY #define TARGET_RETURN_IN_MEMORY spu_return_in_memory +#undef TARGET_ENCODE_SECTION_INFO +#define TARGET_ENCODE_SECTION_INFO spu_encode_section_info + struct gcc_target targetm = TARGET_INITIALIZER; /* Sometimes certain combinations of command options do not make sense @@ -3178,6 +3182,20 @@ aligned_mem_p (rtx mem) return 0; } +/* Encode symbol attributes (local vs. global, tls model) of a SYMBOL_REF + into its SYMBOL_REF_FLAGS. */ +static void +spu_encode_section_info (tree decl, rtx rtl, int first) +{ + default_encode_section_info (decl, rtl, first); + + /* If a variable has a forced alignment to < 16 bytes, mark it with + SYMBOL_FLAG_ALIGN1. */ + if (TREE_CODE (decl) == VAR_DECL + && DECL_USER_ALIGN (decl) && DECL_ALIGN (decl) < 128) + SYMBOL_REF_FLAGS (XEXP (rtl, 0)) |= SYMBOL_FLAG_ALIGN1; +} + /* Return TRUE if we are certain the mem refers to a complete object which is both 16-byte aligned and padded to a 16-byte boundary. This would make it safe to store with a single instruction. |
