]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
aarch64: emit .variant_pcs for aarch64_vector_pcs symbol references
authorSzabolcs Nagy <szabolcs.nagy@arm.com>
Fri, 5 Jul 2019 15:06:11 +0000 (15:06 +0000)
committerSzabolcs Nagy <nsz@gcc.gnu.org>
Fri, 5 Jul 2019 15:06:11 +0000 (15:06 +0000)
Backport r271869
Backport r271913
Backport r272414

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.

gcc/ChangeLog:

* 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/testsuite/ChangeLog:

* 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.

gcc/ChangeLog:

* config/aarch64/aarch64-protos.h (aarch64_asm_output_external): Remove
const.
* config/aarch64/aarch64.c (aarch64_asm_output_external): Call
default_elf_asm_output_external.

gcc/testsuite/ChangeLog:

* gcc.target/aarch64/pcs_attribute-2.c: Remove ifunc usage.
* gcc.target/aarch64/pcs_attribute-3.c: New test.

From-SVN: r273140

gcc/ChangeLog
gcc/config/aarch64/aarch64-protos.h
gcc/config/aarch64/aarch64.c
gcc/config/aarch64/aarch64.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/torture/simd-abi-4.c
gcc/testsuite/lib/target-supports.exp

index 82010817b6aeacb64beea62ae557338ead8d6644..c0ec9df3db14cfbc7a93d763a96fe7fcec353af8 100644 (file)
@@ -1,3 +1,24 @@
+2019-07-05  Szabolcs Nagy  <szabolcs.nagy@arm.com>
+
+       Backport from mainline
+       2019-06-03  Szabolcs Nagy  <szabolcs.nagy@arm.com>
+
+       * 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.
+
+       2019-06-04  Szabolcs Nagy  <szabolcs.nagy@arm.com>
+
+       * config/aarch64/aarch64-protos.h (aarch64_asm_output_external): Remove
+       const.
+       * config/aarch64/aarch64.c (aarch64_asm_output_external): Call
+       default_elf_asm_output_external.
+
 2019-07-04  Martin Liska  <mliska@suse.cz>
 
        Backport from mainline
index b6c0d0a8eb6c1bbc6d0524fbf98686fa9ef9613d..c083cad5327dc45cc3ab2d89000ab6dd20454d3e 100644 (file)
@@ -427,6 +427,8 @@ bool aarch64_is_long_call_p (rtx);
 bool aarch64_is_noplt_call_p (rtx);
 bool aarch64_label_mentioned_p (rtx);
 void aarch64_declare_function_name (FILE *, const char*, tree);
+void aarch64_asm_output_alias (FILE *, const tree, const tree);
+void aarch64_asm_output_external (FILE *, tree, const char*);
 bool aarch64_legitimate_pic_operand_p (rtx);
 bool aarch64_mask_and_shift_for_ubfiz_p (scalar_int_mode, rtx, rtx);
 bool aarch64_masks_and_shift_for_bfi_p (scalar_int_mode, unsigned HOST_WIDE_INT,
index 14259439c9079c9139fca51370765cce54127890..6b25d9cbfaec42bed5198a50a1766315bcbf18ff 100644 (file)
@@ -15276,6 +15276,19 @@ aarch64_asm_preferred_eh_data_format (int code ATTRIBUTE_UNUSED, int global)
    return (global ? DW_EH_PE_indirect : 0) | DW_EH_PE_pcrel | type;
 }
 
+/* Output .variant_pcs for aarch64_vector_pcs function symbols.  */
+
+static void
+aarch64_asm_output_variant_pcs (FILE *stream, const tree decl, const char* name)
+{
+  if (aarch64_simd_decl_p (decl))
+    {
+      fprintf (stream, "\t.variant_pcs\t");
+      assemble_name (stream, name);
+      fprintf (stream, "\n");
+    }
+}
+
 /* The last .arch and .tune assembly strings that we printed.  */
 static std::string aarch64_last_printed_arch_string;
 static std::string aarch64_last_printed_tune_string;
@@ -15325,11 +15338,34 @@ aarch64_declare_function_name (FILE *stream, const char* name,
       aarch64_last_printed_tune_string = this_tune->name;
     }
 
+  aarch64_asm_output_variant_pcs (stream, fndecl, name);
+
   /* Don't forget the type directive for ELF.  */
   ASM_OUTPUT_TYPE_DIRECTIVE (stream, name, "function");
   ASM_OUTPUT_LABEL (stream, name);
 }
 
+/* Implement ASM_OUTPUT_DEF_FROM_DECLS.  Output .variant_pcs for aliases.  */
+
+void
+aarch64_asm_output_alias (FILE *stream, const tree decl, const tree target)
+{
+  const char *name = XSTR (XEXP (DECL_RTL (decl), 0), 0);
+  const char *value = IDENTIFIER_POINTER (target);
+  aarch64_asm_output_variant_pcs (stream, decl, name);
+  ASM_OUTPUT_DEF (stream, name, value);
+}
+
+/* Implement ASM_OUTPUT_EXTERNAL.  Output .variant_pcs for undefined
+   function symbol references.  */
+
+void
+aarch64_asm_output_external (FILE *stream, tree decl, const char* name)
+{
+  default_elf_asm_output_external (stream, decl, name);
+  aarch64_asm_output_variant_pcs (stream, decl, name);
+}
+
 /* Implements TARGET_ASM_FILE_START.  Output the assembly header.  */
 
 static void
index 7bd3bf525dd71347a12ed9cd2227bc2cd6e9cc55..fc6df970c2e759b4f1975cb94e0f8b4b6612b75c 100644 (file)
@@ -505,6 +505,15 @@ extern unsigned aarch64_architecture_version;
 #define ASM_DECLARE_FUNCTION_NAME(STR, NAME, DECL)     \
   aarch64_declare_function_name (STR, NAME, DECL)
 
+/* Output assembly strings for alias definition.  */
+#define ASM_OUTPUT_DEF_FROM_DECLS(STR, DECL, TARGET) \
+  aarch64_asm_output_alias (STR, DECL, TARGET)
+
+/* Output assembly strings for undefined extern symbols.  */
+#undef ASM_OUTPUT_EXTERNAL
+#define ASM_OUTPUT_EXTERNAL(STR, DECL, NAME) \
+  aarch64_asm_output_external (STR, DECL, NAME)
+
 /* For EH returns X4 contains the stack adjustment.  */
 #define EH_RETURN_STACKADJ_RTX gen_rtx_REG (Pmode, R4_REGNUM)
 #define EH_RETURN_HANDLER_RTX  aarch64_eh_return_handler_rtx ()
index 07b2fa79dbf57365cee02bbb97fbea03fd4c9ee7..c128e1c7072760b85509c02a588c69fa8ad53518 100644 (file)
@@ -1,3 +1,18 @@
+2019-07-05  Szabolcs Nagy  <szabolcs.nagy@arm.com>
+
+       Backport from mainline
+       2019-06-03  Szabolcs Nagy  <szabolcs.nagy@arm.com>
+
+       * 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.
+
+       2019-06-18  Szabolcs Nagy  <szabolcs.nagy@arm.com>
+
+       * gcc.target/aarch64/pcs_attribute-2.c: Remove ifunc usage.
+       * gcc.target/aarch64/pcs_attribute-3.c: New test.
+
 2019-07-04  Martin Liska  <mliska@suse.cz>
 
        Backport from mainline
index e399690f364987bbe028cd97dfb28edbcc9db0d1..b8d7ce09b74f08940ae0cdb687313c7921536542 100644 (file)
@@ -1,4 +1,5 @@
-/* dg-do run */
+/* { dg-do run } */
+/* { dg-require-effective-target aarch64_variant_pcs } */
 /* { dg-additional-options "-std=c99" }  */
 
 
index 737ca6d57ad3ef616fc6887a1942ab519efd0fc1..831204dc03c66fc2d692d202bc641c56f939c074 100644 (file)
@@ -8588,6 +8588,17 @@ proc check_effective_target_aarch64_large { } {
     }
 }
 
+# Return 1 if the assembler accepts the aarch64 .variant_pcs directive.
+
+proc check_effective_target_aarch64_variant_pcs { } {
+    if { [istarget aarch64*-*-*] } {
+       return [check_no_compiler_messages aarch64_variant_pcs object {
+           __asm__ (".variant_pcs foo");
+       }]
+    } else {
+       return 0
+    }
+}
 
 # Return 1 if this is a reduced AVR Tiny core.  Such cores have different
 # register set, instruction set, addressing capabilities and ABI.