annotate lld/test/ELF/ppc64-local-dynamic.s @ 192:d7606dcf6fce

Added tag llvm10 for changeset 0572611fdcc8
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 14 Dec 2020 18:01:34 +0900
parents 0572611fdcc8
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 // REQUIRES: ppc
anatofuz
parents:
diff changeset
2
anatofuz
parents:
diff changeset
3 // RUN: llvm-mc -filetype=obj -triple=powerpc64le-unknown-linux %s -o %t.o
anatofuz
parents:
diff changeset
4 // RUN: ld.lld -shared %t.o -z separate-code -o %t.so
anatofuz
parents:
diff changeset
5 // RUN: llvm-readelf -r %t.o | FileCheck --check-prefix=InputRelocs %s
anatofuz
parents:
diff changeset
6 // RUN: llvm-readelf -r %t.so | FileCheck --check-prefix=OutputRelocs %s
anatofuz
parents:
diff changeset
7 // RUN: llvm-objdump --section-headers %t.so | FileCheck --check-prefix=CheckGot %s
anatofuz
parents:
diff changeset
8 // RUN: llvm-objdump -d %t.so | FileCheck --check-prefix=Dis %s
anatofuz
parents:
diff changeset
9
anatofuz
parents:
diff changeset
10 // RUN: llvm-mc -filetype=obj -triple=powerpc64-unknown-linux %s -o %t.o
anatofuz
parents:
diff changeset
11 // RUN: ld.lld -shared %t.o -z separate-code -o %t.so
anatofuz
parents:
diff changeset
12 // RUN: llvm-readelf -r %t.o | FileCheck --check-prefix=InputRelocs %s
anatofuz
parents:
diff changeset
13 // RUN: llvm-readelf -r %t.so | FileCheck --check-prefix=OutputRelocs %s
anatofuz
parents:
diff changeset
14 // RUN: llvm-objdump --section-headers %t.so | FileCheck --check-prefix=CheckGot %s
anatofuz
parents:
diff changeset
15 // RUN: llvm-objdump -d %t.so | FileCheck --check-prefix=Dis %s
anatofuz
parents:
diff changeset
16
anatofuz
parents:
diff changeset
17 .text
anatofuz
parents:
diff changeset
18 .abiversion 2
anatofuz
parents:
diff changeset
19 .globl test
anatofuz
parents:
diff changeset
20 .p2align 4
anatofuz
parents:
diff changeset
21 .type test,@function
anatofuz
parents:
diff changeset
22 test:
anatofuz
parents:
diff changeset
23 .Lfunc_gep0:
anatofuz
parents:
diff changeset
24 addis 2, 12, .TOC.-.Lfunc_gep0@ha
anatofuz
parents:
diff changeset
25 addi 2, 2, .TOC.-.Lfunc_gep0@l
anatofuz
parents:
diff changeset
26 .Lfunc_lep0:
anatofuz
parents:
diff changeset
27 .localentry test, .Lfunc_lep0-.Lfunc_gep0
anatofuz
parents:
diff changeset
28 mflr 0
anatofuz
parents:
diff changeset
29 std 0, 16(1)
anatofuz
parents:
diff changeset
30 stdu 1, -32(1)
anatofuz
parents:
diff changeset
31 addis 3, 2, i@got@tlsld@ha
anatofuz
parents:
diff changeset
32 addi 3, 3, i@got@tlsld@l
anatofuz
parents:
diff changeset
33 bl __tls_get_addr(i@tlsld)
anatofuz
parents:
diff changeset
34 nop
anatofuz
parents:
diff changeset
35 addis 3, 3, i@dtprel@ha
anatofuz
parents:
diff changeset
36 lwa 3, i@dtprel@l(3)
anatofuz
parents:
diff changeset
37 ld 0, 16(1)
anatofuz
parents:
diff changeset
38 mtlr 0
anatofuz
parents:
diff changeset
39 blr
anatofuz
parents:
diff changeset
40
anatofuz
parents:
diff changeset
41 .globl test_hi
anatofuz
parents:
diff changeset
42 .p2align 4
anatofuz
parents:
diff changeset
43 .type test_hi,@function
anatofuz
parents:
diff changeset
44 test_hi:
anatofuz
parents:
diff changeset
45 lis 3, j@got@tlsld@h
anatofuz
parents:
diff changeset
46 blr
anatofuz
parents:
diff changeset
47
anatofuz
parents:
diff changeset
48 .globl test_16
anatofuz
parents:
diff changeset
49 .p2align 4
anatofuz
parents:
diff changeset
50 .type test_16,@function
anatofuz
parents:
diff changeset
51 test_16:
anatofuz
parents:
diff changeset
52 li 3, k@got@tlsld
anatofuz
parents:
diff changeset
53 blr
anatofuz
parents:
diff changeset
54
anatofuz
parents:
diff changeset
55 .type i,@object
anatofuz
parents:
diff changeset
56 .section .tdata,"awT",@progbits
anatofuz
parents:
diff changeset
57 .p2align 2
anatofuz
parents:
diff changeset
58 i:
anatofuz
parents:
diff changeset
59 .long 55
anatofuz
parents:
diff changeset
60 .size i, 4
anatofuz
parents:
diff changeset
61
anatofuz
parents:
diff changeset
62 .type j,@object
anatofuz
parents:
diff changeset
63 .section .tbss,"awT",@nobits
anatofuz
parents:
diff changeset
64 .p2align 2
anatofuz
parents:
diff changeset
65 j:
anatofuz
parents:
diff changeset
66 .long 0
anatofuz
parents:
diff changeset
67 .size j, 4
anatofuz
parents:
diff changeset
68
anatofuz
parents:
diff changeset
69 .type k,@object
anatofuz
parents:
diff changeset
70 .section .tdata,"awT",@progbits
anatofuz
parents:
diff changeset
71 .p2align 3
anatofuz
parents:
diff changeset
72 k:
anatofuz
parents:
diff changeset
73 .quad 66
anatofuz
parents:
diff changeset
74 .size k, 8
anatofuz
parents:
diff changeset
75
anatofuz
parents:
diff changeset
76 // Verify that the input contains all the R_PPC64_GOT_TLSLD16* relocations, as
anatofuz
parents:
diff changeset
77 // well as the DTPREL relocations used in a typical medium code model
anatofuz
parents:
diff changeset
78 // local-dynamic variable access.
anatofuz
parents:
diff changeset
79 // InputRelocs: Relocation section '.rela.text'
anatofuz
parents:
diff changeset
80 // InputRelocs: R_PPC64_GOT_TLSLD16_HA {{[0-9a-f]+}} i + 0
anatofuz
parents:
diff changeset
81 // InputRelocs: R_PPC64_GOT_TLSLD16_LO {{[0-9a-f]+}} i + 0
anatofuz
parents:
diff changeset
82 // InputRelocs: R_PPC64_TLSLD {{[0-9a-f]+}} i + 0
anatofuz
parents:
diff changeset
83 // InputRelocs: R_PPC64_DTPREL16_HA {{[0-9a-f]+}} i + 0
anatofuz
parents:
diff changeset
84 // InputRelocs: R_PPC64_DTPREL16_LO_DS {{[0-9a-f]+}} i + 0
anatofuz
parents:
diff changeset
85 // InputRelocs: R_PPC64_GOT_TLSLD16_HI {{[0-9a-f]+}} j + 0
anatofuz
parents:
diff changeset
86 // InputRelocs: R_PPC64_GOT_TLSLD16 {{[0-9a-f]+}} k + 0
anatofuz
parents:
diff changeset
87
anatofuz
parents:
diff changeset
88 // The local dynamic version of tls needs to use the same mechanism to look up
anatofuz
parents:
diff changeset
89 // a variables address as general-dynamic. ie a call to __tls_get_addr with the
anatofuz
parents:
diff changeset
90 // address of a tls_index struct as the argument. However for local-dynamic
anatofuz
parents:
diff changeset
91 // variables all will have the same ti_module, and the offset field is left as
anatofuz
parents:
diff changeset
92 // as 0, so the same struct can be used for every local-dynamic variable
anatofuz
parents:
diff changeset
93 // used in the shared-object.
anatofuz
parents:
diff changeset
94 // OutputRelocs: Relocation section '.rela.dyn' at offset 0x{{[0-9a-f]+}} contains 1 entries:
anatofuz
parents:
diff changeset
95 // OutputRelocs-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
anatofuz
parents:
diff changeset
96 // OutputRelocs-NEXT: R_PPC64_DTPMOD64
anatofuz
parents:
diff changeset
97
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
98 // Check that the got has 3 entries, 1 for the TOC and 1 structure of 2 entries
150
anatofuz
parents:
diff changeset
99 // for the tls variables. Also verify the address so we can check the offsets
anatofuz
parents:
diff changeset
100 // we calculate for each relocation type.
anatofuz
parents:
diff changeset
101 // CheckGot: got 00000018 0000000000020100
anatofuz
parents:
diff changeset
102
anatofuz
parents:
diff changeset
103 // got starts at 0x20100 so .TOC. will be 0x28100, and the tls_index struct is
anatofuz
parents:
diff changeset
104 // at 0x20108.
anatofuz
parents:
diff changeset
105
anatofuz
parents:
diff changeset
106 // #ha(i@got@tlsld) --> (0x20108 - 0x28100 + 0x8000) >> 16 = 0
anatofuz
parents:
diff changeset
107 // #lo(i@got@tlsld) --> (0x20108 - 0x28100) = -7ff8 = -32760
anatofuz
parents:
diff changeset
108 // When calculating offset relative to the dynamic thread pointer we have to
anatofuz
parents:
diff changeset
109 // adjust by 0x8000 since each DTV pointer points 0x8000 bytes past the start of
anatofuz
parents:
diff changeset
110 // its TLS block.
anatofuz
parents:
diff changeset
111 // #ha(i@dtprel) --> (0x0 -0x8000 + 0x8000) >> 16 = 0
anatofuz
parents:
diff changeset
112 // #lo(i@dtprel) --> (0x0 -0x8000) = -0x8000 = -32768
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
113 // Dis: <test>:
150
anatofuz
parents:
diff changeset
114 // Dis: addis 3, 2, 0
anatofuz
parents:
diff changeset
115 // Dis-NEXT: addi 3, 3, -32760
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
116 // Dis-NEXT: bl 0x10058
150
anatofuz
parents:
diff changeset
117 // Dis-NEXT: ld 2, 24(1)
anatofuz
parents:
diff changeset
118 // Dis-NEXT: addis 3, 3, 0
anatofuz
parents:
diff changeset
119 // Dis-NEXT: lwa 3, -32768(3)
anatofuz
parents:
diff changeset
120
anatofuz
parents:
diff changeset
121
anatofuz
parents:
diff changeset
122 // #hi(j@got@tlsld) --> (0x20108 - 0x28100 ) > 16 = -1
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
123 // Dis: <test_hi>:
150
anatofuz
parents:
diff changeset
124 // Dis: lis 3, -1
anatofuz
parents:
diff changeset
125
anatofuz
parents:
diff changeset
126 // k@got@tlsld --> (0x20108 - 0x28100) = -7ff8 = -32760
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
127 // Dis: <test_16>:
150
anatofuz
parents:
diff changeset
128 // Dis: li 3, -32760