1; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mtriple powerpc-ibm-aix-xcoff < %s | FileCheck %s
2; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mtriple powerpc64-ibm-aix-xcoff < %s | FileCheck %s
3; RUN: llc -verify-machineinstrs -mcpu=pwr4 -mtriple powerpc-ibm-aix-xcoff -filetype=obj -o %t.o < %s
4; RUN: llvm-objdump -D --symbol-description %t.o | FileCheck --check-prefix=CHECKOBJ %s
5; RUN: llvm-readobj -syms %t.o | FileCheck --check-prefix=CHECKSYM %s
6
7@ext_const = constant i32 1, section ".ext_const_sec", align 4
8@ext_var = global i32 1, section ".ext_var_sec", align 4
9@ext_zvar = global i32 0, section ".ext_zvar_sec", align 4
10
11define dso_local signext i32 @ext_fun() section ".ext_fun_sec" {
12entry:
13  %0 = load i32, i32* @ext_const, align 4
14  %1 = load i32, i32* @ext_var, align 4
15  %add = add nsw i32 %0, %1
16  %2 = load i32, i32* @ext_zvar, align 4
17  %add1 = add nsw i32 %add, %2
18  ret i32 %add1
19}
20
21; CHECK:              .globl  ext_fun[DS]                     # -- Begin function ext_fun
22; CHECK-NEXT:         .globl  .ext_fun
23; CHECK-NEXT:         .align  4
24; CHECK-NEXT:         .csect ext_fun[DS]
25; CHECK:              .csect .ext_fun_sec[PR],2
26; CHECK-NEXT: .ext_fun:
27; CHECK:              .csect .ext_const_sec[RO],2
28; CHECK-NEXT:         .globl  ext_const
29; CHECK-NEXT:         .align  2
30; CHECK-NEXT: ext_const:
31; CHECK-NEXT:         .vbyte  4, 1                            # 0x1
32; CHECK-NEXT:         .csect .ext_var_sec[RW],2
33; CHECK-NEXT:         .globl  ext_var
34; CHECK-NEXT:         .align  2
35; CHECK-NEXT: ext_var:
36; CHECK-NEXT:         .vbyte  4, 1                            # 0x1
37; CHECK-NEXT:         .csect .ext_zvar_sec[RW],2
38; CHECK-NEXT:         .globl  ext_zvar
39; CHECK-NEXT:         .align  2
40; CHECK-NEXT: ext_zvar:
41; CHECK-NEXT:         .vbyte  4, 0                            # 0x0
42; CHECK-NEXT:         .toc
43; CHECK-NEXT: L..C0:
44; CHECK-NEXT:         .tc ext_var[TC],ext_var
45; CHECK-NEXT: L..C1:
46; CHECK-NEXT:         .tc ext_zvar[TC],ext_zvar
47
48; CHECKOBJ:        00000000 (idx: 4) .ext_fun:
49; CHECKOBJ-NEXT:          0: 80 62 00 00   lwz 3, 0(2)
50; CHECKOBJ-NEXT:          4: 80 82 00 04   lwz 4, 4(2)
51; CHECKOBJ-NEXT:          8: 80 63 00 00   lwz 3, 0(3)
52; CHECKOBJ-NEXT:          c: 80 84 00 00   lwz 4, 0(4)
53; CHECKOBJ-NEXT:         10: 7c 63 22 14   add 3, 3, 4
54; CHECKOBJ-NEXT:         14: 38 63 00 01   addi 3, 3, 1
55; CHECKOBJ-NEXT:         18: 4e 80 00 20   blr
56; CHECKOBJ-EMPTY:
57; CHECKOBJ-NEXT:   0000001c (idx: 8) ext_const:
58; CHECKOBJ-NEXT:         1c: 00 00 00 01   <unknown>
59; CHECKOBJ-EMPTY:
60; CHECKOBJ-NEXT:   Disassembly of section .data:
61; CHECKOBJ-EMPTY:
62; CHECKOBJ-NEXT:   00000020 (idx: 12) ext_var:
63; CHECKOBJ-NEXT:         20: 00 00 00 01   <unknown>
64; CHECKOBJ-EMPTY:
65; CHECKOBJ-NEXT:   00000024 (idx: 16) ext_zvar:
66; CHECKOBJ-NEXT:         24: 00 00 00 00   <unknown>
67; CHECKOBJ-EMPTY:
68; CHECKOBJ-NEXT:   00000028 (idx: 18) ext_fun[DS]:
69; CHECKOBJ-NEXT:         28: 00 00 00 00   <unknown>
70; CHECKOBJ-NEXT:         2c: 00 00 00 34   <unknown>
71; CHECKOBJ-NEXT:         30: 00 00 00 00   <unknown>
72; CHECKOBJ-EMPTY:
73; CHECKOBJ-NEXT:   00000034 (idx: 22) ext_var[TC]:
74; CHECKOBJ-NEXT:         34: 00 00 00 20   <unknown>
75; CHECKOBJ-EMPTY:
76; CHECKOBJ-NEXT:   00000038 (idx: 24) ext_zvar[TC]:
77; CHECKOBJ-NEXT:         38: 00 00 00 24   <unknown>
78
79; CHECKSYM:       Symbol {{[{][[:space:]] *}}Index: [[#INDX:]]{{[[:space:]] *}}Name: .ext_fun_sec
80; CHECKSYM-NEXT:      Value (RelocatableAddress): 0x0
81; CHECKSYM-NEXT:      Section: .text
82; CHECKSYM-NEXT:      Type: 0x0
83; CHECKSYM-NEXT:      StorageClass: C_HIDEXT (0x6B)
84; CHECKSYM-NEXT:      NumberOfAuxEntries: 1
85; CHECKSYM-NEXT:      CSECT Auxiliary Entry {
86; CHECKSYM-NEXT:        Index: [[#INDX+1]]
87; CHECKSYM-NEXT:        SectionLen: 28
88; CHECKSYM-NEXT:        ParameterHashIndex: 0x0
89; CHECKSYM-NEXT:        TypeChkSectNum: 0x0
90; CHECKSYM-NEXT:        SymbolAlignmentLog2: 4
91; CHECKSYM-NEXT:        SymbolType: XTY_SD (0x1)
92; CHECKSYM-NEXT:        StorageMappingClass: XMC_PR (0x0)
93; CHECKSYM-NEXT:        StabInfoIndex: 0x0
94; CHECKSYM-NEXT:        StabSectNum: 0x0
95; CHECKSYM-NEXT:      }
96; CHECKSYM-NEXT:    }
97; CHECKSYM-NEXT:    Symbol {
98; CHECKSYM-NEXT:      Index: [[#INDX+2]]
99; CHECKSYM-NEXT:      Name: .ext_fun
100; CHECKSYM-NEXT:      Value (RelocatableAddress): 0x0
101; CHECKSYM-NEXT:      Section: .text
102; CHECKSYM-NEXT:      Type: 0x0
103; CHECKSYM-NEXT:      StorageClass: C_EXT (0x2)
104; CHECKSYM-NEXT:      NumberOfAuxEntries: 1
105; CHECKSYM-NEXT:      CSECT Auxiliary Entry {
106; CHECKSYM-NEXT:        Index: [[#INDX+3]]
107; CHECKSYM-NEXT:        ContainingCsectSymbolIndex: [[#INDX]]
108; CHECKSYM-NEXT:        ParameterHashIndex: 0x0
109; CHECKSYM-NEXT:        TypeChkSectNum: 0x0
110; CHECKSYM-NEXT:        SymbolAlignmentLog2: 0
111; CHECKSYM-NEXT:        SymbolType: XTY_LD (0x2)
112; CHECKSYM-NEXT:        StorageMappingClass: XMC_PR (0x0)
113; CHECKSYM-NEXT:        StabInfoIndex: 0x0
114; CHECKSYM-NEXT:        StabSectNum: 0x0
115; CHECKSYM-NEXT:      }
116; CHECKSYM-NEXT:    }
117; CHECKSYM-NEXT:    Symbol {
118; CHECKSYM-NEXT:      Index: [[#INDX+4]]
119; CHECKSYM-NEXT:      Name: .ext_const_sec
120; CHECKSYM-NEXT:      Value (RelocatableAddress): 0x1C
121; CHECKSYM-NEXT:      Section: .text
122; CHECKSYM-NEXT:      Type: 0x0
123; CHECKSYM-NEXT:      StorageClass: C_HIDEXT (0x6B)
124; CHECKSYM-NEXT:      NumberOfAuxEntries: 1
125; CHECKSYM-NEXT:      CSECT Auxiliary Entry {
126; CHECKSYM-NEXT:        Index: [[#INDX+5]]
127; CHECKSYM-NEXT:        SectionLen: 4
128; CHECKSYM-NEXT:        ParameterHashIndex: 0x0
129; CHECKSYM-NEXT:        TypeChkSectNum: 0x0
130; CHECKSYM-NEXT:        SymbolAlignmentLog2: 2
131; CHECKSYM-NEXT:        SymbolType: XTY_SD (0x1)
132; CHECKSYM-NEXT:        StorageMappingClass: XMC_RO (0x1)
133; CHECKSYM-NEXT:        StabInfoIndex: 0x0
134; CHECKSYM-NEXT:        StabSectNum: 0x0
135; CHECKSYM-NEXT:      }
136; CHECKSYM-NEXT:    }
137; CHECKSYM-NEXT:    Symbol {
138; CHECKSYM-NEXT:      Index: [[#INDX+6]]
139; CHECKSYM-NEXT:      Name: ext_const
140; CHECKSYM-NEXT:      Value (RelocatableAddress): 0x1C
141; CHECKSYM-NEXT:      Section: .text
142; CHECKSYM-NEXT:      Type: 0x0
143; CHECKSYM-NEXT:      StorageClass: C_EXT (0x2)
144; CHECKSYM-NEXT:      NumberOfAuxEntries: 1
145; CHECKSYM-NEXT:      CSECT Auxiliary Entry {
146; CHECKSYM-NEXT:        Index: [[#INDX+7]]
147; CHECKSYM-NEXT:        ContainingCsectSymbolIndex: [[#INDX+4]]
148; CHECKSYM-NEXT:        ParameterHashIndex: 0x0
149; CHECKSYM-NEXT:        TypeChkSectNum: 0x0
150; CHECKSYM-NEXT:        SymbolAlignmentLog2: 0
151; CHECKSYM-NEXT:        SymbolType: XTY_LD (0x2)
152; CHECKSYM-NEXT:        StorageMappingClass: XMC_RO (0x1)
153; CHECKSYM-NEXT:        StabInfoIndex: 0x0
154; CHECKSYM-NEXT:        StabSectNum: 0x0
155; CHECKSYM-NEXT:      }
156; CHECKSYM-NEXT:    }
157; CHECKSYM-NEXT:    Symbol {
158; CHECKSYM-NEXT:      Index: [[#INDX+8]]
159; CHECKSYM-NEXT:      Name: .ext_var_sec
160; CHECKSYM-NEXT:      Value (RelocatableAddress): 0x20
161; CHECKSYM-NEXT:      Section: .data
162; CHECKSYM-NEXT:      Type: 0x0
163; CHECKSYM-NEXT:      StorageClass: C_HIDEXT (0x6B)
164; CHECKSYM-NEXT:      NumberOfAuxEntries: 1
165; CHECKSYM-NEXT:      CSECT Auxiliary Entry {
166; CHECKSYM-NEXT:        Index: [[#INDX+9]]
167; CHECKSYM-NEXT:        SectionLen: 4
168; CHECKSYM-NEXT:        ParameterHashIndex: 0x0
169; CHECKSYM-NEXT:        TypeChkSectNum: 0x0
170; CHECKSYM-NEXT:        SymbolAlignmentLog2: 2
171; CHECKSYM-NEXT:        SymbolType: XTY_SD (0x1)
172; CHECKSYM-NEXT:        StorageMappingClass: XMC_RW (0x5)
173; CHECKSYM-NEXT:        StabInfoIndex: 0x0
174; CHECKSYM-NEXT:        StabSectNum: 0x0
175; CHECKSYM-NEXT:      }
176; CHECKSYM-NEXT:    }
177; CHECKSYM-NEXT:    Symbol {
178; CHECKSYM-NEXT:      Index: [[#INDX+10]]
179; CHECKSYM-NEXT:      Name: ext_var
180; CHECKSYM-NEXT:      Value (RelocatableAddress): 0x20
181; CHECKSYM-NEXT:      Section: .data
182; CHECKSYM-NEXT:      Type: 0x0
183; CHECKSYM-NEXT:      StorageClass: C_EXT (0x2)
184; CHECKSYM-NEXT:      NumberOfAuxEntries: 1
185; CHECKSYM-NEXT:      CSECT Auxiliary Entry {
186; CHECKSYM-NEXT:        Index: [[#INDX+11]]
187; CHECKSYM-NEXT:        ContainingCsectSymbolIndex: [[#INDX+8]]
188; CHECKSYM-NEXT:        ParameterHashIndex: 0x0
189; CHECKSYM-NEXT:        TypeChkSectNum: 0x0
190; CHECKSYM-NEXT:        SymbolAlignmentLog2: 0
191; CHECKSYM-NEXT:        SymbolType: XTY_LD (0x2)
192; CHECKSYM-NEXT:        StorageMappingClass: XMC_RW (0x5)
193; CHECKSYM-NEXT:        StabInfoIndex: 0x0
194; CHECKSYM-NEXT:        StabSectNum: 0x0
195; CHECKSYM-NEXT:      }
196; CHECKSYM-NEXT:    }
197; CHECKSYM-NEXT:    Symbol {
198; CHECKSYM-NEXT:      Index: [[#INDX+12]]
199; CHECKSYM-NEXT:      Name: .ext_zvar_sec
200; CHECKSYM-NEXT:      Value (RelocatableAddress): 0x24
201; CHECKSYM-NEXT:      Section: .data
202; CHECKSYM-NEXT:      Type: 0x0
203; CHECKSYM-NEXT:      StorageClass: C_HIDEXT (0x6B)
204; CHECKSYM-NEXT:      NumberOfAuxEntries: 1
205; CHECKSYM-NEXT:      CSECT Auxiliary Entry {
206; CHECKSYM-NEXT:        Index: [[#INDX+13]]
207; CHECKSYM-NEXT:        SectionLen: 4
208; CHECKSYM-NEXT:        ParameterHashIndex: 0x0
209; CHECKSYM-NEXT:        TypeChkSectNum: 0x0
210; CHECKSYM-NEXT:        SymbolAlignmentLog2: 2
211; CHECKSYM-NEXT:        SymbolType: XTY_SD (0x1)
212; CHECKSYM-NEXT:        StorageMappingClass: XMC_RW (0x5)
213; CHECKSYM-NEXT:        StabInfoIndex: 0x0
214; CHECKSYM-NEXT:        StabSectNum: 0x0
215; CHECKSYM-NEXT:      }
216; CHECKSYM-NEXT:    }
217; CHECKSYM-NEXT:    Symbol {
218; CHECKSYM-NEXT:      Index: [[#INDX+14]]
219; CHECKSYM-NEXT:      Name: ext_zvar
220; CHECKSYM-NEXT:      Value (RelocatableAddress): 0x24
221; CHECKSYM-NEXT:      Section: .data
222; CHECKSYM-NEXT:      Type: 0x0
223; CHECKSYM-NEXT:      StorageClass: C_EXT (0x2)
224; CHECKSYM-NEXT:      NumberOfAuxEntries: 1
225; CHECKSYM-NEXT:      CSECT Auxiliary Entry {
226; CHECKSYM-NEXT:        Index: [[#INDX+15]]
227; CHECKSYM-NEXT:        ContainingCsectSymbolIndex: [[#INDX+12]]
228; CHECKSYM-NEXT:        ParameterHashIndex: 0x0
229; CHECKSYM-NEXT:        TypeChkSectNum: 0x0
230; CHECKSYM-NEXT:        SymbolAlignmentLog2: 0
231; CHECKSYM-NEXT:        SymbolType: XTY_LD (0x2)
232; CHECKSYM-NEXT:        StorageMappingClass: XMC_RW (0x5)
233; CHECKSYM-NEXT:        StabInfoIndex: 0x0
234; CHECKSYM-NEXT:        StabSectNum: 0x0
235; CHECKSYM-NEXT:      }
236; CHECKSYM-NEXT:    }
237; CHECKSYM-NEXT:    Symbol {
238; CHECKSYM-NEXT:      Index: [[#INDX+16]]
239; CHECKSYM-NEXT:      Name: ext_fun
240; CHECKSYM-NEXT:      Value (RelocatableAddress): 0x28
241; CHECKSYM-NEXT:      Section: .data
242; CHECKSYM-NEXT:      Type: 0x0
243; CHECKSYM-NEXT:      StorageClass: C_EXT (0x2)
244; CHECKSYM-NEXT:      NumberOfAuxEntries: 1
245; CHECKSYM-NEXT:      CSECT Auxiliary Entry {
246; CHECKSYM-NEXT:        Index: [[#INDX+17]]
247; CHECKSYM-NEXT:        SectionLen: 12
248; CHECKSYM-NEXT:        ParameterHashIndex: 0x0
249; CHECKSYM-NEXT:        TypeChkSectNum: 0x0
250; CHECKSYM-NEXT:        SymbolAlignmentLog2: 2
251; CHECKSYM-NEXT:        SymbolType: XTY_SD (0x1)
252; CHECKSYM-NEXT:        StorageMappingClass: XMC_DS (0xA)
253; CHECKSYM-NEXT:        StabInfoIndex: 0x0
254; CHECKSYM-NEXT:        StabSectNum: 0x0
255; CHECKSYM-NEXT:      }
256; CHECKSYM-NEXT:    }
257