From: H.J. Lu Date: Tue, 15 Dec 2020 04:10:13 +0000 (-0800) Subject: Require .init_array/.fini_array support for SHF_GNU_RETAIN X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=151d1347c99acfcf0f5bcd8caac36dcc7353816d;p=gcc.git 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. --- diff --git a/gcc/defaults.h b/gcc/defaults.h index f1a38626624..80a84dde2d6 100644 --- a/gcc/defaults.h +++ b/gcc/defaults.h @@ -286,6 +286,17 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #endif #endif +/* This determines whether or not we support marking sections with + SHF_GNU_RETAIN flag. Also require .init_array/.fini_array section + for constructors and destructors. */ +#ifndef SUPPORTS_SHF_GNU_RETAIN +#if HAVE_GAS_SHF_GNU_RETAIN && HAVE_INITFINI_ARRAY_SUPPORT +#define SUPPORTS_SHF_GNU_RETAIN 1 +#else +#define SUPPORTS_SHF_GNU_RETAIN 0 +#endif +#endif + /* This determines whether or not we support link-once semantics. */ #ifndef SUPPORTS_ONE_ONLY #ifdef MAKE_DECL_ONE_ONLY diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp index 3c02f763e7e..11343d0192f 100644 --- a/gcc/testsuite/lib/target-supports.exp +++ b/gcc/testsuite/lib/target-supports.exp @@ -10840,7 +10840,7 @@ proc check_effective_target_R_flag_in_section { } { set f [open $src "w"] puts $f "#include \"../../auto-host.h\"" - puts $f "#if HAVE_GAS_SHF_GNU_RETAIN == 0" + puts $f "#if HAVE_GAS_SHF_GNU_RETAIN == 0 || HAVE_INITFINI_ARRAY_SUPPORT == 0" puts $f "# error Assembler does not support 'R' flag in .section directive." puts $f "#endif" close $f diff --git a/gcc/varasm.c b/gcc/varasm.c index a1a8d3bd73e..267a052331d 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)