[gcc/devel/omp/gcc-9] aarch64: emit .variant_pcs for aarch64_vector_pcs symbol references

Tobias Burnus burnus@gcc.gnu.org
Thu Mar 5 14:06:00 GMT 2020


https://gcc.gnu.org/g:183b10be037bff80b406b49ae44e1befb45fb69e

commit 183b10be037bff80b406b49ae44e1befb45fb69e
Author: Szabolcs Nagy <szabolcs.nagy@arm.com>
Date:   Fri Jul 5 15:06:11 2019 +0000

    aarch64: emit .variant_pcs for aarch64_vector_pcs symbol references
    
    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

Diff:
---
 gcc/ChangeLog                                      | 21 +++++++++++++
 gcc/config/aarch64/aarch64-protos.h                |  2 ++
 gcc/config/aarch64/aarch64.c                       | 36 ++++++++++++++++++++++
 gcc/config/aarch64/aarch64.h                       |  9 ++++++
 gcc/testsuite/ChangeLog                            | 15 +++++++++
 .../gcc.target/aarch64/torture/simd-abi-4.c        |  3 +-
 gcc/testsuite/lib/target-supports.exp              | 11 +++++++
 7 files changed, 96 insertions(+), 1 deletion(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8201081..c0ec9df 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config/aarch64/aarch64-protos.h b/gcc/config/aarch64/aarch64-protos.h
index b6c0d0a..c083cad 100644
--- a/gcc/config/aarch64/aarch64-protos.h
+++ b/gcc/config/aarch64/aarch64-protos.h
@@ -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,
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index 1425943..6b25d9c 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -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
diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
index 7bd3bf5..fc6df97 100644
--- a/gcc/config/aarch64/aarch64.h
+++ b/gcc/config/aarch64/aarch64.h
@@ -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 ()
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 07b2fa7..c128e1c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/gcc.target/aarch64/torture/simd-abi-4.c b/gcc/testsuite/gcc.target/aarch64/torture/simd-abi-4.c
index e399690..b8d7ce0 100644
--- a/gcc/testsuite/gcc.target/aarch64/torture/simd-abi-4.c
+++ b/gcc/testsuite/gcc.target/aarch64/torture/simd-abi-4.c
@@ -1,4 +1,5 @@
-/* dg-do run */
+/* { dg-do run } */
+/* { dg-require-effective-target aarch64_variant_pcs } */
 /* { dg-additional-options "-std=c99" }  */
 
 
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index 737ca6d..831204d 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -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.



More information about the Gcc-cvs mailing list