x86: Disable GOT relaxation with data prefix
authorH.J. Lu <hjl.tools@gmail.com>
Mon, 5 Nov 2018 17:01:26 +0000 (09:01 -0800)
committerH.J. Lu <hjl.tools@gmail.com>
Mon, 5 Nov 2018 17:01:43 +0000 (09:01 -0800)
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/ChangeLog
gas/config/tc-i386.c
gas/testsuite/gas/i386/mixed-mode-reloc32.d
ld/ChangeLog
ld/testsuite/ld-i386/i386.exp
ld/testsuite/ld-i386/pr23854.d [new file with mode: 0644]
ld/testsuite/ld-i386/pr23854.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr23854.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr23854.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp

index eef02b8..4b64a58 100644 (file)
@@ -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
index e808d20..7d4ffc8 100644 (file)
@@ -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
index a2ef6a0..59234bc 100644 (file)
@@ -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[         ]*
index 7fee0dd..db854e7 100644 (file)
@@ -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
index 21f5593..76577c4 100644 (file)
@@ -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 (file)
index 0000000..3ed9c20
--- /dev/null
@@ -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 (file)
index 0000000..565e747
--- /dev/null
@@ -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
diff --git a/ld/testsuite/ld-x86-64/pr23854.d b/ld/testsuite/ld-x86-64/pr23854.d
new file mode 100644 (file)
index 0000000..95770d3
--- /dev/null
@@ -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 (file)
index 0000000..b720154
--- /dev/null
@@ -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
index db65810..8e5348d 100644 (file)
@@ -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