Convert mov to lea for loading address of local common symbol
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 16 Oct 2015 10:14:40 +0000 (03:14 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 16 Oct 2015 10:14:40 +0000 (03:14 -0700)
There is no need to check def_regular when converting mov to lea for
loading address of local symbols since def_regular may be false for
common symbols and SYMBOL_REFERENCES_LOCAL is sufficient.

bfd/

* elf32-i386.c (elf_i386_convert_mov_to_lea): Don't check
def_regular.
* elf64-x86-64.c (elf_x86_64_convert_mov_to_lea): Likewise.

ld/testsuite/

* ld-i386/lea1.s: Add a test for loading address of local common
symbol.
* ld-x86-64/lea1.s: Likewise.
* ld-i386/lea1a.d: Updated.
* ld-i386/lea1b.d: Likewise.
* ld-i386/lea1c.d: Likewise.
* ld-x86-64/lea1a.d: Likewise.
* ld-x86-64/lea1b.d: Likewise.
* ld-x86-64/lea1c.d: Likewise.
* ld-x86-64/lea1d.d: Likewise.
* ld-x86-64/lea1e.d: Likewise.
* ld-x86-64/lea1f.d: Likewise.

15 files changed:
bfd/ChangeLog
bfd/elf32-i386.c
bfd/elf64-x86-64.c
ld/testsuite/ChangeLog
ld/testsuite/ld-i386/lea1.s
ld/testsuite/ld-i386/lea1a.d
ld/testsuite/ld-i386/lea1b.d
ld/testsuite/ld-i386/lea1c.d
ld/testsuite/ld-x86-64/lea1.s
ld/testsuite/ld-x86-64/lea1a.d
ld/testsuite/ld-x86-64/lea1b.d
ld/testsuite/ld-x86-64/lea1c.d
ld/testsuite/ld-x86-64/lea1d.d
ld/testsuite/ld-x86-64/lea1e.d
ld/testsuite/ld-x86-64/lea1f.d

index 8400cf6..d26a526 100644 (file)
@@ -1,3 +1,9 @@
+2015-10-16  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * elf32-i386.c (elf_i386_convert_mov_to_lea): Don't check
+       def_regular.
+       * elf64-x86-64.c (elf_x86_64_convert_mov_to_lea): Likewise.
+
 2015-10-15  H.J. Lu  <hongjiu.lu@intel.com>
 
        * elflink.c (_bfd_elf_merge_symbol): Fix typos in comments
index 0a06191..2e5c04d 100644 (file)
@@ -2815,8 +2815,7 @@ elf_i386_convert_mov_to_lea (bfd *abfd, asection *sec,
 
       /* STT_GNU_IFUNC must keep R_386_GOT32 relocation.  We also avoid
         optimizing _DYNAMIC since ld.so may use its link-time address.  */
-      if (h->def_regular
-         && h->type != STT_GNU_IFUNC
+      if (h->type != STT_GNU_IFUNC
          && h != htab->elf.hdynamic
          && SYMBOL_REFERENCES_LOCAL (link_info, h)
          && irel->r_offset >= 2
index 29639d8..aad3244 100644 (file)
@@ -3074,8 +3074,7 @@ elf_x86_64_convert_mov_to_lea (bfd *abfd, asection *sec,
          /* STT_GNU_IFUNC must keep R_X86_64_GOTPCREL relocation.  We also
             avoid optimizing _DYNAMIC since ld.so may use its link-time
             address.  */
-         if (h->def_regular
-             && h->type != STT_GNU_IFUNC
+         if (h->type != STT_GNU_IFUNC
              && h != htab->elf.hdynamic
              && SYMBOL_REFERENCES_LOCAL (link_info, h))
            {
index af8a69f..83d28f0 100644 (file)
@@ -1,3 +1,18 @@
+2015-10-16  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * ld-i386/lea1.s: Add a test for loading address of local common
+       symbol.
+       * ld-x86-64/lea1.s: Likewise.
+       * ld-i386/lea1a.d: Updated.
+       * ld-i386/lea1b.d: Likewise.
+       * ld-i386/lea1c.d: Likewise.
+       * ld-x86-64/lea1a.d: Likewise.
+       * ld-x86-64/lea1b.d: Likewise.
+       * ld-x86-64/lea1c.d: Likewise.
+       * ld-x86-64/lea1d.d: Likewise.
+       * ld-x86-64/lea1e.d: Likewise.
+       * ld-x86-64/lea1f.d: Likewise.
+
 2015-10-15  Alan Modra  <amodra@gmail.com>
 
        * config/default.exp (size): New global.
index 6afad88..f754ec0 100644 (file)
@@ -8,4 +8,7 @@ foo:
        .type   _start, @function
 _start:
        movl    foo@GOT(%ecx), %eax
+       movl    bar@GOT(%ecx), %eax
        .size   _start, .-_start
+       .comm   pad,4,4
+       .comm   bar,4,4
index 45b4965..0435d34 100644 (file)
@@ -10,4 +10,5 @@ Disassembly of section .text:
 
 #...
 [      ]*[a-f0-9]+:    8d 81 ([0-9a-f]{2} ){4} *       lea    -0x[a-f0-9]+\(%ecx\),%eax
+[      ]*[a-f0-9]+:    8d 81 ([0-9a-f]{2} ){4} *       lea    0x[a-f0-9]+\(%ecx\),%eax
 #pass
index 9ad4464..8cef2c4 100644 (file)
@@ -10,4 +10,5 @@ Disassembly of section .text:
 
 #...
 [      ]*[a-f0-9]+:    8d 81 ([0-9a-f]{2} ){4} *       lea    -0x[a-f0-9]+\(%ecx\),%eax
+[      ]*[a-f0-9]+:    8d 81 ([0-9a-f]{2} ){4} *       lea    0x[a-f0-9]+\(%ecx\),%eax
 #pass
index 5ba8275..c84f413 100644 (file)
@@ -10,4 +10,5 @@ Disassembly of section .text:
 
 #...
 [      ]*[a-f0-9]+:    8d 81 ([0-9a-f]{2} ){4} *       lea    -0x[a-f0-9]+\(%ecx\),%eax
+[      ]*[a-f0-9]+:    8d 81 ([0-9a-f]{2} ){4} *       lea    0x[a-f0-9]+\(%ecx\),%eax
 #pass
index 4dce487..c2a499c 100644 (file)
@@ -8,4 +8,7 @@ foo:
        .type   _start, @function
 _start:
        movq    foo@GOTPCREL(%rip), %rax
+       movq    bar@GOTPCREL(%rip), %rax
        .size   _start, .-_start
+       .comm   pad,4,4
+       .comm   bar,4,4
index b48f253..75dad70 100644 (file)
@@ -10,4 +10,5 @@ Disassembly of section .text:
 
 #...
 [      ]*[a-f0-9]+:    48 8d 05 ([0-9a-f]{2} ){4} *    lea    -0x[a-f0-9]+\(%rip\),%rax        # [a-f0-9]+ <foo>
+[      ]*[a-f0-9]+:    48 8d 05 ([0-9a-f]{2} ){4} *    lea    0x[a-f0-9]+\(%rip\),%rax        # [a-f0-9]+ <bar>
 #pass
index 9ee7220..d968ca2 100644 (file)
@@ -10,4 +10,5 @@ Disassembly of section .text:
 
 #...
 [      ]*[a-f0-9]+:    48 8d 05 ([0-9a-f]{2} ){4} *    lea    -0x[a-f0-9]+\(%rip\),%rax        # [a-f0-9]+ <foo>
+[      ]*[a-f0-9]+:    48 8d 05 ([0-9a-f]{2} ){4} *    lea    0x[a-f0-9]+\(%rip\),%rax        # [a-f0-9]+ <bar>
 #pass
index 6ff1618..5f7e6c3 100644 (file)
@@ -10,4 +10,5 @@ Disassembly of section .text:
 
 #...
 [      ]*[a-f0-9]+:    48 8d 05 ([0-9a-f]{2} ){4} *    lea    -0x[a-f0-9]+\(%rip\),%rax        # [a-f0-9]+ <foo>
+[      ]*[a-f0-9]+:    48 8d 05 ([0-9a-f]{2} ){4} *    lea    0x[a-f0-9]+\(%rip\),%rax        # [a-f0-9]+ <bar>
 #pass
index d117f6b..524980f 100644 (file)
@@ -10,4 +10,5 @@ Disassembly of section .text:
 
 #...
 [      ]*[a-f0-9]+:    48 8d 05 ([0-9a-f]{2} ){4} *    lea    -0x[a-f0-9]+\(%rip\),%rax        # [a-f0-9]+ <foo>
+[      ]*[a-f0-9]+:    48 8d 05 ([0-9a-f]{2} ){4} *    lea    0x[a-f0-9]+\(%rip\),%rax        # [a-f0-9]+ <bar>
 #pass
index bde3e6f..22e6dcc 100644 (file)
@@ -10,4 +10,5 @@ Disassembly of section .text:
 
 #...
 [      ]*[a-f0-9]+:    48 8d 05 ([0-9a-f]{2} ){4} *    lea    -0x[a-f0-9]+\(%rip\),%rax        # [a-f0-9]+ <foo>
+[      ]*[a-f0-9]+:    48 8d 05 ([0-9a-f]{2} ){4} *    lea    0x[a-f0-9]+\(%rip\),%rax        # [a-f0-9]+ <bar>
 #pass
index 568143a..9aff34d 100644 (file)
@@ -10,4 +10,5 @@ Disassembly of section .text:
 
 #...
 [      ]*[a-f0-9]+:    48 8d 05 ([0-9a-f]{2} ){4} *    lea    -0x[a-f0-9]+\(%rip\),%rax        # [a-f0-9]+ <foo>
+[      ]*[a-f0-9]+:    48 8d 05 ([0-9a-f]{2} ){4} *    lea    0x[a-f0-9]+\(%rip\),%rax        # [a-f0-9]+ <bar>
 #pass