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);
     }

Reply via email to