public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH binutils 0/4] aarch64: Add STO_AARCH64_VARIANT_PCS support
@ 2019-05-23 11:04 Szabolcs Nagy
  2019-05-23 11:07 ` [PATCH binutils 1/4] aarch64: add STO_AARCH64_VARIANT_PCS and DT_AARCH64_VARIANT_PCS Szabolcs Nagy
                   ` (4 more replies)
  0 siblings, 5 replies; 15+ messages in thread
From: Szabolcs Nagy @ 2019-05-23 11:04 UTC (permalink / raw)
  To: Binutils; +Cc: nd

Adds support for a new aarch64 specific st_other flag that
is used for marking function symbols that follow different
register usage convention from the base PCS. It is required
for lazy binding support for vector PCS calls.

The ELF ABI draft and detailed description is at
https://sourceware.org/ml/binutils/2019-05/msg00294.html

Szabolcs Nagy (4):
  aarch64: add STO_AARCH64_VARIANT_PCS and DT_AARCH64_VARIANT_PCS
  aarch64: handle .variant_pcs directive in gas
  aarch64: override default elf .set handling in gas
  aarch64: handle STO_AARCH64_VARIANT_PCS in bfd

 bfd/elfnn-aarch64.c                           | 41 +++++++++++
 binutils/readelf.c                            | 20 ++++++
 gas/config/tc-aarch64.c                       | 55 +++++++++++++++
 gas/config/tc-aarch64.h                       |  6 ++
 gas/doc/c-aarch64.texi                        |  6 ++
 .../gas/aarch64/symbol-variant_pcs-1.d        | 10 +++
 .../gas/aarch64/symbol-variant_pcs-1.s        |  8 +++
 .../gas/aarch64/symbol-variant_pcs-2.d        |  9 +++
 .../gas/aarch64/symbol-variant_pcs-2.s        |  4 ++
 .../gas/aarch64/symbol-variant_pcs-3.d        | 12 ++++
 .../gas/aarch64/symbol-variant_pcs-3.s        | 20 ++++++
 include/elf/aarch64.h                         |  5 ++
 ld/testsuite/ld-aarch64/aarch64-elf.exp       |  4 ++
 ld/testsuite/ld-aarch64/variant_pcs-1.s       | 59 ++++++++++++++++
 ld/testsuite/ld-aarch64/variant_pcs-2.s       | 47 +++++++++++++
 ld/testsuite/ld-aarch64/variant_pcs-now.d     | 68 +++++++++++++++++++
 ld/testsuite/ld-aarch64/variant_pcs-r.d       | 60 ++++++++++++++++
 ld/testsuite/ld-aarch64/variant_pcs-shared.d  | 68 +++++++++++++++++++
 ld/testsuite/ld-aarch64/variant_pcs.ld        | 23 +++++++
 19 files changed, 525 insertions(+)
 create mode 100644 gas/testsuite/gas/aarch64/symbol-variant_pcs-1.d
 create mode 100644 gas/testsuite/gas/aarch64/symbol-variant_pcs-1.s
 create mode 100644 gas/testsuite/gas/aarch64/symbol-variant_pcs-2.d
 create mode 100644 gas/testsuite/gas/aarch64/symbol-variant_pcs-2.s
 create mode 100644 gas/testsuite/gas/aarch64/symbol-variant_pcs-3.d
 create mode 100644 gas/testsuite/gas/aarch64/symbol-variant_pcs-3.s
 create mode 100644 ld/testsuite/ld-aarch64/variant_pcs-1.s
 create mode 100644 ld/testsuite/ld-aarch64/variant_pcs-2.s
 create mode 100644 ld/testsuite/ld-aarch64/variant_pcs-now.d
 create mode 100644 ld/testsuite/ld-aarch64/variant_pcs-r.d
 create mode 100644 ld/testsuite/ld-aarch64/variant_pcs-shared.d
 create mode 100644 ld/testsuite/ld-aarch64/variant_pcs.ld

-- 
2.17.1

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH binutils 1/4] aarch64: add STO_AARCH64_VARIANT_PCS and DT_AARCH64_VARIANT_PCS
  2019-05-23 11:04 [PATCH binutils 0/4] aarch64: Add STO_AARCH64_VARIANT_PCS support Szabolcs Nagy
@ 2019-05-23 11:07 ` Szabolcs Nagy
  2019-05-24 10:24   ` Nick Clifton
  2019-05-23 11:08 ` [PATCH binutils 2/4] aarch64: handle .variant_pcs directive in gas Szabolcs Nagy
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 15+ messages in thread
From: Szabolcs Nagy @ 2019-05-23 11:07 UTC (permalink / raw)
  To: Binutils; +Cc: nd

[-- Attachment #1: Type: text/plain, Size: 985 bytes --]

The bottom 2 bits of st_other are used for visibility, the top 6 bits are
de facto reserved for processor specific use.  This patch defines a
bits to mark function symbols that follow a variant procedure call standard
with different register usage convention.

A dynamic tag is also defined that marks modules with R_<CLS>_JUMP_SLOT
relocations referencing symbols marked with STO_AARCH64_VARIANT_PCS.
This can be used by dynamic linkers that support lazy binding to decide
what registers need to be preserved during symbol resolution.

binutils/ChangeLog:

2019-05-22  Szabolcs Nagy  <szabolcs.nagy@arm.com>

	* readelf.c (get_aarch64_dynamic_type): Handle DT_AARCH64_VARIANT_PCS.
	(get_aarch64_symbol_other): New, handles STO_AARCH64_VARIANT_PCS.
	(get_symbol_other): Call get_aarch64_symbol_other.

include/ChangeLog:

2019-05-22  Szabolcs Nagy  <szabolcs.nagy@arm.com>

	* elf/aarch64.h (DT_AARCH64_VARIANT_PCS): Define.
	(STO_AARCH64_VARIANT_PCS): Define.

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-aarch64-add-STO_AARCH64_VARIANT_PCS-and-DT_AARCH64_V.diff --]
[-- Type: text/x-patch; name="0001-aarch64-add-STO_AARCH64_VARIANT_PCS-and-DT_AARCH64_V.diff", Size: 1847 bytes --]

diff --git a/binutils/readelf.c b/binutils/readelf.c
index c31a5c1266..0e8b27bcfe 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -1804,6 +1804,7 @@ get_aarch64_dynamic_type (unsigned long type)
     {
     case DT_AARCH64_BTI_PLT:  return "AARCH64_BTI_PLT";
     case DT_AARCH64_PAC_PLT:  return "AARCH64_PAC_PLT";
+    case DT_AARCH64_VARIANT_PCS:  return "AARCH64_VARIANT_PCS";
     default:
       return NULL;
     }
@@ -11095,6 +11096,22 @@ get_solaris_symbol_visibility (unsigned int visibility)
     }
 }
 
+static const char *
+get_aarch64_symbol_other (unsigned int other)
+{
+  static char buf[32];
+
+  if (other & STO_AARCH64_VARIANT_PCS)
+    {
+      other &= ~STO_AARCH64_VARIANT_PCS;
+      if (other == 0)
+	return "VARIANT_PCS";
+      snprintf (buf, sizeof buf, "VARIANT_PCS | %x", other);
+      return buf;
+    }
+  return NULL;
+}
+
 static const char *
 get_mips_symbol_other (unsigned int other)
 {
@@ -11206,6 +11223,9 @@ get_symbol_other (Filedata * filedata, unsigned int other)
 
   switch (filedata->file_header.e_machine)
     {
+    case EM_AARCH64:
+      result = get_aarch64_symbol_other (other);
+      break;
     case EM_MIPS:
       result = get_mips_symbol_other (other);
       break;
diff --git a/include/elf/aarch64.h b/include/elf/aarch64.h
index 4466547626..721378abf8 100644
--- a/include/elf/aarch64.h
+++ b/include/elf/aarch64.h
@@ -38,6 +38,11 @@
 /* Processor specific dynamic array tags.  */
 #define DT_AARCH64_BTI_PLT	(DT_LOPROC + 1)
 #define DT_AARCH64_PAC_PLT	(DT_LOPROC + 3)
+#define DT_AARCH64_VARIANT_PCS	(DT_LOPROC + 5)
+
+/* AArch64-specific values for st_other.  */
+#define STO_AARCH64_VARIANT_PCS	0x80  /* Symbol may follow different call
+					 convention from the base PCS.  */
 
 /* Relocation types.  */
 

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH binutils 2/4] aarch64: handle .variant_pcs directive in gas
  2019-05-23 11:04 [PATCH binutils 0/4] aarch64: Add STO_AARCH64_VARIANT_PCS support Szabolcs Nagy
  2019-05-23 11:07 ` [PATCH binutils 1/4] aarch64: add STO_AARCH64_VARIANT_PCS and DT_AARCH64_VARIANT_PCS Szabolcs Nagy
@ 2019-05-23 11:08 ` Szabolcs Nagy
  2019-05-23 11:10 ` [PATCH binutils 3/4] aarch64: override default elf .set handling " Szabolcs Nagy
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 15+ messages in thread
From: Szabolcs Nagy @ 2019-05-23 11:08 UTC (permalink / raw)
  To: binutils; +Cc: nd

[-- Attachment #1: Type: text/plain, Size: 493 bytes --]

In ELF objects the specified symbol is marked with STO_AARCH64_VARIANT_PCS.

gas/ChangeLog:

2019-05-22  Szabolcs Nagy  <szabolcs.nagy@arm.com>

	* config/tc-aarch64.c (s_variant_pcs): New function.
	* doc/c-aarch64.texi: Document .variant_pcs.
	* testsuite/gas/aarch64/symbol-variant_pcs-1.d: New test.
	* testsuite/gas/aarch64/symbol-variant_pcs-1.s: New test.
	* testsuite/gas/aarch64/symbol-variant_pcs-2.d: New test.
	* testsuite/gas/aarch64/symbol-variant_pcs-2.s: New test.

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0002-aarch64-handle-.variant_pcs-directive-in-gas.diff --]
[-- Type: text/x-patch; name="0002-aarch64-handle-.variant_pcs-directive-in-gas.diff", Size: 3378 bytes --]

diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c
index 1f8d94ea1e..3bccfa24ba 100644
--- a/gas/config/tc-aarch64.c
+++ b/gas/config/tc-aarch64.c
@@ -1936,6 +1936,28 @@ s_aarch64_elf_cons (int nbytes)
   demand_empty_rest_of_line ();
 }
 
+/* Mark symbol that it follows a variant PCS convention.  */
+
+static void
+s_variant_pcs (int ignored ATTRIBUTE_UNUSED)
+{
+  char *name;
+  char c;
+  symbolS *sym;
+  asymbol *bfdsym;
+  elf_symbol_type *elfsym;
+
+  c = get_symbol_name (&name);
+  if (!*name)
+    as_bad (_("Missing symbol name in directive"));
+  sym = symbol_find_or_make (name);
+  restore_line_pointer (c);
+  demand_empty_rest_of_line ();
+  bfdsym = symbol_get_bfdsym (sym);
+  elfsym = elf_symbol_from (bfd_asymbol_bfd (bfdsym), bfdsym);
+  gas_assert (elfsym);
+  elfsym->internal_elf_sym.st_other |= STO_AARCH64_VARIANT_PCS;
+}
 #endif /* OBJ_ELF */
 
 /* Output a 32-bit word, but mark as an instruction.  */
@@ -2082,6 +2104,7 @@ const pseudo_typeS md_pseudo_table[] = {
   {"long", s_aarch64_elf_cons, 4},
   {"xword", s_aarch64_elf_cons, 8},
   {"dword", s_aarch64_elf_cons, 8},
+  {"variant_pcs", s_variant_pcs, 0},
 #endif
   {0, 0, 0}
 };
diff --git a/gas/doc/c-aarch64.texi b/gas/doc/c-aarch64.texi
index 74ffc8f83e..e663061001 100644
--- a/gas/doc/c-aarch64.texi
+++ b/gas/doc/c-aarch64.texi
@@ -439,6 +439,12 @@ should only be done if it is really necessary.
 
 @c VVVVVVVVVVVVVVVVVVVVVVVVVV
 
+@cindex @code{.variant_pcs} directive, AArch64
+@item .variant_pcs @var{symbol}
+This directive marks @var{symbol} referencing a function that may
+follow a variant procedure call standard with different register
+usage convention from the base procedure call standard.
+
 @c WWWWWWWWWWWWWWWWWWWWWWWWWW
 @c XXXXXXXXXXXXXXXXXXXXXXXXXX
 
diff --git a/gas/testsuite/gas/aarch64/symbol-variant_pcs-1.d b/gas/testsuite/gas/aarch64/symbol-variant_pcs-1.d
new file mode 100644
index 0000000000..6257ce1687
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/symbol-variant_pcs-1.d
@@ -0,0 +1,10 @@
+#objdump: -t
+
+.*:     file format .*
+
+SYMBOL TABLE:
+0+ l    d  \.text	0+ \.text
+0+ l    d  \.data	0+ \.data
+0+ l    d  \.bss	0+ \.bss
+0+ l       \.text	0+ func
+0+         \*UND\*	0+ 0x80 foobar
diff --git a/gas/testsuite/gas/aarch64/symbol-variant_pcs-1.s b/gas/testsuite/gas/aarch64/symbol-variant_pcs-1.s
new file mode 100644
index 0000000000..aecb9bde57
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/symbol-variant_pcs-1.s
@@ -0,0 +1,8 @@
+.text
+.variant_pcs foobar
+func:
+	bl	foobar
+	b	foobar
+
+.data
+.xword	foobar
diff --git a/gas/testsuite/gas/aarch64/symbol-variant_pcs-2.d b/gas/testsuite/gas/aarch64/symbol-variant_pcs-2.d
new file mode 100644
index 0000000000..d9b60ac8e7
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/symbol-variant_pcs-2.d
@@ -0,0 +1,9 @@
+#objdump: -t
+
+.*:     file format .*
+
+SYMBOL TABLE:
+0+ l    d  \.text	0+ \.text
+0+ l    d  \.data	0+ \.data
+0+ l    d  \.bss	0+ \.bss
+0+ l       \.text	0+ 0x80 foo
diff --git a/gas/testsuite/gas/aarch64/symbol-variant_pcs-2.s b/gas/testsuite/gas/aarch64/symbol-variant_pcs-2.s
new file mode 100644
index 0000000000..820733b306
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/symbol-variant_pcs-2.s
@@ -0,0 +1,4 @@
+.text
+.variant_pcs foo
+foo:
+	ret

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH binutils 3/4] aarch64: override default elf .set handling in gas
  2019-05-23 11:04 [PATCH binutils 0/4] aarch64: Add STO_AARCH64_VARIANT_PCS support Szabolcs Nagy
  2019-05-23 11:07 ` [PATCH binutils 1/4] aarch64: add STO_AARCH64_VARIANT_PCS and DT_AARCH64_VARIANT_PCS Szabolcs Nagy
  2019-05-23 11:08 ` [PATCH binutils 2/4] aarch64: handle .variant_pcs directive in gas Szabolcs Nagy
@ 2019-05-23 11:10 ` Szabolcs Nagy
  2019-05-23 11:11 ` [PATCH binutils 4/4] aarch64: handle STO_AARCH64_VARIANT_PCS in bfd Szabolcs Nagy
  2019-05-24 10:26 ` [PATCH binutils 0/4] aarch64: Add STO_AARCH64_VARIANT_PCS support Nick Clifton
  4 siblings, 0 replies; 15+ messages in thread
From: Szabolcs Nagy @ 2019-05-23 11:10 UTC (permalink / raw)
  To: binutils; +Cc: nd

[-- Attachment #1: Type: text/plain, Size: 696 bytes --]

Allow st_other values such as STO_AARCH64_VARIANT_PCS to be set for alias
symbols independently.  This is needed for ifunc symbols which are
aliased to the resolver using .set and don't expect resolver attributes
to override the ifunc symbol attributes.  This means .variant_pcs must be
added explicitly to aliases.

gas/ChangeLog:

2019-05-22  Szabolcs Nagy  <szabolcs.nagy@arm.com>

	* config/tc-aarch64.c (aarch64_elf_copy_symbol_attributes): Define.
	* config/tc-aarch64.h (aarch64_elf_copy_symbol_attributes): Declare.
	(OBJ_COPY_SYMBOL_ATTRIBUTES): Define.
	* testsuite/gas/aarch64/symbol-variant_pcs-3.d: New test.
	* testsuite/gas/aarch64/symbol-variant_pcs-3.s: New test.

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0003-aarch64-override-default-elf-.set-handling-in-gas.diff --]
[-- Type: text/x-patch; name="0003-aarch64-override-default-elf-.set-handling-in-gas.diff", Size: 3383 bytes --]

diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c
index 3bccfa24ba..000a81c64f 100644
--- a/gas/config/tc-aarch64.c
+++ b/gas/config/tc-aarch64.c
@@ -9420,3 +9420,35 @@ aarch64_copy_symbol_attributes (symbolS * dest, symbolS * src)
 {
   AARCH64_GET_FLAG (dest) = AARCH64_GET_FLAG (src);
 }
+
+#ifdef OBJ_ELF
+/* Same as elf_copy_symbol_attributes, but without copying st_other.
+   This is needed so AArch64 specific st_other values can be independently
+   specified for an IFUNC resolver (that is called by the dynamic linker)
+   and the symbol it resolves (aliased to the resolver).  In particular,
+   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.  Requiring the directive on the IFUNC resolver
+   symbol would be unexpected and problematic in C code, where the two
+   symbols appear as two independent function declarations.  */
+
+void
+aarch64_elf_copy_symbol_attributes (symbolS *dest, symbolS *src)
+{
+  struct elf_obj_sy *srcelf = symbol_get_obj (src);
+  struct elf_obj_sy *destelf = symbol_get_obj (dest);
+  if (srcelf->size)
+    {
+      if (destelf->size == NULL)
+	destelf->size = XNEW (expressionS);
+      *destelf->size = *srcelf->size;
+    }
+  else
+    {
+      if (destelf->size != NULL)
+	free (destelf->size);
+      destelf->size = NULL;
+    }
+  S_SET_SIZE (dest, S_GET_SIZE (src));
+}
+#endif
diff --git a/gas/config/tc-aarch64.h b/gas/config/tc-aarch64.h
index b54907218c..f4eb1d5fa9 100644
--- a/gas/config/tc-aarch64.h
+++ b/gas/config/tc-aarch64.h
@@ -130,6 +130,12 @@ void aarch64_copy_symbol_attributes (symbolS *, symbolS *);
   (aarch64_copy_symbol_attributes (DEST, SRC))
 #endif
 
+#ifdef OBJ_ELF
+void aarch64_elf_copy_symbol_attributes (symbolS *, symbolS *);
+#define OBJ_COPY_SYMBOL_ATTRIBUTES(DEST, SRC) \
+  aarch64_elf_copy_symbol_attributes (DEST, SRC)
+#endif
+
 #define TC_START_LABEL(STR, NUL_CHAR, NEXT_CHAR)			\
   (NEXT_CHAR == ':' || (NEXT_CHAR == '/' && aarch64_data_in_code ()))
 #define tc_canonicalize_symbol_name(str) aarch64_canonicalize_symbol_name (str);
diff --git a/gas/testsuite/gas/aarch64/symbol-variant_pcs-3.d b/gas/testsuite/gas/aarch64/symbol-variant_pcs-3.d
new file mode 100644
index 0000000000..204914efbd
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/symbol-variant_pcs-3.d
@@ -0,0 +1,12 @@
+#objdump: -t
+
+.*:     file format .*
+
+SYMBOL TABLE:
+0+ l    d  \.text	0+ \.text
+0+ l    d  \.data	0+ \.data
+0+ l    d  \.bss	0+ \.bss
+0+ g       \.text	0+ 0x80 foo_vpcs
+0+ g       \.text	0+ foo_base
+0+ g       \.text	0+ 0x80 alias_vpcs
+0+ g       \.text	0+ alias_base
diff --git a/gas/testsuite/gas/aarch64/symbol-variant_pcs-3.s b/gas/testsuite/gas/aarch64/symbol-variant_pcs-3.s
new file mode 100644
index 0000000000..9960831682
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/symbol-variant_pcs-3.s
@@ -0,0 +1,20 @@
+.text
+.global foo_vpcs
+.global foo_base
+.global alias_vpcs
+.global alias_base
+
+.variant_pcs foo_vpcs
+.variant_pcs alias_vpcs
+
+foo_vpcs:
+foo_base:
+	bl foo_vpcs
+	bl foo_base
+	bl alias_vpcs
+	bl alias_base
+
+/* Check that the STO_AARCH64_VARIANT_PCS is not affected by .set.  */
+
+.set alias_base, foo_vpcs
+.set alias_vpcs, foo_base

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH binutils 4/4] aarch64: handle STO_AARCH64_VARIANT_PCS in bfd
  2019-05-23 11:04 [PATCH binutils 0/4] aarch64: Add STO_AARCH64_VARIANT_PCS support Szabolcs Nagy
                   ` (2 preceding siblings ...)
  2019-05-23 11:10 ` [PATCH binutils 3/4] aarch64: override default elf .set handling " Szabolcs Nagy
@ 2019-05-23 11:11 ` Szabolcs Nagy
  2019-05-26  8:51   ` Christophe Lyon
  2019-05-24 10:26 ` [PATCH binutils 0/4] aarch64: Add STO_AARCH64_VARIANT_PCS support Nick Clifton
  4 siblings, 1 reply; 15+ messages in thread
From: Szabolcs Nagy @ 2019-05-23 11:11 UTC (permalink / raw)
  To: binutils; +Cc: nd

[-- Attachment #1: Type: text/plain, Size: 1043 bytes --]

Propagate STO_AARCH64_VARIANT_PCS st_other attribute to the output and
add DT_AARCH64_VARIANT_PCS dynamic tag if necessary.

Mismatching attributes are not diagnosed.

bfd/ChangeLog:

2019-05-22  Szabolcs Nagy  <szabolcs.nagy@arm.com>

	* elfnn-aarch64.c (elfNN_aarch64_merge_symbol_attribute): New function.
	(struct elf_aarch64_link_hash_table): Add variant_pcs member.
	(elfNN_aarch64_allocate_dynrelocs): Update variant_pcs.
	(elfNN_aarch64_size_dynamic_sections): Add DT_AARCH64_VARIANT_PCS.
	(elf_backend_merge_symbol_attribute): Define.

ld/ChangeLog:

2019-05-22  Szabolcs Nagy  <szabolcs.nagy@arm.com>

	* testsuite/ld-aarch64/aarch64-elf.exp: Add new tests.
	* testsuite/ld-aarch64/variant_pcs-1.s: New asm for tests.
	* testsuite/ld-aarch64/variant_pcs-2.s: New asm for tests.
	* testsuite/ld-aarch64/variant_pcs-now.d: New test.
	* testsuite/ld-aarch64/variant_pcs-r.d: New test.
	* testsuite/ld-aarch64/variant_pcs-shared.d: New test.
	* testsuite/ld-aarch64/variant_pcs.ld: New linker script for tests.

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0004-aarch64-handle-STO_AARCH64_VARIANT_PCS-in-bfd.diff --]
[-- Type: text/x-patch; name="0004-aarch64-handle-STO_AARCH64_VARIANT_PCS-in-bfd.diff", Size: 24379 bytes --]

diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c
index 9e28544e4b..761e6b92b5 100644
--- a/bfd/elfnn-aarch64.c
+++ b/bfd/elfnn-aarch64.c
@@ -2681,6 +2681,9 @@ struct elf_aarch64_link_hash_table
   unsigned int top_index;
   asection **input_list;
 
+  /* JUMP_SLOT relocs for variant PCS symbols may be present.  */
+  int variant_pcs;
+
   /* The offset into splt of the PLT entry for the TLS descriptor
      resolver.  Special values are 0, if not necessary (or not found
      to be necessary yet), and -1 if needed but not determined
@@ -2895,6 +2898,31 @@ elfNN_aarch64_copy_indirect_symbol (struct bfd_link_info *info,
   _bfd_elf_link_hash_copy_indirect (info, dir, ind);
 }
 
+/* Merge non-visibility st_other attributes.  */
+
+static void
+elfNN_aarch64_merge_symbol_attribute (struct elf_link_hash_entry *h,
+				      const Elf_Internal_Sym *isym,
+				      bfd_boolean definition ATTRIBUTE_UNUSED,
+				      bfd_boolean dynamic ATTRIBUTE_UNUSED)
+{
+  unsigned int isym_sto = isym->st_other & ~ELF_ST_VISIBILITY (-1);
+  unsigned int h_sto = h->other & ~ELF_ST_VISIBILITY (-1);
+
+  if (isym_sto == h_sto)
+    return;
+
+  if (isym_sto & ~STO_AARCH64_VARIANT_PCS)
+    /* Not fatal, this callback cannot fail.  */
+    _bfd_error_handler (_("unknown attribute for symbol `%s': 0x%02x"),
+			h->root.root.string, isym_sto);
+
+  /* Note: Ideally we would warn about any attribute mismatch, but
+     this api does not allow that without substantial changes.  */
+  if (isym_sto & STO_AARCH64_VARIANT_PCS)
+    h->other |= STO_AARCH64_VARIANT_PCS;
+}
+
 /* Destroy an AArch64 elf linker hash table.  */
 
 static void
@@ -8571,6 +8599,12 @@ elfNN_aarch64_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
 	     updated.  */
 
 	  htab->root.srelplt->reloc_count++;
+
+	  /* Mark the DSO in case R_<CLS>_JUMP_SLOT relocs against
+	     variant PCS symbols are present.  */
+	  if (h->other & STO_AARCH64_VARIANT_PCS)
+	    htab->variant_pcs = 1;
+
 	}
       else
 	{
@@ -9159,6 +9193,10 @@ elfNN_aarch64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
 	      || !add_dynamic_entry (DT_JMPREL, 0))
 	    return FALSE;
 
+	  if (htab->variant_pcs
+	      && !add_dynamic_entry (DT_AARCH64_VARIANT_PCS, 0))
+	    return FALSE;
+
 	  if (htab->tlsdesc_plt
 	      && !(info->flags & DF_BIND_NOW)
 	      && (!add_dynamic_entry (DT_TLSDESC_PLT, 0)
@@ -10083,6 +10121,9 @@ const struct elf_size_info elfNN_aarch64_size_info =
 #define elf_backend_copy_indirect_symbol	\
   elfNN_aarch64_copy_indirect_symbol
 
+#define elf_backend_merge_symbol_attribute	\
+  elfNN_aarch64_merge_symbol_attribute
+
 /* Create .dynbss, and .rela.bss sections in DYNOBJ, and set up shortcuts
    to them in our hash.  */
 #define elf_backend_create_dynamic_sections	\
diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp
index 1e4c38e691..c1a94957aa 100644
--- a/ld/testsuite/ld-aarch64/aarch64-elf.exp
+++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp
@@ -384,6 +384,10 @@ run_dump_test "property-bti-pac3"
 run_dump_test "bti-plt-1"
 run_dump_test "bti-plt-2"
 
+run_dump_test_lp64 "variant_pcs-r"
+run_dump_test_lp64 "variant_pcs-shared"
+run_dump_test_lp64 "variant_pcs-now"
+
 set aarch64elflinktests {
   {"ld-aarch64/so with global symbol" "-shared" "" "" {copy-reloc-so.s}
     {} "copy-reloc-so.so"}
diff --git a/ld/testsuite/ld-aarch64/variant_pcs-1.s b/ld/testsuite/ld-aarch64/variant_pcs-1.s
new file mode 100644
index 0000000000..8461e8ff5e
--- /dev/null
+++ b/ld/testsuite/ld-aarch64/variant_pcs-1.s
@@ -0,0 +1,59 @@
+.text
+
+.variant_pcs f_spec_global_default_def
+.variant_pcs f_spec_global_default_undef
+.variant_pcs f_spec_global_hidden_def
+.variant_pcs f_spec_local
+.variant_pcs f_spec_global_default_ifunc
+.variant_pcs f_spec_global_hidden_ifunc
+.variant_pcs f_spec_local_ifunc
+
+.global f_spec_global_default_def
+.global f_spec_global_default_undef
+.global f_spec_global_hidden_def
+.global f_spec_global_default_ifunc
+.global f_spec_global_hidden_ifunc
+.global f_base_global_default_def
+.global f_base_global_default_undef
+.global f_base_global_hidden_def
+.global f_base_global_default_ifunc
+.global f_base_global_hidden_ifunc
+
+.hidden f_spec_global_hidden_def
+.hidden f_spec_global_hidden_ifunc
+.hidden f_base_global_hidden_def
+.hidden f_base_global_hidden_ifunc
+
+.type f_spec_global_default_ifunc, %gnu_indirect_function
+.type f_spec_global_hidden_ifunc, %gnu_indirect_function
+.type f_spec_local_ifunc, %gnu_indirect_function
+.type f_base_global_default_ifunc, %gnu_indirect_function
+.type f_base_global_hidden_ifunc, %gnu_indirect_function
+.type f_base_local_ifunc, %gnu_indirect_function
+
+f_spec_global_default_def:
+f_spec_global_hidden_def:
+f_spec_local:
+f_base_global_default_def:
+f_base_global_hidden_def:
+f_base_local:
+f_spec_global_default_ifunc:
+f_spec_global_hidden_ifunc:
+f_spec_local_ifunc:
+f_base_global_default_ifunc:
+f_base_global_hidden_ifunc:
+f_base_local_ifunc:
+	bl f_spec_global_default_def
+	bl f_spec_global_default_undef
+	bl f_spec_global_hidden_def
+	bl f_spec_local
+	bl f_base_global_default_def
+	bl f_base_global_default_undef
+	bl f_base_global_hidden_def
+	bl f_base_local
+	bl f_spec_global_default_ifunc
+	bl f_spec_global_hidden_ifunc
+	bl f_spec_local_ifunc
+	bl f_base_global_default_ifunc
+	bl f_base_global_hidden_ifunc
+	bl f_base_local_ifunc
diff --git a/ld/testsuite/ld-aarch64/variant_pcs-2.s b/ld/testsuite/ld-aarch64/variant_pcs-2.s
new file mode 100644
index 0000000000..e8f13ad941
--- /dev/null
+++ b/ld/testsuite/ld-aarch64/variant_pcs-2.s
@@ -0,0 +1,47 @@
+.text
+
+.variant_pcs f_spec_global_default_def
+.variant_pcs f_spec_global_default_undef
+.variant_pcs f_spec_global_hidden_def
+.variant_pcs f_spec_local2
+.variant_pcs f_spec_global_default_ifunc
+.variant_pcs f_spec_global_hidden_ifunc
+.variant_pcs f_spec_local2_ifunc
+
+.global f_spec_global_default_def
+.global f_spec_global_default_undef
+.global f_spec_global_hidden_def
+.global f_spec_global_default_ifunc
+.global f_spec_global_hidden_ifunc
+.global f_base_global_default_def
+.global f_base_global_default_undef
+.global f_base_global_hidden_def
+.global f_base_global_default_ifunc
+.global f_base_global_hidden_ifunc
+
+.hidden f_spec_global_hidden_def
+.hidden f_spec_global_hidden_ifunc
+.hidden f_base_global_hidden_def
+.hidden f_base_global_hidden_ifunc
+
+.type f_spec_local2_ifunc, %gnu_indirect_function
+.type f_base_local2_ifunc, %gnu_indirect_function
+
+f_spec_local2:
+f_base_local2:
+f_spec_local2_ifunc:
+f_base_local2_ifunc:
+	bl f_spec_global_default_def
+	bl f_spec_global_default_undef
+	bl f_spec_global_hidden_def
+	bl f_spec_local2
+	bl f_base_global_default_def
+	bl f_base_global_default_undef
+	bl f_base_global_hidden_def
+	bl f_base_local2
+	bl f_spec_global_default_ifunc
+	bl f_spec_global_hidden_ifunc
+	bl f_spec_local2_ifunc
+	bl f_base_global_default_ifunc
+	bl f_base_global_hidden_ifunc
+	bl f_base_local2_ifunc
diff --git a/ld/testsuite/ld-aarch64/variant_pcs-now.d b/ld/testsuite/ld-aarch64/variant_pcs-now.d
new file mode 100644
index 0000000000..fc238929da
--- /dev/null
+++ b/ld/testsuite/ld-aarch64/variant_pcs-now.d
@@ -0,0 +1,68 @@
+#source: variant_pcs-1.s
+#source: variant_pcs-2.s
+#ld: -shared -T variant_pcs.ld -z now
+#readelf: -rsW
+
+Relocation section '\.rela\.plt' at offset 0x11000 contains 12 entries:
+    Offset             Info             Type               Symbol's Value  Symbol's Name \+ Addend
+0000000000009020  0000000100000402 R_AARCH64_JUMP_SLOT    0000000000000000 f_base_global_default_undef \+ 0
+0000000000009028  0000000200000402 R_AARCH64_JUMP_SLOT    0000000000000000 f_spec_global_default_undef \+ 0
+0000000000009030  0000000500000402 R_AARCH64_JUMP_SLOT    0000000000008000 f_base_global_default_def \+ 0
+0000000000009038  0000000600000402 R_AARCH64_JUMP_SLOT    0000000000008000 f_spec_global_default_def \+ 0
+0000000000009040  0000000000000408 R_AARCH64_IRELATIVE                       8000
+0000000000009048  0000000400000402 R_AARCH64_JUMP_SLOT    f_spec_global_default_ifunc\(\) f_spec_global_default_ifunc \+ 0
+0000000000009050  0000000000000408 R_AARCH64_IRELATIVE                       8000
+0000000000009058  0000000300000402 R_AARCH64_JUMP_SLOT    f_base_global_default_ifunc\(\) f_base_global_default_ifunc \+ 0
+0000000000009060  0000000000000408 R_AARCH64_IRELATIVE                       8038
+0000000000009068  0000000000000408 R_AARCH64_IRELATIVE                       8038
+0000000000009070  0000000000000408 R_AARCH64_IRELATIVE                       8000
+0000000000009078  0000000000000408 R_AARCH64_IRELATIVE                       8000
+
+Symbol table '\.dynsym' contains 7 entries:
+   Num:    Value          Size Type    Bind   Vis      Ndx Name
+     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND f_base_global_default_undef
+     2: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT \[VARIANT_PCS\]   UND f_spec_global_default_undef
+     3: 0000000000008000     0 IFUNC   GLOBAL DEFAULT    1 f_base_global_default_ifunc
+     4: 0000000000008000     0 IFUNC   GLOBAL DEFAULT \[VARIANT_PCS\]     1 f_spec_global_default_ifunc
+     5: 0000000000008000     0 NOTYPE  GLOBAL DEFAULT    1 f_base_global_default_def
+     6: 0000000000008000     0 NOTYPE  GLOBAL DEFAULT \[VARIANT_PCS\]     1 f_spec_global_default_def
+
+Symbol table '\.symtab' contains 36 entries:
+   Num:    Value          Size Type    Bind   Vis      Ndx Name
+     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 0000000000008000     0 SECTION LOCAL  DEFAULT    1 
+     2: 0000000000008070     0 SECTION LOCAL  DEFAULT    2 
+     3: 0000000000009000     0 SECTION LOCAL  DEFAULT    3 
+     4: 0000000000009080     0 SECTION LOCAL  DEFAULT    4 
+     5: 0000000000011000     0 SECTION LOCAL  DEFAULT    5 
+     6: 0000000000011120     0 SECTION LOCAL  DEFAULT    6 
+     7: 00000000000111c8     0 SECTION LOCAL  DEFAULT    7 
+     8: 0000000000011270     0 SECTION LOCAL  DEFAULT    8 
+     9: 00000000000112a0     0 SECTION LOCAL  DEFAULT    9 
+    10: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS .*variant_pcs-1\.o
+    11: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local
+    12: 0000000000008000     0 IFUNC   LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local_ifunc
+    13: 0000000000008000     0 IFUNC   LOCAL  DEFAULT    1 f_base_local_ifunc
+    14: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT    1 f_base_local
+    15: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT    1 \$x
+    16: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS .*variant_pcs-2\.o
+    17: 0000000000008038     0 NOTYPE  LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local2
+    18: 0000000000008038     0 IFUNC   LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local2_ifunc
+    19: 0000000000008038     0 IFUNC   LOCAL  DEFAULT    1 f_base_local2_ifunc
+    20: 0000000000008038     0 NOTYPE  LOCAL  DEFAULT    1 f_base_local2
+    21: 0000000000008038     0 NOTYPE  LOCAL  DEFAULT    1 \$x
+    22: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS 
+    23: 0000000000009080     0 OBJECT  LOCAL  DEFAULT  ABS _DYNAMIC
+    24: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_global_hidden_def
+    25: 0000000000008000     0 IFUNC   LOCAL  DEFAULT    1 f_base_global_hidden_ifunc
+    26: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT    1 f_base_global_hidden_def
+    27: 0000000000009000     0 OBJECT  LOCAL  DEFAULT  ABS _GLOBAL_OFFSET_TABLE_
+    28: 0000000000008000     0 IFUNC   LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_global_hidden_ifunc
+    29: 0000000000008070     0 NOTYPE  LOCAL  DEFAULT    2 \$x
+    30: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND f_base_global_default_undef
+    31: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT \[VARIANT_PCS\]   UND f_spec_global_default_undef
+    32: 0000000000008000     0 IFUNC   GLOBAL DEFAULT \[VARIANT_PCS\]     1 f_spec_global_default_ifunc
+    33: 0000000000008000     0 NOTYPE  GLOBAL DEFAULT    1 f_base_global_default_def
+    34: 0000000000008000     0 NOTYPE  GLOBAL DEFAULT \[VARIANT_PCS\]     1 f_spec_global_default_def
+    35: 0000000000008000     0 IFUNC   GLOBAL DEFAULT    1 f_base_global_default_ifunc
diff --git a/ld/testsuite/ld-aarch64/variant_pcs-r.d b/ld/testsuite/ld-aarch64/variant_pcs-r.d
new file mode 100644
index 0000000000..a534149d9e
--- /dev/null
+++ b/ld/testsuite/ld-aarch64/variant_pcs-r.d
@@ -0,0 +1,60 @@
+#source: variant_pcs-1.s
+#source: variant_pcs-2.s
+#ld: -r
+#readelf: -rsW
+
+Relocation section '\.rela\.text' at offset .* contains 24 entries:
+    Offset             Info             Type               Symbol's Value  Symbol's Name \+ Addend
+0000000000000000  000000180000011b R_AARCH64_CALL26       0000000000000000 f_spec_global_default_def \+ 0
+0000000000000004  000000110000011b R_AARCH64_CALL26       0000000000000000 f_spec_global_default_undef \+ 0
+0000000000000008  000000120000011b R_AARCH64_CALL26       0000000000000000 f_spec_global_hidden_def \+ 0
+0000000000000010  000000170000011b R_AARCH64_CALL26       0000000000000000 f_base_global_default_def \+ 0
+0000000000000014  000000100000011b R_AARCH64_CALL26       0000000000000000 f_base_global_default_undef \+ 0
+0000000000000018  000000150000011b R_AARCH64_CALL26       0000000000000000 f_base_global_hidden_def \+ 0
+0000000000000020  000000140000011b R_AARCH64_CALL26       f_spec_global_default_ifunc\(\) f_spec_global_default_ifunc \+ 0
+0000000000000024  000000160000011b R_AARCH64_CALL26       f_spec_global_hidden_ifunc\(\) f_spec_global_hidden_ifunc \+ 0
+0000000000000028  000000060000011b R_AARCH64_CALL26       f_spec_local_ifunc\(\) f_spec_local_ifunc \+ 0
+000000000000002c  000000190000011b R_AARCH64_CALL26       f_base_global_default_ifunc\(\) f_base_global_default_ifunc \+ 0
+0000000000000030  000000130000011b R_AARCH64_CALL26       f_base_global_hidden_ifunc\(\) f_base_global_hidden_ifunc \+ 0
+0000000000000034  000000070000011b R_AARCH64_CALL26       f_base_local_ifunc\(\) f_base_local_ifunc \+ 0
+0000000000000038  000000180000011b R_AARCH64_CALL26       0000000000000000 f_spec_global_default_def \+ 0
+000000000000003c  000000110000011b R_AARCH64_CALL26       0000000000000000 f_spec_global_default_undef \+ 0
+0000000000000040  000000120000011b R_AARCH64_CALL26       0000000000000000 f_spec_global_hidden_def \+ 0
+0000000000000048  000000170000011b R_AARCH64_CALL26       0000000000000000 f_base_global_default_def \+ 0
+000000000000004c  000000100000011b R_AARCH64_CALL26       0000000000000000 f_base_global_default_undef \+ 0
+0000000000000050  000000150000011b R_AARCH64_CALL26       0000000000000000 f_base_global_hidden_def \+ 0
+0000000000000058  000000140000011b R_AARCH64_CALL26       f_spec_global_default_ifunc\(\) f_spec_global_default_ifunc \+ 0
+000000000000005c  000000160000011b R_AARCH64_CALL26       f_spec_global_hidden_ifunc\(\) f_spec_global_hidden_ifunc \+ 0
+0000000000000060  0000000c0000011b R_AARCH64_CALL26       f_spec_local2_ifunc\(\) f_spec_local2_ifunc \+ 0
+0000000000000064  000000190000011b R_AARCH64_CALL26       f_base_global_default_ifunc\(\) f_base_global_default_ifunc \+ 0
+0000000000000068  000000130000011b R_AARCH64_CALL26       f_base_global_hidden_ifunc\(\) f_base_global_hidden_ifunc \+ 0
+000000000000006c  0000000d0000011b R_AARCH64_CALL26       f_base_local2_ifunc\(\) f_base_local2_ifunc \+ 0
+
+Symbol table '\.symtab' contains 26 entries:
+   Num:    Value          Size Type    Bind   Vis      Ndx Name
+     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 0000000000000000     0 SECTION LOCAL  DEFAULT    1 
+     2: 0000000000000000     0 SECTION LOCAL  DEFAULT    3 
+     3: 0000000000000000     0 SECTION LOCAL  DEFAULT    4 
+     4: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS .*variant_pcs-1\.o
+     5: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local
+     6: 0000000000000000     0 IFUNC   LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local_ifunc
+     7: 0000000000000000     0 IFUNC   LOCAL  DEFAULT    1 f_base_local_ifunc
+     8: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT    1 f_base_local
+     9: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT    1 \$x
+    10: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS .*variant_pcs-2\.o
+    11: 0000000000000038     0 NOTYPE  LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local2
+    12: 0000000000000038     0 IFUNC   LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local2_ifunc
+    13: 0000000000000038     0 IFUNC   LOCAL  DEFAULT    1 f_base_local2_ifunc
+    14: 0000000000000038     0 NOTYPE  LOCAL  DEFAULT    1 f_base_local2
+    15: 0000000000000038     0 NOTYPE  LOCAL  DEFAULT    1 \$x
+    16: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND f_base_global_default_undef
+    17: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT \[VARIANT_PCS\]   UND f_spec_global_default_undef
+    18: 0000000000000000     0 NOTYPE  GLOBAL HIDDEN  \[VARIANT_PCS\]     1 f_spec_global_hidden_def
+    19: 0000000000000000     0 IFUNC   GLOBAL HIDDEN     1 f_base_global_hidden_ifunc
+    20: 0000000000000000     0 IFUNC   GLOBAL DEFAULT \[VARIANT_PCS\]     1 f_spec_global_default_ifunc
+    21: 0000000000000000     0 NOTYPE  GLOBAL HIDDEN     1 f_base_global_hidden_def
+    22: 0000000000000000     0 IFUNC   GLOBAL HIDDEN  \[VARIANT_PCS\]     1 f_spec_global_hidden_ifunc
+    23: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT    1 f_base_global_default_def
+    24: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT \[VARIANT_PCS\]     1 f_spec_global_default_def
+    25: 0000000000000000     0 IFUNC   GLOBAL DEFAULT    1 f_base_global_default_ifunc
diff --git a/ld/testsuite/ld-aarch64/variant_pcs-shared.d b/ld/testsuite/ld-aarch64/variant_pcs-shared.d
new file mode 100644
index 0000000000..508bdaa206
--- /dev/null
+++ b/ld/testsuite/ld-aarch64/variant_pcs-shared.d
@@ -0,0 +1,68 @@
+#source: variant_pcs-1.s
+#source: variant_pcs-2.s
+#ld: -shared -T variant_pcs.ld
+#readelf: -rsW
+
+Relocation section '\.rela\.plt' at offset 0x11000 contains 12 entries:
+    Offset             Info             Type               Symbol's Value  Symbol's Name \+ Addend
+0000000000009020  0000000100000402 R_AARCH64_JUMP_SLOT    0000000000000000 f_base_global_default_undef \+ 0
+0000000000009028  0000000200000402 R_AARCH64_JUMP_SLOT    0000000000000000 f_spec_global_default_undef \+ 0
+0000000000009030  0000000500000402 R_AARCH64_JUMP_SLOT    0000000000008000 f_base_global_default_def \+ 0
+0000000000009038  0000000600000402 R_AARCH64_JUMP_SLOT    0000000000008000 f_spec_global_default_def \+ 0
+0000000000009040  0000000000000408 R_AARCH64_IRELATIVE                       8000
+0000000000009048  0000000400000402 R_AARCH64_JUMP_SLOT    f_spec_global_default_ifunc\(\) f_spec_global_default_ifunc \+ 0
+0000000000009050  0000000000000408 R_AARCH64_IRELATIVE                       8000
+0000000000009058  0000000300000402 R_AARCH64_JUMP_SLOT    f_base_global_default_ifunc\(\) f_base_global_default_ifunc \+ 0
+0000000000009060  0000000000000408 R_AARCH64_IRELATIVE                       8038
+0000000000009068  0000000000000408 R_AARCH64_IRELATIVE                       8038
+0000000000009070  0000000000000408 R_AARCH64_IRELATIVE                       8000
+0000000000009078  0000000000000408 R_AARCH64_IRELATIVE                       8000
+
+Symbol table '\.dynsym' contains 7 entries:
+   Num:    Value          Size Type    Bind   Vis      Ndx Name
+     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND f_base_global_default_undef
+     2: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT \[VARIANT_PCS\]   UND f_spec_global_default_undef
+     3: 0000000000008000     0 IFUNC   GLOBAL DEFAULT    1 f_base_global_default_ifunc
+     4: 0000000000008000     0 IFUNC   GLOBAL DEFAULT \[VARIANT_PCS\]     1 f_spec_global_default_ifunc
+     5: 0000000000008000     0 NOTYPE  GLOBAL DEFAULT    1 f_base_global_default_def
+     6: 0000000000008000     0 NOTYPE  GLOBAL DEFAULT \[VARIANT_PCS\]     1 f_spec_global_default_def
+
+Symbol table '\.symtab' contains 36 entries:
+   Num:    Value          Size Type    Bind   Vis      Ndx Name
+     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 0000000000008000     0 SECTION LOCAL  DEFAULT    1 
+     2: 0000000000008070     0 SECTION LOCAL  DEFAULT    2 
+     3: 0000000000009000     0 SECTION LOCAL  DEFAULT    3 
+     4: 0000000000009080     0 SECTION LOCAL  DEFAULT    4 
+     5: 0000000000011000     0 SECTION LOCAL  DEFAULT    5 
+     6: 0000000000011120     0 SECTION LOCAL  DEFAULT    6 
+     7: 00000000000111c8     0 SECTION LOCAL  DEFAULT    7 
+     8: 0000000000011270     0 SECTION LOCAL  DEFAULT    8 
+     9: 00000000000112a0     0 SECTION LOCAL  DEFAULT    9 
+    10: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS .*variant_pcs-1\.o
+    11: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local
+    12: 0000000000008000     0 IFUNC   LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local_ifunc
+    13: 0000000000008000     0 IFUNC   LOCAL  DEFAULT    1 f_base_local_ifunc
+    14: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT    1 f_base_local
+    15: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT    1 \$x
+    16: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS .*variant_pcs-2\.o
+    17: 0000000000008038     0 NOTYPE  LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local2
+    18: 0000000000008038     0 IFUNC   LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local2_ifunc
+    19: 0000000000008038     0 IFUNC   LOCAL  DEFAULT    1 f_base_local2_ifunc
+    20: 0000000000008038     0 NOTYPE  LOCAL  DEFAULT    1 f_base_local2
+    21: 0000000000008038     0 NOTYPE  LOCAL  DEFAULT    1 \$x
+    22: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS 
+    23: 0000000000009080     0 OBJECT  LOCAL  DEFAULT  ABS _DYNAMIC
+    24: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_global_hidden_def
+    25: 0000000000008000     0 IFUNC   LOCAL  DEFAULT    1 f_base_global_hidden_ifunc
+    26: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT    1 f_base_global_hidden_def
+    27: 0000000000009000     0 OBJECT  LOCAL  DEFAULT  ABS _GLOBAL_OFFSET_TABLE_
+    28: 0000000000008000     0 IFUNC   LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_global_hidden_ifunc
+    29: 0000000000008070     0 NOTYPE  LOCAL  DEFAULT    2 \$x
+    30: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND f_base_global_default_undef
+    31: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT \[VARIANT_PCS\]   UND f_spec_global_default_undef
+    32: 0000000000008000     0 IFUNC   GLOBAL DEFAULT \[VARIANT_PCS\]     1 f_spec_global_default_ifunc
+    33: 0000000000008000     0 NOTYPE  GLOBAL DEFAULT    1 f_base_global_default_def
+    34: 0000000000008000     0 NOTYPE  GLOBAL DEFAULT \[VARIANT_PCS\]     1 f_spec_global_default_def
+    35: 0000000000008000     0 IFUNC   GLOBAL DEFAULT    1 f_base_global_default_ifunc
diff --git a/ld/testsuite/ld-aarch64/variant_pcs.ld b/ld/testsuite/ld-aarch64/variant_pcs.ld
new file mode 100644
index 0000000000..a66a9343a7
--- /dev/null
+++ b/ld/testsuite/ld-aarch64/variant_pcs.ld
@@ -0,0 +1,23 @@
+/* Script for .variant_pcs symbol tests.  */
+OUTPUT_ARCH(aarch64)
+ENTRY(_start)
+SECTIONS
+{
+  /* Read-only sections, merged into text segment: */
+  PROVIDE (__executable_start = 0x8000); . = 0x8000;
+  .text           :
+  {
+    *(.before)
+    *(.text)
+    *(.after)
+  } =0
+  . = 0x9000;
+  .got            : { *(.got) *(.got.plt)}
+  . = 0x10000;
+  .rela.dyn       : { *(.rela.ifunc) }
+  . = 0x11000;
+  .rela.plt       : { *(.rela.plt) *(.rela.iplt) }
+  . = 0x12340000;
+  .far : { *(.far) }
+  .ARM.attributes 0 : { *(.ARM.atttributes) }
+}

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH binutils 1/4] aarch64: add STO_AARCH64_VARIANT_PCS and DT_AARCH64_VARIANT_PCS
  2019-05-23 11:07 ` [PATCH binutils 1/4] aarch64: add STO_AARCH64_VARIANT_PCS and DT_AARCH64_VARIANT_PCS Szabolcs Nagy
@ 2019-05-24 10:24   ` Nick Clifton
  2019-05-24 10:58     ` Jan Beulich
  0 siblings, 1 reply; 15+ messages in thread
From: Nick Clifton @ 2019-05-24 10:24 UTC (permalink / raw)
  To: Szabolcs Nagy, Binutils; +Cc: nd

Hi Szabolcs,

  A little bit of paranoia...

> +static const char *
> +get_aarch64_symbol_other (unsigned int other)
> +{
> +  static char buf[32];
> +
> +  if (other & STO_AARCH64_VARIANT_PCS)
> +    {
> +      other &= ~STO_AARCH64_VARIANT_PCS;
> +      if (other == 0)
> +	return "VARIANT_PCS";
> +      snprintf (buf, sizeof buf, "VARIANT_PCS | %x", other);
> +      return buf;

On a host where an unsigned int is a 64-bit quantity, it is
theoretically possible for the snprintf function to have to
truncate the output, possibly confusing the user.  Could you
increase the buffer size a little bit please ?

Cheers
  Nick

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH binutils 0/4] aarch64: Add STO_AARCH64_VARIANT_PCS support
  2019-05-23 11:04 [PATCH binutils 0/4] aarch64: Add STO_AARCH64_VARIANT_PCS support Szabolcs Nagy
                   ` (3 preceding siblings ...)
  2019-05-23 11:11 ` [PATCH binutils 4/4] aarch64: handle STO_AARCH64_VARIANT_PCS in bfd Szabolcs Nagy
@ 2019-05-24 10:26 ` Nick Clifton
  2019-05-24 14:25   ` Szabolcs Nagy
  2019-05-24 15:08   ` Szabolcs Nagy
  4 siblings, 2 replies; 15+ messages in thread
From: Nick Clifton @ 2019-05-24 10:26 UTC (permalink / raw)
  To: Szabolcs Nagy, Binutils; +Cc: nd

Hi Szabolcs,

> Szabolcs Nagy (4):
>   aarch64: add STO_AARCH64_VARIANT_PCS and DT_AARCH64_VARIANT_PCS
>   aarch64: handle .variant_pcs directive in gas
>   aarch64: override default elf .set handling in gas
>   aarch64: handle STO_AARCH64_VARIANT_PCS in bfd
 
Patch series approved.  (Well modulo the small request for a larger buffer).

Cheers
  Nick

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH binutils 1/4] aarch64: add STO_AARCH64_VARIANT_PCS and DT_AARCH64_VARIANT_PCS
  2019-05-24 10:24   ` Nick Clifton
@ 2019-05-24 10:58     ` Jan Beulich
  2019-05-24 11:01       ` Nick Clifton
  0 siblings, 1 reply; 15+ messages in thread
From: Jan Beulich @ 2019-05-24 10:58 UTC (permalink / raw)
  To: Nick Clifton; +Cc: nd, Szabolcs Nagy, binutils

>>> On 24.05.19 at 12:23, <nickc@redhat.com> wrote:
> Hi Szabolcs,
> 
>   A little bit of paranoia...
> 
>> +static const char *
>> +get_aarch64_symbol_other (unsigned int other)
>> +{
>> +  static char buf[32];
>> +
>> +  if (other & STO_AARCH64_VARIANT_PCS)
>> +    {
>> +      other &= ~STO_AARCH64_VARIANT_PCS;
>> +      if (other == 0)
>> +	return "VARIANT_PCS";
>> +      snprintf (buf, sizeof buf, "VARIANT_PCS | %x", other);
>> +      return buf;
> 
> On a host where an unsigned int is a 64-bit quantity, it is
> theoretically possible for the snprintf function to have to
> truncate the output, possibly confusing the user.  Could you
> increase the buffer size a little bit please ?

Hmm, %x can be at most 16 digits then, and I count 14
literal characters and a nul. I.e. 32 looks to be sufficient
for that case.

Jan


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH binutils 1/4] aarch64: add STO_AARCH64_VARIANT_PCS and DT_AARCH64_VARIANT_PCS
  2019-05-24 10:58     ` Jan Beulich
@ 2019-05-24 11:01       ` Nick Clifton
  0 siblings, 0 replies; 15+ messages in thread
From: Nick Clifton @ 2019-05-24 11:01 UTC (permalink / raw)
  To: Jan Beulich; +Cc: nd, Szabolcs Nagy, binutils

Hi Jan,

>>> +  static char buf[32];

>>> +      snprintf (buf, sizeof buf, "VARIANT_PCS | %x", other);

>> On a host where an unsigned int is a 64-bit quantity, it is
>> theoretically possible for the snprintf function to have to
>> truncate the output, possibly confusing the user.  Could you
>> increase the buffer size a little bit please ?
> 
> Hmm, %x can be at most 16 digits then, and I count 14
> literal characters and a nul. I.e. 32 looks to be sufficient
> for that case.

Oh bananas - yes you are right - I can't count.  Please ignore this request. :-)

Cheers
  Nick


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH binutils 0/4] aarch64: Add STO_AARCH64_VARIANT_PCS support
  2019-05-24 10:26 ` [PATCH binutils 0/4] aarch64: Add STO_AARCH64_VARIANT_PCS support Nick Clifton
@ 2019-05-24 14:25   ` Szabolcs Nagy
  2019-05-24 15:08   ` Szabolcs Nagy
  1 sibling, 0 replies; 15+ messages in thread
From: Szabolcs Nagy @ 2019-05-24 14:25 UTC (permalink / raw)
  To: nickc, Binutils; +Cc: nd

On 24/05/2019 11:26, Nick Clifton wrote:
> Hi Szabolcs,
> 
>> Szabolcs Nagy (4):
>>   aarch64: add STO_AARCH64_VARIANT_PCS and DT_AARCH64_VARIANT_PCS
>>   aarch64: handle .variant_pcs directive in gas
>>   aarch64: override default elf .set handling in gas
>>   aarch64: handle STO_AARCH64_VARIANT_PCS in bfd
>  
> Patch series approved.  (Well modulo the small request for a larger buffer).

thanks, applied.
(with original buffer size)

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH binutils 0/4] aarch64: Add STO_AARCH64_VARIANT_PCS support
  2019-05-24 10:26 ` [PATCH binutils 0/4] aarch64: Add STO_AARCH64_VARIANT_PCS support Nick Clifton
  2019-05-24 14:25   ` Szabolcs Nagy
@ 2019-05-24 15:08   ` Szabolcs Nagy
  2019-07-05 14:29     ` Szabolcs Nagy
  1 sibling, 1 reply; 15+ messages in thread
From: Szabolcs Nagy @ 2019-05-24 15:08 UTC (permalink / raw)
  To: nickc, Binutils; +Cc: nd

On 24/05/2019 11:26, Nick Clifton wrote:
> Hi Szabolcs,
> 
>> Szabolcs Nagy (4):
>>   aarch64: add STO_AARCH64_VARIANT_PCS and DT_AARCH64_VARIANT_PCS
>>   aarch64: handle .variant_pcs directive in gas
>>   aarch64: override default elf .set handling in gas
>>   aarch64: handle STO_AARCH64_VARIANT_PCS in bfd
>  
> Patch series approved.  (Well modulo the small request for a larger buffer).

this is new abi, but since it is required for correctness,
i'd like to backport it to the 2.32 release branch after
some testing on the master branch.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH binutils 4/4] aarch64: handle STO_AARCH64_VARIANT_PCS in bfd
  2019-05-23 11:11 ` [PATCH binutils 4/4] aarch64: handle STO_AARCH64_VARIANT_PCS in bfd Szabolcs Nagy
@ 2019-05-26  8:51   ` Christophe Lyon
  2019-05-28 11:07     ` Szabolcs Nagy
  0 siblings, 1 reply; 15+ messages in thread
From: Christophe Lyon @ 2019-05-26  8:51 UTC (permalink / raw)
  To: Szabolcs Nagy; +Cc: binutils, nd

On Thu, 23 May 2019 at 13:11, Szabolcs Nagy <Szabolcs.Nagy@arm.com> wrote:
>
> Propagate STO_AARCH64_VARIANT_PCS st_other attribute to the output and
> add DT_AARCH64_VARIANT_PCS dynamic tag if necessary.
>
> Mismatching attributes are not diagnosed.
>
> bfd/ChangeLog:
>
> 2019-05-22  Szabolcs Nagy  <szabolcs.nagy@arm.com>
>
>         * elfnn-aarch64.c (elfNN_aarch64_merge_symbol_attribute): New function.
>         (struct elf_aarch64_link_hash_table): Add variant_pcs member.
>         (elfNN_aarch64_allocate_dynrelocs): Update variant_pcs.
>         (elfNN_aarch64_size_dynamic_sections): Add DT_AARCH64_VARIANT_PCS.
>         (elf_backend_merge_symbol_attribute): Define.
>
> ld/ChangeLog:
>
> 2019-05-22  Szabolcs Nagy  <szabolcs.nagy@arm.com>
>
>         * testsuite/ld-aarch64/aarch64-elf.exp: Add new tests.
>         * testsuite/ld-aarch64/variant_pcs-1.s: New asm for tests.
>         * testsuite/ld-aarch64/variant_pcs-2.s: New asm for tests.
>         * testsuite/ld-aarch64/variant_pcs-now.d: New test.
>         * testsuite/ld-aarch64/variant_pcs-r.d: New test.
>         * testsuite/ld-aarch64/variant_pcs-shared.d: New test.
>         * testsuite/ld-aarch64/variant_pcs.ld: New linker script for tests.

Hi,

I have noticed that some new tests fail on aarch64-elf:
FAIL: ld-aarch64/variant_pcs-now
FAIL: ld-aarch64/variant_pcs-shared

Christophe

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH binutils 4/4] aarch64: handle STO_AARCH64_VARIANT_PCS in bfd
  2019-05-26  8:51   ` Christophe Lyon
@ 2019-05-28 11:07     ` Szabolcs Nagy
  0 siblings, 0 replies; 15+ messages in thread
From: Szabolcs Nagy @ 2019-05-28 11:07 UTC (permalink / raw)
  To: Christophe Lyon; +Cc: nd, binutils, nickc

[-- Attachment #1: Type: text/plain, Size: 242 bytes --]

On 26/05/2019 09:50, Christophe Lyon wrote:
> I have noticed that some new tests fail on aarch64-elf:
> FAIL: ld-aarch64/variant_pcs-now
> FAIL: ld-aarch64/variant_pcs-shared

Sorry. committed the attached fix for the tests as obvious.

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-aarch64-fix-variant_pcs-ld-tests.patch --]
[-- Type: text/x-patch; name="0001-aarch64-fix-variant_pcs-ld-tests.patch", Size: 18289 bytes --]

From 65f381e729bedb933f3e1376e7f53f0ff63ac9a8 Mon Sep 17 00:00:00 2001
From: Szabolcs Nagy <szabolcs.nagy@arm.com>
Date: Tue, 28 May 2019 11:48:08 +0100
Subject: [PATCH] aarch64: fix variant_pcs ld tests

Force sysv hash style for reliable symbol table layout.

ld/ChangeLog:

	* testsuite/ld-aarch64/variant_pcs-now.d: Use --hash-style=sysv.
	* testsuite/ld-aarch64/variant_pcs-shared.d: Likewise.
---
 ld/ChangeLog                                 |  5 ++
 ld/testsuite/ld-aarch64/variant_pcs-now.d    | 77 ++++++++++----------
 ld/testsuite/ld-aarch64/variant_pcs-shared.d | 77 ++++++++++----------
 3 files changed, 81 insertions(+), 78 deletions(-)

diff --git a/ld/ChangeLog b/ld/ChangeLog
index 36d866f465..581be2e4c8 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,8 @@
+2019-05-28  Szabolcs Nagy  <szabolcs.nagy@arm.com>
+
+	* testsuite/ld-aarch64/variant_pcs-now.d: Use --hash-style=sysv.
+	* testsuite/ld-aarch64/variant_pcs-shared.d: Likewise.
+
 2019-05-27  Alan Modra  <amodra@gmail.com>
 
 	PR 24596
diff --git a/ld/testsuite/ld-aarch64/variant_pcs-now.d b/ld/testsuite/ld-aarch64/variant_pcs-now.d
index fc238929da..c3f48fe847 100644
--- a/ld/testsuite/ld-aarch64/variant_pcs-now.d
+++ b/ld/testsuite/ld-aarch64/variant_pcs-now.d
@@ -1,34 +1,34 @@
 #source: variant_pcs-1.s
 #source: variant_pcs-2.s
-#ld: -shared -T variant_pcs.ld -z now
+#ld: -shared --hash-style=sysv -T variant_pcs.ld -z now
 #readelf: -rsW
 
 Relocation section '\.rela\.plt' at offset 0x11000 contains 12 entries:
     Offset             Info             Type               Symbol's Value  Symbol's Name \+ Addend
 0000000000009020  0000000100000402 R_AARCH64_JUMP_SLOT    0000000000000000 f_base_global_default_undef \+ 0
 0000000000009028  0000000200000402 R_AARCH64_JUMP_SLOT    0000000000000000 f_spec_global_default_undef \+ 0
-0000000000009030  0000000500000402 R_AARCH64_JUMP_SLOT    0000000000008000 f_base_global_default_def \+ 0
-0000000000009038  0000000600000402 R_AARCH64_JUMP_SLOT    0000000000008000 f_spec_global_default_def \+ 0
+0000000000009030  0000000400000402 R_AARCH64_JUMP_SLOT    0000000000008000 f_base_global_default_def \+ 0
+0000000000009038  0000000500000402 R_AARCH64_JUMP_SLOT    0000000000008000 f_spec_global_default_def \+ 0
 0000000000009040  0000000000000408 R_AARCH64_IRELATIVE                       8000
-0000000000009048  0000000400000402 R_AARCH64_JUMP_SLOT    f_spec_global_default_ifunc\(\) f_spec_global_default_ifunc \+ 0
+0000000000009048  0000000300000402 R_AARCH64_JUMP_SLOT    f_spec_global_default_ifunc\(\) f_spec_global_default_ifunc \+ 0
 0000000000009050  0000000000000408 R_AARCH64_IRELATIVE                       8000
-0000000000009058  0000000300000402 R_AARCH64_JUMP_SLOT    f_base_global_default_ifunc\(\) f_base_global_default_ifunc \+ 0
+0000000000009058  0000000600000402 R_AARCH64_JUMP_SLOT    f_base_global_default_ifunc\(\) f_base_global_default_ifunc \+ 0
 0000000000009060  0000000000000408 R_AARCH64_IRELATIVE                       8038
-0000000000009068  0000000000000408 R_AARCH64_IRELATIVE                       8038
+0000000000009068  0000000000000408 R_AARCH64_IRELATIVE                       8000
 0000000000009070  0000000000000408 R_AARCH64_IRELATIVE                       8000
-0000000000009078  0000000000000408 R_AARCH64_IRELATIVE                       8000
+0000000000009078  0000000000000408 R_AARCH64_IRELATIVE                       8038
 
 Symbol table '\.dynsym' contains 7 entries:
    Num:    Value          Size Type    Bind   Vis      Ndx Name
      0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
      1: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND f_base_global_default_undef
      2: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT \[VARIANT_PCS\]   UND f_spec_global_default_undef
-     3: 0000000000008000     0 IFUNC   GLOBAL DEFAULT    1 f_base_global_default_ifunc
-     4: 0000000000008000     0 IFUNC   GLOBAL DEFAULT \[VARIANT_PCS\]     1 f_spec_global_default_ifunc
-     5: 0000000000008000     0 NOTYPE  GLOBAL DEFAULT    1 f_base_global_default_def
-     6: 0000000000008000     0 NOTYPE  GLOBAL DEFAULT \[VARIANT_PCS\]     1 f_spec_global_default_def
+     3: 0000000000008000     0 IFUNC   GLOBAL DEFAULT \[VARIANT_PCS\]     1 f_spec_global_default_ifunc
+     4: 0000000000008000     0 NOTYPE  GLOBAL DEFAULT    1 f_base_global_default_def
+     5: 0000000000008000     0 NOTYPE  GLOBAL DEFAULT \[VARIANT_PCS\]     1 f_spec_global_default_def
+     6: 0000000000008000     0 IFUNC   GLOBAL DEFAULT    1 f_base_global_default_ifunc
 
-Symbol table '\.symtab' contains 36 entries:
+Symbol table '\.symtab' contains 35 entries:
    Num:    Value          Size Type    Bind   Vis      Ndx Name
      0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
      1: 0000000000008000     0 SECTION LOCAL  DEFAULT    1 
@@ -39,30 +39,29 @@ Symbol table '\.symtab' contains 36 entries:
      6: 0000000000011120     0 SECTION LOCAL  DEFAULT    6 
      7: 00000000000111c8     0 SECTION LOCAL  DEFAULT    7 
      8: 0000000000011270     0 SECTION LOCAL  DEFAULT    8 
-     9: 00000000000112a0     0 SECTION LOCAL  DEFAULT    9 
-    10: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS .*variant_pcs-1\.o
-    11: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local
-    12: 0000000000008000     0 IFUNC   LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local_ifunc
-    13: 0000000000008000     0 IFUNC   LOCAL  DEFAULT    1 f_base_local_ifunc
-    14: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT    1 f_base_local
-    15: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT    1 \$x
-    16: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS .*variant_pcs-2\.o
-    17: 0000000000008038     0 NOTYPE  LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local2
-    18: 0000000000008038     0 IFUNC   LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local2_ifunc
-    19: 0000000000008038     0 IFUNC   LOCAL  DEFAULT    1 f_base_local2_ifunc
-    20: 0000000000008038     0 NOTYPE  LOCAL  DEFAULT    1 f_base_local2
-    21: 0000000000008038     0 NOTYPE  LOCAL  DEFAULT    1 \$x
-    22: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS 
-    23: 0000000000009080     0 OBJECT  LOCAL  DEFAULT  ABS _DYNAMIC
-    24: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_global_hidden_def
-    25: 0000000000008000     0 IFUNC   LOCAL  DEFAULT    1 f_base_global_hidden_ifunc
-    26: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT    1 f_base_global_hidden_def
-    27: 0000000000009000     0 OBJECT  LOCAL  DEFAULT  ABS _GLOBAL_OFFSET_TABLE_
-    28: 0000000000008000     0 IFUNC   LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_global_hidden_ifunc
-    29: 0000000000008070     0 NOTYPE  LOCAL  DEFAULT    2 \$x
-    30: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND f_base_global_default_undef
-    31: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT \[VARIANT_PCS\]   UND f_spec_global_default_undef
-    32: 0000000000008000     0 IFUNC   GLOBAL DEFAULT \[VARIANT_PCS\]     1 f_spec_global_default_ifunc
-    33: 0000000000008000     0 NOTYPE  GLOBAL DEFAULT    1 f_base_global_default_def
-    34: 0000000000008000     0 NOTYPE  GLOBAL DEFAULT \[VARIANT_PCS\]     1 f_spec_global_default_def
-    35: 0000000000008000     0 IFUNC   GLOBAL DEFAULT    1 f_base_global_default_ifunc
+     9: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS .*variant_pcs-1\.o
+    10: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local
+    11: 0000000000008000     0 IFUNC   LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local_ifunc
+    12: 0000000000008000     0 IFUNC   LOCAL  DEFAULT    1 f_base_local_ifunc
+    13: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT    1 f_base_local
+    14: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT    1 \$x
+    15: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS .*variant_pcs-2\.o
+    16: 0000000000008038     0 NOTYPE  LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local2
+    17: 0000000000008038     0 IFUNC   LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local2_ifunc
+    18: 0000000000008038     0 IFUNC   LOCAL  DEFAULT    1 f_base_local2_ifunc
+    19: 0000000000008038     0 NOTYPE  LOCAL  DEFAULT    1 f_base_local2
+    20: 0000000000008038     0 NOTYPE  LOCAL  DEFAULT    1 \$x
+    21: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS 
+    22: 0000000000009080     0 OBJECT  LOCAL  DEFAULT  ABS _DYNAMIC
+    23: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_global_hidden_def
+    24: 0000000000008000     0 IFUNC   LOCAL  DEFAULT    1 f_base_global_hidden_ifunc
+    25: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT    1 f_base_global_hidden_def
+    26: 0000000000009000     0 OBJECT  LOCAL  DEFAULT  ABS _GLOBAL_OFFSET_TABLE_
+    27: 0000000000008000     0 IFUNC   LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_global_hidden_ifunc
+    28: 0000000000008070     0 NOTYPE  LOCAL  DEFAULT    2 \$x
+    29: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND f_base_global_default_undef
+    30: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT \[VARIANT_PCS\]   UND f_spec_global_default_undef
+    31: 0000000000008000     0 IFUNC   GLOBAL DEFAULT \[VARIANT_PCS\]     1 f_spec_global_default_ifunc
+    32: 0000000000008000     0 NOTYPE  GLOBAL DEFAULT    1 f_base_global_default_def
+    33: 0000000000008000     0 NOTYPE  GLOBAL DEFAULT \[VARIANT_PCS\]     1 f_spec_global_default_def
+    34: 0000000000008000     0 IFUNC   GLOBAL DEFAULT    1 f_base_global_default_ifunc
diff --git a/ld/testsuite/ld-aarch64/variant_pcs-shared.d b/ld/testsuite/ld-aarch64/variant_pcs-shared.d
index 508bdaa206..bdcc2c867f 100644
--- a/ld/testsuite/ld-aarch64/variant_pcs-shared.d
+++ b/ld/testsuite/ld-aarch64/variant_pcs-shared.d
@@ -1,34 +1,34 @@
 #source: variant_pcs-1.s
 #source: variant_pcs-2.s
-#ld: -shared -T variant_pcs.ld
+#ld: -shared --hash-style=sysv -T variant_pcs.ld
 #readelf: -rsW
 
 Relocation section '\.rela\.plt' at offset 0x11000 contains 12 entries:
     Offset             Info             Type               Symbol's Value  Symbol's Name \+ Addend
 0000000000009020  0000000100000402 R_AARCH64_JUMP_SLOT    0000000000000000 f_base_global_default_undef \+ 0
 0000000000009028  0000000200000402 R_AARCH64_JUMP_SLOT    0000000000000000 f_spec_global_default_undef \+ 0
-0000000000009030  0000000500000402 R_AARCH64_JUMP_SLOT    0000000000008000 f_base_global_default_def \+ 0
-0000000000009038  0000000600000402 R_AARCH64_JUMP_SLOT    0000000000008000 f_spec_global_default_def \+ 0
+0000000000009030  0000000400000402 R_AARCH64_JUMP_SLOT    0000000000008000 f_base_global_default_def \+ 0
+0000000000009038  0000000500000402 R_AARCH64_JUMP_SLOT    0000000000008000 f_spec_global_default_def \+ 0
 0000000000009040  0000000000000408 R_AARCH64_IRELATIVE                       8000
-0000000000009048  0000000400000402 R_AARCH64_JUMP_SLOT    f_spec_global_default_ifunc\(\) f_spec_global_default_ifunc \+ 0
+0000000000009048  0000000300000402 R_AARCH64_JUMP_SLOT    f_spec_global_default_ifunc\(\) f_spec_global_default_ifunc \+ 0
 0000000000009050  0000000000000408 R_AARCH64_IRELATIVE                       8000
-0000000000009058  0000000300000402 R_AARCH64_JUMP_SLOT    f_base_global_default_ifunc\(\) f_base_global_default_ifunc \+ 0
+0000000000009058  0000000600000402 R_AARCH64_JUMP_SLOT    f_base_global_default_ifunc\(\) f_base_global_default_ifunc \+ 0
 0000000000009060  0000000000000408 R_AARCH64_IRELATIVE                       8038
-0000000000009068  0000000000000408 R_AARCH64_IRELATIVE                       8038
+0000000000009068  0000000000000408 R_AARCH64_IRELATIVE                       8000
 0000000000009070  0000000000000408 R_AARCH64_IRELATIVE                       8000
-0000000000009078  0000000000000408 R_AARCH64_IRELATIVE                       8000
+0000000000009078  0000000000000408 R_AARCH64_IRELATIVE                       8038
 
 Symbol table '\.dynsym' contains 7 entries:
    Num:    Value          Size Type    Bind   Vis      Ndx Name
      0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
      1: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND f_base_global_default_undef
      2: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT \[VARIANT_PCS\]   UND f_spec_global_default_undef
-     3: 0000000000008000     0 IFUNC   GLOBAL DEFAULT    1 f_base_global_default_ifunc
-     4: 0000000000008000     0 IFUNC   GLOBAL DEFAULT \[VARIANT_PCS\]     1 f_spec_global_default_ifunc
-     5: 0000000000008000     0 NOTYPE  GLOBAL DEFAULT    1 f_base_global_default_def
-     6: 0000000000008000     0 NOTYPE  GLOBAL DEFAULT \[VARIANT_PCS\]     1 f_spec_global_default_def
+     3: 0000000000008000     0 IFUNC   GLOBAL DEFAULT \[VARIANT_PCS\]     1 f_spec_global_default_ifunc
+     4: 0000000000008000     0 NOTYPE  GLOBAL DEFAULT    1 f_base_global_default_def
+     5: 0000000000008000     0 NOTYPE  GLOBAL DEFAULT \[VARIANT_PCS\]     1 f_spec_global_default_def
+     6: 0000000000008000     0 IFUNC   GLOBAL DEFAULT    1 f_base_global_default_ifunc
 
-Symbol table '\.symtab' contains 36 entries:
+Symbol table '\.symtab' contains 35 entries:
    Num:    Value          Size Type    Bind   Vis      Ndx Name
      0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
      1: 0000000000008000     0 SECTION LOCAL  DEFAULT    1 
@@ -39,30 +39,29 @@ Symbol table '\.symtab' contains 36 entries:
      6: 0000000000011120     0 SECTION LOCAL  DEFAULT    6 
      7: 00000000000111c8     0 SECTION LOCAL  DEFAULT    7 
      8: 0000000000011270     0 SECTION LOCAL  DEFAULT    8 
-     9: 00000000000112a0     0 SECTION LOCAL  DEFAULT    9 
-    10: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS .*variant_pcs-1\.o
-    11: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local
-    12: 0000000000008000     0 IFUNC   LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local_ifunc
-    13: 0000000000008000     0 IFUNC   LOCAL  DEFAULT    1 f_base_local_ifunc
-    14: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT    1 f_base_local
-    15: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT    1 \$x
-    16: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS .*variant_pcs-2\.o
-    17: 0000000000008038     0 NOTYPE  LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local2
-    18: 0000000000008038     0 IFUNC   LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local2_ifunc
-    19: 0000000000008038     0 IFUNC   LOCAL  DEFAULT    1 f_base_local2_ifunc
-    20: 0000000000008038     0 NOTYPE  LOCAL  DEFAULT    1 f_base_local2
-    21: 0000000000008038     0 NOTYPE  LOCAL  DEFAULT    1 \$x
-    22: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS 
-    23: 0000000000009080     0 OBJECT  LOCAL  DEFAULT  ABS _DYNAMIC
-    24: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_global_hidden_def
-    25: 0000000000008000     0 IFUNC   LOCAL  DEFAULT    1 f_base_global_hidden_ifunc
-    26: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT    1 f_base_global_hidden_def
-    27: 0000000000009000     0 OBJECT  LOCAL  DEFAULT  ABS _GLOBAL_OFFSET_TABLE_
-    28: 0000000000008000     0 IFUNC   LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_global_hidden_ifunc
-    29: 0000000000008070     0 NOTYPE  LOCAL  DEFAULT    2 \$x
-    30: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND f_base_global_default_undef
-    31: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT \[VARIANT_PCS\]   UND f_spec_global_default_undef
-    32: 0000000000008000     0 IFUNC   GLOBAL DEFAULT \[VARIANT_PCS\]     1 f_spec_global_default_ifunc
-    33: 0000000000008000     0 NOTYPE  GLOBAL DEFAULT    1 f_base_global_default_def
-    34: 0000000000008000     0 NOTYPE  GLOBAL DEFAULT \[VARIANT_PCS\]     1 f_spec_global_default_def
-    35: 0000000000008000     0 IFUNC   GLOBAL DEFAULT    1 f_base_global_default_ifunc
+     9: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS .*variant_pcs-1\.o
+    10: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local
+    11: 0000000000008000     0 IFUNC   LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local_ifunc
+    12: 0000000000008000     0 IFUNC   LOCAL  DEFAULT    1 f_base_local_ifunc
+    13: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT    1 f_base_local
+    14: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT    1 \$x
+    15: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS .*variant_pcs-2\.o
+    16: 0000000000008038     0 NOTYPE  LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local2
+    17: 0000000000008038     0 IFUNC   LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_local2_ifunc
+    18: 0000000000008038     0 IFUNC   LOCAL  DEFAULT    1 f_base_local2_ifunc
+    19: 0000000000008038     0 NOTYPE  LOCAL  DEFAULT    1 f_base_local2
+    20: 0000000000008038     0 NOTYPE  LOCAL  DEFAULT    1 \$x
+    21: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS 
+    22: 0000000000009080     0 OBJECT  LOCAL  DEFAULT  ABS _DYNAMIC
+    23: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_global_hidden_def
+    24: 0000000000008000     0 IFUNC   LOCAL  DEFAULT    1 f_base_global_hidden_ifunc
+    25: 0000000000008000     0 NOTYPE  LOCAL  DEFAULT    1 f_base_global_hidden_def
+    26: 0000000000009000     0 OBJECT  LOCAL  DEFAULT  ABS _GLOBAL_OFFSET_TABLE_
+    27: 0000000000008000     0 IFUNC   LOCAL  DEFAULT \[VARIANT_PCS\]     1 f_spec_global_hidden_ifunc
+    28: 0000000000008070     0 NOTYPE  LOCAL  DEFAULT    2 \$x
+    29: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND f_base_global_default_undef
+    30: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT \[VARIANT_PCS\]   UND f_spec_global_default_undef
+    31: 0000000000008000     0 IFUNC   GLOBAL DEFAULT \[VARIANT_PCS\]     1 f_spec_global_default_ifunc
+    32: 0000000000008000     0 NOTYPE  GLOBAL DEFAULT    1 f_base_global_default_def
+    33: 0000000000008000     0 NOTYPE  GLOBAL DEFAULT \[VARIANT_PCS\]     1 f_spec_global_default_def
+    34: 0000000000008000     0 IFUNC   GLOBAL DEFAULT    1 f_base_global_default_ifunc
-- 
2.17.1


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH binutils 0/4] aarch64: Add STO_AARCH64_VARIANT_PCS support
  2019-05-24 15:08   ` Szabolcs Nagy
@ 2019-07-05 14:29     ` Szabolcs Nagy
  2019-07-08 14:25       ` Szabolcs Nagy
  0 siblings, 1 reply; 15+ messages in thread
From: Szabolcs Nagy @ 2019-07-05 14:29 UTC (permalink / raw)
  To: nickc, Binutils; +Cc: nd

On 24/05/2019 16:08, Szabolcs Nagy wrote:
> On 24/05/2019 11:26, Nick Clifton wrote:
>> Hi Szabolcs,
>>
>>> Szabolcs Nagy (4):
>>>   aarch64: add STO_AARCH64_VARIANT_PCS and DT_AARCH64_VARIANT_PCS
>>>   aarch64: handle .variant_pcs directive in gas
>>>   aarch64: override default elf .set handling in gas
>>>   aarch64: handle STO_AARCH64_VARIANT_PCS in bfd
>>  
>> Patch series approved.  (Well modulo the small request for a larger buffer).
> 
> this is new abi, but since it is required for correctness,
> i'd like to backport it to the 2.32 release branch after
> some testing on the master branch.
> 

backported to 2.32 branch.

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH binutils 0/4] aarch64: Add STO_AARCH64_VARIANT_PCS support
  2019-07-05 14:29     ` Szabolcs Nagy
@ 2019-07-08 14:25       ` Szabolcs Nagy
  0 siblings, 0 replies; 15+ messages in thread
From: Szabolcs Nagy @ 2019-07-08 14:25 UTC (permalink / raw)
  To: nickc, Binutils; +Cc: nd

[-- Attachment #1: Type: text/plain, Size: 842 bytes --]

On 05/07/2019 15:29, Szabolcs Nagy wrote:
> On 24/05/2019 16:08, Szabolcs Nagy wrote:
>> On 24/05/2019 11:26, Nick Clifton wrote:
>>> Hi Szabolcs,
>>>
>>>> Szabolcs Nagy (4):
>>>>   aarch64: add STO_AARCH64_VARIANT_PCS and DT_AARCH64_VARIANT_PCS
>>>>   aarch64: handle .variant_pcs directive in gas
>>>>   aarch64: override default elf .set handling in gas
>>>>   aarch64: handle STO_AARCH64_VARIANT_PCS in bfd
>>>  
>>> Patch series approved.  (Well modulo the small request for a larger buffer).
>>
>> this is new abi, but since it is required for correctness,
>> i'd like to backport it to the 2.32 release branch after
>> some testing on the master branch.
>>
> 
> backported to 2.32 branch.
> 

i made a mistake in the backport that can cause build
failure with -werror.

committed the attached patch to fix it.

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-aarch64-fix-DT_AARCH64_VARIANT_PCS-handling-in-reade.patch --]
[-- Type: text/x-patch; name="0001-aarch64-fix-DT_AARCH64_VARIANT_PCS-handling-in-reade.patch", Size: 1167 bytes --]

From 16ba30dcfaa33637fb06bf4e6ff8afe68cb6c810 Mon Sep 17 00:00:00 2001
From: Szabolcs Nagy <szabolcs.nagy@arm.com>
Date: Mon, 8 Jul 2019 13:57:43 +0100
Subject: [PATCH] aarch64: fix DT_AARCH64_VARIANT_PCS handling in readelf

backport commit 13acf03468d1e218c0a980ff6e6adaaac4bb5d1e
failed to copy the changes in get_dynamic_type.

this could cause build failure

binutils/readelf.c:1800:1: warning: 'get_aarch64_dynamic_type' defined but not used [-Wunused-function]

binutils/ChangeLog:

2019-07-08  Szabolcs Nagy  <szabolcs.nagy@arm.com>

	* readelf.c (get_dynamic_type): Handle EM_AARCH64.
---
 binutils/readelf.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/binutils/readelf.c b/binutils/readelf.c
index 28466e0cd7..6b4eb41aee 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -2180,6 +2180,9 @@ get_dynamic_type (Filedata * filedata, unsigned long type)
 
 	  switch (filedata->file_header.e_machine)
 	    {
+	    case EM_AARCH64:
+	      result = get_aarch64_dynamic_type (type);
+	      break;
 	    case EM_MIPS:
 	    case EM_MIPS_RS3_LE:
 	      result = get_mips_dynamic_type (type);
-- 
2.17.1


^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2019-07-08 14:25 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-05-23 11:04 [PATCH binutils 0/4] aarch64: Add STO_AARCH64_VARIANT_PCS support Szabolcs Nagy
2019-05-23 11:07 ` [PATCH binutils 1/4] aarch64: add STO_AARCH64_VARIANT_PCS and DT_AARCH64_VARIANT_PCS Szabolcs Nagy
2019-05-24 10:24   ` Nick Clifton
2019-05-24 10:58     ` Jan Beulich
2019-05-24 11:01       ` Nick Clifton
2019-05-23 11:08 ` [PATCH binutils 2/4] aarch64: handle .variant_pcs directive in gas Szabolcs Nagy
2019-05-23 11:10 ` [PATCH binutils 3/4] aarch64: override default elf .set handling " Szabolcs Nagy
2019-05-23 11:11 ` [PATCH binutils 4/4] aarch64: handle STO_AARCH64_VARIANT_PCS in bfd Szabolcs Nagy
2019-05-26  8:51   ` Christophe Lyon
2019-05-28 11:07     ` Szabolcs Nagy
2019-05-24 10:26 ` [PATCH binutils 0/4] aarch64: Add STO_AARCH64_VARIANT_PCS support Nick Clifton
2019-05-24 14:25   ` Szabolcs Nagy
2019-05-24 15:08   ` Szabolcs Nagy
2019-07-05 14:29     ` Szabolcs Nagy
2019-07-08 14:25       ` Szabolcs Nagy

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).