Relocate with the symbol if the relocation is of kind NTPOFF.
[oota-llvm.git] / test / MC / ELF / relocation-386.s
1 // RUN: llvm-mc -filetype=obj -triple i386-pc-linux-gnu %s -o - | elf-dump | FileCheck  %s
2
3 // Test that we produce the correct relocation types and that the relocations
4 // correctly point to the section or the symbol.
5
6 // Section 3 is bss
7 // CHECK:      # Section 0x00000003
8 // CHECK-NEXT: (('sh_name', 0x0000000d) # '.bss'
9
10 // CHECK:      # Symbol 0x00000001
11 // CHECK-NEXT: (('st_name', 0x00000005) # '.Lfoo'
12
13 // Symbol 4 is zed
14 // CHECK:      # Symbol 0x00000004
15 // CHECK-NEXT: (('st_name', 0x00000035) # 'zed'
16 // CHECK-NEXT:  ('st_value', 0x00000000)
17 // CHECK-NEXT:  ('st_size', 0x00000000)
18 // CHECK-NEXT:  ('st_bind', 0x00000000)
19 // CHECK-NEXT:  ('st_type', 0x00000006)
20 // CHECK-NEXT:  ('st_other', 0x00000000)
21 // CHECK-NEXT:  ('st_shndx', 0x00000004)
22
23 // Symbol 7 is section 3
24 // CHECK:      # Symbol 0x00000007
25 // CHECK-NEXT: (('st_name', 0x00000000) # ''
26 // CHECK-NEXT:  ('st_value', 0x00000000)
27 // CHECK-NEXT:  ('st_size', 0x00000000)
28 // CHECK-NEXT:  ('st_bind', 0x00000000)
29 // CHECK-NEXT:  ('st_type', 0x00000003)
30 // CHECK-NEXT:  ('st_other', 0x00000000)
31 // CHECK-NEXT:  ('st_shndx', 0x00000003)
32
33 // CHECK:      # Relocation 0x00000000
34 // CHECK-NEXT: (('r_offset', 0x00000002)
35 // CHECK-NEXT:  ('r_sym', 0x00000001)
36 // CHECK-NEXT:  ('r_type', 0x00000009)
37 // CHECK-NEXT: ),
38 // CHECK-NEXT:  # Relocation 0x00000001
39 // CHECK-NEXT: (('r_offset',
40 // CHECK-NEXT:  ('r_sym',
41 // CHECK-NEXT:  ('r_type', 0x00000004)
42 // CHECK-NEXT: ),
43 // CHECK-NEXT:  # Relocation 0x00000002
44 // CHECK-NEXT: (('r_offset',
45 // CHECK-NEXT:  ('r_sym',
46 // CHECK-NEXT:  ('r_type', 0x0000000a)
47 // CHECK-NEXT: ),
48
49 // Relocation 3 (bar3@GOTOFF) is done with symbol 7 (bss)
50 // CHECK-NEXT:  # Relocation 0x00000003
51 // CHECK-NEXT: (('r_offset',
52 // CHECK-NEXT:  ('r_sym', 0x00000007
53 // CHECK-NEXT:  ('r_type',
54 // CHECK-NEXT: ),
55
56 // Relocation 4 (bar2@GOT) is of type R_386_GOT32
57 // CHECK-NEXT:  # Relocation 0x00000004
58 // CHECK-NEXT: (('r_offset',
59 // CHECK-NEXT:  ('r_sym',
60 // CHECK-NEXT:  ('r_type', 0x00000003
61 // CHECK-NEXT: ),
62
63 // Relocation 5 (foo@TLSGD) is of type R_386_TLS_GD
64 // CHECK-NEXT: # Relocation 0x00000005
65 // CHECK-NEXT: (('r_offset', 0x00000020)
66 // CHECK-NEXT:  ('r_sym', 0x0000000d)
67 // CHECK-NEXT:  ('r_type', 0x00000012)
68 // CHECK-NEXT: ),
69
70 // Relocation 6 ($foo@TPOFF) is of type R_386_TLS_LE_32
71 // CHECK-NEXT: # Relocation 0x00000006
72 // CHECK-NEXT: (('r_offset', 0x00000025)
73 // CHECK-NEXT:  ('r_sym', 0x0000000d)
74 // CHECK-NEXT:  ('r_type', 0x00000022)
75 // CHECK-NEXT: ),
76
77 // Relocation 7 (foo@INDNTPOFF) is of type R_386_TLS_IE
78 // CHECK-NEXT: # Relocation 0x00000007
79 // CHECK-NEXT: (('r_offset', 0x0000002b)
80 // CHECK-NEXT:  ('r_sym', 0x0000000d)
81 // CHECK-NEXT:  ('r_type', 0x0000000f)
82 // CHECK-NEXT: ),
83
84 // Relocation 8 (foo@NTPOFF) is of type R_386_TLS_LE
85 // CHECK-NEXT: # Relocation 0x00000008
86 // CHECK-NEXT: (('r_offset', 0x00000031)
87 // CHECK-NEXT:  ('r_sym', 0x0000000d)
88 // CHECK-NEXT:  ('r_type', 0x00000011)
89 // CHECK-NEXT: ),
90
91 // Relocation 9 (foo@GOTNTPOFF) is of type R_386_TLS_GOTIE
92 // CHECK-NEXT: # Relocation 0x00000009
93 // CHECK-NEXT: (('r_offset', 0x00000037)
94 // CHECK-NEXT:  ('r_sym', 0x0000000d)
95 // CHECK-NEXT:  ('r_type', 0x00000010)
96 // CHECK-NEXT: ),
97
98 // Relocation 10 (foo@TLSLDM) is of type R_386_TLS_LDM
99 // CHECK-NEXT: # Relocation 0x0000000a
100 // CHECK-NEXT: (('r_offset', 0x0000003d)
101 // CHECK-NEXT:  ('r_sym', 0x0000000d)
102 // CHECK-NEXT:  ('r_type', 0x00000013)
103 // CHECK-NEXT: ),
104
105 // Relocation 11 (foo@DTPOFF) is of type R_386_TLS_LDO_32
106 // CHECK-NEXT: # Relocation 0x0000000b
107 // CHECK-NEXT: (('r_offset', 0x00000043)
108 // CHECK-NEXT:  ('r_sym', 0x0000000d)
109 // CHECK-NEXT:  ('r_type', 0x00000020)
110 // CHECK-NEXT: ),
111 // Relocation 12 (calll 4096) is of type R_386_PC32
112 // CHECK-NEXT: # Relocation 0x0000000c
113 // CHECK-NEXT: (('r_offset', 0x00000048)
114 // CHECK-NEXT:  ('r_sym', 0x00000000)
115 // CHECK-NEXT:  ('r_type', 0x00000002)
116 // CHECK-NEXT: ),
117 // Relocation 13 (zed@NTPOFF) is of type R_386_TLS_LE and uses the symbol
118 // CHECK-NEXT: # Relocation 0x0000000d
119 // CHECK-NEXT: (('r_offset', 0x0000004e)
120 // CHECK-NEXT:  ('r_sym', 0x00000004)
121 // CHECK-NEXT:  ('r_type', 0x00000011)
122 // CHECK-NEXT: ),
123
124         .text
125 bar:
126         leal    .Lfoo@GOTOFF(%ebx), %eax
127
128         .global bar2
129 bar2:
130         calll   bar2@PLT
131         addl    $_GLOBAL_OFFSET_TABLE_, %ebx
132         movb    bar3@GOTOFF(%ebx), %al
133
134         .type   bar3,@object
135         .local  bar3
136         .comm   bar3,1,1
137
138         movl    bar2j@GOT(%eax), %eax
139
140         leal foo@TLSGD(, %ebx,1), %eax
141         movl $foo@TPOFF, %edx
142         movl foo@INDNTPOFF, %ecx
143         addl foo@NTPOFF(%eax), %eax
144         addl foo@GOTNTPOFF(%ebx), %ecx
145         leal foo@TLSLDM(%ebx), %eax
146         leal foo@DTPOFF(%eax), %edx
147         calll 4096
148         movl zed@NTPOFF(%eax), %eax
149
150         .section        zedsec,"awT",@progbits
151 zed:
152         .long 0
153
154         .section        .rodata.str1.16,"aMS",@progbits,1
155 .Lfoo:
156         .asciz   "bool llvm::llvm_start_multithreaded()"