Sophie

Sophie

distrib > Mageia > 7 > i586 > by-pkgid > 0e1fb6d48c993633711e2942dec89407 > files > 19

binutils-2.32-14.mga7.src.rpm

From 5da3661e58411e14f353f5a567097d2bef94128d Mon Sep 17 00:00:00 2001
From: Szabolcs Nagy <szabolcs.nagy@arm.com>
Date: Thu, 25 Apr 2019 15:06:53 +0100
Subject: [PATCH] aarch64: handle .variant_pcs directive in gas

Backport commit f166ae0188dcb89c5ae925034260a708a254ab2f

In ELF objects the specified symbol is marked with STO_AARCH64_VARIANT_PCS.

gas/ChangeLog:

	* 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.
---
 gas/ChangeLog                                 | 12 ++++++++++
 gas/config/tc-aarch64.c                       | 23 +++++++++++++++++++
 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 ++++
 7 files changed, 72 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

#diff --git a/gas/ChangeLog b/gas/ChangeLog
#index 24c6c2cdf1..c6a65ac942 100644
#--- a/gas/ChangeLog
#+++ b/gas/ChangeLog
#@@ -1,3 +1,15 @@
#+2019-07-05  Szabolcs Nagy  <szabolcs.nagy@arm.com>
#+
#+	Backport from mainline
#+	2019-05-24  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.
#+
# 2019-07-02  Richard Sandiford  <richard.sandiford@arm.com>
# 
# 	* testsuite/gas/aarch64/sve-movprfx_27.s,
diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c
index 3f75f93008..12f4849be1 100644
--- a/gas/config/tc-aarch64.c
+++ b/gas/config/tc-aarch64.c
@@ -1938,6 +1938,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.  */
@@ -2084,6 +2106,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 7451f2f795..f754538a06 100644
--- a/gas/doc/c-aarch64.texi
+++ b/gas/doc/c-aarch64.texi
@@ -425,6 +425,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
-- 
2.22.0