]> git.ipfire.org Git - thirdparty/gcc.git/commit
Require .init_array/.fini_array support for SHF_GNU_RETAIN
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 15 Dec 2020 04:10:13 +0000 (20:10 -0800)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 16 Dec 2020 13:42:08 +0000 (05:42 -0800)
commit151d1347c99acfcf0f5bcd8caac36dcc7353816d
tree34f662e0f712743b0d1c70f1378193d3b0930573
parent2a976020603589e897fcfa3276590ef50b489d34
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.
gcc/defaults.h
gcc/testsuite/lib/target-supports.exp
gcc/varasm.c