blob: 1aef62d5aaa273ff6f53d31a7e771d1f682f4a1e [file] [log] [blame]
# REQUIRES: aarch64
# RUN: split-file %s %t
# RUN: llvm-mc -filetype=obj -triple=aarch64-linux-gnu %t/test1 -o %t.o
# RUN: ld.lld %t.o --shared -o %t.so
# RUN: llvm-readelf --dynamic-table %t.so | FileCheck --check-prefix T1-PCSDYN %s
# RUN: llvm-readelf --symbols %t.so | FileCheck --check-prefix T1-PCSSYM %s
# T1-PCSDYN-NOT: 0x0000000070000005 (AARCH64_VARIANT_PCS) 0
# T1-PCSSYM: Symbol table '.dynsym'
# T1-PCSSYM: 0 NOTYPE GLOBAL DEFAULT [VARIANT_PCS] [[#]] pcs_func_global_def
# RUN: llvm-mc -filetype=obj -triple=aarch64-linux-gnu %t/test2 -o %t.o
# RUN: ld.lld %t.o --shared -o %t.so
# RUN: llvm-readelf --dynamic-table %t.so | FileCheck --check-prefix T2-PCSDYN %s
# RUN: llvm-readelf --symbols %t.so | FileCheck --check-prefix T2-PCSSYM %s
# T2-PCSDYN: 0x0000000070000005 (AARCH64_VARIANT_PCS) 0
# T2-PCSSYM: Symbol table '.dynsym'
# T2-PCSSYM: 0 NOTYPE GLOBAL DEFAULT [VARIANT_PCS] [[#]] pcs_func_global_def
# RUN: llvm-mc -filetype=obj -triple=aarch64-linux-gnu %t/test3 -o %t.o
# RUN: ld.lld %t.o --shared -o %t.so
# RUN: llvm-readelf --dynamic-table %t.so | FileCheck --check-prefix T3-PCSDYN %s
# RUN: llvm-readelf --symbols %t.so | FileCheck --check-prefix T3-PCSSYM %s
# T3-PCSDYN: 0x0000000070000005 (AARCH64_VARIANT_PCS) 0
# T3-PCSSYM: Symbol table '.dynsym'
# T3-PCSSYM: 0 IFUNC GLOBAL DEFAULT [VARIANT_PCS] UND pcs_ifunc_global_def
# T3-PCSSYM: 0 NOTYPE GLOBAL DEFAULT [[#]] pcs_func_global_def
# RUN: llvm-mc -filetype=obj -triple=aarch64-linux-gnu %t/test4 -o %t.o
# RUN: ld.lld %t.o --shared -o %t.so
# RUN: llvm-readelf --dynamic-table %t.so | FileCheck --check-prefix T4-PCSDYN %s
# RUN: llvm-readelf --symbols %t.so | FileCheck --check-prefix T4-PCSSYM %s
# T4-PCSDYN-NOT: 0x0000000070000005 (AARCH64_VARIANT_PCS) 0
# T4-PCSSYM: Symbol table '.dynsym'
# T4-PCSSYM: 0 IFUNC GLOBAL DEFAULT [VARIANT_PCS] [[#]] pcs_ifunc_global_def
# RUN: llvm-mc -filetype=obj -triple=aarch64-linux-gnu %t/test5 -o %t.o
# RUN: ld.lld %t.o --shared -o %t.so
# RUN: llvm-readelf --symbols %t.so | FileCheck --check-prefix T5-PCSSYM %s
# T5-PCSSYM: Symbol table '.dynsym'
# T5-PCSSYM: 0 NOTYPE GLOBAL DEFAULT [VARIANT_PCS] UND pcs_func_global_undef
# T5-PCSSYM-NEXT: 0 NOTYPE GLOBAL DEFAULT [VARIANT_PCS] [[#]] pcs_func_global_def
# T5-PCSSYM-NEXT: 0 IFUNC GLOBAL DEFAULT [VARIANT_PCS] [[#]] pcs_ifunc_global_def
# T5-PCSSYM: Symbol table '.symtab' contains 10 entries:
# T5-PCSSYM: 0 NOTYPE LOCAL DEFAULT [VARIANT_PCS] [[#]] pcs_func_local
# T5-PCSSYM-NEXT: 0 IFUNC LOCAL DEFAULT [VARIANT_PCS] [[#]] pcs_ifunc_local
# T5-PCSSYM: 0 NOTYPE LOCAL HIDDEN [VARIANT_PCS] [[#]] pcs_func_global_hidden
# T5-PCSSYM-NEXT: 0 IFUNC LOCAL HIDDEN [VARIANT_PCS] [[#]] pcs_ifunc_global_hidden
# T5-PCSSYM: 0 NOTYPE GLOBAL DEFAULT [VARIANT_PCS] [[#]] pcs_func_global_def
# T5-PCSSYM-NEXT: 0 NOTYPE GLOBAL DEFAULT [VARIANT_PCS] UND pcs_func_global_undef
# T5-PCSSYM-NEXT: 0 IFUNC GLOBAL DEFAULT [VARIANT_PCS] [[#]] pcs_ifunc_global_def
#--- test1
## An object with a variant_pcs symbol but without a R_AARCH64_JMP_SLOT
## should not generate a DT_AARCH64_VARIANT_PCS.
.text
.global pcs_func_global_def
.variant_pcs pcs_func_global_def
pcs_func_global_def:
ret
#--- test2
## An object with a variant_pcs symbol and with a R_AARCH64_JMP_SLOT
## should generate a DT_AARCH64_VARIANT_PCS.
.text
.global pcs_func_global_def
.variant_pcs pcs_func_global_def
pcs_func_global_def:
bl pcs_func_global_def
#--- test3
## Same as before, but targeting a GNU IFUNC.
.text
.global pcs_ifunc_global_def
.global pcs_func_global_def
.variant_pcs pcs_ifunc_global_def
.type pcs_ifunc_global_def, %gnu_indirect_function
pcs_func_global_def:
bl pcs_ifunc_global_def
#--- test4
## An object with a variant_pcs symbol and with a R_AARCH64_IRELATIVE
## should not generate a DT_AARCH64_VARIANT_PCS.
.text
.global pcs_ifunc_global_def
.global pcs_func_global_def
.variant_pcs pcs_ifunc_global_def
.type pcs_ifunc_global_def, %gnu_indirect_function
pcs_ifunc_global_def:
bl pcs_func_global_def
#--- test5
## Check if STO_AARCH64_VARIANT_PCS is kept on symbol st_other for both undef,
## local, and hidden visibility.
.text
.global pcs_func_global_def, pcs_func_global_undef, pcs_func_global_hidden
.global pcs_ifunc_global_def, pcs_ifunc_global_hidden
.local pcs_func_local
.hidden pcs_func_global_hidden, pcs_ifunc_global_hidden
.type pcs_ifunc_global_def, %gnu_indirect_function
.type pcs_ifunc_global_hidden, %gnu_indirect_function
.type pcs_ifunc_local, %gnu_indirect_function
.variant_pcs pcs_func_global_def
.variant_pcs pcs_func_global_undef
.variant_pcs pcs_func_global_hidden
.variant_pcs pcs_func_local
.variant_pcs pcs_ifunc_global_def
.variant_pcs pcs_ifunc_global_hidden
.variant_pcs pcs_ifunc_local
pcs_func_global_def:
pcs_func_global_hidden:
pcs_func_local:
pcs_ifunc_global_def:
pcs_ifunc_global_hidden:
pcs_ifunc_local:
ret