aboutsummaryrefslogtreecommitdiff
path: root/gcc/varasm.c
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2020-12-14 20:10:13 -0800
committerH.J. Lu <hjl.tools@gmail.com>2020-12-16 05:42:08 -0800
commit151d1347c99acfcf0f5bcd8caac36dcc7353816d (patch)
tree34f662e0f712743b0d1c70f1378193d3b0930573 /gcc/varasm.c
parent2a976020603589e897fcfa3276590ef50b489d34 (diff)
downloadgcc-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.c8
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)