Commit f9ede957 by Roland McGrath Committed by Roland McGrath

PR other/77609: Let the assembler choose ELF section types for miscellaneous named sections

gcc/
	PR other/77609
	* varasm.c (default_section_type_flags): Set SECTION_NOTYPE for
	any section for which we don't know a specific type it should have,
	regardless of name.  Previously this was done only for the exact
	names ".init_array", ".fini_array", and ".preinit_array".
	(default_elf_asm_named_section): Add comment about
	relationship with default_section_type_flags and SECTION_NOTYPE.
	(get_section): Don't consider it a type conflict if one side has
	SECTION_NOTYPE and the other doesn't, as long as neither has the
	SECTION_BSS et al used in the default_section_type_flags logic.

From-SVN: r259969
parent 21251395
2018-05-05 Roland McGrath <mcgrathr@google.com>
PR other/77609
* varasm.c (default_section_type_flags): Set SECTION_NOTYPE for
any section for which we don't know a specific type it should have,
regardless of name. Previously this was done only for the exact
names ".init_array", ".fini_array", and ".preinit_array".
(default_elf_asm_named_section): Add comment about
relationship with default_section_type_flags and SECTION_NOTYPE.
(get_section): Don't consider it a type conflict if one side has
SECTION_NOTYPE and the other doesn't, as long as neither has the
SECTION_BSS et al used in the default_section_type_flags logic.
2018-05-05 Tom de Vries <tom@codesourcery.com> 2018-05-05 Tom de Vries <tom@codesourcery.com>
PR target/85653 PR target/85653
......
...@@ -296,6 +296,17 @@ get_section (const char *name, unsigned int flags, tree decl) ...@@ -296,6 +296,17 @@ get_section (const char *name, unsigned int flags, tree decl)
else else
{ {
sect = *slot; sect = *slot;
/* It is fine if one of the sections has SECTION_NOTYPE as long as
the other has none of the contrary flags (see the logic at the end
of default_section_type_flags, below). */
if (((sect->common.flags ^ flags) & SECTION_NOTYPE)
&& !((sect->common.flags | flags)
& (SECTION_CODE | SECTION_BSS | SECTION_TLS | SECTION_ENTSIZE
| (HAVE_COMDAT_GROUP ? SECTION_LINKONCE : 0))))
{
sect->common.flags |= SECTION_NOTYPE;
flags |= SECTION_NOTYPE;
}
if ((sect->common.flags & ~SECTION_DECLARED) != flags if ((sect->common.flags & ~SECTION_DECLARED) != flags
&& ((sect->common.flags | flags) & SECTION_OVERRIDE) == 0) && ((sect->common.flags | flags) & SECTION_OVERRIDE) == 0)
{ {
...@@ -6360,15 +6371,23 @@ default_section_type_flags (tree decl, const char *name, int reloc) ...@@ -6360,15 +6371,23 @@ default_section_type_flags (tree decl, const char *name, int reloc)
|| strncmp (name, ".gnu.linkonce.tb.", 17) == 0) || strncmp (name, ".gnu.linkonce.tb.", 17) == 0)
flags |= SECTION_TLS | SECTION_BSS; flags |= SECTION_TLS | SECTION_BSS;
/* These three sections have special ELF types. They are neither /* Various sections have special ELF types that the assembler will
SHT_PROGBITS nor SHT_NOBITS, so when changing sections we don't assign by default based on the name. They are neither SHT_PROGBITS
want to print a section type (@progbits or @nobits). If someone nor SHT_NOBITS, so when changing sections we don't want to print a
is silly enough to emit code or TLS variables to one of these section type (@progbits or @nobits). Rather than duplicating the
sections, then don't handle them specially. */ assembler's knowledge of what those special name patterns are, just
if (!(flags & (SECTION_CODE | SECTION_BSS | SECTION_TLS)) let the assembler choose the type if we don't know a specific
&& (strcmp (name, ".init_array") == 0 reason to set it to something other than the default. SHT_PROGBITS
|| strcmp (name, ".fini_array") == 0 is the default for sections whose name is not specially known to
|| strcmp (name, ".preinit_array") == 0)) the assembler, so it does no harm to leave the choice to the
assembler when @progbits is the best thing we know to use. If
someone is silly enough to emit code or TLS variables to one of
these sections, then don't handle them specially.
default_elf_asm_named_section (below) handles the BSS, TLS, ENTSIZE, and
LINKONCE cases when NOTYPE is not set, so leave those to its logic. */
if (!(flags & (SECTION_CODE | SECTION_BSS | SECTION_TLS | SECTION_ENTSIZE))
&& !(HAVE_COMDAT_GROUP && (flags & SECTION_LINKONCE)))
flags |= SECTION_NOTYPE; flags |= SECTION_NOTYPE;
return flags; return flags;
...@@ -6454,6 +6473,10 @@ default_elf_asm_named_section (const char *name, unsigned int flags, ...@@ -6454,6 +6473,10 @@ default_elf_asm_named_section (const char *name, unsigned int flags,
fprintf (asm_out_file, "\t.section\t%s,\"%s\"", name, flagchars); fprintf (asm_out_file, "\t.section\t%s,\"%s\"", name, flagchars);
/* default_section_type_flags (above) knows which flags need special
handling here, and sets NOTYPE when none of these apply so that the
assembler's logic for default types can apply to user-chosen
section names. */
if (!(flags & SECTION_NOTYPE)) if (!(flags & SECTION_NOTYPE))
{ {
const char *type; const char *type;
......
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