* doc/tm.texi.in (TARGET_ASM_MERGEABLE_RODATA_PREFIX): Add hook.
authorbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 13 Jul 2011 13:32:57 +0000 (13:32 +0000)
committerbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 13 Jul 2011 13:32:57 +0000 (13:32 +0000)
* doc/tm.texi: Regenerate.
* target.def (mergeable_rodata_prefix: New defhookpod.
* varasm.c (mergeable_string_section, mergeable_constant_section):
Use it. Allocate name with alloca.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@176235 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/doc/tm.texi
gcc/doc/tm.texi.in
gcc/target.def
gcc/varasm.c

index 8690a1d..7bb3a05 100644 (file)
@@ -1,3 +1,11 @@
+2011-07-13  Bernd Schmidt  <bernds@codesourcery.com>
+
+       * doc/tm.texi.in (TARGET_ASM_MERGEABLE_RODATA_PREFIX): Add hook.
+       * doc/tm.texi: Regenerate.
+       * target.def (mergeable_rodata_prefix: New defhookpod.
+       * varasm.c (mergeable_string_section, mergeable_constant_section):
+       Use it. Allocate name with alloca.
+
 2011-07-13  H.J. Lu  <hongjiu.lu@intel.com>
 
        * doc/invoke.texi (x86): Remove -mfused-madd and add -mfma.
index faf8b6c..08acb35 100644 (file)
@@ -7050,6 +7050,12 @@ if function is in @code{.text.name}, and the normal readonly-data section
 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 d823fae..7990c76 100644 (file)
@@ -6984,6 +6984,8 @@ if function is in @code{.text.name}, and the normal readonly-data section
 otherwise.
 @end deftypefn
 
+@hook TARGET_ASM_MERGEABLE_RODATA_PREFIX
+
 @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 9f03ac9..3a0b413 100644 (file)
@@ -296,6 +296,15 @@ 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,
+ "Usually, the compiler uses the prefix @code{\".rodata\"} to construct\n\
+section names for mergeable constant data.  Define this macro to override\n\
+the string if a different section name should be used.",
+ const char *, ".rodata")
+
 /* Output a constructor for a symbol with a given priority.  */
 DEFHOOK
 (constructor,
index 045d619..8c65696 100644 (file)
@@ -742,7 +742,8 @@ mergeable_string_section (tree decl ATTRIBUTE_UNUSED,
       const char *str;
       HOST_WIDE_INT i;
       int j, unit;
-      char name[30];
+      const char *prefix = targetm.asm_out.mergeable_rodata_prefix;
+      char *name = (char *) alloca (strlen (prefix) + 30);
 
       mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (decl)));
       modesize = GET_MODE_BITSIZE (mode);
@@ -766,8 +767,8 @@ mergeable_string_section (tree decl ATTRIBUTE_UNUSED,
            }
          if (i == len - unit)
            {
-             sprintf (name, ".rodata.str%d.%d", modesize / 8,
-                      (int) (align / 8));
+             sprintf (name, "%s.str%d.%d", prefix,
+                      modesize / 8, (int) (align / 8));
              flags |= (modesize / 8) | SECTION_MERGE | SECTION_STRINGS;
              return get_section (name, flags, NULL);
            }
@@ -794,9 +795,10 @@ mergeable_constant_section (enum machine_mode mode ATTRIBUTE_UNUSED,
       && align <= 256
       && (align & (align - 1)) == 0)
     {
-      char name[24];
+      const char *prefix = targetm.asm_out.mergeable_rodata_prefix;
+      char *name = (char *) alloca (strlen (prefix) + 30);
 
-      sprintf (name, ".rodata.cst%d", (int) (align / 8));
+      sprintf (name, "%s.cst%d", prefix, (int) (align / 8));
       flags |= (align / 8) | SECTION_MERGE;
       return get_section (name, flags, NULL);
     }