diff mbox

C6X port 7/11: Cope with odd section names

Message ID 4DC95CDA.3000909@codesourcery.com
State New
Headers show

Commit Message

Bernd Schmidt May 10, 2011, 3:42 p.m. UTC
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.

Comments

Joseph Myers May 10, 2011, 4:55 p.m. UTC | #1
On Tue, 10 May 2011, Bernd Schmidt wrote:

> 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

Unless the documentation is based on pre-existing GFDL-only documentation 
in tm.texi.in, it's preferable for the documentation of a new hook to go 
in the doc string in target.def and get to tm.texi that way, rather than 
putting it directly in tm.texi.in.  (So you'd put the @hook in tm.texi.in, 
but not the main body of the documentation for the hook.)

> +/* Nonnull if the target wants to override the default ".rodata" prefix
> +   for mergeable data sections.  */
> +DEFHOOKPOD
> +(mergeable_rodata_prefix,
> + "",
> + const char *, NULL)

A default of ".rodata" instead of NULL would seem to simplify the rest of 
the patch.

> -      char name[30];
> +      char name[80];

There seems to be some undocumented requirement on the maximum length of 
the string named by the hook, to avoid buffer overruns with these 
fixed-size buffers.  Consider using alloca (or asprintf to avoid needing 
to work out manually how much to add to the length of the string, but then 
you need to free things before returning) to avoid such an undocumented 
bound.
diff mbox

Patch

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