RISC-V: Support STO_RISCV_VARIANT_CC and DT_RISCV_VARIANT_CC.
authorNelson Chu <nelson.chu@sifive.com>
Wed, 11 Aug 2021 08:26:39 +0000 (01:26 -0700)
committerNelson Chu <nelson.chu@sifive.com>
Fri, 19 Nov 2021 01:32:19 +0000 (09:32 +0800)
commit8155b8539b55bca87378129e02009cd8907d8c8c
tree30524e98925e912c02387ae7b2bd0c58b9bb6ff4
parentfccf4ba5adaf69cac1875a194d8ee99dabf50c70
RISC-V: Support STO_RISCV_VARIANT_CC and DT_RISCV_VARIANT_CC.

This is the original discussion,
https://github.com/riscv/riscv-elf-psabi-doc/pull/190

And here is the glibc part,
https://sourceware.org/pipermail/libc-alpha/2021-August/129931.html

For binutils part, we need to support a new direcitve: .variant_cc.
The function symbol marked by .variant_cc means it need to be resolved
directly without resolver for dynamic linker.  We also add a new dynamic
entry, STO_RISCV_VARIANT_CC, to indicate there are symbols with the
special attribute in the dynamic symbol table of the object.

I heard that llvm already have supported this in their mainline, so
I think it's time to commit this.

bfd/
* elfnn-riscv.c (riscv_elf_link_hash_table): Added variant_cc
flag. It is used to check if relocations for variant CC symbols
may be present.
(allocate_dynrelocs): If the symbol has STO_RISCV_VARIANT_CC
flag, then raise the variant_cc flag of riscv_elf_link_hash_table.
(riscv_elf_size_dynamic_sections): Added dynamic entry for
variant_cc.
(riscv_elf_merge_symbol_attribute): New function, used to merge
non-visibility st_other attributes, including STO_RISCV_VARIANT_CC.
binutils/
* readelf.c (get_riscv_dynamic_type): New function.
(get_dynamic_type): Called get_riscv_dynamic_type for riscv targets.
(get_riscv_symbol_other): New function.
(get_symbol_other): Called get_riscv_symbol_other for riscv targets.
gas/
* config/tc-riscv.c (s_variant_cc): Marked symbol that it follows a
variant CC convention.
(riscv_elf_copy_symbol_attributes): Same as elf_copy_symbol_attributes,
but without copying st_other.  If a function symbol has special st_other
value set via directives, then attaching an IFUNC resolver to that symbol
should not override the st_other setting.
(riscv_pseudo_table): Support variant_cc diretive.
* config/tc-riscv.h (OBJ_COPY_SYMBOL_ATTRIBUTES): Defined.
* testsuite/gas/riscv/variant_cc-set.d: New testcase.
* testsuite/gas/riscv/variant_cc-set.s: Likewise.
* testsuite/gas/riscv/variant_cc.d: Likewise.
* testsuite/gas/riscv/variant_cc.s: Likewise.
include/
* elf/riscv.h (DT_RISCV_VARIANT_CC): Defined to (DT_LOPROC + 1).
(STO_RISCV_VARIANT_CC): Defined to 0x80.
ld/
* testsuite/ld-riscv-elf/variant_cc-1.s: New testcase.
* testsuite/ld-riscv-elf/variant_cc-2.s: Likewise.
* testsuite/ld-riscv-elf/variant_cc-now.d: Likewise.
* testsuite/ld-riscv-elf/variant_cc-r.d: Likewise.
* testsuite/ld-riscv-elf/variant_cc-shared.d: Likewise.
* testsuite/ld-riscv-elf/ld-riscv-elf.exp: Updated.
15 files changed:
bfd/elfnn-riscv.c
binutils/readelf.c
gas/config/tc-riscv.c
gas/config/tc-riscv.h
gas/testsuite/gas/riscv/variant_cc-set.d [new file with mode: 0644]
gas/testsuite/gas/riscv/variant_cc-set.s [new file with mode: 0644]
gas/testsuite/gas/riscv/variant_cc.d [new file with mode: 0644]
gas/testsuite/gas/riscv/variant_cc.s [new file with mode: 0644]
include/elf/riscv.h
ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
ld/testsuite/ld-riscv-elf/variant_cc-1.s [new file with mode: 0644]
ld/testsuite/ld-riscv-elf/variant_cc-2.s [new file with mode: 0644]
ld/testsuite/ld-riscv-elf/variant_cc-now.d [new file with mode: 0644]
ld/testsuite/ld-riscv-elf/variant_cc-r.d [new file with mode: 0644]
ld/testsuite/ld-riscv-elf/variant_cc-shared.d [new file with mode: 0644]