diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2020-01-22 09:24:14 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2020-01-22 09:24:14 -0800 |
commit | be4c5e58bdc839898739e0332aee84abf6e5299a (patch) | |
tree | 5b2fa8999c65f96def40ddd14b6560045d83f8b8 /gas | |
parent | 6a462ad49ec13bec4659f2a8fb2301cac9742da9 (diff) | |
download | gdb-be4c5e58bdc839898739e0332aee84abf6e5299a.zip gdb-be4c5e58bdc839898739e0332aee84abf6e5299a.tar.gz gdb-be4c5e58bdc839898739e0332aee84abf6e5299a.tar.bz2 |
x86: Always disallow double word suffix with word general register
In 64-bit mode, double word suffix in mnemonic with word general register
is disallowed. Otherwise, assembler gives a warning:
$ cat /tmp/x.s
movl %ax, %bx
movl %ds, %ax
movl %ax, %cs
$ gcc -c /tmp/x.s
/tmp/x.s: Assembler messages:
/tmp/x.s:1: Error: incorrect register `%bx' used with `l' suffix
/tmp/x.s:2: Error: incorrect register `%ax' used with `l' suffix
/tmp/x.s:3: Error: incorrect register `%ax' used with `l' suffix
$ gcc -c /tmp/x.s -m32
/tmp/x.s: Assembler messages:
/tmp/x.s: Assembler messages:
/tmp/x.s:1: Warning: using `%ebx' instead of `%bx' due to `l' suffix
/tmp/x.s:1: Warning: using `%eax' instead of `%ax' due to `l' suffix
/tmp/x.s:2: Warning: using `%eax' instead of `%ax' due to `l' suffix
/tmp/x.s:3: Warning: using `%eax' instead of `%ax' due to `l' suffix
This patch makes it a hard error in all modes. Now we get:
$ gcc -c /tmp/x.s -m32
/tmp/x.s: Assembler messages:
/tmp/x.s:1: Error: incorrect register `%bx' used with `l' suffix
/tmp/x.s:2: Error: incorrect register `%ax' used with `l' suffix
/tmp/x.s:3: Error: incorrect register `%ax' used with `l' suffix
PR gas/25438
* config/tc-i386.c (check_long_reg): Always disallow double word
suffix in mnemonic with word general register.
* testsuite/gas/i386/general.s: Replace word general register
with double word general register for movl.
* testsuite/gas/i386/inval.s: Add tests for movl with word general
register.
* testsuite/gas/i386/general.l: Updated.
* testsuite/gas/i386/inval.l: Likewise.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 12 | ||||
-rw-r--r-- | gas/config/tc-i386.c | 24 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/general.l | 12 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/general.s | 6 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/inval.l | 7 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/inval.s | 4 |
6 files changed, 35 insertions, 30 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 2d247a1..8a18aa7 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,15 @@ +2020-01-22 H.J. Lu <hongjiu.lu@intel.com> + + PR gas/25438 + * config/tc-i386.c (check_long_reg): Always disallow double word + suffix in mnemonic with word general register. + * testsuite/gas/i386/general.s: Replace word general register + with double word general register for movl. + * testsuite/gas/i386/inval.s: Add tests for movl with word general + register. + * testsuite/gas/i386/general.l: Updated. + * testsuite/gas/i386/inval.l: Likewise. + 2020-01-22 Alan Modra <amodra@gmail.com> * config/tc-ppc.c (parse_tls_arg): Handle tls arg for diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 3a2a1b7..34778ae 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -6672,28 +6672,16 @@ check_long_reg (void) i.suffix); return 0; } - /* Warn if the e prefix on a general reg is missing. */ - else if ((!quiet_warnings || flag_code == CODE_64BIT) - && i.types[op].bitfield.word + /* Error if the e prefix on a general reg is missing. */ + else if (i.types[op].bitfield.word && (i.tm.operand_types[op].bitfield.class == Reg || i.tm.operand_types[op].bitfield.instance == Accum) && i.tm.operand_types[op].bitfield.dword) { - /* Prohibit these changes in the 64bit mode, since the - lowering is more complicated. */ - if (flag_code == CODE_64BIT) - { - as_bad (_("incorrect register `%s%s' used with `%c' suffix"), - register_prefix, i.op[op].regs->reg_name, - i.suffix); - return 0; - } -#if REGISTER_WARNINGS - as_warn (_("using `%s%s' instead of `%s%s' due to `%c' suffix"), - register_prefix, - (i.op[op].regs + REGNAM_EAX - REGNAM_AX)->reg_name, - register_prefix, i.op[op].regs->reg_name, i.suffix); -#endif + as_bad (_("incorrect register `%s%s' used with `%c' suffix"), + register_prefix, i.op[op].regs->reg_name, + i.suffix); + return 0; } /* Warn if the r prefix on a general reg is present. */ else if (i.types[op].bitfield.qword diff --git a/gas/testsuite/gas/i386/general.l b/gas/testsuite/gas/i386/general.l index acd4440..4705277 100644 --- a/gas/testsuite/gas/i386/general.l +++ b/gas/testsuite/gas/i386/general.l @@ -9,8 +9,6 @@ .*:25: Warning:.* .*:27: Warning:.* .*:29: Warning:.* -.*:39: Warning:.* -.*:41: Warning:.* .*:48: Warning:.* .*:51: Warning:.* .*:124: Warning:.* @@ -30,7 +28,6 @@ .*:142: Warning:.* .*:143: Warning:.* .*:144: Warning:.* -.*:178: Warning:.* .*:224: Warning:.* .*:233: Warning:.* .*:234: Warning:.* @@ -84,11 +81,9 @@ 36 007e 1F popl %ds 37 007f 8CD8 mov %ds,%eax 38 0081 8CD8 movl %ds,%eax - 39 0083 8CD8 movl %ds,%ax -.*Warning:.* + 39 0083 8CDB movl %ds,%ebx 40 0085 8ED8 mov %eax,%ds - 41 0087 8ED8 movl %ax,%ds -.*Warning:.* + 41 0087 8EDB movl %ebx,%ds 42 0089 8ED8 movl %eax,%ds 43 44 008b 661E pushw %ds @@ -244,8 +239,7 @@ 175 01a9 66F7F1 div %cx,%ax 176 01ac F7F1 div %ecx,%eax 177 01ae 8EDE mov %si,%ds - 178 01b0 8EDE movl %si,%ds # warning here -.*Warning:.* + 178 01b0 8EDF movl %edi,%ds 179 01b2 1E pushl %ds 180 01b3 1E push %ds 181 01b4 A0000000 00 mov 0,%al diff --git a/gas/testsuite/gas/i386/general.s b/gas/testsuite/gas/i386/general.s index 39bbfe3..77f54ae 100644 --- a/gas/testsuite/gas/i386/general.s +++ b/gas/testsuite/gas/i386/general.s @@ -36,9 +36,9 @@ popl %ds mov %ds,%eax movl %ds,%eax - movl %ds,%ax + movl %ds,%ebx mov %eax,%ds - movl %ax,%ds + movl %ebx,%ds movl %eax,%ds pushw %ds @@ -175,7 +175,7 @@ div %cx,%ax div %ecx,%eax mov %si,%ds - movl %si,%ds # warning here + movl %edi,%ds pushl %ds push %ds mov 0,%al diff --git a/gas/testsuite/gas/i386/inval.l b/gas/testsuite/gas/i386/inval.l index 3d52a17..0159e97 100644 --- a/gas/testsuite/gas/i386/inval.l +++ b/gas/testsuite/gas/i386/inval.l @@ -88,6 +88,9 @@ .*:98: Error: .*rol.* .*:99: Error: .*rcl.* .*:102: Error: .* +.*:104: Error: .* +.*:105: Error: .* +.*:106: Error: .* GAS LISTING .* @@ -196,3 +199,7 @@ GAS LISTING .* [ ]*[1-9][0-9]*[ ]+ [ ]*[1-9][0-9]*[ ]+\.att_syntax prefix [ ]*[1-9][0-9]*[ ]+movsd \(%esi\), %ss:\(%edi\), %ss:\(%eax\) +[ ]*[1-9][0-9]*[ ]+ +[ ]*[1-9][0-9]*[ ]+movl %ds, %ax +[ ]*[1-9][0-9]*[ ]+movl %ax, %ds +[ ]*[1-9][0-9]*[ ]+movl %ax, %bx diff --git a/gas/testsuite/gas/i386/inval.s b/gas/testsuite/gas/i386/inval.s index 47655e5..3ff58b3 100644 --- a/gas/testsuite/gas/i386/inval.s +++ b/gas/testsuite/gas/i386/inval.s @@ -100,3 +100,7 @@ movnti word ptr [eax], ax .att_syntax prefix movsd (%esi), %ss:(%edi), %ss:(%eax) + + movl %ds, %ax + movl %ax, %ds + movl %ax, %bx |