xref: /llvm-project/llvm/test/CodeGen/PowerPC/aix-tls-ie-xcoff-reloc.ll (revision b1acb7a315e903ee340a33dbc9b2b61b0450bb67)
1; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mtriple=powerpc64-ibm-aix-xcoff \
2; RUN:   -xcoff-traceback-table=false -data-sections=false -filetype=obj -o %t.o < %s
3; RUN: llvm-readobj --relocs --expand-relocs %t.o | FileCheck -D#NFA=2 --check-prefix=REL64 %s
4; RUN: llvm-readobj --syms %t.o | FileCheck -D#NFA=2 --check-prefix=SYM64 %s
5; RUN: llvm-objdump -D -r --symbol-description %t.o | FileCheck -D#NFA=2 --check-prefix=DIS64 %s
6
7; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mtriple=powerpc64-ibm-aix-xcoff -code-model=small \
8; RUN:   -xcoff-traceback-table=false -data-sections=false -filetype=obj -o %t.o < %s
9; RUN: llvm-readobj --relocs --expand-relocs %t.o | FileCheck -D#NFA=2 --check-prefix=REL64 %s
10; RUN: llvm-readobj --syms %t.o | FileCheck -D#NFA=2 --check-prefix=SYM64 %s
11; RUN: llvm-objdump -D -r --symbol-description %t.o | FileCheck -D#NFA=2 --check-prefix=DIS64 %s
12
13; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mtriple=powerpc-ibm-aix-xcoff \
14; RUN:   -xcoff-traceback-table=false -data-sections=false -filetype=obj -o %t.o < %s
15; RUN: llvm-readobj --relocs --expand-relocs %t.o | FileCheck -D#NFA=2 --check-prefix=REL32 %s
16; RUN: llvm-readobj --syms %t.o | FileCheck -D#NFA=2 --check-prefix=SYM32 %s
17; RUN: llvm-objdump -D -r --symbol-description %t.o | FileCheck -D#NFA=2 --check-prefix=DIS32 %s
18
19; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mtriple=powerpc-ibm-aix-xcoff -code-model=small \
20; RUN:   -xcoff-traceback-table=false -data-sections=false -filetype=obj -o %t.o < %s
21; RUN: llvm-readobj --relocs --expand-relocs %t.o | FileCheck -D#NFA=2 --check-prefix=REL32 %s
22; RUN: llvm-readobj --syms %t.o | FileCheck -D#NFA=2 --check-prefix=SYM32 %s
23; RUN: llvm-objdump -D -r --symbol-description %t.o | FileCheck -D#NFA=2 --check-prefix=DIS32 %s
24
25@global_int_nonzero = thread_local(initialexec) global i32 1, align 4
26@intern_int_zero = internal thread_local(initialexec) global i32 0, align 4
27
28define void @store_intern_int_zero(i32 noundef signext %i) {
29entry:
30  %addr = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @intern_int_zero)
31  store i32 %i, ptr %addr, align 4
32  ret void
33}
34
35define signext i32 @load_global_int_nonzero() {
36entry:
37  %addr = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @global_int_nonzero)
38  %val = load i32, ptr %addr, align 4
39  ret i32 %val
40}
41
42define signext i32 @load_intern_int_zero() {
43entry:
44  %addr = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @intern_int_zero)
45  %val = load i32, ptr %addr, align 4
46  ret i32 %val
47}
48
49declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull)
50
51; REL64:      File:
52; REL64-NEXT: Format: aix5coff64-rs6000
53; REL64-NEXT: Arch: powerpc64
54; REL64-NEXT: AddressSize: 64bit
55; REL64-NEXT: Relocations [
56; REL64:       Virtual Address: 0x2
57; REL64-NEXT:       Symbol: intern_int_zero ([[#NFA+17]])
58; REL64-NEXT:       IsSigned: No
59; REL64-NEXT:       FixupBitValue: 0
60; REL64-NEXT:       Length: 16
61; REL64-NEXT:       Type: R_TOC (0x3)
62; REL64-NEXT:     }
63; REL64:       Virtual Address: 0x12
64; REL64-NEXT:       Symbol: global_int_nonzero ([[#NFA+19]])
65; REL64-NEXT:       IsSigned: No
66; REL64-NEXT:       FixupBitValue: 0
67; REL64-NEXT:       Length: 16
68; REL64-NEXT:       Type: R_TOC (0x3)
69; REL64-NEXT:     }
70; REL64:       Virtual Address: 0x22
71; REL64-NEXT:       Symbol: intern_int_zero ([[#NFA+17]])
72; REL64-NEXT:       IsSigned: No
73; REL64-NEXT:       FixupBitValue: 0
74; REL64-NEXT:       Length: 16
75; REL64-NEXT:       Type: R_TOC (0x3)
76; REL64-NEXT:     }
77; REL64:       Virtual Address: 0x78
78; REL64-NEXT:       Symbol: intern_int_zero ([[#NFA+25]])
79; REL64-NEXT:       IsSigned: No
80; REL64-NEXT:       FixupBitValue: 0
81; REL64-NEXT:       Length: 64
82; REL64-NEXT:       Type: R_TLS_IE (0x21)
83; REL64-NEXT:     }
84; REL64:       Virtual Address: 0x80
85; REL64-NEXT:       Symbol: global_int_nonzero ([[#NFA+23]])
86; REL64-NEXT:       IsSigned: No
87; REL64-NEXT:       FixupBitValue: 0
88; REL64-NEXT:       Length: 64
89; REL64-NEXT:       Type: R_TLS_IE (0x21)
90; REL64-NEXT:     }
91
92; SYM64:      File:
93; SYM64-NEXT: Format: aix5coff64-rs6000
94; SYM64-NEXT: Arch: powerpc64
95; SYM64-NEXT: AddressSize: 64bit
96; SYM64-NEXT: Symbols [
97; SYM64:          Name: intern_int_zero
98; SYM64-NEXT:     Value (RelocatableAddress): 0x78
99; SYM64-NEXT:     Section: .data
100; SYM64-NEXT:     Type: 0x0
101; SYM64-NEXT:     StorageClass: C_HIDEXT (0x6B)
102; SYM64-NEXT:     NumberOfAuxEntries: 1
103; SYM64-NEXT:     CSECT Auxiliary Entry {
104; SYM64-NEXT:       Index: [[#INDX:]]
105; SYM64-NEXT:       SectionLen: 8
106; SYM64-NEXT:       ParameterHashIndex: 0x0
107; SYM64-NEXT:       TypeChkSectNum: 0x0
108; SYM64-NEXT:       SymbolAlignmentLog2: 3
109; SYM64-NEXT:       SymbolType: XTY_SD (0x1)
110; SYM64-NEXT:       StorageMappingClass: XMC_TC (0x3)
111; SYM64-NEXT:       Auxiliary Type: AUX_CSECT (0xFB)
112; SYM64-NEXT:     }
113; SYM64-NEXT:   }
114; SYM64:     Index: [[#INDX+1]]
115; SYM64-NEXT:     Name: global_int_nonzero
116; SYM64-NEXT:     Value (RelocatableAddress): 0x80
117; SYM64-NEXT:     Section: .data
118; SYM64-NEXT:     Type: 0x0
119; SYM64-NEXT:     StorageClass: C_HIDEXT (0x6B)
120; SYM64-NEXT:     NumberOfAuxEntries: 1
121; SYM64-NEXT:     CSECT Auxiliary Entry {
122; SYM64-NEXT:       Index: [[#INDX+2]]
123; SYM64-NEXT:       SectionLen: 8
124; SYM64-NEXT:       ParameterHashIndex: 0x0
125; SYM64-NEXT:       TypeChkSectNum: 0x0
126; SYM64-NEXT:       SymbolAlignmentLog2: 3
127; SYM64-NEXT:       SymbolType: XTY_SD (0x1)
128; SYM64-NEXT:       StorageMappingClass: XMC_TC (0x3)
129; SYM64-NEXT:       Auxiliary Type: AUX_CSECT (0xFB)
130; SYM64-NEXT:     }
131; SYM64-NEXT:   }
132; SYM64:     Index: [[#INDX+5]]
133; SYM64-NEXT:     Name: global_int_nonzero
134; SYM64-NEXT:     Value (RelocatableAddress): 0x0
135; SYM64-NEXT:     Section: .tdata
136; SYM64-NEXT:     Type: 0x0
137; SYM64-NEXT:     StorageClass: C_EXT (0x2)
138; SYM64-NEXT:     NumberOfAuxEntries: 1
139; SYM64-NEXT:     CSECT Auxiliary Entry {
140; SYM64-NEXT:       Index: [[#INDX+6]]
141; SYM64-NEXT:       ContainingCsectSymbolIndex: [[#INDX+3]]
142; SYM64-NEXT:       ParameterHashIndex: 0x0
143; SYM64-NEXT:       TypeChkSectNum: 0x0
144; SYM64-NEXT:       SymbolAlignmentLog2: 0
145; SYM64-NEXT:       SymbolType: XTY_LD (0x2)
146; SYM64-NEXT:       StorageMappingClass: XMC_TL (0x14)
147; SYM64-NEXT:       Auxiliary Type: AUX_CSECT (0xFB)
148; SYM64-NEXT:     }
149; SYM64-NEXT:   }
150; SYM64:     Index: [[#INDX+7]]
151; SYM64-NEXT:     Name: intern_int_zero
152; SYM64-NEXT:     Value (RelocatableAddress): 0x4
153; SYM64-NEXT:     Section: .tbss
154; SYM64-NEXT:     Type: 0x0
155; SYM64-NEXT:     StorageClass: C_HIDEXT (0x6B)
156; SYM64-NEXT:     NumberOfAuxEntries: 1
157; SYM64-NEXT:     CSECT Auxiliary Entry {
158; SYM64-NEXT:       Index: [[#INDX+8]]
159; SYM64-NEXT:       SectionLen: 4
160; SYM64-NEXT:       ParameterHashIndex: 0x0
161; SYM64-NEXT:       TypeChkSectNum: 0x0
162; SYM64-NEXT:       SymbolAlignmentLog2: 2
163; SYM64-NEXT:       SymbolType: XTY_CM (0x3)
164; SYM64-NEXT:       StorageMappingClass: XMC_UL (0x15)
165; SYM64-NEXT:       Auxiliary Type: AUX_CSECT (0xFB)
166; SYM64-NEXT:     }
167; SYM64-NEXT:   }
168
169; DIS64: {{.*}}: file format aix5coff64-rs6000
170; DIS64: Disassembly of section .text:
171; DIS64: (idx: [[#NFA+3]]) .store_intern_int_zero:
172; DIS64-NEXT: ld 4, 0(2)
173; DIS64-NEXT: (idx: [[#NFA+17]]) intern_int_zero[TC]
174; DIS64-NEXT: stwx 3, 13, 4
175; DIS64-NEXT: blr
176; DIS64: (idx: [[#NFA+5]]) .load_global_int_nonzero:
177; DIS64-NEXT: ld 3, 8(2)
178; DIS64-NEXT: (idx: [[#NFA+19]]) global_int_nonzero[TC]
179; DIS64-NEXT: lwax 3, 13, 3
180; DIS64-NEXT: blr
181; DIS64: (idx: [[#NFA+7]]) .load_intern_int_zero:
182; DIS64-NEXT: ld 3, 0(2)
183; DIS64-NEXT: (idx: [[#NFA+17]]) intern_int_zero[TC]
184; DIS64-NEXT: lwax 3, 13, 3
185; DIS64-NEXT: blr
186
187; DIS64: Disassembly of section .data:
188; DIS64: (idx: [[#NFA+9]]) store_intern_int_zero[DS]:
189; DIS64: R_POS        (idx: [[#NFA+3]]) .store_intern_int_zero
190; DIS64: R_POS        (idx: [[#NFA+15]]) TOC[TC0]
191; DIS64: (idx: [[#NFA+11]]) load_global_int_nonzero[DS]:
192; DIS64: R_POS        (idx: [[#NFA+5]]) .load_global_int_nonzero
193; DIS64: R_POS        (idx: [[#NFA+15]]) TOC[TC0]
194; DIS64: (idx: [[#NFA+13]]) load_intern_int_zero[DS]:
195; DIS64: R_POS        (idx: [[#NFA+7]]) .load_intern_int_zero
196; DIS64: R_POS        (idx: [[#NFA+15]]) TOC[TC0]
197; DIS64: (idx: [[#NFA+17]]) intern_int_zero[TC]:
198; DIS64: R_TLS_IE     (idx: [[#NFA+25]]) intern_int_zero[UL]
199; DIS64: (idx: [[#NFA+19]]) global_int_nonzero[TC]:
200; DIS64: R_TLS_IE     (idx: [[#NFA+23]]) global_int_nonzero
201
202; DIS64: Disassembly of section .tdata:
203; DIS64: (idx: [[#NFA+23]]) global_int_nonzero:
204
205; DIS64: Disassembly of section .tbss:
206; DIS64: (idx: [[#NFA+25]]) intern_int_zero[UL]:
207
208; REL32:      File:
209; REL32-NEXT: Format: aixcoff-rs6000
210; REL32-NEXT: Arch: powerpc
211; REL32-NEXT: AddressSize: 32bit
212; REL32-NEXT: Relocations [
213; REL32:       Virtual Address: 0xA
214; REL32-NEXT:       Symbol: intern_int_zero ([[#NFA+19]])
215; REL32-NEXT:       IsSigned: No
216; REL32-NEXT:       FixupBitValue: 0
217; REL32-NEXT:       Length: 16
218; REL32-NEXT:       Type: R_TOC (0x3)
219; REL32-NEXT:     }
220; REL32:       Virtual Address: 0x10
221; REL32-NEXT:       Symbol: .__get_tpointer ([[#NFA+1]])
222; REL32-NEXT:       IsSigned: No
223; REL32-NEXT:       FixupBitValue: 0
224; REL32-NEXT:       Length: 26
225; REL32-NEXT:       Type: R_RBA (0x18)
226; REL32-NEXT:     }
227; REL32:       Virtual Address: 0x3A
228; REL32-NEXT:       Symbol: global_int_nonzero ([[#NFA+21]])
229; REL32-NEXT:       IsSigned: No
230; REL32-NEXT:       FixupBitValue: 0
231; REL32-NEXT:       Length: 16
232; REL32-NEXT:       Type: R_TOC (0x3)
233; REL32-NEXT:     }
234; REL32:       Virtual Address: 0x40
235; REL32-NEXT:       Symbol: .__get_tpointer ([[#NFA+1]])
236; REL32-NEXT:       IsSigned: No
237; REL32-NEXT:       FixupBitValue: 0
238; REL32-NEXT:       Length: 26
239; REL32-NEXT:       Type: R_RBA (0x18)
240; REL32-NEXT:     }
241; REL32:       Virtual Address: 0x6A
242; REL32-NEXT:       Symbol: intern_int_zero ([[#NFA+19]])
243; REL32-NEXT:       IsSigned: No
244; REL32-NEXT:       FixupBitValue: 0
245; REL32-NEXT:       Length: 16
246; REL32-NEXT:       Type: R_TOC (0x3)
247; REL32-NEXT:     }
248; REL32:       Virtual Address: 0x70
249; REL32-NEXT:       Symbol: .__get_tpointer ([[#NFA+1]])
250; REL32-NEXT:       IsSigned: No
251; REL32-NEXT:       FixupBitValue: 0
252; REL32-NEXT:       Length: 26
253; REL32-NEXT:       Type: R_RBA (0x18)
254; REL32-NEXT:     }
255; REL32:       Virtual Address: 0xAC
256; REL32-NEXT:       Symbol: intern_int_zero ([[#NFA+27]])
257; REL32-NEXT:       IsSigned: No
258; REL32-NEXT:       FixupBitValue: 0
259; REL32-NEXT:       Length: 32
260; REL32-NEXT:       Type: R_TLS_IE (0x21)
261; REL32-NEXT:     }
262; REL32:       Virtual Address: 0xB0
263; REL32-NEXT:       Symbol: global_int_nonzero ([[#NFA+25]])
264; REL32-NEXT:       IsSigned: No
265; REL32-NEXT:       FixupBitValue: 0
266; REL32-NEXT:       Length: 32
267; REL32-NEXT:       Type: R_TLS_IE (0x21)
268; REL32-NEXT:     }
269
270; SYM32:      File:
271; SYM32-NEXT: Format: aixcoff-rs6000
272; SYM32-NEXT: Arch: powerpc
273; SYM32-NEXT: AddressSize: 32bit
274; SYM32-NEXT: Symbols [
275; SYM32:          Name: intern_int_zero
276; SYM32-NEXT:     Value (RelocatableAddress): 0xAC
277; SYM32-NEXT:     Section: .data
278; SYM32-NEXT:     Type: 0x0
279; SYM32-NEXT:     StorageClass: C_HIDEXT (0x6B)
280; SYM32-NEXT:     NumberOfAuxEntries: 1
281; SYM32-NEXT:     CSECT Auxiliary Entry {
282; SYM32-NEXT:       Index: [[#INDX:]]
283; SYM32-NEXT:       SectionLen: 4
284; SYM32-NEXT:       ParameterHashIndex: 0x0
285; SYM32-NEXT:       TypeChkSectNum: 0x0
286; SYM32-NEXT:       SymbolAlignmentLog2: 2
287; SYM32-NEXT:       SymbolType: XTY_SD (0x1)
288; SYM32-NEXT:       StorageMappingClass: XMC_TC (0x3)
289; SYM32-NEXT:       StabInfoIndex: 0x0
290; SYM32-NEXT:       StabSectNum: 0x0
291; SYM32-NEXT:     }
292; SYM32-NEXT:   }
293; SYM32:     Index: [[#INDX+1]]
294; SYM32-NEXT:     Name: global_int_nonzero
295; SYM32-NEXT:     Value (RelocatableAddress): 0xB0
296; SYM32-NEXT:     Section: .data
297; SYM32-NEXT:     Type: 0x0
298; SYM32-NEXT:     StorageClass: C_HIDEXT (0x6B)
299; SYM32-NEXT:     NumberOfAuxEntries: 1
300; SYM32-NEXT:     CSECT Auxiliary Entry {
301; SYM32-NEXT:       Index: [[#INDX+2]]
302; SYM32-NEXT:       SectionLen: 4
303; SYM32-NEXT:       ParameterHashIndex: 0x0
304; SYM32-NEXT:       TypeChkSectNum: 0x0
305; SYM32-NEXT:       SymbolAlignmentLog2: 2
306; SYM32-NEXT:       SymbolType: XTY_SD (0x1)
307; SYM32-NEXT:       StorageMappingClass: XMC_TC (0x3)
308; SYM32-NEXT:       StabInfoIndex: 0x0
309; SYM32-NEXT:       StabSectNum: 0x0
310; SYM32-NEXT:     }
311; SYM32-NEXT:   }
312; SYM32:     Index: [[#INDX+5]]
313; SYM32-NEXT:     Name: global_int_nonzero
314; SYM32-NEXT:     Value (RelocatableAddress): 0x0
315; SYM32-NEXT:     Section: .tdata
316; SYM32-NEXT:     Type: 0x0
317; SYM32-NEXT:     StorageClass: C_EXT (0x2)
318; SYM32-NEXT:     NumberOfAuxEntries: 1
319; SYM32-NEXT:     CSECT Auxiliary Entry {
320; SYM32-NEXT:       Index: [[#INDX+6]]
321; SYM32-NEXT:       ContainingCsectSymbolIndex: [[#INDX+3]]
322; SYM32-NEXT:       ParameterHashIndex: 0x0
323; SYM32-NEXT:       TypeChkSectNum: 0x0
324; SYM32-NEXT:       SymbolAlignmentLog2: 0
325; SYM32-NEXT:       SymbolType: XTY_LD (0x2)
326; SYM32-NEXT:       StorageMappingClass: XMC_TL (0x14)
327; SYM32-NEXT:       StabInfoIndex: 0x0
328; SYM32-NEXT:       StabSectNum: 0x0
329; SYM32-NEXT:     }
330; SYM32-NEXT:   }
331; SYM32:     Index: [[#INDX+7]]
332; SYM32-NEXT:     Name: intern_int_zero
333; SYM32-NEXT:     Value (RelocatableAddress): 0x4
334; SYM32-NEXT:     Section: .tbss
335; SYM32-NEXT:     Type: 0x0
336; SYM32-NEXT:     StorageClass: C_HIDEXT (0x6B)
337; SYM32-NEXT:     NumberOfAuxEntries: 1
338; SYM32-NEXT:     CSECT Auxiliary Entry {
339; SYM32-NEXT:       Index: [[#INDX+8]]
340; SYM32-NEXT:       SectionLen: 4
341; SYM32-NEXT:       ParameterHashIndex: 0x0
342; SYM32-NEXT:       TypeChkSectNum: 0x0
343; SYM32-NEXT:       SymbolAlignmentLog2: 2
344; SYM32-NEXT:       SymbolType: XTY_CM (0x3)
345; SYM32-NEXT:       StorageMappingClass: XMC_UL (0x15)
346; SYM32-NEXT:       StabInfoIndex: 0x0
347; SYM32-NEXT:       StabSectNum: 0x0
348; SYM32-NEXT:     }
349; SYM32-NEXT:   }
350
351; DIS32: file format aixcoff-rs6000
352; DIS32: Disassembly of section .text:
353; DIS32: (idx: [[#NFA+5]]) .store_intern_int_zero:
354; DIS32: R_TOC        (idx: [[#NFA+19]]) intern_int_zero[TC]
355; DIS32: R_RBA        (idx: [[#NFA+1]]) .__get_tpointer[PR]
356; DIS32: blr
357; DIS32: (idx: [[#NFA+7]]) .load_global_int_nonzero:
358; DIS32: R_TOC        (idx: [[#NFA+21]]) global_int_nonzero[TC]
359; DIS32: R_RBA        (idx: [[#NFA+1]]) .__get_tpointer[PR]
360; DIS32: blr
361; DIS32: (idx: [[#NFA+9]]) .load_intern_int_zero:
362; DIS32: R_TOC        (idx: [[#NFA+19]]) intern_int_zero[TC]
363; DIS32: R_RBA        (idx: [[#NFA+1]]) .__get_tpointer[PR]
364; DIS32: blr
365
366; DIS32: Disassembly of section .data:
367; DIS32: (idx: [[#NFA+11]]) store_intern_int_zero[DS]:
368; DIS32: R_POS        (idx: [[#NFA+5]]) .store_intern_int_zero
369; DIS32: R_POS        (idx: [[#NFA+17]]) TOC[TC0]
370; DIS32: (idx: [[#NFA+13]]) load_global_int_nonzero[DS]:
371; DIS32: R_POS        (idx: [[#NFA+7]]) .load_global_int_nonzero
372; DIS32: R_POS        (idx: [[#NFA+17]]) TOC[TC0]
373; DIS32: (idx: [[#NFA+15]]) load_intern_int_zero[DS]:
374; DIS32: R_POS        (idx: [[#NFA+9]]) .load_intern_int_zero
375; DIS32: R_POS        (idx: [[#NFA+17]]) TOC[TC0]
376; DIS32: (idx: [[#NFA+19]]) intern_int_zero[TC]:
377; DIS32: R_TLS_IE     (idx: [[#NFA+27]]) intern_int_zero[UL]
378; DIS32: (idx: [[#NFA+21]]) global_int_nonzero[TC]:
379; DIS32: R_TLS_IE     (idx: [[#NFA+25]]) global_int_nonzero
380
381; DIS32: Disassembly of section .tdata:
382; DIS32: (idx: [[#NFA+25]]) global_int_nonzero:
383
384; DIS32: Disassembly of section .tbss:
385; DIS32: (idx: [[#NFA+27]]) intern_int_zero[UL]:
386