From 76d3a78a498e814fa1fea713091849cba7896f7a Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Wed, 11 Jul 2018 10:23:48 +0200 Subject: [PATCH] x86: fix "REP RET" with -madd-bnd-prefix Just like any other branches, RET should gain a BND prefix also when already prefixed in source by REP. --- gas/ChangeLog | 13 +++++++++++++ gas/config/tc-i386.c | 14 ++++++++++---- gas/testsuite/gas/i386/mpx-add-bnd-prefix.d | 7 +++++-- gas/testsuite/gas/i386/mpx-add-bnd-prefix.e | 3 +++ gas/testsuite/gas/i386/mpx-add-bnd-prefix.s | 3 +++ gas/testsuite/gas/i386/x86-64-mpx-add-bnd-prefix.d | 7 +++++-- gas/testsuite/gas/i386/x86-64-mpx-add-bnd-prefix.e | 3 +++ gas/testsuite/gas/i386/x86-64-mpx-add-bnd-prefix.s | 3 +++ 8 files changed, 45 insertions(+), 8 deletions(-) create mode 100644 gas/testsuite/gas/i386/mpx-add-bnd-prefix.e create mode 100644 gas/testsuite/gas/i386/x86-64-mpx-add-bnd-prefix.e diff --git a/gas/ChangeLog b/gas/ChangeLog index d49fc1151ac..6de7a6167fe 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,16 @@ +2018-07-11 Jan Beulich + + * config/tc-i386.c (md_assemble): Also replace an already + present REP prefix. + * testsuite/gas/i386/mpx-add-bnd-prefix.s, + testsuite/gas/i386/x86-64-mpx-add-bnd-prefix.s: Test RET with + all REP flavors. + * testsuite/gas/i386/mpx-add-bnd-prefix.d, + testsuite/gas/i386/x86-64-mpx-add-bnd-prefix.d: Adjust + expectations. + * testsuite/gas/i386/mpx-add-bnd-prefix.e, + testsuite/gas/i386/x86-64-mpx-add-bnd-prefix.e: New. + 2018-07-09 Jeff Law * testsuite/nds32/ji-jr.d: Fix name tag. diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 2d20f1cae94..a7b84000e05 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -4112,10 +4112,16 @@ md_assemble (char *line) } /* Insert BND prefix. */ - if (add_bnd_prefix - && i.tm.opcode_modifier.bndprefixok - && !i.prefix[BND_PREFIX]) - add_prefix (BND_PREFIX_OPCODE); + if (add_bnd_prefix && i.tm.opcode_modifier.bndprefixok) + { + if (!i.prefix[BND_PREFIX]) + add_prefix (BND_PREFIX_OPCODE); + else if (i.prefix[BND_PREFIX] != BND_PREFIX_OPCODE) + { + as_warn (_("replacing `rep'/`repe' prefix by `bnd'")); + i.prefix[BND_PREFIX] = BND_PREFIX_OPCODE; + } + } /* Check string instruction segment overrides. */ if (i.tm.opcode_modifier.isstring && i.mem_operands != 0) diff --git a/gas/testsuite/gas/i386/mpx-add-bnd-prefix.d b/gas/testsuite/gas/i386/mpx-add-bnd-prefix.d index 571f0da5897..30f6502b082 100644 --- a/gas/testsuite/gas/i386/mpx-add-bnd-prefix.d +++ b/gas/testsuite/gas/i386/mpx-add-bnd-prefix.d @@ -1,4 +1,5 @@ #as: -madd-bnd-prefix +#stderr: mpx-add-bnd-prefix.e #objdump: -drw #name: Check -madd-bnd-prefix @@ -18,7 +19,9 @@ Disassembly of section .text: 0+14 : [ ]*[a-f0-9]+: f2 c3 bnd ret [ ]*[a-f0-9]+: f2 c3 bnd ret -[ ]*[a-f0-9]+: f2 e8 f6 ff ff ff bnd call 14 +[ ]*[a-f0-9]+: f2 c3 bnd ret +[ ]*[a-f0-9]+: f2 c3 bnd ret +[ ]*[a-f0-9]+: f2 e8 f2 ff ff ff bnd call 14 [ ]*[a-f0-9]+: 01 c3 add %eax,%ebx -[ ]*[a-f0-9]+: e2 f2 loop 14 +[ ]*[a-f0-9]+: e2 ee loop 14 #pass diff --git a/gas/testsuite/gas/i386/mpx-add-bnd-prefix.e b/gas/testsuite/gas/i386/mpx-add-bnd-prefix.e new file mode 100644 index 00000000000..4e99ad0542a --- /dev/null +++ b/gas/testsuite/gas/i386/mpx-add-bnd-prefix.e @@ -0,0 +1,3 @@ +.*: Assembler messages: +.*:12: Warning: .*rep.*bnd.* +.*:13: Warning: .*rep.*bnd.* diff --git a/gas/testsuite/gas/i386/mpx-add-bnd-prefix.s b/gas/testsuite/gas/i386/mpx-add-bnd-prefix.s index 638dafab8ed..a75faa7c9f3 100644 --- a/gas/testsuite/gas/i386/mpx-add-bnd-prefix.s +++ b/gas/testsuite/gas/i386/mpx-add-bnd-prefix.s @@ -8,6 +8,9 @@ jmp *(%ebx) ret foo: + # Use of REP/REPE prefix - converted to BND with warning + rep ret + repe ret # Use of REPNE prefix - we shouldn't get any error repne ret # BND prefix already exists - we shouldn't get any error here diff --git a/gas/testsuite/gas/i386/x86-64-mpx-add-bnd-prefix.d b/gas/testsuite/gas/i386/x86-64-mpx-add-bnd-prefix.d index cef644f5c9b..139faae7dc5 100644 --- a/gas/testsuite/gas/i386/x86-64-mpx-add-bnd-prefix.d +++ b/gas/testsuite/gas/i386/x86-64-mpx-add-bnd-prefix.d @@ -1,4 +1,5 @@ #as: -madd-bnd-prefix +#stderr: x86-64-mpx-add-bnd-prefix.e #objdump: -drw #name: Check -madd-bnd-prefix (x86-64) @@ -18,7 +19,9 @@ Disassembly of section .text: 0+14 : [ ]*[a-f0-9]+: f2 c3 bnd retq [ ]*[a-f0-9]+: f2 c3 bnd retq -[ ]*[a-f0-9]+: f2 e8 f6 ff ff ff bnd callq 14 +[ ]*[a-f0-9]+: f2 c3 bnd retq +[ ]*[a-f0-9]+: f2 c3 bnd retq +[ ]*[a-f0-9]+: f2 e8 f2 ff ff ff bnd callq 14 [ ]*[a-f0-9]+: 48 01 c3 add %rax,%rbx -[ ]*[a-f0-9]+: e2 f1 loop 14 +[ ]*[a-f0-9]+: e2 ed loop 14 #pass diff --git a/gas/testsuite/gas/i386/x86-64-mpx-add-bnd-prefix.e b/gas/testsuite/gas/i386/x86-64-mpx-add-bnd-prefix.e new file mode 100644 index 00000000000..4e99ad0542a --- /dev/null +++ b/gas/testsuite/gas/i386/x86-64-mpx-add-bnd-prefix.e @@ -0,0 +1,3 @@ +.*: Assembler messages: +.*:12: Warning: .*rep.*bnd.* +.*:13: Warning: .*rep.*bnd.* diff --git a/gas/testsuite/gas/i386/x86-64-mpx-add-bnd-prefix.s b/gas/testsuite/gas/i386/x86-64-mpx-add-bnd-prefix.s index f9a900cfd83..c1be9efa339 100644 --- a/gas/testsuite/gas/i386/x86-64-mpx-add-bnd-prefix.s +++ b/gas/testsuite/gas/i386/x86-64-mpx-add-bnd-prefix.s @@ -8,6 +8,9 @@ jmp *(%rbx) ret foo: + # Use of REP/REPE prefix - converted to BND with warning + rep ret + repe ret # Use of REPNE prefix - we shouldn't get any error repne ret # BND prefix already exists - we shouldn't get any error here -- 2.30.2