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:
parent
212513950c
commit
f9ede95714
2 changed files with 45 additions and 9 deletions
|
@ -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
|
||||
|
|
41
gcc/varasm.c
41
gcc/varasm.c
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue