xref: /llvm-project/llvm/test/CodeGen/PowerPC/aix-xcoff-toc.ll (revision 427fb35192f1f7bb694a5910b05abc5925a798b2)
1; This file tests TOC entry generation and undefined symbol generation.
2
3; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
4; RUN:     -xcoff-traceback-table=false < %s | FileCheck --check-prefixes CHECK,CHECK32 %s
5; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc64-ibm-aix-xcoff \
6; RUN:     -xcoff-traceback-table=false < %s 2>&1 | FileCheck --check-prefixes CHECK,CHECK64  %s
7
8; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
9; RUN:     --xcoff-traceback-table=false -filetype=obj -o %t.o < %s
10; RUN: llvm-readobj --syms %t.o | FileCheck --check-prefixes=SYM,SYM32 %s
11
12; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mattr=-altivec -mtriple powerpc64-ibm-aix-xcoff \
13; RUN:     --xcoff-traceback-table=false -filetype=obj -o %t64.o < %s
14; RUN: llvm-readobj --syms %t64.o | FileCheck --check-prefixes=SYM,SYM64 %s
15
16@a = external global i32, align 4
17@b = external global i64, align 8
18@c = external global i16, align 2
19@globa = common global i32 0, align 4
20
21@ptr = internal global ptr null, align 4
22
23declare void @foo()
24
25define void @bar() {
26  %1 = alloca ptr, align 8
27  %2 = alloca ptr, align 8
28  store i32 0, ptr @a, align 4
29  store i64 0, ptr @b, align 8
30  store i16 0, ptr @c, align 2
31  store i32 0, ptr @globa, align 4
32  store ptr @bar, ptr @ptr, align 4
33  store ptr @foo, ptr %1, align 8
34  store ptr @foobar, ptr %2, align 8
35  ret void
36}
37
38; We initialize a csect when we first reference an external global, so make sure we don't run into problems when we see it again.
39define void @bar2() {
40  store i32 0, ptr @a, align 4
41  store i64 0, ptr @b, align 8
42  store i16 0, ptr @c, align 2
43  ret void
44}
45
46define void @foobar() {
47  ret void
48}
49
50; Test tc entry assembly generation.
51
52; CHECK-NOT: .comm a
53; CHECK-NOT: .lcomm a
54; CHECK-NOT: .comm b
55; CHECK-NOT: .lcomm b
56; CHECK-NOT: .comm c
57; CHECK-NOT: .lcomm c
58; CHECK: .comm globa[RW],4,2
59; CHECK32: .lcomm ptr,4,ptr[BS],2
60; CHECK64: .lcomm ptr,8,ptr[BS],2
61; CHECK:      .toc
62; CHECK-NEXT: L..C0:
63; CHECK-NEXT: .tc   a[TC],a[UA]
64; CHECK-NEXT: L..C1:
65; CHECK-NEXT: .tc   b[TC],b[UA]
66; CHECK-NEXT: L..C2:
67; CHECK-NEXT: .tc   c[TC],c[UA]
68; CHECK-NEXT: L..C3:
69; CHECK-NEXT: .tc   globa[TC],globa[RW]
70; CHECK-NEXT: L..C4:
71; CHECK-NEXT: .tc   ptr[TC],ptr[BS]
72; CHECK-NEXT: L..C5:
73; CHECK-NEXT: .tc   bar[TC],bar[DS]
74; CHECK-NEXT: L..C6:
75; CHECK-NEXT: .tc   foo[TC],foo[DS]
76; CHECK-NEXT: L..C7:
77; CHECK-NEXT: .tc   foobar[TC],foobar[DS]
78
79
80; Test undefined symbol generation.
81
82; SYM:       Symbol {{[{][[:space:]] *}}Index: [[#UNDEF_INDX:]]{{[[:space:]] *}}Name: a
83; SYM-NEXT:   Value (RelocatableAddress): 0x0
84; SYM-NEXT:   Section: N_UNDEF
85; SYM-NEXT:   Type: 0x0
86; SYM-NEXT:   StorageClass: C_EXT (0x2)
87; SYM-NEXT:   NumberOfAuxEntries: 1
88; SYM-NEXT:   CSECT Auxiliary Entry {
89; SYM-NEXT:     Index: [[#UNDEF_INDX+1]]
90; SYM-NEXT:     SectionLen: 0
91; SYM-NEXT:     ParameterHashIndex: 0x0
92; SYM-NEXT:     TypeChkSectNum: 0x0
93; SYM-NEXT:     SymbolAlignmentLog2: 0
94; SYM-NEXT:     SymbolType: XTY_ER (0x0)
95; SYM-NEXT:     StorageMappingClass: XMC_UA (0x4)
96; SYM32-NEXT:   StabInfoIndex: 0x0
97; SYM32-NEXT:   StabSectNum: 0x0
98; SYM64-NEXT:   Auxiliary Type: AUX_CSECT (0xFB)
99; SYM-NEXT:   }
100; SYM-NEXT: }
101; SYM-NEXT: Symbol {
102; SYM-NEXT:   Index: [[#UNDEF_INDX+2]]
103; SYM-NEXT:   Name: b
104; SYM-NEXT:   Value (RelocatableAddress): 0x0
105; SYM-NEXT:   Section: N_UNDEF
106; SYM-NEXT:   Type: 0x0
107; SYM-NEXT:   StorageClass: C_EXT (0x2)
108; SYM-NEXT:   NumberOfAuxEntries: 1
109; SYM-NEXT:   CSECT Auxiliary Entry {
110; SYM-NEXT:     Index: [[#UNDEF_INDX+3]]
111; SYM-NEXT:     SectionLen: 0
112; SYM-NEXT:     ParameterHashIndex: 0x0
113; SYM-NEXT:     TypeChkSectNum: 0x0
114; SYM-NEXT:     SymbolAlignmentLog2: 0
115; SYM-NEXT:     SymbolType: XTY_ER (0x0)
116; SYM-NEXT:     StorageMappingClass: XMC_UA (0x4)
117; SYM32-NEXT:   StabInfoIndex: 0x0
118; SYM32-NEXT:   StabSectNum: 0x0
119; SYM64-NEXT:   Auxiliary Type: AUX_CSECT (0xFB)
120; SYM-NEXT:   }
121; SYM-NEXT: }
122; SYM-NEXT: Symbol {
123; SYM-NEXT:   Index: [[#UNDEF_INDX+4]]
124; SYM-NEXT:   Name: c
125; SYM-NEXT:   Value (RelocatableAddress): 0x0
126; SYM-NEXT:   Section: N_UNDEF
127; SYM-NEXT:   Type: 0x0
128; SYM-NEXT:   StorageClass: C_EXT (0x2)
129; SYM-NEXT:   NumberOfAuxEntries: 1
130; SYM-NEXT:   CSECT Auxiliary Entry {
131; SYM-NEXT:     Index: [[#UNDEF_INDX+5]]
132; SYM-NEXT:     SectionLen: 0
133; SYM-NEXT:     ParameterHashIndex: 0x0
134; SYM-NEXT:     TypeChkSectNum: 0x0
135; SYM-NEXT:     SymbolAlignmentLog2: 0
136; SYM-NEXT:     SymbolType: XTY_ER (0x0)
137; SYM-NEXT:     StorageMappingClass: XMC_UA (0x4)
138; SYM32-NEXT:   StabInfoIndex: 0x0
139; SYM32-NEXT:   StabSectNum: 0x0
140; SYM64-NEXT:   Auxiliary Type: AUX_CSECT (0xFB)
141; SYM-NEXT:   }
142; SYM-NEXT: }
143; SYM-NEXT: Symbol {
144; SYM-NEXT:   Index: [[#UNDEF_INDX+6]]
145; SYM-NEXT:   Name: .foo
146; SYM-NEXT:   Value (RelocatableAddress): 0x0
147; SYM-NEXT:   Section: N_UNDEF
148; SYM-NEXT:   Type: 0x0
149; SYM-NEXT:   StorageClass: C_EXT (0x2)
150; SYM-NEXT:   NumberOfAuxEntries: 1
151; SYM-NEXT:   CSECT Auxiliary Entry {
152; SYM-NEXT:     Index: [[#UNDEF_INDX+7]]
153; SYM-NEXT:     SectionLen: 0
154; SYM-NEXT:     ParameterHashIndex: 0x0
155; SYM-NEXT:     TypeChkSectNum: 0x0
156; SYM-NEXT:     SymbolAlignmentLog2: 0
157; SYM-NEXT:     SymbolType: XTY_ER (0x0)
158; SYM-NEXT:     StorageMappingClass: XMC_PR (0x0)
159; SYM32-NEXT:   StabInfoIndex: 0x0
160; SYM32-NEXT:   StabSectNum: 0x0
161; SYM64-NEXT:   Auxiliary Type: AUX_CSECT (0xFB)
162; SYM-NEXT:   }
163; SYM-NEXT: }
164; SYM-NEXT: Symbol {
165; SYM-NEXT:   Index: [[#UNDEF_INDX+8]]
166; SYM-NEXT:   Name: foo
167; SYM-NEXT:   Value (RelocatableAddress): 0x0
168; SYM-NEXT:   Section: N_UNDEF
169; SYM-NEXT:   Type: 0x0
170; SYM-NEXT:   StorageClass: C_EXT (0x2)
171; SYM-NEXT:   NumberOfAuxEntries: 1
172; SYM-NEXT:   CSECT Auxiliary Entry {
173; SYM-NEXT:     Index: [[#UNDEF_INDX+9]]
174; SYM-NEXT:     SectionLen: 0
175; SYM-NEXT:     ParameterHashIndex: 0x0
176; SYM-NEXT:     TypeChkSectNum: 0x0
177; SYM-NEXT:     SymbolAlignmentLog2: 0
178; SYM-NEXT:     SymbolType: XTY_ER (0x0)
179; SYM-NEXT:     StorageMappingClass: XMC_DS (0xA)
180; SYM32-NEXT:   StabInfoIndex: 0x0
181; SYM32-NEXT:   StabSectNum: 0x0
182; SYM64-NEXT:   Auxiliary Type: AUX_CSECT (0xFB)
183; SYM-NEXT:   }
184; SYM-NEXT: }
185
186; Test TOC entry symbol generation.
187
188; SYM:       Symbol {{[{][[:space:]] *}}Index: [[#TOC_INDX:]]{{[[:space:]] *}}Name: TOC
189; SYM32-NEXT:  Value (RelocatableAddress): 0xA8
190; SYM64-NEXT:  Value (RelocatableAddress): 0xC0
191; SYM-NEXT:    Section: .data
192; SYM-NEXT:    Type: 0x0
193; SYM-NEXT:    StorageClass: C_HIDEXT (0x6B)
194; SYM-NEXT:    NumberOfAuxEntries: 1
195; SYM-NEXT:    CSECT Auxiliary Entry {
196; SYM-NEXT:      Index: [[#TOC_INDX+1]]
197; SYM-NEXT:      SectionLen: 0
198; SYM-NEXT:      ParameterHashIndex: 0x0
199; SYM-NEXT:      TypeChkSectNum: 0x0
200; SYM-NEXT:      SymbolAlignmentLog2: 2
201; SYM-NEXT:      SymbolType: XTY_SD (0x1)
202; SYM-NEXT:      StorageMappingClass: XMC_TC0 (0xF)
203; SYM32-NEXT:    StabInfoIndex: 0x0
204; SYM32-NEXT:    StabSectNum: 0x0
205; SYM64-NEXT:    Auxiliary Type: AUX_CSECT (0xFB)
206; SYM-NEXT:    }
207; SYM-NEXT:  }
208; SYM-NEXT:  Symbol {
209; SYM-NEXT:    Index: [[#TOC_INDX+2]]
210; SYM-NEXT:    Name: a
211; SYM32-NEXT:  Value (RelocatableAddress): 0xA8
212; SYM64-NEXT:  Value (RelocatableAddress): 0xC0
213; SYM-NEXT:    Section: .data
214; SYM-NEXT:    Type: 0x0
215; SYM-NEXT:    StorageClass: C_HIDEXT (0x6B)
216; SYM-NEXT:    NumberOfAuxEntries: 1
217; SYM-NEXT:    CSECT Auxiliary Entry {
218; SYM-NEXT:      Index: [[#TOC_INDX+3]]
219; SYM32-NEXT:    SectionLen: 4
220; SYM64-NEXT:    SectionLen: 8
221; SYM-NEXT:      ParameterHashIndex: 0x0
222; SYM-NEXT:      TypeChkSectNum: 0x0
223; SYM32-NEXT:    SymbolAlignmentLog2: 2
224; SYM64-NEXT:    SymbolAlignmentLog2: 3
225; SYM-NEXT:      SymbolType: XTY_SD (0x1)
226; SYM-NEXT:      StorageMappingClass: XMC_TC (0x3)
227; SYM32-NEXT:    StabInfoIndex: 0x0
228; SYM32-NEXT:    StabSectNum: 0x0
229; SYM64-NEXT:    Auxiliary Type: AUX_CSECT (0xFB)
230; SYM-NEXT:    }
231; SYM-NEXT:  }
232; SYM-NEXT:  Symbol {
233; SYM-NEXT:    Index: [[#TOC_INDX+4]]
234; SYM-NEXT:    Name: b
235; SYM32-NEXT:  Value (RelocatableAddress): 0xAC
236; SYM64-NEXT:  Value (RelocatableAddress): 0xC8
237; SYM-NEXT:    Section: .data
238; SYM-NEXT:    Type: 0x0
239; SYM-NEXT:    StorageClass: C_HIDEXT (0x6B)
240; SYM-NEXT:    NumberOfAuxEntries: 1
241; SYM-NEXT:    CSECT Auxiliary Entry {
242; SYM-NEXT:      Index: [[#TOC_INDX+5]]
243; SYM32-NEXT:    SectionLen: 4
244; SYM64-NEXT:    SectionLen: 8
245; SYM-NEXT:      ParameterHashIndex: 0x0
246; SYM-NEXT:      TypeChkSectNum: 0x0
247; SYM32-NEXT:    SymbolAlignmentLog2: 2
248; SYM64-NEXT:    SymbolAlignmentLog2: 3
249; SYM-NEXT:      SymbolType: XTY_SD (0x1)
250; SYM-NEXT:      StorageMappingClass: XMC_TC (0x3)
251; SYM32-NEXT:    StabInfoIndex: 0x0
252; SYM32-NEXT:    StabSectNum: 0x0
253; SYM64-NEXT:    Auxiliary Type: AUX_CSECT (0xFB)
254; SYM-NEXT:    }
255; SYM-NEXT:  }
256; SYM-NEXT:  Symbol {
257; SYM-NEXT:    Index: [[#TOC_INDX+6]]
258; SYM-NEXT:    Name: c
259; SYM32-NEXT:  Value (RelocatableAddress): 0xB0
260; SYM64-NEXT:  Value (RelocatableAddress): 0xD0
261; SYM-NEXT:    Section: .data
262; SYM-NEXT:    Type: 0x0
263; SYM-NEXT:    StorageClass: C_HIDEXT (0x6B)
264; SYM-NEXT:    NumberOfAuxEntries: 1
265; SYM-NEXT:    CSECT Auxiliary Entry {
266; SYM-NEXT:      Index: [[#TOC_INDX+7]]
267; SYM32-NEXT:    SectionLen: 4
268; SYM64-NEXT:    SectionLen: 8
269; SYM-NEXT:      ParameterHashIndex: 0x0
270; SYM-NEXT:      TypeChkSectNum: 0x0
271; SYM32-NEXT:    SymbolAlignmentLog2: 2
272; SYM64-NEXT:    SymbolAlignmentLog2: 3
273; SYM-NEXT:      SymbolType: XTY_SD (0x1)
274; SYM-NEXT:      StorageMappingClass: XMC_TC (0x3)
275; SYM32-NEXT:    StabInfoIndex: 0x0
276; SYM32-NEXT:    StabSectNum: 0x0
277; SYM64-NEXT:    Auxiliary Type: AUX_CSECT (0xFB)
278; SYM-NEXT:    }
279; SYM-NEXT:  }
280; SYM-NEXT:  Symbol {
281; SYM-NEXT:    Index: [[#TOC_INDX+8]]
282; SYM-NEXT:    Name: globa
283; SYM32-NEXT:  Value (RelocatableAddress): 0xB4
284; SYM64-NEXT:  Value (RelocatableAddress): 0xD8
285; SYM-NEXT:    Section: .data
286; SYM-NEXT:    Type: 0x0
287; SYM-NEXT:    StorageClass: C_HIDEXT (0x6B)
288; SYM-NEXT:    NumberOfAuxEntries: 1
289; SYM-NEXT:    CSECT Auxiliary Entry {
290; SYM-NEXT:      Index: [[#TOC_INDX+9]]
291; SYM32-NEXT:    SectionLen: 4
292; SYM64-NEXT:    SectionLen: 8
293; SYM-NEXT:      ParameterHashIndex: 0x0
294; SYM-NEXT:      TypeChkSectNum: 0x0
295; SYM32-NEXT:    SymbolAlignmentLog2: 2
296; SYM64-NEXT:    SymbolAlignmentLog2: 3
297; SYM-NEXT:      SymbolType: XTY_SD (0x1)
298; SYM-NEXT:      StorageMappingClass: XMC_TC (0x3)
299; SYM32-NEXT:    StabInfoIndex: 0x0
300; SYM32-NEXT:    StabSectNum: 0x0
301; SYM64-NEXT:    Auxiliary Type: AUX_CSECT (0xFB)
302; SYM-NEXT:    }
303; SYM-NEXT:  }
304; SYM-NEXT:  Symbol {
305; SYM-NEXT:    Index: [[#TOC_INDX+10]]
306; SYM-NEXT:    Name: ptr
307; SYM32-NEXT:  Value (RelocatableAddress): 0xB8
308; SYM64-NEXT:  Value (RelocatableAddress): 0xE0
309; SYM-NEXT:    Section: .data
310; SYM-NEXT:    Type: 0x0
311; SYM-NEXT:    StorageClass: C_HIDEXT (0x6B)
312; SYM-NEXT:    NumberOfAuxEntries: 1
313; SYM-NEXT:    CSECT Auxiliary Entry {
314; SYM-NEXT:      Index: [[#TOC_INDX+11]]
315; SYM32-NEXT:    SectionLen: 4
316; SYM64-NEXT:    SectionLen: 8
317; SYM-NEXT:      ParameterHashIndex: 0x0
318; SYM-NEXT:      TypeChkSectNum: 0x0
319; SYM32-NEXT:    SymbolAlignmentLog2: 2
320; SYM64-NEXT:    SymbolAlignmentLog2: 3
321; SYM-NEXT:      SymbolType: XTY_SD (0x1)
322; SYM-NEXT:      StorageMappingClass: XMC_TC (0x3)
323; SYM32-NEXT:    StabInfoIndex: 0x0
324; SYM32-NEXT:    StabSectNum: 0x0
325; SYM64-NEXT:    Auxiliary Type: AUX_CSECT (0xFB)
326; SYM-NEXT:    }
327; SYM-NEXT:  }
328; SYM-NEXT:  Symbol {
329; SYM-NEXT:    Index: [[#TOC_INDX+12]]
330; SYM-NEXT:    Name: bar
331; SYM32-NEXT:  Value (RelocatableAddress): 0xBC
332; SYM64-NEXT:  Value (RelocatableAddress): 0xE8
333; SYM-NEXT:    Section: .data
334; SYM-NEXT:    Type: 0x0
335; SYM-NEXT:    StorageClass: C_HIDEXT (0x6B)
336; SYM-NEXT:    NumberOfAuxEntries: 1
337; SYM-NEXT:    CSECT Auxiliary Entry {
338; SYM-NEXT:      Index: [[#TOC_INDX+13]]
339; SYM32-NEXT:    SectionLen: 4
340; SYM64-NEXT:    SectionLen: 8
341; SYM-NEXT:      ParameterHashIndex: 0x0
342; SYM-NEXT:      TypeChkSectNum: 0x0
343; SYM32-NEXT:    SymbolAlignmentLog2: 2
344; SYM64-NEXT:    SymbolAlignmentLog2: 3
345; SYM-NEXT:      SymbolType: XTY_SD (0x1)
346; SYM-NEXT:      StorageMappingClass: XMC_TC (0x3)
347; SYM32-NEXT:    StabInfoIndex: 0x0
348; SYM32-NEXT:    StabSectNum: 0x0
349; SYM64-NEXT:    Auxiliary Type: AUX_CSECT (0xFB)
350; SYM-NEXT:    }
351; SYM-NEXT:  }
352; SYM-NEXT:  Symbol {
353; SYM-NEXT:    Index: [[#TOC_INDX+14]]
354; SYM-NEXT:    Name: foo
355; SYM32-NEXT:  Value (RelocatableAddress): 0xC0
356; SYM64-NEXT:  Value (RelocatableAddress): 0xF0
357; SYM-NEXT:    Section: .data
358; SYM-NEXT:    Type: 0x0
359; SYM-NEXT:    StorageClass: C_HIDEXT (0x6B)
360; SYM-NEXT:    NumberOfAuxEntries: 1
361; SYM-NEXT:    CSECT Auxiliary Entry {
362; SYM-NEXT:      Index: [[#TOC_INDX+15]]
363; SYM32-NEXT:    SectionLen: 4
364; SYM64-NEXT:    SectionLen: 8
365; SYM-NEXT:      ParameterHashIndex: 0x0
366; SYM-NEXT:      TypeChkSectNum: 0x0
367; SYM32-NEXT:    SymbolAlignmentLog2: 2
368; SYM64-NEXT:    SymbolAlignmentLog2: 3
369; SYM-NEXT:      SymbolType: XTY_SD (0x1)
370; SYM-NEXT:      StorageMappingClass: XMC_TC (0x3)
371; SYM32-NEXT:    StabInfoIndex: 0x0
372; SYM32-NEXT:    StabSectNum: 0x0
373; SYM64-NEXT:    Auxiliary Type: AUX_CSECT (0xFB)
374; SYM-NEXT:    }
375; SYM-NEXT:  }
376; SYM-NEXT:  Symbol {
377; SYM-NEXT:    Index: [[#TOC_INDX+16]]
378; SYM-NEXT:    Name: foobar
379; SYM32-NEXT:  Value (RelocatableAddress): 0xC4
380; SYM64-NEXT:  Value (RelocatableAddress): 0xF8
381; SYM-NEXT:    Section: .data
382; SYM-NEXT:    Type: 0x0
383; SYM-NEXT:    StorageClass: C_HIDEXT (0x6B)
384; SYM-NEXT:    NumberOfAuxEntries: 1
385; SYM-NEXT:    CSECT Auxiliary Entry {
386; SYM-NEXT:      Index: [[#TOC_INDX+17]]
387; SYM32-NEXT:    SectionLen: 4
388; SYM64-NEXT:    SectionLen: 8
389; SYM-NEXT:      ParameterHashIndex: 0x0
390; SYM-NEXT:      TypeChkSectNum: 0x0
391; SYM32-NEXT:    SymbolAlignmentLog2: 2
392; SYM64-NEXT:    SymbolAlignmentLog2: 3
393; SYM-NEXT:      SymbolType: XTY_SD (0x1)
394; SYM-NEXT:      StorageMappingClass: XMC_TC (0x3)
395; SYM32-NEXT:    StabInfoIndex: 0x0
396; SYM32-NEXT:    StabSectNum: 0x0
397; SYM64-NEXT:    Auxiliary Type: AUX_CSECT (0xFB)
398; SYM-NEXT:    }
399; SYM-NEXT:  }
400