This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[committed, PATCH] Convert mov to lea for loading address of local common symbol
- From: "H.J. Lu" <hongjiu dot lu at intel dot com>
- To: binutils at sourceware dot org
- Date: Fri, 16 Oct 2015 03:28:45 -0700
- Subject: [committed, PATCH] Convert mov to lea for loading address of local common symbol
- Authentication-results: sourceware.org; auth=none
- Reply-to: "H.J. Lu" <hjl dot tools at gmail dot com>
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.
---
bfd/ChangeLog | 6 ++++++
bfd/elf32-i386.c | 3 +--
bfd/elf64-x86-64.c | 3 +--
ld/testsuite/ChangeLog | 15 +++++++++++++++
ld/testsuite/ld-i386/lea1.s | 3 +++
ld/testsuite/ld-i386/lea1a.d | 1 +
ld/testsuite/ld-i386/lea1b.d | 1 +
ld/testsuite/ld-i386/lea1c.d | 1 +
ld/testsuite/ld-x86-64/lea1.s | 3 +++
ld/testsuite/ld-x86-64/lea1a.d | 1 +
ld/testsuite/ld-x86-64/lea1b.d | 1 +
ld/testsuite/ld-x86-64/lea1c.d | 1 +
ld/testsuite/ld-x86-64/lea1d.d | 1 +
ld/testsuite/ld-x86-64/lea1e.d | 1 +
ld/testsuite/ld-x86-64/lea1f.d | 1 +
15 files changed, 38 insertions(+), 4 deletions(-)
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 8400cf6..d26a526 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
index 0a06191..2e5c04d 100644
--- a/bfd/elf32-i386.c
+++ b/bfd/elf32-i386.c
@@ -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
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index 29639d8..aad3244 100644
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -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))
{
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index af8a69f..83d28f0 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -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.
diff --git a/ld/testsuite/ld-i386/lea1.s b/ld/testsuite/ld-i386/lea1.s
index 6afad88..f754ec0 100644
--- a/ld/testsuite/ld-i386/lea1.s
+++ b/ld/testsuite/ld-i386/lea1.s
@@ -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
diff --git a/ld/testsuite/ld-i386/lea1a.d b/ld/testsuite/ld-i386/lea1a.d
index 45b4965..0435d34 100644
--- a/ld/testsuite/ld-i386/lea1a.d
+++ b/ld/testsuite/ld-i386/lea1a.d
@@ -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
diff --git a/ld/testsuite/ld-i386/lea1b.d b/ld/testsuite/ld-i386/lea1b.d
index 9ad4464..8cef2c4 100644
--- a/ld/testsuite/ld-i386/lea1b.d
+++ b/ld/testsuite/ld-i386/lea1b.d
@@ -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
diff --git a/ld/testsuite/ld-i386/lea1c.d b/ld/testsuite/ld-i386/lea1c.d
index 5ba8275..c84f413 100644
--- a/ld/testsuite/ld-i386/lea1c.d
+++ b/ld/testsuite/ld-i386/lea1c.d
@@ -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
diff --git a/ld/testsuite/ld-x86-64/lea1.s b/ld/testsuite/ld-x86-64/lea1.s
index 4dce487..c2a499c 100644
--- a/ld/testsuite/ld-x86-64/lea1.s
+++ b/ld/testsuite/ld-x86-64/lea1.s
@@ -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
diff --git a/ld/testsuite/ld-x86-64/lea1a.d b/ld/testsuite/ld-x86-64/lea1a.d
index b48f253..75dad70 100644
--- a/ld/testsuite/ld-x86-64/lea1a.d
+++ b/ld/testsuite/ld-x86-64/lea1a.d
@@ -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
diff --git a/ld/testsuite/ld-x86-64/lea1b.d b/ld/testsuite/ld-x86-64/lea1b.d
index 9ee7220..d968ca2 100644
--- a/ld/testsuite/ld-x86-64/lea1b.d
+++ b/ld/testsuite/ld-x86-64/lea1b.d
@@ -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
diff --git a/ld/testsuite/ld-x86-64/lea1c.d b/ld/testsuite/ld-x86-64/lea1c.d
index 6ff1618..5f7e6c3 100644
--- a/ld/testsuite/ld-x86-64/lea1c.d
+++ b/ld/testsuite/ld-x86-64/lea1c.d
@@ -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
diff --git a/ld/testsuite/ld-x86-64/lea1d.d b/ld/testsuite/ld-x86-64/lea1d.d
index d117f6b..524980f 100644
--- a/ld/testsuite/ld-x86-64/lea1d.d
+++ b/ld/testsuite/ld-x86-64/lea1d.d
@@ -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
diff --git a/ld/testsuite/ld-x86-64/lea1e.d b/ld/testsuite/ld-x86-64/lea1e.d
index bde3e6f..22e6dcc 100644
--- a/ld/testsuite/ld-x86-64/lea1e.d
+++ b/ld/testsuite/ld-x86-64/lea1e.d
@@ -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
diff --git a/ld/testsuite/ld-x86-64/lea1f.d b/ld/testsuite/ld-x86-64/lea1f.d
index 568143a..9aff34d 100644
--- a/ld/testsuite/ld-x86-64/lea1f.d
+++ b/ld/testsuite/ld-x86-64/lea1f.d
@@ -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
--
2.4.3