diff --git a/gcc/defaults.h b/gcc/defaults.h index f1a38626624456fad90acab8871497f4a7b7cc00..80a84dde2d6665dabfe5e2b62322a3b3ea92ae32 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 3c02f763e7e0963505b7d487cc74e6a235695bf2..11343d0192fcb7d38c3b994c0a6062c2ab79d075 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 a1a8d3bd73e698e983ab5a0bde5ec03c13a9533c..267a052331d8fbd76711ef2e4f492682396b97a1 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)