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
This commit is contained in:
Roland McGrath 2018-05-05 23:35:25 +00:00 committed by Roland McGrath
parent 212513950c
commit f9ede95714
2 changed files with 45 additions and 9 deletions

View file

@ -1,3 +1,16 @@
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>
PR target/85653

View file

@ -296,6 +296,17 @@ get_section (const char *name, unsigned int flags, tree decl)
else
{
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
&& ((sect->common.flags | flags) & SECTION_OVERRIDE) == 0)
{
@ -6360,15 +6371,23 @@ default_section_type_flags (tree decl, const char *name, int reloc)
|| strncmp (name, ".gnu.linkonce.tb.", 17) == 0)
flags |= SECTION_TLS | SECTION_BSS;
/* These three sections have special ELF types. They are neither
SHT_PROGBITS nor SHT_NOBITS, so when changing sections we don't
want to print a section type (@progbits or @nobits). If someone
is silly enough to emit code or TLS variables to one of these
sections, then don't handle them specially. */
if (!(flags & (SECTION_CODE | SECTION_BSS | SECTION_TLS))
&& (strcmp (name, ".init_array") == 0
|| strcmp (name, ".fini_array") == 0
|| strcmp (name, ".preinit_array") == 0))
/* Various sections have special ELF types that the assembler will
assign by default based on the name. They are neither SHT_PROGBITS
nor SHT_NOBITS, so when changing sections we don't want to print a
section type (@progbits or @nobits). Rather than duplicating the
assembler's knowledge of what those special name patterns are, just
let the assembler choose the type if we don't know a specific
reason to set it to something other than the default. SHT_PROGBITS
is the default for sections whose name is not specially known to
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;
return 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);
/* 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))
{
const char *type;