public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: Jan Beulich <jbeulich@suse.com>
To: Binutils <binutils@sourceware.org>
Cc: "H.J. Lu" <hjl.tools@gmail.com>
Subject: [PATCH 1/2] x86: don't recognize quoted symbol names as registers or operators
Date: Fri, 5 May 2023 14:51:05 +0200	[thread overview]
Message-ID: <4735d366-fe31-0092-2edc-d166184b8567@suse.com> (raw)
In-Reply-To: <e84fc499-62d1-78c7-8f61-6e0fad9b38bf@suse.com>

The concept of quoted symbols names was introduced pretty late. Utilize
it to allow access to symbols with names matching that of a register (or,
in Intel syntax, also an identifier-like operator).

This is primarily to aid gcc when generating Intel syntax output; see
their bug target/53929.
---
If desired, the i386_parse_name() could of course be restricted to
Intel syntax only. But 

--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -13868,6 +13868,13 @@ i386_parse_name (char *name, expressionS
   const reg_entry *r = NULL;
   char *end = input_line_pointer;
 
+  /* We only know the terminating character here.  It being double quote could
+     be the closing one of a quoted symbol name, or an opening one from a
+     following string (or another quoted symbol name).  Since the latter can't
+     be valid syntax for anything, bailing in either case is good enough.  */
+  if (*nextcharP == '"')
+    return 0;
+
   *end = *nextcharP;
   if (*name == REGISTER_PREFIX || allow_naked_reg)
     r = parse_real_register (name, &input_line_pointer);
--- a/gas/config/tc-i386-intel.c
+++ b/gas/config/tc-i386-intel.c
@@ -169,6 +169,10 @@ operatorT i386_operator (const char *nam
       return O_illegal;
     }
 
+  /* See the quotation related comment in i386_parse_name().  */
+  if (*pc == '"')
+    return O_absent;
+
   for (j = 0; i386_operators[j].name; ++j)
     if (strcasecmp (i386_operators[j].name, name) == 0)
       {
--- a/gas/testsuite/gas/i386/i386.exp
+++ b/gas/testsuite/gas/i386/i386.exp
@@ -105,6 +105,7 @@ if [gas_32_check] then {
     run_list_test "equ-bad"
     run_dump_test "divide"
     run_dump_test "quoted"
+    run_dump_test "quoted2"
     run_dump_test "unary"
     run_dump_test "padlock"
     run_dump_test "crx"
--- a/gas/testsuite/gas/i386/quoted.d
+++ b/gas/testsuite/gas/i386/quoted.d
@@ -18,4 +18,11 @@ Disassembly of section .text:
 [ 	]*[a-f0-9]+:[ 	]*ff 15 00 00 00 00[	 ]+call   \*0x0	[a-f0-9]+: (R_386_|dir)?32	x\(y\)
 [ 	]*[a-f0-9]+:[ 	]*26 ff 15 00 00 00 00[	 ]+call   \*%es:0x0	[a-f0-9]+: (R_386_|dir)?32	x\(y\)
 [ 	]*[a-f0-9]+:[ 	]*26 ff 15 00 00 00 00[	 ]+call   \*%es:0x0	[a-f0-9]+: (R_386_|dir)?32	x\(y\)
+[ 	]*[a-f0-9]+:[ 	]*b8 00 00 00 00[	 ]+mov    \$0x0,%eax	[a-f0-9]+: (R_386_|dir)?32	%eax
+[ 	]*[a-f0-9]+:[ 	]*a1 00 00 00 00[	 ]+mov    0x0,%eax	[a-f0-9]+: (R_386_|dir)?32	%eax
+[ 	]*[a-f0-9]+:[ 	]*a1 00 00 00 00[	 ]+mov    0x0,%eax	[a-f0-9]+: (R_386_|dir)?32	ecx
+[ 	]*[a-f0-9]+:[ 	]*a1 00 00 00 00[	 ]+mov    0x0,%eax	[a-f0-9]+: (R_386_|dir)?32	xmm0
+[ 	]*[a-f0-9]+:[ 	]*a1 00 00 00 00[	 ]+mov    0x0,%eax	[a-f0-9]+: (R_386_|dir)?32	not
+[ 	]*[a-f0-9]+:[ 	]*a1 00 00 00 00[	 ]+mov    0x0,%eax	[a-f0-9]+: (R_386_|dir)?32	and
+[ 	]*[a-f0-9]+:[ 	]*b8 00 00 00 00[	 ]+mov    \$0x0,%eax	[a-f0-9]+: (R_386_|dir)?32	edx
 #pass
--- a/gas/testsuite/gas/i386/quoted.s
+++ b/gas/testsuite/gas/i386/quoted.s
@@ -14,3 +14,13 @@ quoted:
 	call	*"x(y)"
 	call	*%es:"x(y)"
 	call	%es:*"x(y)"
+
+	mov	$"%eax", %eax
+	mov	"%eax", %eax
+
+	.intel_syntax noprefix
+	mov	eax, "ecx"
+	mov	eax, "xmm0"
+	mov	eax, "not"
+	mov	eax, "and"
+	mov	eax, offset "edx"
--- /dev/null
+++ b/gas/testsuite/gas/i386/quoted2.d
@@ -0,0 +1,15 @@
+#objdump: -r
+#name: i386 quoted symbols (data)
+# Mach-O relocations appear in inverse order
+#notarget: *-*-darwin
+
+.*: +file format .*
+
+RELOCATION RECORDS FOR \[\.data\]:
+OFFSET +TYPE +VALUE
+0+00 (R_386_|dir)?32 +%ebx
+0+04 (R_386_|dir)?32 +%rdx
+0+08 (R_386_|dir)?32 +eax
+0+0c (R_386_|dir)?32 +cr0
+0+10 (R_386_|dir)?32 +k0
+#pass
--- /dev/null
+++ b/gas/testsuite/gas/i386/quoted2.s
@@ -0,0 +1,9 @@
+	.data
+quoted:
+	.long	"%ebx"
+	.long	"%rdx"
+
+	.intel_syntax noprefix
+	.long	"eax"
+	.long	"cr0"
+	.long	"k0"


  reply	other threads:[~2023-05-05 12:51 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-05 12:49 [PATCH 0/2] " Jan Beulich
2023-05-05 12:51 ` Jan Beulich [this message]
2023-05-05 12:52 ` [PATCH 2/2] x86/Intel: address quoted-symbol related FIXMEs Jan Beulich

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4735d366-fe31-0092-2edc-d166184b8567@suse.com \
    --to=jbeulich@suse.com \
    --cc=binutils@sourceware.org \
    --cc=hjl.tools@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).