ELF: Add support for unique section ID to assembler
authorH.J. Lu <hjl.tools@gmail.com>
Mon, 3 Feb 2020 01:07:51 +0000 (17:07 -0800)
committerH.J. Lu <hjl.tools@gmail.com>
Mon, 3 Feb 2020 01:08:01 +0000 (17:08 -0800)
commita8c4d40b578378be3b12575d127d4c7bd9972f32
treefa3a722b3b535806f0f535a4c81c30f97da6b7ba
parent0f8b5e560e43ca0148162d30b83411b2107b27e5
ELF: Add support for unique section ID to assembler

Clang's integrated assembler supports multiple section with the same
name:

.section .text,"ax",@progbits,unique,1
nop
.section .text,"ax",@progbits,unique,2
nop

"unique,N" assigns the number, N, as the section ID, to a section.  The
valid values of the section ID are between 0 and 4294967295.  It can be
used to distinguish different sections with the same section name.

This is useful with -fno-unique-section-names -ffunction-sections.
-ffunction-sections by default generates .text.foo, .text.bar, etc.
Using the same string can save lots of space in .strtab.

This patch adds section_id to bfd_section and reuses the linker
internal bit in BFD section flags, SEC_LINKER_CREATED, for assmebler
internal use to mark valid section_id.  It also updates objdump to
compare section pointers if 2 sections comes from the same file since
2 different sections can have the same section name.

bfd/

PR gas/25380
* bfd-in2.h: Regenerated.
* ecoff.c (bfd_debug_section): Add section_id.
* section.c (bfd_section): Add section_id.
(SEC_ASSEMBLER_SECTION_ID): New.
(BFD_FAKE_SECTION): Add section_id.

binutils/

PR gas/25380
* objdump.c (sym_ok): Return FALSE if 2 sections are in the
same file with different section pointers.

gas/

PR gas/25380
* config/obj-elf.c (section_match): Removed.
(get_section): Also match SEC_ASSEMBLER_SECTION_ID and
section_id.
(obj_elf_change_section): Replace info and group_name arguments
with match_p.  Also update the section ID and flags from match_p.
(obj_elf_section): Handle "unique,N".  Update call to
obj_elf_change_section.
* config/obj-elf.h (elf_section_match): New.
(obj_elf_change_section): Updated.
* config/tc-arm.c (start_unwind_section): Update call to
obj_elf_change_section.
* config/tc-ia64.c (obj_elf_vms_common): Likewise.
* config/tc-microblaze.c (microblaze_s_data): Likewise.
(microblaze_s_sdata): Likewise.
(microblaze_s_rdata): Likewise.
(microblaze_s_bss): Likewise.
* config/tc-mips.c (s_change_section): Likewise.
* config/tc-msp430.c (msp430_profiler): Likewise.
* config/tc-rx.c (parse_rx_section): Likewise.
* config/tc-tic6x.c (tic6x_start_unwind_section): Likewise.
* doc/as.texi: Document "unique,N" in .section directive.
* testsuite/gas/elf/elf.exp: Run "unique,N" tests.
* testsuite/gas/elf/section15.d: New file.
* testsuite/gas/elf/section15.s: Likewise.
* testsuite/gas/elf/section16.s: Likewise.
* testsuite/gas/elf/section16a.d: Likewise.
* testsuite/gas/elf/section16b.d: Likewise.
* testsuite/gas/elf/section17.d: Likewise.
* testsuite/gas/elf/section17.l: Likewise.
* testsuite/gas/elf/section17.s: Likewise.
* testsuite/gas/i386/unique.d: Likewise.
* testsuite/gas/i386/unique.s: Likewise.
* testsuite/gas/i386/x86-64-unique.d: Likewise.
* testsuite/gas/i386/i386.exp: Run unique and x86-64-unique.

ld/

PR gas/25380
* testsuite/ld-i386/pr22001-1c.S: Use "unique,N" in .section
directives.
* testsuite/ld-i386/tls-gd1.S: Likewise.
* testsuite/ld-x86-64/pr21481b.S: Likewise.
34 files changed:
bfd/ChangeLog
bfd/bfd-in2.h
bfd/ecoff.c
bfd/section.c
binutils/ChangeLog
binutils/objdump.c
gas/ChangeLog
gas/config/obj-elf.c
gas/config/obj-elf.h
gas/config/tc-arm.c
gas/config/tc-ia64.c
gas/config/tc-microblaze.c
gas/config/tc-mips.c
gas/config/tc-msp430.c
gas/config/tc-rx.c
gas/config/tc-tic6x.c
gas/doc/as.texi
gas/testsuite/gas/elf/elf.exp
gas/testsuite/gas/elf/section15.d [new file with mode: 0644]
gas/testsuite/gas/elf/section15.s [new file with mode: 0644]
gas/testsuite/gas/elf/section16.s [new file with mode: 0644]
gas/testsuite/gas/elf/section16a.d [new file with mode: 0644]
gas/testsuite/gas/elf/section16b.d [new file with mode: 0644]
gas/testsuite/gas/elf/section17.d [new file with mode: 0644]
gas/testsuite/gas/elf/section17.l [new file with mode: 0644]
gas/testsuite/gas/elf/section17.s [new file with mode: 0644]
gas/testsuite/gas/i386/i386.exp
gas/testsuite/gas/i386/unique.d [new file with mode: 0644]
gas/testsuite/gas/i386/unique.s [new file with mode: 0644]
gas/testsuite/gas/i386/x86-64-unique.d [new file with mode: 0644]
ld/ChangeLog
ld/testsuite/ld-i386/pr22001-1c.S
ld/testsuite/ld-i386/tls-gd1.S
ld/testsuite/ld-x86-64/pr21481b.S