x86: Update segment register check in Intel syntax
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 1 Aug 2017 12:53:27 +0000 (05:53 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 1 Aug 2017 12:53:27 +0000 (05:53 -0700)
https://sourceware.org/ml/binutils/2009-04/msg00223.html

introduced a new Intel syntax parser which accepts

mov eax, fs:gs:[eax]

It ignores anything between ':'s after fs and treats

mov eax, DWORD PTR fs:foobar:16
mov eax, DWORD PTR fs:foobar:barfoo:16
mov eax, DWORD PTR fs:ds:16
mov eax, DWORD PTR fs:ds:cs:16

as

mov eax, DWORD PTR fs:16

This patch updates segment register check and only allows a single ':'.

PR gas/21874
* config/tc-i386-intel.c (i386_intel_operand): Update segment
register check.
* testsuite/gas/i386/intelok.s: Replace "fs:gs:[eax]" with
"fs:[eax]".
* testsuite/gas/i386/inval-seg.s: Add tests for invalid segment
register.
* testsuite/gas/i386/x86-64-inval-seg.s: Likewise.
* testsuite/gas/i386/inval-seg.l: Updated.
* testsuite/gas/i386/x86-64-inval-seg.l: Likewise.

gas/ChangeLog
gas/config/tc-i386-intel.c
gas/testsuite/gas/i386/intelok.s
gas/testsuite/gas/i386/inval-seg.l
gas/testsuite/gas/i386/inval-seg.s
gas/testsuite/gas/i386/x86-64-inval-seg.l
gas/testsuite/gas/i386/x86-64-inval-seg.s

index 1a3439d9e12fef19180184ad7506acb11a0f4bc9..81ce3f7f70f4690e8e94d246d645315d5e261c0c 100644 (file)
@@ -1,3 +1,16 @@
+2017-08-01  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR gas/21874
+       * config/tc-i386-intel.c (i386_intel_operand): Update segment
+       register check.
+       * testsuite/gas/i386/intelok.s: Replace "fs:gs:[eax]" with
+       "fs:[eax]".
+       * testsuite/gas/i386/inval-seg.s: Add tests for invalid segment
+       register.
+       * testsuite/gas/i386/x86-64-inval-seg.s: Likewise.
+       * testsuite/gas/i386/inval-seg.l: Updated.
+       * testsuite/gas/i386/x86-64-inval-seg.l: Likewise.
+
 2017-07-31  John David Anglin  <danglin@gcc.gnu.org>
 
        * config/tc-hppa.c (pa_ip): Clear `d' bit in branch on bit instructions
index 92ed98ee6b780d61999cc9381a41e3d3a45548b5..9e8135e3bac364d67391e1022ff0936af76f8916 100644 (file)
@@ -932,13 +932,7 @@ i386_intel_operand (char *operand_string, int got_a_float)
 
       if (intel_state.seg)
        {
-         for (;;)
-           {
-             expP = symbol_get_value_expression (intel_state.seg);
-             if (expP->X_op != O_full_ptr)
-               break;
-             intel_state.seg = expP->X_add_symbol;
-           }
+         expP = symbol_get_value_expression (intel_state.seg);
          if (expP->X_op != O_register)
            {
              as_bad (_("segment register name expected"));
index eae9c2d50923e1067bb1436a917d0556ca9fd7bd..4c16613e54dfb2d7512e0e1ace71a49008265181 100644 (file)
@@ -150,7 +150,7 @@ start:
        mov     eax, [eax[ecx]]
        mov     eax, [[eax][ecx]]
        mov     eax, es:[eax]
-       mov     eax, fs:gs:[eax]
+       mov     eax, fs:[eax]
 
        # expressions
 
index efe190e9998f76f177b34614248a4c32e6dd4c88..c1bbef93ab11fe4b27ca1ecdf5b465d5d90ed122 100644 (file)
@@ -1,10 +1,20 @@
 .*: Assembler messages:
 .*:3: Error: .*
 .*:4: Error: .*
+.*:7: Error: .*
+.*:8: Error: .*
+.*:9: Error: .*
+.*:10: Error: .*
 GAS LISTING .*
 
 
-   1 [         ]*      .text
-   2 [         ]*# All the following should be illegal
-   3 [         ]*      movl    %ds,\(%eax\)
-   4 [         ]*      movl    \(%eax\),%ds
+[      ]*1[    ]+\.text
+[      ]*2[    ]+\# All the following should be illegal
+[      ]*3[    ]+movl  %ds,\(%eax\)
+[      ]*4[    ]+movl  \(%eax\),%ds
+[      ]*5[    ]+
+[      ]*6[    ]+\.intel_syntax noprefix
+[      ]*7[    ]+mov   eax, DWORD PTR fs:foobar:16
+[      ]*8[    ]+mov   eax, DWORD PTR fs:foobar:barfoo:16
+[      ]*9[    ]+mov   eax, DWORD PTR fs:ds:16
+[      ]*10[   ]+mov   eax, DWORD PTR fs:ds:cs:16
index 4cc222145e8a79ae052cb42cab4a682ab5e086d1..b23d87de33e6fc07bf419a48e91f9268f4e04127 100644 (file)
@@ -2,3 +2,9 @@
 # All the following should be illegal
        movl    %ds,(%eax)
        movl    (%eax),%ds
+
+       .intel_syntax noprefix
+       mov     eax, DWORD PTR fs:foobar:16
+       mov     eax, DWORD PTR fs:foobar:barfoo:16
+       mov     eax, DWORD PTR fs:ds:16
+       mov     eax, DWORD PTR fs:ds:cs:16
index adef5d41d4446b8ed45fa0934c4293174a78f9f4..51deb15e55f973062605074f02a2f50a1c59472f 100644 (file)
@@ -3,12 +3,22 @@
 .*:4: Error: .*
 .*:5: Error: .*
 .*:6: Error: .*
+.*:9: Error: .*
+.*:10: Error: .*
+.*:11: Error: .*
+.*:12: Error: .*
 GAS LISTING .*
 
 
-   1 [         ]*      .text
-   2 [         ]*# All the following should be illegal
-   3 [         ]*      movq    %ds,\(%rax\)
-   4 [         ]*      movl    %ds,\(%rax\)
-   5 [         ]*      movq    \(%rax\),%ds
-   6 [         ]*      movl    \(%rax\),%ds
+[      ]*1[    ]+\.text
+[      ]*2[    ]+\# All the following should be illegal
+[      ]*3[    ]+movq  %ds,\(%rax\)
+[      ]*4[    ]+movl  %ds,\(%rax\)
+[      ]*5[    ]+movq  \(%rax\),%ds
+[      ]*6[    ]+movl  \(%rax\),%ds
+[      ]*7[    ]+
+[      ]*8[    ]+\.intel_syntax noprefix
+[      ]*9[    ]+mov   eax, DWORD PTR fs:foobar:16
+[      ]*10[   ]+mov   eax, DWORD PTR fs:foobar:barfoo:16
+[      ]*11[   ]+mov   eax, DWORD PTR fs:ds:16
+[      ]*12[   ]+mov   eax, DWORD PTR fs:ds:cs:16
index bb547422364a55a9ed4472984d88b9d7586deeb0..cfe46cf639fbf3d2ef877102f0bfcdf687ce3b08 100644 (file)
@@ -4,3 +4,9 @@
        movl    %ds,(%rax)
        movq    (%rax),%ds
        movl    (%rax),%ds
+
+       .intel_syntax noprefix
+       mov     eax, DWORD PTR fs:foobar:16
+       mov     eax, DWORD PTR fs:foobar:barfoo:16
+       mov     eax, DWORD PTR fs:ds:16
+       mov     eax, DWORD PTR fs:ds:cs:16