H.J. Lu
2018-11-05 15:46:27 UTC
Since linker GOT relaxation isn't valid for 16-bit GOT access, we should
disable GOT relaxation with data prefix.
gas/
PR gas/r23854
* config/tc-i386.c (output_disp): Disable GOT relaxation with
data prefix.
* testsuite/gas/i386/mixed-mode-reloc32.d: Updated.
ld/
PR gas/r23854
* testsuite/ld-i386/i386.exp: Run pr23854.
* testsuite/ld-x86-64/x86-64.exp: Likewwise.
* testsuite/ld-i386/pr23854.d: New file.
* testsuite/ld-i386/pr23854.s: Likewwise.
* testsuite/ld-i386/pr23854.d: Likewwise.
* testsuite/ld-x86-64/pr23854.d: Likewwise.
* testsuite/ld-x86-64/pr23854.s: Likewwise.
---
gas/config/tc-i386.c | 13 ++++----
gas/testsuite/gas/i386/mixed-mode-reloc32.d | 2 +-
ld/testsuite/ld-i386/i386.exp | 1 +
ld/testsuite/ld-i386/pr23854.d | 28 +++++++++++++++++
ld/testsuite/ld-i386/pr23854.s | 33 +++++++++++++++++++++
ld/testsuite/ld-x86-64/pr23854.d | 28 +++++++++++++++++
ld/testsuite/ld-x86-64/pr23854.s | 33 +++++++++++++++++++++
ld/testsuite/ld-x86-64/x86-64.exp | 1 +
8 files changed, 132 insertions(+), 7 deletions(-)
create mode 100644 ld/testsuite/ld-i386/pr23854.d
create mode 100644 ld/testsuite/ld-i386/pr23854.s
create mode 100644 ld/testsuite/ld-x86-64/pr23854.d
create mode 100644 ld/testsuite/ld-x86-64/pr23854.s
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index e808d20ed8..7d4ffc8dad 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -8419,12 +8419,13 @@ output_disp (fragS *insn_start_frag, offsetT insn_start_off)
/* Check for "call/jmp *mem", "mov mem, %reg",
"test %reg, mem" and "binop mem, %reg" where binop
is one of adc, add, and, cmp, or, sbb, sub, xor
- instructions. Always generate R_386_GOT32X for
- "sym*GOT" operand in 32-bit mode. */
- if ((generate_relax_relocations
- || (!object_64bit
- && i.rm.mode == 0
- && i.rm.regmem == 5))
+ instructions without data prefix. Always generate
+ R_386_GOT32X for "sym*GOT" operand in 32-bit mode. */
+ if (i.prefix[DATA_PREFIX] == 0
+ && (generate_relax_relocations
+ || (!object_64bit
+ && i.rm.mode == 0
+ && i.rm.regmem == 5))
&& (i.rm.mode == 2
|| (i.rm.mode == 0 && i.rm.regmem == 5))
&& ((i.operands == 1
diff --git a/gas/testsuite/gas/i386/mixed-mode-reloc32.d b/gas/testsuite/gas/i386/mixed-mode-reloc32.d
index a2ef6a0b85..59234bc9be 100644
--- a/gas/testsuite/gas/i386/mixed-mode-reloc32.d
+++ b/gas/testsuite/gas/i386/mixed-mode-reloc32.d
@@ -7,7 +7,7 @@
RELOCATION RECORDS FOR \[.text\]:
OFFSET[ ]+TYPE[ ]+VALUE[ ]*
-[0-9a-f]+[ ]+R_386_GOT32X[ ]+xtrn[ ]*
+[0-9a-f]+[ ]+R_386_GOT32[ ]+xtrn[ ]*
[0-9a-f]+[ ]+R_386_PLT32[ ]+xtrn[ ]*
[0-9a-f]+[ ]+R_386_GOT32X[ ]+xtrn[ ]*
[0-9a-f]+[ ]+R_386_PLT32[ ]+xtrn[ ]*
diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp
index 21f5593249..76577c4fcb 100644
--- a/ld/testsuite/ld-i386/i386.exp
+++ b/ld/testsuite/ld-i386/i386.exp
@@ -481,6 +481,7 @@ run_dump_test "pr23486a"
run_dump_test "pr23486b"
run_dump_test "pr23486c"
run_dump_test "pr23486d"
+run_dump_test "pr23854"
if { !([istarget "i?86-*-linux*"]
|| [istarget "i?86-*-gnu*"]
diff --git a/ld/testsuite/ld-i386/pr23854.d b/ld/testsuite/ld-i386/pr23854.d
new file mode 100644
index 0000000000..3ed9c206e5
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr23854.d
@@ -0,0 +1,28 @@
+#as: --32 -mrelax-relocations=yes
+#ld: -melf_i386
+#objdump: -dw
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+ +[a-f0-9]+: 66 13 81 f8 ff ff ff adc -0x8\(%ecx\),%ax
+ +[a-f0-9]+: 66 03 99 f8 ff ff ff add -0x8\(%ecx\),%bx
+ +[a-f0-9]+: 66 23 89 f8 ff ff ff and -0x8\(%ecx\),%cx
+ +[a-f0-9]+: 66 3b 91 f8 ff ff ff cmp -0x8\(%ecx\),%dx
+ +[a-f0-9]+: 66 0b b9 f8 ff ff ff or -0x8\(%ecx\),%di
+ +[a-f0-9]+: 66 1b b1 f8 ff ff ff sbb -0x8\(%ecx\),%si
+ +[a-f0-9]+: 66 2b a9 f8 ff ff ff sub -0x8\(%ecx\),%bp
+ +[a-f0-9]+: 66 33 a1 f8 ff ff ff xor -0x8\(%ecx\),%sp
+ +[a-f0-9]+: 66 85 89 f8 ff ff ff test %cx,-0x8\(%ecx\)
+ +[a-f0-9]+: 66 13 81 fc ff ff ff adc -0x4\(%ecx\),%ax
+ +[a-f0-9]+: 66 03 99 fc ff ff ff add -0x4\(%ecx\),%bx
+ +[a-f0-9]+: 66 23 89 fc ff ff ff and -0x4\(%ecx\),%cx
+ +[a-f0-9]+: 66 3b 91 fc ff ff ff cmp -0x4\(%ecx\),%dx
+ +[a-f0-9]+: 66 0b b9 fc ff ff ff or -0x4\(%ecx\),%di
+ +[a-f0-9]+: 66 1b b1 fc ff ff ff sbb -0x4\(%ecx\),%si
+ +[a-f0-9]+: 66 2b a9 fc ff ff ff sub -0x4\(%ecx\),%bp
+ +[a-f0-9]+: 66 33 a1 fc ff ff ff xor -0x4\(%ecx\),%sp
+ +[a-f0-9]+: 66 85 89 fc ff ff ff test %cx,-0x4\(%ecx\)
+#pass
diff --git a/ld/testsuite/ld-i386/pr23854.s b/ld/testsuite/ld-i386/pr23854.s
new file mode 100644
index 0000000000..565e747be0
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr23854.s
@@ -0,0 +1,33 @@
+ .data
+ .type bar, @object
+bar:
+ .byte 1
+ .size bar, .-bar
+ .globl foo
+ .type foo, @object
+foo:
+ .byte 1
+ .size foo, .-foo
+ .text
+ .globl _start
+ .type _start, @function
+_start:
+ adcw ***@GOT(%ecx), %ax
+ addw ***@GOT(%ecx), %bx
+ andw ***@GOT(%ecx), %cx
+ cmpw ***@GOT(%ecx), %dx
+ orw ***@GOT(%ecx), %di
+ sbbw ***@GOT(%ecx), %si
+ subw ***@GOT(%ecx), %bp
+ xorw ***@GOT(%ecx), %sp
+ testw %cx, ***@GOT(%ecx)
+ adcw ***@GOT(%ecx), %ax
+ addw ***@GOT(%ecx), %bx
+ andw ***@GOT(%ecx), %cx
+ cmpw ***@GOT(%ecx), %dx
+ orw ***@GOT(%ecx), %di
+ sbbw ***@GOT(%ecx), %si
+ subw ***@GOT(%ecx), %bp
+ xorw ***@GOT(%ecx), %sp
+ testw %cx, ***@GOT(%ecx)
+ .size _start, .-_start
diff --git a/ld/testsuite/ld-x86-64/pr23854.d b/ld/testsuite/ld-x86-64/pr23854.d
new file mode 100644
index 0000000000..95770d3cef
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr23854.d
@@ -0,0 +1,28 @@
+#as: --64 -mrelax-relocations=yes
+#ld: -melf_x86_64
+#objdump: -dw
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+ +[a-f0-9]+: 66 13 05 ([0-9a-f]{2} ){4} * adc 0x[a-f0-9]+\(%rip\),%ax # [a-f0-9]+ <.got>
+ +[a-f0-9]+: 66 03 1d ([0-9a-f]{2} ){4} * add 0x[a-f0-9]+\(%rip\),%bx # [a-f0-9]+ <.got>
+ +[a-f0-9]+: 66 23 0d ([0-9a-f]{2} ){4} * and 0x[a-f0-9]+\(%rip\),%cx # [a-f0-9]+ <.got>
+ +[a-f0-9]+: 66 3b 15 ([0-9a-f]{2} ){4} * cmp 0x[a-f0-9]+\(%rip\),%dx # [a-f0-9]+ <.got>
+ +[a-f0-9]+: 66 0b 3d ([0-9a-f]{2} ){4} * or 0x[a-f0-9]+\(%rip\),%di # [a-f0-9]+ <.got>
+ +[a-f0-9]+: 66 1b 35 ([0-9a-f]{2} ){4} * sbb 0x[a-f0-9]+\(%rip\),%si # [a-f0-9]+ <.got>
+ +[a-f0-9]+: 66 2b 2d ([0-9a-f]{2} ){4} * sub 0x[a-f0-9]+\(%rip\),%bp # [a-f0-9]+ <.got>
+ +[a-f0-9]+: 66 44 33 05 ([0-9a-f]{2} ){4} * xor 0x[a-f0-9]+\(%rip\),%r8w # [a-f0-9]+ <.got>
+ +[a-f0-9]+: 66 85 0d ([0-9a-f]{2} ){4} * test %cx,0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <.got>
+ +[a-f0-9]+: 66 13 05 ([0-9a-f]{2} ){4} * adc 0x[a-f0-9]+\(%rip\),%ax # [a-f0-9]+ <.got\+0x8>
+ +[a-f0-9]+: 66 03 1d ([0-9a-f]{2} ){4} * add 0x[a-f0-9]+\(%rip\),%bx # [a-f0-9]+ <.got\+0x8>
+ +[a-f0-9]+: 66 23 0d ([0-9a-f]{2} ){4} * and 0x[a-f0-9]+\(%rip\),%cx # [a-f0-9]+ <.got\+0x8>
+ +[a-f0-9]+: 66 3b 15 ([0-9a-f]{2} ){4} * cmp 0x[a-f0-9]+\(%rip\),%dx # [a-f0-9]+ <.got\+0x8>
+ +[a-f0-9]+: 66 0b 3d ([0-9a-f]{2} ){4} * or 0x[a-f0-9]+\(%rip\),%di # [a-f0-9]+ <.got\+0x8>
+ +[a-f0-9]+: 66 1b 35 ([0-9a-f]{2} ){4} * sbb 0x[a-f0-9]+\(%rip\),%si # [a-f0-9]+ <.got\+0x8>
+ +[a-f0-9]+: 66 2b 2d ([0-9a-f]{2} ){4} * sub 0x[a-f0-9]+\(%rip\),%bp # [a-f0-9]+ <.got\+0x8>
+ +[a-f0-9]+: 66 44 33 05 ([0-9a-f]{2} ){4} * xor 0x[a-f0-9]+\(%rip\),%r8w # [a-f0-9]+ <.got\+0x8>
+ +[a-f0-9]+: 66 85 0d ([0-9a-f]{2} ){4} * test %cx,0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <.got\+0x8>
+#pass
diff --git a/ld/testsuite/ld-x86-64/pr23854.s b/ld/testsuite/ld-x86-64/pr23854.s
new file mode 100644
index 0000000000..b720154fb2
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr23854.s
@@ -0,0 +1,33 @@
+ .data
+ .type bar, @object
+bar:
+ .byte 1
+ .size bar, .-bar
+ .globl foo
+ .type foo, @object
+foo:
+ .byte 1
+ .size foo, .-foo
+ .text
+ .globl _start
+ .type _start, @function
+_start:
+ adcw ***@GOTPCREL(%rip), %ax
+ addw ***@GOTPCREL(%rip), %bx
+ andw ***@GOTPCREL(%rip), %cx
+ cmpw ***@GOTPCREL(%rip), %dx
+ orw ***@GOTPCREL(%rip), %di
+ sbbw ***@GOTPCREL(%rip), %si
+ subw ***@GOTPCREL(%rip), %bp
+ xorw ***@GOTPCREL(%rip), %r8w
+ testw %cx, ***@GOTPCREL(%rip)
+ adcw ***@GOTPCREL(%rip), %ax
+ addw ***@GOTPCREL(%rip), %bx
+ andw ***@GOTPCREL(%rip), %cx
+ cmpw ***@GOTPCREL(%rip), %dx
+ orw ***@GOTPCREL(%rip), %di
+ sbbw ***@GOTPCREL(%rip), %si
+ subw ***@GOTPCREL(%rip), %bp
+ xorw ***@GOTPCREL(%rip), %r8w
+ testw %cx, ***@GOTPCREL(%rip)
+ .size _start, .-_start
diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp
index db65810f1f..8e5348dfea 100644
--- a/ld/testsuite/ld-x86-64/x86-64.exp
+++ b/ld/testsuite/ld-x86-64/x86-64.exp
@@ -421,6 +421,7 @@ run_dump_test "pr23486c"
run_dump_test "pr23486c-x32"
run_dump_test "pr23486d"
run_dump_test "pr23486d-x32"
+run_dump_test "pr23854"
if { ![istarget "x86_64-*-linux*"] && ![istarget "x86_64-*-nacl*"]} {
return
disable GOT relaxation with data prefix.
gas/
PR gas/r23854
* config/tc-i386.c (output_disp): Disable GOT relaxation with
data prefix.
* testsuite/gas/i386/mixed-mode-reloc32.d: Updated.
ld/
PR gas/r23854
* testsuite/ld-i386/i386.exp: Run pr23854.
* testsuite/ld-x86-64/x86-64.exp: Likewwise.
* testsuite/ld-i386/pr23854.d: New file.
* testsuite/ld-i386/pr23854.s: Likewwise.
* testsuite/ld-i386/pr23854.d: Likewwise.
* testsuite/ld-x86-64/pr23854.d: Likewwise.
* testsuite/ld-x86-64/pr23854.s: Likewwise.
---
gas/config/tc-i386.c | 13 ++++----
gas/testsuite/gas/i386/mixed-mode-reloc32.d | 2 +-
ld/testsuite/ld-i386/i386.exp | 1 +
ld/testsuite/ld-i386/pr23854.d | 28 +++++++++++++++++
ld/testsuite/ld-i386/pr23854.s | 33 +++++++++++++++++++++
ld/testsuite/ld-x86-64/pr23854.d | 28 +++++++++++++++++
ld/testsuite/ld-x86-64/pr23854.s | 33 +++++++++++++++++++++
ld/testsuite/ld-x86-64/x86-64.exp | 1 +
8 files changed, 132 insertions(+), 7 deletions(-)
create mode 100644 ld/testsuite/ld-i386/pr23854.d
create mode 100644 ld/testsuite/ld-i386/pr23854.s
create mode 100644 ld/testsuite/ld-x86-64/pr23854.d
create mode 100644 ld/testsuite/ld-x86-64/pr23854.s
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index e808d20ed8..7d4ffc8dad 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -8419,12 +8419,13 @@ output_disp (fragS *insn_start_frag, offsetT insn_start_off)
/* Check for "call/jmp *mem", "mov mem, %reg",
"test %reg, mem" and "binop mem, %reg" where binop
is one of adc, add, and, cmp, or, sbb, sub, xor
- instructions. Always generate R_386_GOT32X for
- "sym*GOT" operand in 32-bit mode. */
- if ((generate_relax_relocations
- || (!object_64bit
- && i.rm.mode == 0
- && i.rm.regmem == 5))
+ instructions without data prefix. Always generate
+ R_386_GOT32X for "sym*GOT" operand in 32-bit mode. */
+ if (i.prefix[DATA_PREFIX] == 0
+ && (generate_relax_relocations
+ || (!object_64bit
+ && i.rm.mode == 0
+ && i.rm.regmem == 5))
&& (i.rm.mode == 2
|| (i.rm.mode == 0 && i.rm.regmem == 5))
&& ((i.operands == 1
diff --git a/gas/testsuite/gas/i386/mixed-mode-reloc32.d b/gas/testsuite/gas/i386/mixed-mode-reloc32.d
index a2ef6a0b85..59234bc9be 100644
--- a/gas/testsuite/gas/i386/mixed-mode-reloc32.d
+++ b/gas/testsuite/gas/i386/mixed-mode-reloc32.d
@@ -7,7 +7,7 @@
RELOCATION RECORDS FOR \[.text\]:
OFFSET[ ]+TYPE[ ]+VALUE[ ]*
-[0-9a-f]+[ ]+R_386_GOT32X[ ]+xtrn[ ]*
+[0-9a-f]+[ ]+R_386_GOT32[ ]+xtrn[ ]*
[0-9a-f]+[ ]+R_386_PLT32[ ]+xtrn[ ]*
[0-9a-f]+[ ]+R_386_GOT32X[ ]+xtrn[ ]*
[0-9a-f]+[ ]+R_386_PLT32[ ]+xtrn[ ]*
diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp
index 21f5593249..76577c4fcb 100644
--- a/ld/testsuite/ld-i386/i386.exp
+++ b/ld/testsuite/ld-i386/i386.exp
@@ -481,6 +481,7 @@ run_dump_test "pr23486a"
run_dump_test "pr23486b"
run_dump_test "pr23486c"
run_dump_test "pr23486d"
+run_dump_test "pr23854"
if { !([istarget "i?86-*-linux*"]
|| [istarget "i?86-*-gnu*"]
diff --git a/ld/testsuite/ld-i386/pr23854.d b/ld/testsuite/ld-i386/pr23854.d
new file mode 100644
index 0000000000..3ed9c206e5
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr23854.d
@@ -0,0 +1,28 @@
+#as: --32 -mrelax-relocations=yes
+#ld: -melf_i386
+#objdump: -dw
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+ +[a-f0-9]+: 66 13 81 f8 ff ff ff adc -0x8\(%ecx\),%ax
+ +[a-f0-9]+: 66 03 99 f8 ff ff ff add -0x8\(%ecx\),%bx
+ +[a-f0-9]+: 66 23 89 f8 ff ff ff and -0x8\(%ecx\),%cx
+ +[a-f0-9]+: 66 3b 91 f8 ff ff ff cmp -0x8\(%ecx\),%dx
+ +[a-f0-9]+: 66 0b b9 f8 ff ff ff or -0x8\(%ecx\),%di
+ +[a-f0-9]+: 66 1b b1 f8 ff ff ff sbb -0x8\(%ecx\),%si
+ +[a-f0-9]+: 66 2b a9 f8 ff ff ff sub -0x8\(%ecx\),%bp
+ +[a-f0-9]+: 66 33 a1 f8 ff ff ff xor -0x8\(%ecx\),%sp
+ +[a-f0-9]+: 66 85 89 f8 ff ff ff test %cx,-0x8\(%ecx\)
+ +[a-f0-9]+: 66 13 81 fc ff ff ff adc -0x4\(%ecx\),%ax
+ +[a-f0-9]+: 66 03 99 fc ff ff ff add -0x4\(%ecx\),%bx
+ +[a-f0-9]+: 66 23 89 fc ff ff ff and -0x4\(%ecx\),%cx
+ +[a-f0-9]+: 66 3b 91 fc ff ff ff cmp -0x4\(%ecx\),%dx
+ +[a-f0-9]+: 66 0b b9 fc ff ff ff or -0x4\(%ecx\),%di
+ +[a-f0-9]+: 66 1b b1 fc ff ff ff sbb -0x4\(%ecx\),%si
+ +[a-f0-9]+: 66 2b a9 fc ff ff ff sub -0x4\(%ecx\),%bp
+ +[a-f0-9]+: 66 33 a1 fc ff ff ff xor -0x4\(%ecx\),%sp
+ +[a-f0-9]+: 66 85 89 fc ff ff ff test %cx,-0x4\(%ecx\)
+#pass
diff --git a/ld/testsuite/ld-i386/pr23854.s b/ld/testsuite/ld-i386/pr23854.s
new file mode 100644
index 0000000000..565e747be0
--- /dev/null
+++ b/ld/testsuite/ld-i386/pr23854.s
@@ -0,0 +1,33 @@
+ .data
+ .type bar, @object
+bar:
+ .byte 1
+ .size bar, .-bar
+ .globl foo
+ .type foo, @object
+foo:
+ .byte 1
+ .size foo, .-foo
+ .text
+ .globl _start
+ .type _start, @function
+_start:
+ adcw ***@GOT(%ecx), %ax
+ addw ***@GOT(%ecx), %bx
+ andw ***@GOT(%ecx), %cx
+ cmpw ***@GOT(%ecx), %dx
+ orw ***@GOT(%ecx), %di
+ sbbw ***@GOT(%ecx), %si
+ subw ***@GOT(%ecx), %bp
+ xorw ***@GOT(%ecx), %sp
+ testw %cx, ***@GOT(%ecx)
+ adcw ***@GOT(%ecx), %ax
+ addw ***@GOT(%ecx), %bx
+ andw ***@GOT(%ecx), %cx
+ cmpw ***@GOT(%ecx), %dx
+ orw ***@GOT(%ecx), %di
+ sbbw ***@GOT(%ecx), %si
+ subw ***@GOT(%ecx), %bp
+ xorw ***@GOT(%ecx), %sp
+ testw %cx, ***@GOT(%ecx)
+ .size _start, .-_start
diff --git a/ld/testsuite/ld-x86-64/pr23854.d b/ld/testsuite/ld-x86-64/pr23854.d
new file mode 100644
index 0000000000..95770d3cef
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr23854.d
@@ -0,0 +1,28 @@
+#as: --64 -mrelax-relocations=yes
+#ld: -melf_x86_64
+#objdump: -dw
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+[a-f0-9]+ <_start>:
+ +[a-f0-9]+: 66 13 05 ([0-9a-f]{2} ){4} * adc 0x[a-f0-9]+\(%rip\),%ax # [a-f0-9]+ <.got>
+ +[a-f0-9]+: 66 03 1d ([0-9a-f]{2} ){4} * add 0x[a-f0-9]+\(%rip\),%bx # [a-f0-9]+ <.got>
+ +[a-f0-9]+: 66 23 0d ([0-9a-f]{2} ){4} * and 0x[a-f0-9]+\(%rip\),%cx # [a-f0-9]+ <.got>
+ +[a-f0-9]+: 66 3b 15 ([0-9a-f]{2} ){4} * cmp 0x[a-f0-9]+\(%rip\),%dx # [a-f0-9]+ <.got>
+ +[a-f0-9]+: 66 0b 3d ([0-9a-f]{2} ){4} * or 0x[a-f0-9]+\(%rip\),%di # [a-f0-9]+ <.got>
+ +[a-f0-9]+: 66 1b 35 ([0-9a-f]{2} ){4} * sbb 0x[a-f0-9]+\(%rip\),%si # [a-f0-9]+ <.got>
+ +[a-f0-9]+: 66 2b 2d ([0-9a-f]{2} ){4} * sub 0x[a-f0-9]+\(%rip\),%bp # [a-f0-9]+ <.got>
+ +[a-f0-9]+: 66 44 33 05 ([0-9a-f]{2} ){4} * xor 0x[a-f0-9]+\(%rip\),%r8w # [a-f0-9]+ <.got>
+ +[a-f0-9]+: 66 85 0d ([0-9a-f]{2} ){4} * test %cx,0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <.got>
+ +[a-f0-9]+: 66 13 05 ([0-9a-f]{2} ){4} * adc 0x[a-f0-9]+\(%rip\),%ax # [a-f0-9]+ <.got\+0x8>
+ +[a-f0-9]+: 66 03 1d ([0-9a-f]{2} ){4} * add 0x[a-f0-9]+\(%rip\),%bx # [a-f0-9]+ <.got\+0x8>
+ +[a-f0-9]+: 66 23 0d ([0-9a-f]{2} ){4} * and 0x[a-f0-9]+\(%rip\),%cx # [a-f0-9]+ <.got\+0x8>
+ +[a-f0-9]+: 66 3b 15 ([0-9a-f]{2} ){4} * cmp 0x[a-f0-9]+\(%rip\),%dx # [a-f0-9]+ <.got\+0x8>
+ +[a-f0-9]+: 66 0b 3d ([0-9a-f]{2} ){4} * or 0x[a-f0-9]+\(%rip\),%di # [a-f0-9]+ <.got\+0x8>
+ +[a-f0-9]+: 66 1b 35 ([0-9a-f]{2} ){4} * sbb 0x[a-f0-9]+\(%rip\),%si # [a-f0-9]+ <.got\+0x8>
+ +[a-f0-9]+: 66 2b 2d ([0-9a-f]{2} ){4} * sub 0x[a-f0-9]+\(%rip\),%bp # [a-f0-9]+ <.got\+0x8>
+ +[a-f0-9]+: 66 44 33 05 ([0-9a-f]{2} ){4} * xor 0x[a-f0-9]+\(%rip\),%r8w # [a-f0-9]+ <.got\+0x8>
+ +[a-f0-9]+: 66 85 0d ([0-9a-f]{2} ){4} * test %cx,0x[a-f0-9]+\(%rip\) # [a-f0-9]+ <.got\+0x8>
+#pass
diff --git a/ld/testsuite/ld-x86-64/pr23854.s b/ld/testsuite/ld-x86-64/pr23854.s
new file mode 100644
index 0000000000..b720154fb2
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/pr23854.s
@@ -0,0 +1,33 @@
+ .data
+ .type bar, @object
+bar:
+ .byte 1
+ .size bar, .-bar
+ .globl foo
+ .type foo, @object
+foo:
+ .byte 1
+ .size foo, .-foo
+ .text
+ .globl _start
+ .type _start, @function
+_start:
+ adcw ***@GOTPCREL(%rip), %ax
+ addw ***@GOTPCREL(%rip), %bx
+ andw ***@GOTPCREL(%rip), %cx
+ cmpw ***@GOTPCREL(%rip), %dx
+ orw ***@GOTPCREL(%rip), %di
+ sbbw ***@GOTPCREL(%rip), %si
+ subw ***@GOTPCREL(%rip), %bp
+ xorw ***@GOTPCREL(%rip), %r8w
+ testw %cx, ***@GOTPCREL(%rip)
+ adcw ***@GOTPCREL(%rip), %ax
+ addw ***@GOTPCREL(%rip), %bx
+ andw ***@GOTPCREL(%rip), %cx
+ cmpw ***@GOTPCREL(%rip), %dx
+ orw ***@GOTPCREL(%rip), %di
+ sbbw ***@GOTPCREL(%rip), %si
+ subw ***@GOTPCREL(%rip), %bp
+ xorw ***@GOTPCREL(%rip), %r8w
+ testw %cx, ***@GOTPCREL(%rip)
+ .size _start, .-_start
diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp
index db65810f1f..8e5348dfea 100644
--- a/ld/testsuite/ld-x86-64/x86-64.exp
+++ b/ld/testsuite/ld-x86-64/x86-64.exp
@@ -421,6 +421,7 @@ run_dump_test "pr23486c"
run_dump_test "pr23486c-x32"
run_dump_test "pr23486d"
run_dump_test "pr23486d-x32"
+run_dump_test "pr23854"
if { ![istarget "x86_64-*-linux*"] && ![istarget "x86_64-*-nacl*"]} {
return
--
2.17.2
2.17.2