1; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -xcoff-traceback-table=false -mcpu=pwr4 \
2; RUN:   -mattr=-altivec -data-sections=false < %s | FileCheck --check-prefixes=COMMON,BIT32 %s
3
4; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff -xcoff-traceback-table=false -mcpu=pwr4 \
5; RUN:   -mattr=-altivec -data-sections=false < %s | FileCheck --check-prefixes=COMMON,BIT64 %s
6
7; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -xcoff-traceback-table=false -mcpu=pwr4 \
8; RUN:   -mattr=-altivec -data-sections=false -filetype=obj -o %t.o < %s
9; RUN: llvm-readobj --symbols %t.o | FileCheck --check-prefix=CHECKSYM %s
10
11;; FIXME: currently only fileHeader and sectionHeaders are supported in XCOFF64.
12
13@foo_weak_p = global void (...)* bitcast (void ()* @foo_ref_weak to void (...)*), align 4
14@b = weak global i32 0, align 4
15
16define weak void @foo_weak(i32* %p)  {
17entry:
18  %p.addr = alloca i32*, align 4
19  store i32* %p, i32** %p.addr, align 4
20  %0 = load i32*, i32** %p.addr, align 4
21  %1 = load i32, i32* %0, align 4
22  %inc = add nsw i32 %1, 1
23  store i32 %inc, i32* %0, align 4
24  ret void
25}
26
27define weak void @foo_ref_weak()  {
28entry:
29  ret void
30}
31
32define i32 @main()  {
33entry:
34  %0 = load void (...)*, void (...)** @foo_weak_p, align 4
35  %callee.knr.cast = bitcast void (...)* %0 to void ()*
36  call void %callee.knr.cast()
37  call void @foo_weak(i32* @b)
38  call void @foo_ref_weak()
39  ret i32 0
40}
41
42; COMMON:               .weak	foo_weak[DS]            # -- Begin function foo_weak
43; COMMON-NEXT:          .weak	.foo_weak
44; COMMON-NEXT:          .align	4
45; COMMON-NEXT:          .csect foo_weak[DS]
46; BIT32-NEXT:           .vbyte	4, .foo_weak               # @foo_weak
47; BIT32-NEXT:           .vbyte	4, TOC[TC0]
48; BIT32-NEXT:           .vbyte	4, 0
49; BIT64-NEXT:           .vbyte	8, .foo_weak               # @foo_weak
50; BIT64-NEXT:           .vbyte	8, TOC[TC0]
51; BIT64-NEXT:           .vbyte	8, 0
52; COMMON-NEXT:          .csect .text[PR]
53; COMMON-NEXT:  .foo_weak:
54
55; COMMON:               .weak   foo_ref_weak[DS]        # -- Begin function foo_ref_weak
56; COMMON-NEXT:          .weak	.foo_ref_weak
57; COMMON-NEXT:          .align	4
58; COMMON-NEXT:          .csect foo_ref_weak[DS]
59; BIT32-NEXT:           .vbyte	4, .foo_ref_weak           # @foo_ref_weak
60; BIT32-NEXT:           .vbyte	4, TOC[TC0]
61; BIT32-NEXT:           .vbyte	4, 0
62; BIT64-NEXT:           .vbyte	8, .foo_ref_weak           # @foo_ref_weak
63; BIT64-NEXT:           .vbyte	8, TOC[TC0]
64; BIT64-NEXT:           .vbyte	8, 0
65; COMMON-NEXT:          .csect .text[PR]
66; COMMON-NEXT:  .foo_ref_weak:
67
68; COMMON:               .globl  main[DS]                # -- Begin function main
69; COMMON-NEXT:          .globl  .main
70; COMMON-NEXT:          .align	4
71; COMMON-NEXT:          .csect main[DS]
72; BIT32-NEXT:           .vbyte	4, .main                   # @main
73; BIT32-NEXT:           .vbyte	4, TOC[TC0]
74; BIT32-NEXT:           .vbyte	4, 0
75; BIT64-NEXT:           .vbyte	8, .main                   # @main
76; BIT64-NEXT:           .vbyte	8, TOC[TC0]
77; BIT64-NEXT:           .vbyte	8, 0
78; COMMON-NEXT:          .csect .text[PR]
79; COMMON-NEXT:  .main:
80
81; COMMON:     	        .csect .data[RW]
82; COMMON-NEXT:          .globl	foo_weak_p
83; BIT32-NEXT:           .align	2
84; BIT64-NEXT:           .align	3
85; COMMON-NEXT:  foo_weak_p:
86; BIT32-NEXT:           .vbyte	4, foo_ref_weak[DS]
87; BIT64-NEXT:           .vbyte	8, foo_ref_weak[DS]
88; COMMON-NEXT:          .weak	b
89; COMMON-NEXT:          .align	2
90; COMMON-NEXT:  b:
91; COMMON-NEXT:          .vbyte	4, 0                       # 0x0
92; COMMON-NEXT:          .toc
93; COMMON-NEXT:  L..C0:
94; COMMON-NEXT:          .tc foo_weak_p[TC],foo_weak_p
95; COMMON-NEXT:  L..C1:
96; COMMON-NEXT:          .tc b[TC],b
97
98
99; CHECKSYM:      Symbols [
100; CHECKSYM-NEXT:   Symbol {
101; CHECKSYM-NEXT:     Index: 0
102; CHECKSYM-NEXT:     Name: .file
103; CHECKSYM-NEXT:     Value (SymbolTableIndex): 0x0
104; CHECKSYM-NEXT:     Section: N_DEBUG
105; CHECKSYM-NEXT:     Source Language ID: TB_C (0x0)
106; CHECKSYM-NEXT:     CPU Version ID: 0x0
107; CHECKSYM-NEXT:     StorageClass: C_FILE (0x67)
108; CHECKSYM-NEXT:     NumberOfAuxEntries: 0
109; CHECKSYM-NEXT:   }
110; CHECKSYM-NEXT:   Symbol {
111; CHECKSYM-NEXT:     Index: [[#Index:]]
112; CHECKSYM-NEXT:     Name: .text
113; CHECKSYM-NEXT:     Value (RelocatableAddress): 0x0
114; CHECKSYM-NEXT:     Section: .text
115; CHECKSYM-NEXT:     Type: 0x0
116; CHECKSYM-NEXT:     StorageClass: C_HIDEXT (0x6B)
117; CHECKSYM-NEXT:     NumberOfAuxEntries: 1
118; CHECKSYM-NEXT:     CSECT Auxiliary Entry {
119; CHECKSYM-NEXT:       Index: [[#Index+1]]
120; CHECKSYM-NEXT:       SectionLen: 136
121; CHECKSYM-NEXT:       ParameterHashIndex: 0x0
122; CHECKSYM-NEXT:       TypeChkSectNum: 0x0
123; CHECKSYM-NEXT:       SymbolAlignmentLog2: 4
124; CHECKSYM-NEXT:       SymbolType: XTY_SD (0x1)
125; CHECKSYM-NEXT:       StorageMappingClass: XMC_PR (0x0)
126; CHECKSYM-NEXT:       StabInfoIndex: 0x0
127; CHECKSYM-NEXT:       StabSectNum: 0x0
128; CHECKSYM-NEXT:     }
129; CHECKSYM-NEXT:   }
130; CHECKSYM-NEXT:   Symbol {
131; CHECKSYM-NEXT:     Index: [[#Index+2]]
132; CHECKSYM-NEXT:     Name: .foo_weak
133; CHECKSYM-NEXT:     Value (RelocatableAddress): 0x0
134; CHECKSYM-NEXT:     Section: .text
135; CHECKSYM-NEXT:     Type: 0x0
136; CHECKSYM-NEXT:     StorageClass: C_WEAKEXT (0x6F)
137; CHECKSYM-NEXT:     NumberOfAuxEntries: 1
138; CHECKSYM-NEXT:     CSECT Auxiliary Entry {
139; CHECKSYM-NEXT:       Index: [[#Index+3]]
140; CHECKSYM-NEXT:       ContainingCsectSymbolIndex: [[#Index]]
141; CHECKSYM-NEXT:       ParameterHashIndex: 0x0
142; CHECKSYM-NEXT:       TypeChkSectNum: 0x0
143; CHECKSYM-NEXT:       SymbolAlignmentLog2: 0
144; CHECKSYM-NEXT:       SymbolType: XTY_LD (0x2)
145; CHECKSYM-NEXT:       StorageMappingClass: XMC_PR (0x0)
146; CHECKSYM-NEXT:       StabInfoIndex: 0x0
147; CHECKSYM-NEXT:       StabSectNum: 0x0
148; CHECKSYM-NEXT:     }
149; CHECKSYM-NEXT:   }
150; CHECKSYM-NEXT:   Symbol {
151; CHECKSYM-NEXT:     Index: [[#Index+4]]
152; CHECKSYM-NEXT:     Name: .foo_ref_weak
153; CHECKSYM-NEXT:     Value (RelocatableAddress): 0x20
154; CHECKSYM-NEXT:     Section: .text
155; CHECKSYM-NEXT:     Type: 0x0
156; CHECKSYM-NEXT:     StorageClass: C_WEAKEXT (0x6F)
157; CHECKSYM-NEXT:     NumberOfAuxEntries: 1
158; CHECKSYM-NEXT:     CSECT Auxiliary Entry {
159; CHECKSYM-NEXT:       Index: [[#Index+5]]
160; CHECKSYM-NEXT:       ContainingCsectSymbolIndex: [[#Index]]
161; CHECKSYM-NEXT:       ParameterHashIndex: 0x0
162; CHECKSYM-NEXT:       TypeChkSectNum: 0x0
163; CHECKSYM-NEXT:       SymbolAlignmentLog2: 0
164; CHECKSYM-NEXT:       SymbolType: XTY_LD (0x2)
165; CHECKSYM-NEXT:       StorageMappingClass: XMC_PR (0x0)
166; CHECKSYM-NEXT:       StabInfoIndex: 0x0
167; CHECKSYM-NEXT:       StabSectNum: 0x0
168; CHECKSYM-NEXT:     }
169; CHECKSYM-NEXT:   }
170; CHECKSYM-NEXT:   Symbol {
171; CHECKSYM-NEXT:     Index: [[#Index+6]]
172; CHECKSYM-NEXT:     Name: .main
173; CHECKSYM-NEXT:     Value (RelocatableAddress): 0x30
174; CHECKSYM-NEXT:     Section: .text
175; CHECKSYM-NEXT:     Type: 0x0
176; CHECKSYM-NEXT:     StorageClass: C_EXT (0x2)
177; CHECKSYM-NEXT:     NumberOfAuxEntries: 1
178; CHECKSYM-NEXT:     CSECT Auxiliary Entry {
179; CHECKSYM-NEXT:       Index: [[#Index+7]]
180; CHECKSYM-NEXT:       ContainingCsectSymbolIndex: [[#Index]]
181; CHECKSYM-NEXT:       ParameterHashIndex: 0x0
182; CHECKSYM-NEXT:       TypeChkSectNum: 0x0
183; CHECKSYM-NEXT:       SymbolAlignmentLog2: 0
184; CHECKSYM-NEXT:       SymbolType: XTY_LD (0x2)
185; CHECKSYM-NEXT:       StorageMappingClass: XMC_PR (0x0)
186; CHECKSYM-NEXT:       StabInfoIndex: 0x0
187; CHECKSYM-NEXT:       StabSectNum: 0x0
188; CHECKSYM-NEXT:     }
189; CHECKSYM-NEXT:   }
190; CHECKSYM-NEXT:   Symbol {
191; CHECKSYM-NEXT:     Index: [[#Index+8]]
192; CHECKSYM-NEXT:     Name: .data
193; CHECKSYM-NEXT:     Value (RelocatableAddress): 0x88
194; CHECKSYM-NEXT:     Section: .data
195; CHECKSYM-NEXT:     Type: 0x0
196; CHECKSYM-NEXT:     StorageClass: C_HIDEXT (0x6B)
197; CHECKSYM-NEXT:     NumberOfAuxEntries: 1
198; CHECKSYM-NEXT:     CSECT Auxiliary Entry {
199; CHECKSYM-NEXT:       Index: [[#Index+9]]
200; CHECKSYM-NEXT:       SectionLen: 8
201; CHECKSYM-NEXT:       ParameterHashIndex: 0x0
202; CHECKSYM-NEXT:       TypeChkSectNum: 0x0
203; CHECKSYM-NEXT:       SymbolAlignmentLog2: 2
204; CHECKSYM-NEXT:       SymbolType: XTY_SD (0x1)
205; CHECKSYM-NEXT:       StorageMappingClass: XMC_RW (0x5)
206; CHECKSYM-NEXT:       StabInfoIndex: 0x0
207; CHECKSYM-NEXT:       StabSectNum: 0x0
208; CHECKSYM-NEXT:     }
209; CHECKSYM-NEXT:   }
210; CHECKSYM-NEXT:   Symbol {
211; CHECKSYM-NEXT:     Index: [[#Index+10]]
212; CHECKSYM-NEXT:     Name: foo_weak_p
213; CHECKSYM-NEXT:     Value (RelocatableAddress): 0x88
214; CHECKSYM-NEXT:     Section: .data
215; CHECKSYM-NEXT:     Type: 0x0
216; CHECKSYM-NEXT:     StorageClass: C_EXT (0x2)
217; CHECKSYM-NEXT:     NumberOfAuxEntries: 1
218; CHECKSYM-NEXT:     CSECT Auxiliary Entry {
219; CHECKSYM-NEXT:       Index: [[#Index+11]]
220; CHECKSYM-NEXT:       ContainingCsectSymbolIndex: [[#Index+8]]
221; CHECKSYM-NEXT:       ParameterHashIndex: 0x0
222; CHECKSYM-NEXT:       TypeChkSectNum: 0x0
223; CHECKSYM-NEXT:       SymbolAlignmentLog2: 0
224; CHECKSYM-NEXT:       SymbolType: XTY_LD (0x2)
225; CHECKSYM-NEXT:       StorageMappingClass: XMC_RW (0x5)
226; CHECKSYM-NEXT:       StabInfoIndex: 0x0
227; CHECKSYM-NEXT:       StabSectNum: 0x0
228; CHECKSYM-NEXT:     }
229; CHECKSYM-NEXT:   }
230; CHECKSYM-NEXT:   Symbol {
231; CHECKSYM-NEXT:     Index: [[#Index+12]]
232; CHECKSYM-NEXT:     Name: b
233; CHECKSYM-NEXT:     Value (RelocatableAddress): 0x8C
234; CHECKSYM-NEXT:     Section: .data
235; CHECKSYM-NEXT:     Type: 0x0
236; CHECKSYM-NEXT:     StorageClass: C_WEAKEXT (0x6F)
237; CHECKSYM-NEXT:     NumberOfAuxEntries: 1
238; CHECKSYM-NEXT:     CSECT Auxiliary Entry {
239; CHECKSYM-NEXT:       Index: [[#Index+13]]
240; CHECKSYM-NEXT:       ContainingCsectSymbolIndex: [[#Index+8]]
241; CHECKSYM-NEXT:       ParameterHashIndex: 0x0
242; CHECKSYM-NEXT:       TypeChkSectNum: 0x0
243; CHECKSYM-NEXT:       SymbolAlignmentLog2: 0
244; CHECKSYM-NEXT:       SymbolType: XTY_LD (0x2)
245; CHECKSYM-NEXT:       StorageMappingClass: XMC_RW (0x5)
246; CHECKSYM-NEXT:       StabInfoIndex: 0x0
247; CHECKSYM-NEXT:       StabSectNum: 0x0
248; CHECKSYM-NEXT:     }
249; CHECKSYM-NEXT:   }
250; CHECKSYM-NEXT:   Symbol {
251; CHECKSYM-NEXT:     Index: [[#Index+14]]
252; CHECKSYM-NEXT:     Name: foo_weak
253; CHECKSYM-NEXT:     Value (RelocatableAddress): 0x90
254; CHECKSYM-NEXT:     Section: .data
255; CHECKSYM-NEXT:     Type: 0x0
256; CHECKSYM-NEXT:     StorageClass: C_WEAKEXT (0x6F)
257; CHECKSYM-NEXT:     NumberOfAuxEntries: 1
258; CHECKSYM-NEXT:     CSECT Auxiliary Entry {
259; CHECKSYM-NEXT:       Index: [[#Index+15]]
260; CHECKSYM-NEXT:       SectionLen: 12
261; CHECKSYM-NEXT:       ParameterHashIndex: 0x0
262; CHECKSYM-NEXT:       TypeChkSectNum: 0x0
263; CHECKSYM-NEXT:       SymbolAlignmentLog2: 2
264; CHECKSYM-NEXT:       SymbolType: XTY_SD (0x1)
265; CHECKSYM-NEXT:       StorageMappingClass: XMC_DS (0xA)
266; CHECKSYM-NEXT:       StabInfoIndex: 0x0
267; CHECKSYM-NEXT:       StabSectNum: 0x0
268; CHECKSYM-NEXT:     }
269; CHECKSYM-NEXT:   }
270; CHECKSYM-NEXT:   Symbol {
271; CHECKSYM-NEXT:     Index: [[#Index+16]]
272; CHECKSYM-NEXT:     Name: foo_ref_weak
273; CHECKSYM-NEXT:     Value (RelocatableAddress): 0x9C
274; CHECKSYM-NEXT:     Section: .data
275; CHECKSYM-NEXT:     Type: 0x0
276; CHECKSYM-NEXT:     StorageClass: C_WEAKEXT (0x6F)
277; CHECKSYM-NEXT:     NumberOfAuxEntries: 1
278; CHECKSYM-NEXT:     CSECT Auxiliary Entry {
279; CHECKSYM-NEXT:       Index: [[#Index+17]]
280; CHECKSYM-NEXT:       SectionLen: 12
281; CHECKSYM-NEXT:       ParameterHashIndex: 0x0
282; CHECKSYM-NEXT:       TypeChkSectNum: 0x0
283; CHECKSYM-NEXT:       SymbolAlignmentLog2: 2
284; CHECKSYM-NEXT:       SymbolType: XTY_SD (0x1)
285; CHECKSYM-NEXT:       StorageMappingClass: XMC_DS (0xA)
286; CHECKSYM-NEXT:       StabInfoIndex: 0x0
287; CHECKSYM-NEXT:       StabSectNum: 0x0
288; CHECKSYM-NEXT:     }
289; CHECKSYM-NEXT:   }
290; CHECKSYM-NEXT:   Symbol {
291; CHECKSYM-NEXT:     Index: [[#Index+18]]
292; CHECKSYM-NEXT:     Name: main
293; CHECKSYM-NEXT:     Value (RelocatableAddress): 0xA8
294; CHECKSYM-NEXT:     Section: .data
295; CHECKSYM-NEXT:     Type: 0x0
296; CHECKSYM-NEXT:     StorageClass: C_EXT (0x2)
297; CHECKSYM-NEXT:     NumberOfAuxEntries: 1
298; CHECKSYM-NEXT:     CSECT Auxiliary Entry {
299; CHECKSYM-NEXT:       Index: [[#Index+19]]
300; CHECKSYM-NEXT:       SectionLen: 12
301; CHECKSYM-NEXT:       ParameterHashIndex: 0x0
302; CHECKSYM-NEXT:       TypeChkSectNum: 0x0
303; CHECKSYM-NEXT:       SymbolAlignmentLog2: 2
304; CHECKSYM-NEXT:       SymbolType: XTY_SD (0x1)
305; CHECKSYM-NEXT:       StorageMappingClass: XMC_DS (0xA)
306; CHECKSYM-NEXT:       StabInfoIndex: 0x0
307; CHECKSYM-NEXT:       StabSectNum: 0x0
308; CHECKSYM-NEXT:     }
309; CHECKSYM-NEXT:   }
310; CHECKSYM-NEXT:   Symbol {
311; CHECKSYM-NEXT:     Index: [[#Index+20]]
312; CHECKSYM-NEXT:     Name: TOC
313; CHECKSYM-NEXT:     Value (RelocatableAddress): 0xB4
314; CHECKSYM-NEXT:     Section: .data
315; CHECKSYM-NEXT:     Type: 0x0
316; CHECKSYM-NEXT:     StorageClass: C_HIDEXT (0x6B)
317; CHECKSYM-NEXT:     NumberOfAuxEntries: 1
318; CHECKSYM-NEXT:     CSECT Auxiliary Entry {
319; CHECKSYM-NEXT:       Index: [[#Index+21]]
320; CHECKSYM-NEXT:       SectionLen: 0
321; CHECKSYM-NEXT:       ParameterHashIndex: 0x0
322; CHECKSYM-NEXT:       TypeChkSectNum: 0x0
323; CHECKSYM-NEXT:       SymbolAlignmentLog2: 2
324; CHECKSYM-NEXT:       SymbolType: XTY_SD (0x1)
325; CHECKSYM-NEXT:       StorageMappingClass: XMC_TC0 (0xF)
326; CHECKSYM-NEXT:       StabInfoIndex: 0x0
327; CHECKSYM-NEXT:       StabSectNum: 0x0
328; CHECKSYM-NEXT:     }
329; CHECKSYM-NEXT:   }
330; CHECKSYM-NEXT:   Symbol {
331; CHECKSYM-NEXT:     Index: [[#Index+22]]
332; CHECKSYM-NEXT:     Name: foo_weak_p
333; CHECKSYM-NEXT:     Value (RelocatableAddress): 0xB4
334; CHECKSYM-NEXT:     Section: .data
335; CHECKSYM-NEXT:     Type: 0x0
336; CHECKSYM-NEXT:     StorageClass: C_HIDEXT (0x6B)
337; CHECKSYM-NEXT:     NumberOfAuxEntries: 1
338; CHECKSYM-NEXT:     CSECT Auxiliary Entry {
339; CHECKSYM-NEXT:       Index: [[#Index+23]]
340; CHECKSYM-NEXT:       SectionLen: 4
341; CHECKSYM-NEXT:       ParameterHashIndex: 0x0
342; CHECKSYM-NEXT:       TypeChkSectNum: 0x0
343; CHECKSYM-NEXT:       SymbolAlignmentLog2: 2
344; CHECKSYM-NEXT:       SymbolType: XTY_SD (0x1)
345; CHECKSYM-NEXT:       StorageMappingClass: XMC_TC (0x3)
346; CHECKSYM-NEXT:       StabInfoIndex: 0x0
347; CHECKSYM-NEXT:       StabSectNum: 0x0
348; CHECKSYM-NEXT:     }
349; CHECKSYM-NEXT:   }
350; CHECKSYM-NEXT:   Symbol {
351; CHECKSYM-NEXT:     Index: [[#Index+24]]
352; CHECKSYM-NEXT:     Name: b
353; CHECKSYM-NEXT:     Value (RelocatableAddress): 0xB8
354; CHECKSYM-NEXT:     Section: .data
355; CHECKSYM-NEXT:     Type: 0x0
356; CHECKSYM-NEXT:     StorageClass: C_HIDEXT (0x6B)
357; CHECKSYM-NEXT:     NumberOfAuxEntries: 1
358; CHECKSYM-NEXT:     CSECT Auxiliary Entry {
359; CHECKSYM-NEXT:       Index: [[#Index+25]]
360; CHECKSYM-NEXT:       SectionLen: 4
361; CHECKSYM-NEXT:       ParameterHashIndex: 0x0
362; CHECKSYM-NEXT:       TypeChkSectNum: 0x0
363; CHECKSYM-NEXT:       SymbolAlignmentLog2: 2
364; CHECKSYM-NEXT:       SymbolType: XTY_SD (0x1)
365; CHECKSYM-NEXT:       StorageMappingClass: XMC_TC (0x3)
366; CHECKSYM-NEXT:       StabInfoIndex: 0x0
367; CHECKSYM-NEXT:       StabSectNum: 0x0
368; CHECKSYM-NEXT:     }
369; CHECKSYM-NEXT:   }
370; CHECKSYM-NEXT: ]
371