diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2020-12-14 20:10:13 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2020-12-16 05:42:08 -0800 |
commit | 151d1347c99acfcf0f5bcd8caac36dcc7353816d (patch) | |
tree | 34f662e0f712743b0d1c70f1378193d3b0930573 /gcc/varasm.c | |
parent | 2a976020603589e897fcfa3276590ef50b489d34 (diff) | |
download | gcc-151d1347c99acfcf0f5bcd8caac36dcc7353816d.zip gcc-151d1347c99acfcf0f5bcd8caac36dcc7353816d.tar.gz gcc-151d1347c99acfcf0f5bcd8caac36dcc7353816d.tar.bz2 |
Require .init_array/.fini_array support for SHF_GNU_RETAIN
Since SHF_GNU_RETAIN support doesn't work for crtstuff.c which switches
the output section directly with asm statement:
---
static void __attribute__((used))
__do_global_dtors_aux (void)
{
static _Bool completed;
if (__builtin_expect (completed, 0))
return;
completed = 1;
}
static void __attribute__((__used__))
call___do_global_dtors_aux (void)
{
asm ("\t.section\t.fini");
__do_global_dtors_aux ();
asm ("\t.section\t.text");
}
---
use SHF_GNU_RETAIN only if .init_array/.fini_array section is supported.
gcc/
PR target/98146
* defaults.h (SUPPORTS_SHF_GNU_RETAIN): New.
* varasm.c (get_section): Replace HAVE_GAS_SHF_GNU_RETAIN with
SUPPORTS_SHF_GNU_RETAIN.
(resolve_unique_section): Likewise.
(get_variable_section): Likewise.
(switch_to_section): Likewise.
gcc/testsuite/
PR target/98146
* lib/target-supports.exp
(check_effective_target_R_flag_in_section): Also check
HAVE_INITFINI_ARRAY_SUPPORT != 0.
Diffstat (limited to 'gcc/varasm.c')
-rw-r--r-- | gcc/varasm.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/gcc/varasm.c b/gcc/varasm.c index a1a8d3b..267a052 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -297,7 +297,7 @@ get_section (const char *name, unsigned int flags, tree decl, slot = section_htab->find_slot_with_hash (name, htab_hash_string (name), INSERT); flags |= SECTION_NAMED; - if (HAVE_GAS_SHF_GNU_RETAIN + if (SUPPORTS_SHF_GNU_RETAIN && decl != nullptr && DECL_P (decl) && DECL_PRESERVE_P (decl)) @@ -487,7 +487,7 @@ resolve_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED, if (DECL_SECTION_NAME (decl) == NULL && targetm_common.have_named_sections && (flag_function_or_data_sections - || (HAVE_GAS_SHF_GNU_RETAIN && DECL_PRESERVE_P (decl)) + || (SUPPORTS_SHF_GNU_RETAIN && DECL_PRESERVE_P (decl)) || DECL_COMDAT_GROUP (decl))) { targetm.asm_out.unique_section (decl, reloc); @@ -1227,7 +1227,7 @@ get_variable_section (tree decl, bool prefer_noswitch_p) vnode->get_constructor (); if (DECL_COMMON (decl) - && !(HAVE_GAS_SHF_GNU_RETAIN && DECL_PRESERVE_P (decl))) + && !(SUPPORTS_SHF_GNU_RETAIN && DECL_PRESERVE_P (decl))) { /* If the decl has been given an explicit section name, or it resides in a non-generic address space, then it isn't common, and shouldn't @@ -7756,7 +7756,7 @@ switch_to_section (section *new_section, tree decl) { if (in_section == new_section) { - if (HAVE_GAS_SHF_GNU_RETAIN + if (SUPPORTS_SHF_GNU_RETAIN && (new_section->common.flags & SECTION_NAMED) && decl != nullptr && DECL_P (decl) |