Use SHF_GNU_RETAIN to preserve symbol definitions
authorH.J. Lu <hjl.tools@gmail.com>
Mon, 3 Feb 2020 19:55:43 +0000 (11:55 -0800)
committerH.J. Lu <hjl.tools@gmail.com>
Wed, 2 Dec 2020 00:42:50 +0000 (16:42 -0800)
commit6fbec038f7a7ddf29f074943611b53210d17c40c
tree17b1d7fb7010085b8d79deab1e4a07edf51ddf9b
parent670f5095e4aacc30099f6b73c1e67c06df76f36b
Use SHF_GNU_RETAIN to preserve symbol definitions

In assemly code, the section flag 'R' sets the SHF_GNU_RETAIN flag to
indicate that the section must be preserved by the linker.

Add SECTION_RETAIN to indicate a section should be retained by the linker
and set SECTION_RETAIN on section for the preserved symbol if assembler
supports SHF_GNU_RETAIN.  All retained symbols are placed in separate
sections with

.section .data.rel.local.preserved_symbol,"awR"
preserved_symbol:
...
.section .data.rel.local,"aw"
not_preserved_symbol:
...

to avoid

.section .data.rel.local,"awR"
preserved_symbol:
...
not_preserved_symbol:
...

which places not_preserved_symbol definition in the SHF_GNU_RETAIN
section.

gcc/

2020-12-01  H.J. Lu  <hjl.tools@gmail.com>

* configure.ac (HAVE_GAS_SHF_GNU_RETAIN): New.  Define 1 if
the assembler supports marking sections with SHF_GNU_RETAIN flag.
* output.h (SECTION_RETAIN): New.  Defined as 0x4000000.
(SECTION_MACH_DEP): Changed from 0x4000000 to 0x8000000.
(default_unique_section): Add a bool argument.
* varasm.c (get_section): Set SECTION_RETAIN for the preserved
symbol with HAVE_GAS_SHF_GNU_RETAIN.
(resolve_unique_section): Used named section for the preserved
symbol if assembler supports SHF_GNU_RETAIN.
(get_variable_section): Handle the preserved common symbol with
HAVE_GAS_SHF_GNU_RETAIN.
(default_elf_asm_named_section): Require the full declaration and
use the 'R' flag for SECTION_RETAIN.
* config.in: Regenerated.
* configure: Likewise.
* doc/sourcebuild.texi: Document R_flag_in_section.

gcc/testsuite/

2020-12-01  H.J. Lu  <hjl.tools@gmail.com>
    Jozef Lawrynowicz  <jozef.l@mittosystems.com>

* c-c++-common/attr-used.c: Check the 'R' flag.
* c-c++-common/attr-used-2.c: Likewise.
* c-c++-common/attr-used-3.c: New test.
* c-c++-common/attr-used-4.c: Likewise.
* gcc.c-torture/compile/attr-used-retain-1.c: Likewise.
* gcc.c-torture/compile/attr-used-retain-2.c: Likewise.
* lib/target-supports.exp
(check_effective_target_R_flag_in_section): New proc.
13 files changed:
gcc/config.in
gcc/configure
gcc/configure.ac
gcc/doc/sourcebuild.texi
gcc/output.h
gcc/testsuite/c-c++-common/attr-used-2.c
gcc/testsuite/c-c++-common/attr-used-3.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/attr-used-4.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/attr-used.c
gcc/testsuite/gcc.c-torture/compile/attr-used-retain-1.c [new file with mode: 0644]
gcc/testsuite/gcc.c-torture/compile/attr-used-retain-2.c [new file with mode: 0644]
gcc/testsuite/lib/target-supports.exp
gcc/varasm.c