A dynamic linker with lazy binding support may need to handle vector PCS function symbols specially, so an ELF symbol table marking was introduced for such symbols.
Function symbol references and definitions that follow the vector PCS are marked in the generated assembly with .variant_pcs and then the STO_AARCH64_VARIANT_PCS st_other flag is set on the symbol in the object file. The marking is propagated to the dynamic symbol table by the static linker so a dynamic linker can handle such symbols specially.
For this to work, the assembler, the static linker and the dynamic linker has to be updated on a system. Old assembler does not support the new .variant_pcs directive, so a toolchain with old binutils won't be able to compile code that references vector PCS symbols.
- config/aarch64/aarch64-protos.h (aarch64_asm_output_alias): Declare. (aarch64_asm_output_external): Declare.
- config/aarch64/aarch64.c (aarch64_asm_output_variant_pcs): New. (aarch64_declare_function_name): Call aarch64_asm_output_variant_pcs. (aarch64_asm_output_alias): New. (aarch64_asm_output_external): New.
- config/aarch64/aarch64.h (ASM_OUTPUT_DEF_FROM_DECLS): Define. (ASM_OUTPUT_EXTERNAL): Define.
- gcc.target/aarch64/pcs_attribute-2.c: New test.
- gcc.target/aarch64/torture/simd-abi-4.c: Check .variant_pcs support.
- lib/target-supports.exp (check_effective_target_aarch64_variant_pcs): New.
779640c76d3 aarch64: emit .variant_pcs for aarch64_vector_pcs symbol references
gcc/ChangeLog | 11 ++
gcc/config/aarch64/aarch64-protos.h | 2 +
gcc/config/aarch64/aarch64.c | 35 +++++++
gcc/config/aarch64/aarch64.h | 9 ++
gcc/testsuite/ChangeLog | 7 ++
gcc/testsuite/gcc.target/aarch64/pcs_attribute-2.c | 114 +++++++++++++++++++++
.../gcc.target/aarch64/torture/simd-abi-4.c | 3 +-
gcc/testsuite/lib/target-supports.exp | 11 ++
8 files changed, 191 insertions(+), 1 deletion(-)