The C6X ELF ABI chooses to use ".const" rather than ".rodata" for far-readonly data. This patch adds a target hook to deal with the problem.
Bernd
* doc/tm.texi.in (TARGET_ASM_MERGEABLE_RODATA_PREFIX): Document. * doc/tm.texi: Regenerate. * target.def (mergeable_rodata_prefix: New defhookpod. * varasm.c (mergeable_string_section, mergeable_constant_section): Use it. Index: doc/tm.texi =================================================================== --- doc/tm.texi.orig +++ doc/tm.texi @@ -7024,6 +7024,12 @@ if function is in @code{.text.name}, and otherwise. @end deftypefn +@deftypevr {Target Hook} {const char *} TARGET_ASM_MERGEABLE_RODATA_PREFIX +Usually, the compiler uses the prefix @code{".rodata"} to construct section +names for mergeable constant data. Define this macro to override the string +if a different section name should be used. +@end deftypevr + @deftypefn {Target Hook} {section *} TARGET_ASM_SELECT_RTX_SECTION (enum machine_mode @var{mode}, rtx @var{x}, unsigned HOST_WIDE_INT @var{align}) Return the section into which a constant @var{x}, of mode @var{mode}, should be placed. You can assume that @var{x} is some kind of Index: doc/tm.texi.in =================================================================== --- doc/tm.texi.in.orig +++ doc/tm.texi.in @@ -6976,6 +6976,12 @@ if function is in @code{.text.name}, and otherwise. @end deftypefn +@hook TARGET_ASM_MERGEABLE_RODATA_PREFIX +Usually, the compiler uses the prefix @code{".rodata"} to construct section +names for mergeable constant data. Define this macro to override the string +if a different section name should be used. +@end deftypevr + @hook TARGET_ASM_SELECT_RTX_SECTION Return the section into which a constant @var{x}, of mode @var{mode}, should be placed. You can assume that @var{x} is some kind of Index: target.def =================================================================== --- target.def.orig +++ target.def @@ -296,6 +296,13 @@ DEFHOOK section *, (tree decl), default_function_rodata_section) +/* Nonnull if the target wants to override the default ".rodata" prefix + for mergeable data sections. */ +DEFHOOKPOD +(mergeable_rodata_prefix, + "", + const char *, NULL) + /* Output a constructor for a symbol with a given priority. */ DEFHOOK (constructor, Index: varasm.c =================================================================== --- varasm.c.orig +++ varasm.c @@ -737,7 +737,7 @@ mergeable_string_section (tree decl ATTR const char *str; HOST_WIDE_INT i; int j, unit; - char name[30]; + char name[80]; mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (decl))); modesize = GET_MODE_BITSIZE (mode); @@ -761,8 +761,10 @@ mergeable_string_section (tree decl ATTR } if (i == len - unit) { - sprintf (name, ".rodata.str%d.%d", modesize / 8, - (int) (align / 8)); + sprintf (name, "%s.str%d.%d", + targetm.asm_out.mergeable_rodata_prefix + ? targetm.asm_out.mergeable_rodata_prefix : ".rodata", + modesize / 8, (int) (align / 8)); flags |= (modesize / 8) | SECTION_MERGE | SECTION_STRINGS; return get_section (name, flags, NULL); } @@ -789,9 +791,12 @@ mergeable_constant_section (enum machine && align <= 256 && (align & (align - 1)) == 0) { - char name[24]; + char name[80]; - sprintf (name, ".rodata.cst%d", (int) (align / 8)); + sprintf (name, "%s.cst%d", + targetm.asm_out.mergeable_rodata_prefix + ? targetm.asm_out.mergeable_rodata_prefix : ".rodata", + (int) (align / 8)); flags |= (align / 8) | SECTION_MERGE; return get_section (name, flags, NULL); }