mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-21 04:42:53 +08:00
8155b8539b
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.
62 lines
1.7 KiB
ArmAsm
62 lines
1.7 KiB
ArmAsm
.text
|
|
|
|
.variant_cc cc_global_default_def
|
|
.variant_cc cc_global_default_undef
|
|
.variant_cc cc_global_default_ifunc
|
|
.variant_cc cc_global_hidden_def
|
|
.variant_cc cc_global_hidden_ifunc
|
|
.variant_cc cc_local2
|
|
.variant_cc cc_local2_ifunc
|
|
|
|
.global cc_global_default_def
|
|
.global cc_global_default_undef
|
|
.global cc_global_default_ifunc
|
|
.global cc_global_hidden_def
|
|
.global cc_global_hidden_ifunc
|
|
.global nocc_global_default_def
|
|
.global nocc_global_default_undef
|
|
.global nocc_global_default_ifunc
|
|
.global nocc_global_hidden_def
|
|
.global nocc_global_hidden_ifunc
|
|
|
|
.hidden cc_global_hidden_def
|
|
.hidden cc_global_hidden_ifunc
|
|
.hidden nocc_global_hidden_def
|
|
.hidden nocc_global_hidden_ifunc
|
|
|
|
# .type cc_global_default_ifunc, %gnu_indirect_function
|
|
# .type cc_global_hidden_ifunc, %gnu_indirect_function
|
|
.type cc_local2_ifunc, %gnu_indirect_function
|
|
# .type nocc_global_default_ifunc, %gnu_indirect_function
|
|
# .type nocc_global_hidden_ifunc, %gnu_indirect_function
|
|
.type nocc_local2_ifunc, %gnu_indirect_function
|
|
|
|
# cc_global_default_def:
|
|
# cc_global_default_undef:
|
|
# cc_global_hidden_def:
|
|
# cc_global_default_ifunc:
|
|
# cc_global_hidden_ifunc:
|
|
cc_local2:
|
|
cc_local2_ifunc:
|
|
# nocc_global_default_def:
|
|
# nocc_global_default_undef:
|
|
# nocc_global_hidden_def:
|
|
# nocc_global_default_ifunc:
|
|
# nocc_global_hidden_ifunc:
|
|
nocc_local2:
|
|
nocc_local2_ifunc:
|
|
call cc_global_default_def
|
|
call cc_global_default_undef
|
|
call cc_global_hidden_def
|
|
call cc_global_default_ifunc
|
|
call cc_global_hidden_ifunc
|
|
call cc_local2
|
|
call cc_local2_ifunc
|
|
call nocc_global_default_def
|
|
call nocc_global_default_undef
|
|
call nocc_global_hidden_def
|
|
call nocc_global_default_ifunc
|
|
call nocc_global_hidden_ifunc
|
|
call nocc_local2
|
|
call nocc_local2_ifunc
|