When
d02603dc201f ("Allow symbol and label names to be enclosed in
double quotes") added the check for a leading double quote to
i386_att_operand(), it missed a second similar check after having found
a segment override. To avoid the two checks going out of sync again,
introduce an inline helper.
+2021-06-07 Jan Beulich <jbeulich@suse.com>
+
+ * config/tc-i386.c (starts_memory_operand): New.
+ (i386_att_operand): Use it.
+ * testsuite/gas/i386/quoted.s, testsuite/gas/i386/quoted.d: New.
+ * testsuite/gas/i386/i386.exp: Run new test.
+
2021-06-07 Jan Beulich <jbeulich@suse.com>
* config/tc-i386.c (i386_att_operand): Flip checking for '*' and
return 1;
}
+static INLINE bool starts_memory_operand (char c)
+{
+ return is_digit_char (c)
+ || is_identifier_char (c)
+ || c == '"'
+ || c == '(';
+}
+
/* Parse OPERAND_STRING into the i386_insn structure I. Returns zero
on error. */
i.jumpabsolute = true;
}
- if (!is_digit_char (*op_string)
- && !is_identifier_char (*op_string)
- && *op_string != '(')
+ if (!starts_memory_operand (*op_string))
{
as_bad (_("bad memory operand `%s'"), op_string);
return 0;
/* If it is a RC or SAE immediate, do nothing. */
;
}
- else if (is_digit_char (*op_string)
- || is_identifier_char (*op_string)
- || *op_string == '"'
- || *op_string == '(')
+ else if (starts_memory_operand (*op_string))
{
/* This is a memory reference of some sort. */
char *base_string;
run_dump_test "equ"
run_list_test "equ-bad"
run_dump_test "divide"
+ run_dump_test "quoted"
run_dump_test "padlock"
run_dump_test "crx"
run_list_test "cr-err" ""
--- /dev/null
+#objdump: -drw
+#name: i386 quoted symbols
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+0+ <quoted>:
+[ ]*[a-f0-9]+:[ ]*a1 00 00 00 00[ ]+mov 0x0,%eax [a-f0-9]+: (R_386_|dir)32 x\(y\)
+[ ]*[a-f0-9]+:[ ]*8b 80 00 00 00 00[ ]+mov 0x0\(%eax\),%eax [a-f0-9]+: (R_386_|dir)32 x\(y\)
+[ ]*[a-f0-9]+:[ ]*26 a1 00 00 00 00[ ]+mov %es:0x0,%eax [a-f0-9]+: (R_386_|dir)32 x\(y\)
+[ ]*[a-f0-9]+:[ ]*26 8b 80 00 00 00 00[ ]+mov %es:0x0\(%eax\),%eax [a-f0-9]+: (R_386_|dir)32 x\(y\)
+[ ]*[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\)
+#pass
--- /dev/null
+ .text
+quoted:
+ mov "x(y)", %eax
+ mov "x(y)"(%eax), %eax
+ mov %es:"x(y)", %eax
+ mov %es:"x(y)"(%eax), %eax
+
+ call *"x(y)"
+ call *%es:"x(y)"
+ call %es:*"x(y)"