]> code.ossystems Code Review - openembedded-core.git/blob
b4bc10f9c5c5010af30be8aed7e6cf2c94150911
[openembedded-core.git] /
1 From 0c6a475b99dc06a49549d81059f290b23b86c62d Mon Sep 17 00:00:00 2001
2 From: "H.J. Lu" <hjl.tools@gmail.com>
3 Date: Tue, 20 Nov 2012 05:57:53 +0000
4 Subject: [PATCH 12/27] Fix TLS LD to LE optimization for x32
5
6         PR gold/14858
7         * x86_64.cc (Relocate::tls_ld_to_le): Support x32.
8 ---
9  gold/ChangeLog |    5 +++++
10  gold/x86_64.cc |    9 ++++++++-
11  2 files changed, 13 insertions(+), 1 deletion(-)
12
13 diff --git a/gold/ChangeLog b/gold/ChangeLog
14 index 9a1a9d3..b31d11f 100644
15 --- a/gold/ChangeLog
16 +++ b/gold/ChangeLog
17 @@ -1,3 +1,8 @@
18 +2012-11-19  H.J. Lu  <hongjiu.lu@intel.com>
19 +
20 +       PR gold/14858
21 +       * x86_64.cc (Relocate::tls_ld_to_le): Support x32.
22 +
23  2012-11-14  Roland McGrath  <mcgrathr@google.com>
24  
25         * arm.cc (Output_data_plt_arm_nacl::first_plt_entry): Use bic rather
26 diff --git a/gold/x86_64.cc b/gold/x86_64.cc
27 index b5b616f..8ddf4f2 100644
28 --- a/gold/x86_64.cc
29 +++ b/gold/x86_64.cc
30 @@ -3959,8 +3959,12 @@ Target_x86_64<size>::Relocate::tls_ld_to_le(
31      section_size_type view_size)
32  {
33    // leaq foo@tlsld(%rip),%rdi; call __tls_get_addr@plt;
34 +  // For SIZE == 64:
35    // ... leq foo@dtpoff(%rax),%reg
36    // ==> .word 0x6666; .byte 0x66; movq %fs:0,%rax ... leaq x@tpoff(%rax),%rdx
37 +  // For SIZE == 32:
38 +  // ... leq foo@dtpoff(%rax),%reg
39 +  // ==> nopl 0x0(%rax); movl %fs:0,%eax ... leaq x@tpoff(%rax),%rdx
40  
41    tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, -3);
42    tls::check_range(relinfo, relnum, rela.get_r_offset(), view_size, 9);
43 @@ -3970,7 +3974,10 @@ Target_x86_64<size>::Relocate::tls_ld_to_le(
44  
45    tls::check_tls(relinfo, relnum, rela.get_r_offset(), view[4] == 0xe8);
46  
47 -  memcpy(view - 3, "\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0\0", 12);
48 +  if (size == 64)
49 +    memcpy(view - 3, "\x66\x66\x66\x64\x48\x8b\x04\x25\0\0\0\0", 12);
50 +  else
51 +    memcpy(view - 3, "\x0f\x1f\x40\x00\x64\x8b\x04\x25\0\0\0\0", 12);
52  
53    // The next reloc should be a PLT32 reloc against __tls_get_addr.
54    // We can skip it.
55 -- 
56 1.7.9.5
57