aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2020-07-20 08:57:18 +0200
committerJan Beulich <jbeulich@suse.com>2020-07-20 08:57:18 +0200
commitb3983e5f53caad175563f8c842f2ab2a1277c2bc (patch)
tree6d5e3343f11a36633999b33996e210b4edd1650e
parent750e4bf70f2caab39dc5d0a1b2d26c9ca1fbd909 (diff)
downloadgdb-b3983e5f53caad175563f8c842f2ab2a1277c2bc.zip
gdb-b3983e5f53caad175563f8c842f2ab2a1277c2bc.tar.gz
gdb-b3983e5f53caad175563f8c842f2ab2a1277c2bc.tar.bz2
x86: handle SVR4 escaped binary operators
PR gas/4572 When / is a comment character, its use as binary "divide" operator needs escaping by a backslash. Besides the scrubber needing to support this (addressed in an earlier change), there are also a few provisions needed in target specific operator handling. As the spec calls for % and * to also be escaped because of being "overloaded", also recognize these, despite the overloading there not really preventing their use as operators in most (%) or all (*) cases, given the way how the rest of the assembler works. To bring source and testsuite in line, also drop the TE_I386AIX part of the respective conditional, as i?86-*-aix* support had been removed a while ago.
-rw-r--r--gas/ChangeLog12
-rw-r--r--gas/config/tc-i386-intel.c10
-rw-r--r--gas/config/tc-i386.c17
-rw-r--r--gas/testsuite/gas/i386/i386.exp8
-rw-r--r--gas/testsuite/gas/i386/svr4.d24
-rw-r--r--gas/testsuite/gas/i386/svr4.s31
6 files changed, 95 insertions, 7 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 67fabb9..2aed48f 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,6 +1,18 @@
2020-07-20 Jan Beulich <jbeulich@suse.com>
PR gas/4572
+ * config/tc-i386.c (i386_comment_chars): Drop TE_I386AIX from
+ conditional around it.
+ (md_begin): Insert backslash into operand_chars[] when slash is
+ a comment character.
+ * config/tc-i386-intel.c (i386_operator): Recognize \/, \%, and
+ \* as operators when / may be a comment character.
+ * testsuite/gas/i386/svr4.s, testsuite/gas/i386/svr4.d: New.
+ * testsuite/gas/i386/i386.exp: Run new test.
+
+2020-07-20 Jan Beulich <jbeulich@suse.com>
+
+ PR gas/4572
* app.c (last_char): Drop TC_ARM conditional around it.
(struct app_save): Drop TC_ARM conditional around last_char.
(app_push, app_pop): Drop TC_ARM conditional from last_char
diff --git a/gas/config/tc-i386-intel.c b/gas/config/tc-i386-intel.c
index b326d30..a98771b 100644
--- a/gas/config/tc-i386-intel.c
+++ b/gas/config/tc-i386-intel.c
@@ -123,6 +123,16 @@ operatorT i386_operator (const char *name, unsigned int operands, char *pc)
{
unsigned int j;
+#ifdef SVR4_COMMENT_CHARS
+ if (!name && operands == 2 && *input_line_pointer == '\\')
+ switch (input_line_pointer[1])
+ {
+ case '/': input_line_pointer += 2; return O_divide;
+ case '%': input_line_pointer += 2; return O_modulus;
+ case '*': input_line_pointer += 2; return O_multiply;
+ }
+#endif
+
if (!intel_syntax)
return O_absent;
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 5b0a014e..9ab8413 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -480,13 +480,12 @@ const char extra_symbol_chars[] = "*%-([{}"
#endif
;
-#if (defined (TE_I386AIX) \
- || ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) \
- && !defined (TE_GNU) \
- && !defined (TE_LINUX) \
- && !defined (TE_FreeBSD) \
- && !defined (TE_DragonFly) \
- && !defined (TE_NetBSD)))
+#if ((defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)) \
+ && !defined (TE_GNU) \
+ && !defined (TE_LINUX) \
+ && !defined (TE_FreeBSD) \
+ && !defined (TE_DragonFly) \
+ && !defined (TE_NetBSD))
/* This array holds the chars that always start a comment. If the
pre-processor is disabled, these aren't very useful. The option
--divide will remove '/' from this list. */
@@ -3116,6 +3115,10 @@ md_begin (void)
mnemonic_chars[c] = c;
operand_chars[c] = c;
}
+#ifdef SVR4_COMMENT_CHARS
+ else if (c == '\\' && strchr (i386_comment_chars, '/'))
+ operand_chars[c] = c;
+#endif
if (ISALPHA (c) || ISDIGIT (c))
identifier_chars[c] = c;
diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp
index f401732..a91ad79 100644
--- a/gas/testsuite/gas/i386/i386.exp
+++ b/gas/testsuite/gas/i386/i386.exp
@@ -692,6 +692,14 @@ if [expr [istarget "i*86-*-*"] || [istarget "x86_64-*-*"]] then {
run_dump_test "dw2-compressed-1"
run_dump_test "dw2-compressed-3a"
run_dump_test "dw2-compressed-3b"
+
+ if {![istarget "*-*-dragonfly*"]
+ && ![istarget "*-*-gnu*"]
+ && ![istarget "*-*-freebsd*"]
+ && ![istarget "*-*-linux*"]
+ && ![istarget "*-*-netbsd*"]} then {
+ run_dump_test "svr4"
+ }
}
}
diff --git a/gas/testsuite/gas/i386/svr4.d b/gas/testsuite/gas/i386/svr4.d
new file mode 100644
index 0000000..3a46354
--- /dev/null
+++ b/gas/testsuite/gas/i386/svr4.d
@@ -0,0 +1,24 @@
+#objdump: -dtw
+#name: SVR4 comment char escape handling
+
+.*: +file format .*
+
+SYMBOL TABLE:
+0+00 .* \.text[ ]+0+ \.text
+0+00 .* \.data[ ]+0+ \.data
+0+00 .* \.bss[ ]+0+ \.bss
+0+00 .* \.text[ ]+0+ svr4
+0+04 .* \*ABS\*[ ]+0+ a
+0+03 .* \*ABS\*[ ]+0+ b
+0+4c .* \*ABS\*[ ]+0+ c
+
+Disassembly of section .text:
+
+0+0 <svr4>:
+[ ]*[0-9a-f]+:[ ]+b0 07[ ]+mov \$0x7,%al
+[ ]*[0-9a-f]+:[ ]+b0 01[ ]+mov \$0x1,%al
+[ ]*[0-9a-f]+:[ ]+b0 1e[ ]+mov \$0x1e,%al
+[ ]*[0-9a-f]+:[ ]+b0 05[ ]+mov \$0x5,%al
+[ ]*[0-9a-f]+:[ ]+b0 02[ ]+mov \$0x2,%al
+[ ]*[0-9a-f]+:[ ]+b0 33[ ]+mov \$0x33,%al
+#pass
diff --git a/gas/testsuite/gas/i386/svr4.s b/gas/testsuite/gas/i386/svr4.s
new file mode 100644
index 0000000..4565e01
--- /dev/null
+++ b/gas/testsuite/gas/i386/svr4.s
@@ -0,0 +1,31 @@
+ .text
+
+ .if 1 / 2
+ .else
+ .error
+ .endif
+
+ .if 1 \/ 2
+ .error
+ .endif
+
+ .if 4 \% 2
+ .error
+ .endif
+
+ .if 1 \* 0
+ .error
+ .endif
+
+svr4:
+ mov $(15 \/ 2), %al
+ mov $(15 \% 2), %al
+ mov $(15 \* 2), %al
+
+ .byte 0xb0, 17 \/ 3
+ .byte 0xb0, 17 \% 3
+ .byte 0xb0, 17 \* 3
+
+ .equiv a, 19 \/ 4
+ .equiv b, 19 \% 4
+ .equiv c, 19 \* 4