Commit 727a65e6 by Bernd Schmidt Committed by Bernd Schmidt

tm.texi.in (TARGET_ASM_MERGEABLE_RODATA_PREFIX): Add hook.

	* 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.

From-SVN: r176235
parent cb77b6cf
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> 2011-07-13 H.J. Lu <hongjiu.lu@intel.com>
* doc/invoke.texi (x86): Remove -mfused-madd and add -mfma. * doc/invoke.texi (x86): Remove -mfused-madd and add -mfma.
......
...@@ -7050,6 +7050,12 @@ if function is in @code{.text.name}, and the normal readonly-data section ...@@ -7050,6 +7050,12 @@ if function is in @code{.text.name}, and the normal readonly-data section
otherwise. otherwise.
@end deftypefn @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}) @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}, 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 should be placed. You can assume that @var{x} is some kind of
......
...@@ -6984,6 +6984,8 @@ if function is in @code{.text.name}, and the normal readonly-data section ...@@ -6984,6 +6984,8 @@ if function is in @code{.text.name}, and the normal readonly-data section
otherwise. otherwise.
@end deftypefn @end deftypefn
@hook TARGET_ASM_MERGEABLE_RODATA_PREFIX
@hook TARGET_ASM_SELECT_RTX_SECTION @hook TARGET_ASM_SELECT_RTX_SECTION
Return the section into which a constant @var{x}, of mode @var{mode}, 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 should be placed. You can assume that @var{x} is some kind of
......
...@@ -296,6 +296,15 @@ DEFHOOK ...@@ -296,6 +296,15 @@ DEFHOOK
section *, (tree decl), section *, (tree decl),
default_function_rodata_section) 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. */ /* Output a constructor for a symbol with a given priority. */
DEFHOOK DEFHOOK
(constructor, (constructor,
......
...@@ -742,7 +742,8 @@ mergeable_string_section (tree decl ATTRIBUTE_UNUSED, ...@@ -742,7 +742,8 @@ mergeable_string_section (tree decl ATTRIBUTE_UNUSED,
const char *str; const char *str;
HOST_WIDE_INT i; HOST_WIDE_INT i;
int j, unit; 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))); mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (decl)));
modesize = GET_MODE_BITSIZE (mode); modesize = GET_MODE_BITSIZE (mode);
...@@ -766,8 +767,8 @@ mergeable_string_section (tree decl ATTRIBUTE_UNUSED, ...@@ -766,8 +767,8 @@ mergeable_string_section (tree decl ATTRIBUTE_UNUSED,
} }
if (i == len - unit) if (i == len - unit)
{ {
sprintf (name, ".rodata.str%d.%d", modesize / 8, sprintf (name, "%s.str%d.%d", prefix,
(int) (align / 8)); modesize / 8, (int) (align / 8));
flags |= (modesize / 8) | SECTION_MERGE | SECTION_STRINGS; flags |= (modesize / 8) | SECTION_MERGE | SECTION_STRINGS;
return get_section (name, flags, NULL); return get_section (name, flags, NULL);
} }
...@@ -794,9 +795,10 @@ mergeable_constant_section (enum machine_mode mode ATTRIBUTE_UNUSED, ...@@ -794,9 +795,10 @@ mergeable_constant_section (enum machine_mode mode ATTRIBUTE_UNUSED,
&& align <= 256 && align <= 256
&& (align & (align - 1)) == 0) && (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; flags |= (align / 8) | SECTION_MERGE;
return get_section (name, flags, NULL); return get_section (name, flags, NULL);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment