x86: Disable GOT relaxation with data prefix
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.
This commit is contained in:
parent
713f1b445a
commit
e60f4d3bda
@ -1,3 +1,10 @@
|
||||
2018-11-05 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR gas/r23854
|
||||
* config/tc-i386.c (output_disp): Disable GOT relaxation with
|
||||
data prefix.
|
||||
* testsuite/gas/i386/mixed-mode-reloc32.d: Updated.
|
||||
|
||||
2018-11-01 Thomas Preud'homme <thomas.preudhomme@linaro.org>
|
||||
|
||||
* testsuite/config/default.exp: Define LD, LDFLAGS and
|
||||
|
@ -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
|
||||
|
@ -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[ ]*
|
||||
|
11
ld/ChangeLog
11
ld/ChangeLog
@ -1,3 +1,14 @@
|
||||
2018-11-05 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
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.
|
||||
|
||||
2018-11-01 Thomas Preud'homme <thomas.preudhomme@linaro.org>
|
||||
|
||||
* testsuite/lib/ld-lib.exp (check_shared_lib_support): Moved to
|
||||
|
@ -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*"]
|
||||
|
28
ld/testsuite/ld-i386/pr23854.d
Normal file
28
ld/testsuite/ld-i386/pr23854.d
Normal file
@ -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
|
33
ld/testsuite/ld-i386/pr23854.s
Normal file
33
ld/testsuite/ld-i386/pr23854.s
Normal file
@ -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 bar@GOT(%ecx), %ax
|
||||
addw bar@GOT(%ecx), %bx
|
||||
andw bar@GOT(%ecx), %cx
|
||||
cmpw bar@GOT(%ecx), %dx
|
||||
orw bar@GOT(%ecx), %di
|
||||
sbbw bar@GOT(%ecx), %si
|
||||
subw bar@GOT(%ecx), %bp
|
||||
xorw bar@GOT(%ecx), %sp
|
||||
testw %cx, bar@GOT(%ecx)
|
||||
adcw foo@GOT(%ecx), %ax
|
||||
addw foo@GOT(%ecx), %bx
|
||||
andw foo@GOT(%ecx), %cx
|
||||
cmpw foo@GOT(%ecx), %dx
|
||||
orw foo@GOT(%ecx), %di
|
||||
sbbw foo@GOT(%ecx), %si
|
||||
subw foo@GOT(%ecx), %bp
|
||||
xorw foo@GOT(%ecx), %sp
|
||||
testw %cx, foo@GOT(%ecx)
|
||||
.size _start, .-_start
|
28
ld/testsuite/ld-x86-64/pr23854.d
Normal file
28
ld/testsuite/ld-x86-64/pr23854.d
Normal file
@ -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
|
33
ld/testsuite/ld-x86-64/pr23854.s
Normal file
33
ld/testsuite/ld-x86-64/pr23854.s
Normal file
@ -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 bar@GOTPCREL(%rip), %ax
|
||||
addw bar@GOTPCREL(%rip), %bx
|
||||
andw bar@GOTPCREL(%rip), %cx
|
||||
cmpw bar@GOTPCREL(%rip), %dx
|
||||
orw bar@GOTPCREL(%rip), %di
|
||||
sbbw bar@GOTPCREL(%rip), %si
|
||||
subw bar@GOTPCREL(%rip), %bp
|
||||
xorw bar@GOTPCREL(%rip), %r8w
|
||||
testw %cx, bar@GOTPCREL(%rip)
|
||||
adcw foo@GOTPCREL(%rip), %ax
|
||||
addw foo@GOTPCREL(%rip), %bx
|
||||
andw foo@GOTPCREL(%rip), %cx
|
||||
cmpw foo@GOTPCREL(%rip), %dx
|
||||
orw foo@GOTPCREL(%rip), %di
|
||||
sbbw foo@GOTPCREL(%rip), %si
|
||||
subw foo@GOTPCREL(%rip), %bp
|
||||
xorw foo@GOTPCREL(%rip), %r8w
|
||||
testw %cx, foo@GOTPCREL(%rip)
|
||||
.size _start, .-_start
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user