1
2; RUN: llc -debugger-tune=gdb -mtriple powerpc-ibm-aix-xcoff < %s | \
3; RUN:   FileCheck %s
4
5source_filename = "2.c"
6target datalayout = "E-m:a-p:32:32-i64:64-n32"
7
8; Function Attrs: noinline nounwind optnone
9define i32 @bar() #0 !dbg !8 {
10entry:
11  ret i32 1, !dbg !13
12}
13
14; Function Attrs: noinline nounwind optnone
15define i32 @main() #0 section "explicit_main_sec" !dbg !14 {
16entry:
17  %retval = alloca i32, align 4
18  store i32 0, i32* %retval, align 4
19  %call = call i32 @bar(), !dbg !15
20  ret i32 %call, !dbg !16
21}
22
23!llvm.dbg.cu = !{!0}
24!llvm.module.flags = !{!3, !4, !5, !6}
25!llvm.ident = !{!7}
26
27!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 13.0.0", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, nameTableKind: None)
28!1 = !DIFile(filename: "2.c", directory: "debug")
29!2 = !{}
30!3 = !{i32 7, !"Dwarf Version", i32 3}
31!4 = !{i32 2, !"Debug Info Version", i32 3}
32!5 = !{i32 1, !"wchar_size", i32 2}
33!6 = !{i32 7, !"PIC Level", i32 2}
34!7 = !{!"clang version 13.0.0"}
35!8 = distinct !DISubprogram(name: "bar", scope: !9, file: !9, line: 1, type: !10, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2)
36!9 = !DIFile(filename: "2.c", directory: "debug")
37!10 = !DISubroutineType(types: !11)
38!11 = !{!12}
39!12 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
40!13 = !DILocation(line: 1, column: 12, scope: !8)
41!14 = distinct !DISubprogram(name: "main", scope: !9, file: !9, line: 2, type: !10, scopeLine: 2, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2)
42!15 = !DILocation(line: 3, column: 10, scope: !14)
43!16 = !DILocation(line: 3, column: 3, scope: !14)
44
45; CHECK:               .csect .text[PR],5
46; CHECK-NEXT:          .file   "2.c"
47; CHECK-NEXT:          .globl  bar[DS]                         # -- Begin function bar
48; CHECK-NEXT:          .globl  .bar
49; CHECK-NEXT:          .align  2
50; CHECK-NEXT:          .csect bar[DS],2
51; CHECK-NEXT:          .vbyte  4, .bar                         # @bar
52; CHECK-NEXT:          .vbyte  4, TOC[TC0]
53; CHECK-NEXT:          .vbyte  4, 0
54; CHECK-NEXT:          .csect .text[PR],5
55; CHECK-NEXT:  .bar:
56; CHECK-NEXT:  L..func_begin0:
57; CHECK-NEXT:  # %bb.0:                                # %entry
58; CHECK-NEXT:  L..tmp0:
59; CHECK-NEXT:  L..tmp1:
60; CHECK-NEXT:          li 3, 1
61; CHECK-NEXT:          blr
62; CHECK-NEXT:  L..tmp2:
63; CHECK-NEXT:  L..bar0:
64; CHECK-NEXT:          .vbyte  4, 0x00000000                   # Traceback table begin
65; CHECK-NEXT:          .byte   0x00                            # Version = 0
66; CHECK-NEXT:          .byte   0x09                            # Language = CPlusPlus
67; CHECK-NEXT:          .byte   0x20                            # -IsGlobaLinkage, -IsOutOfLineEpilogOrPrologue
68; CHECK-NEXT:                                          # +HasTraceBackTableOffset, -IsInternalProcedure
69; CHECK-NEXT:                                          # -HasControlledStorage, -IsTOCless
70; CHECK-NEXT:                                          # -IsFloatingPointPresent
71; CHECK-NEXT:                                          # -IsFloatingPointOperationLogOrAbortEnabled
72; CHECK-NEXT:          .byte   0x40                            # -IsInterruptHandler, +IsFunctionNamePresent, -IsAllocaUsed
73; CHECK-NEXT:                                          # OnConditionDirective = 0, -IsCRSaved, -IsLRSaved
74; CHECK-NEXT:          .byte   0x80                            # +IsBackChainStored, -IsFixup, NumOfFPRsSaved = 0
75; CHECK-NEXT:          .byte   0x00                            # -HasExtensionTable, -HasVectorInfo, NumOfGPRsSaved = 0
76; CHECK-NEXT:          .byte   0x00                            # NumberOfFixedParms = 0
77; CHECK-NEXT:          .byte   0x01                            # NumberOfFPParms = 0, +HasParmsOnStack
78; CHECK-NEXT:          .vbyte  4, L..bar0-.bar                 # Function size
79; CHECK-NEXT:          .vbyte  2, 0x0003                       # Function name len = 3
80; CHECK-NEXT:          .byte   "bar"                           # Function Name
81; CHECK-NEXT:  L..func_end0:
82; CHECK-NEXT:                                          # -- End function
83; CHECK-NEXT:          .csect explicit_main_sec[PR],5
84; CHECK-NEXT:          .globl  main[DS]                        # -- Begin function main
85; CHECK-NEXT:          .globl  .main
86; CHECK-NEXT:          .align  2
87; CHECK-NEXT:          .csect main[DS],2
88; CHECK-NEXT:          .vbyte  4, .main                        # @main
89; CHECK-NEXT:          .vbyte  4, TOC[TC0]
90; CHECK-NEXT:          .vbyte  4, 0
91; CHECK-NEXT:          .csect explicit_main_sec[PR],5
92; CHECK-NEXT:  .main:
93; CHECK-NEXT:  L..func_begin1:
94; CHECK-NEXT:  # %bb.0:                                # %entry
95; CHECK-NEXT:  L..tmp3:
96; CHECK-NEXT:          mflr 0
97; CHECK-NEXT:          stw 0, 8(1)
98; CHECK-NEXT:          stwu 1, -64(1)
99; CHECK-NEXT:          li 3, 0
100; CHECK-NEXT:          stw 3, 60(1)
101; CHECK-NEXT:  L..tmp4:
102; CHECK-NEXT:  L..tmp5:
103; CHECK-NEXT:          bl .bar
104; CHECK-NEXT:          nop
105; CHECK-NEXT:  L..tmp6:
106; CHECK-NEXT:          addi 1, 1, 64
107; CHECK-NEXT:          lwz 0, 8(1)
108; CHECK-NEXT:          mtlr 0
109; CHECK-NEXT:          blr
110; CHECK-NEXT:  L..tmp7:
111; CHECK-NEXT:  L..main0:
112; CHECK-NEXT:          .vbyte  4, 0x00000000                   # Traceback table begin
113; CHECK-NEXT:          .byte   0x00                            # Version = 0
114; CHECK-NEXT:          .byte   0x09                            # Language = CPlusPlus
115; CHECK-NEXT:          .byte   0x20                            # -IsGlobaLinkage, -IsOutOfLineEpilogOrPrologue
116; CHECK-NEXT:                                          # +HasTraceBackTableOffset, -IsInternalProcedure
117; CHECK-NEXT:                                          # -HasControlledStorage, -IsTOCless
118; CHECK-NEXT:                                          # -IsFloatingPointPresent
119; CHECK-NEXT:                                          # -IsFloatingPointOperationLogOrAbortEnabled
120; CHECK-NEXT:          .byte   0x41                            # -IsInterruptHandler, +IsFunctionNamePresent, -IsAllocaUsed
121; CHECK-NEXT:                                          # OnConditionDirective = 0, -IsCRSaved, +IsLRSaved
122; CHECK-NEXT:          .byte   0x80                            # +IsBackChainStored, -IsFixup, NumOfFPRsSaved = 0
123; CHECK-NEXT:          .byte   0x00                            # -HasExtensionTable, -HasVectorInfo, NumOfGPRsSaved = 0
124; CHECK-NEXT:          .byte   0x00                            # NumberOfFixedParms = 0
125; CHECK-NEXT:          .byte   0x01                            # NumberOfFPParms = 0, +HasParmsOnStack
126; CHECK-NEXT:          .vbyte  4, L..main0-.main               # Function size
127; CHECK-NEXT:          .vbyte  2, 0x0004                       # Function name len = 4
128; CHECK-NEXT:          .byte   "main"                          # Function Name
129; CHECK-NEXT:  L..func_end1:
130; CHECK-NEXT:                                          # -- End function
131; CHECK-NEXT:  L..sec_end0:
132; CHECK:               .dwsect 0x60000
133; CHECK-NEXT:  L...dwabrev:
134; CHECK-NEXT:          .byte   1                               # Abbreviation Code
135; CHECK-NEXT:          .byte   17                              # DW_TAG_compile_unit
136; CHECK-NEXT:          .byte   1                               # DW_CHILDREN_yes
137; CHECK-NEXT:          .byte   37                              # DW_AT_producer
138; CHECK-NEXT:          .byte   14                              # DW_FORM_strp
139; CHECK-NEXT:          .byte   19                              # DW_AT_language
140; CHECK-NEXT:          .byte   5                               # DW_FORM_data2
141; CHECK-NEXT:          .byte   3                               # DW_AT_name
142; CHECK-NEXT:          .byte   14                              # DW_FORM_strp
143; CHECK-NEXT:          .byte   16                              # DW_AT_stmt_list
144; CHECK-NEXT:          .byte   6                               # DW_FORM_data4
145; CHECK-NEXT:          .byte   27                              # DW_AT_comp_dir
146; CHECK-NEXT:          .byte   14                              # DW_FORM_strp
147; CHECK-NEXT:          .byte   17                              # DW_AT_low_pc
148; CHECK-NEXT:          .byte   1                               # DW_FORM_addr
149; CHECK-NEXT:          .byte   85                              # DW_AT_ranges
150; CHECK-NEXT:          .byte   6                               # DW_FORM_data4
151; CHECK-NEXT:          .byte   0                               # EOM(1)
152; CHECK-NEXT:          .byte   0                               # EOM(2)
153; CHECK-NEXT:          .byte   2                               # Abbreviation Code
154; CHECK-NEXT:          .byte   46                              # DW_TAG_subprogram
155; CHECK-NEXT:          .byte   0                               # DW_CHILDREN_no
156; CHECK-NEXT:          .byte   17                              # DW_AT_low_pc
157; CHECK-NEXT:          .byte   1                               # DW_FORM_addr
158; CHECK-NEXT:          .byte   18                              # DW_AT_high_pc
159; CHECK-NEXT:          .byte   1                               # DW_FORM_addr
160; CHECK-NEXT:          .byte   64                              # DW_AT_frame_base
161; CHECK-NEXT:          .byte   10                              # DW_FORM_block1
162; CHECK-NEXT:          .byte   3                               # DW_AT_name
163; CHECK-NEXT:          .byte   14                              # DW_FORM_strp
164; CHECK-NEXT:          .byte   58                              # DW_AT_decl_file
165; CHECK-NEXT:          .byte   11                              # DW_FORM_data1
166; CHECK-NEXT:          .byte   59                              # DW_AT_decl_line
167; CHECK-NEXT:          .byte   11                              # DW_FORM_data1
168; CHECK-NEXT:          .byte   73                              # DW_AT_type
169; CHECK-NEXT:          .byte   19                              # DW_FORM_ref4
170; CHECK-NEXT:          .byte   63                              # DW_AT_external
171; CHECK-NEXT:          .byte   12                              # DW_FORM_flag
172; CHECK-NEXT:          .byte   0                               # EOM(1)
173; CHECK-NEXT:          .byte   0                               # EOM(2)
174; CHECK-NEXT:          .byte   3                               # Abbreviation Code
175; CHECK-NEXT:          .byte   36                              # DW_TAG_base_type
176; CHECK-NEXT:          .byte   0                               # DW_CHILDREN_no
177; CHECK-NEXT:          .byte   3                               # DW_AT_name
178; CHECK-NEXT:          .byte   14                              # DW_FORM_strp
179; CHECK-NEXT:          .byte   62                              # DW_AT_encoding
180; CHECK-NEXT:          .byte   11                              # DW_FORM_data1
181; CHECK-NEXT:          .byte   11                              # DW_AT_byte_size
182; CHECK-NEXT:          .byte   11                              # DW_FORM_data1
183; CHECK-NEXT:          .byte   0                               # EOM(1)
184; CHECK-NEXT:          .byte   0                               # EOM(2)
185; CHECK-NEXT:          .byte   0                               # EOM(3)
186; CHECK:               .dwsect 0x10000
187; CHECK-NEXT:  L...dwinfo:
188; CHECK-NEXT:  L..cu_begin0:
189; CHECK-NEXT:          .vbyte  2, 3                            # DWARF version number
190; CHECK-NEXT:          .vbyte  4, L...dwabrev                  # Offset Into Abbrev. Section
191; CHECK-NEXT:          .byte   4                               # Address Size (in bytes)
192; CHECK-NEXT:          .byte   1                               # Abbrev [1] 0xb:0x4f DW_TAG_compile_unit
193; CHECK-NEXT:          .vbyte  4, L..info_string0              # DW_AT_producer
194; CHECK-NEXT:          .vbyte  2, 12                           # DW_AT_language
195; CHECK-NEXT:          .vbyte  4, L..info_string1              # DW_AT_name
196; CHECK-NEXT:          .vbyte  4, L..line_table_start0         # DW_AT_stmt_list
197; CHECK-NEXT:          .vbyte  4, L..info_string2              # DW_AT_comp_dir
198; CHECK-NEXT:          .vbyte  4, 0                            # DW_AT_low_pc
199; CHECK-NEXT:          .vbyte  4, L..debug_ranges0             # DW_AT_ranges
200; CHECK-NEXT:          .byte   2                               # Abbrev [2] 0x26:0x16 DW_TAG_subprogram
201; CHECK-NEXT:          .vbyte  4, L..func_begin0               # DW_AT_low_pc
202; CHECK-NEXT:          .vbyte  4, L..func_end0                 # DW_AT_high_pc
203; CHECK-NEXT:          .byte   1                               # DW_AT_frame_base
204; CHECK-NEXT:          .byte   81
205; CHECK-NEXT:          .vbyte  4, L..info_string3              # DW_AT_name
206; CHECK-NEXT:          .byte   1                               # DW_AT_decl_file
207; CHECK-NEXT:          .byte   1                               # DW_AT_decl_line
208; CHECK-NEXT:          .vbyte  4, 82                           # DW_AT_type
209; CHECK-NEXT:          .byte   1                               # DW_AT_external
210; CHECK-NEXT:          .byte   2                               # Abbrev [2] 0x3c:0x16 DW_TAG_subprogram
211; CHECK-NEXT:          .vbyte  4, L..func_begin1               # DW_AT_low_pc
212; CHECK-NEXT:          .vbyte  4, L..func_end1                 # DW_AT_high_pc
213; CHECK-NEXT:          .byte   1                               # DW_AT_frame_base
214; CHECK-NEXT:          .byte   81
215; CHECK-NEXT:          .vbyte  4, L..info_string5              # DW_AT_name
216; CHECK-NEXT:          .byte   1                               # DW_AT_decl_file
217; CHECK-NEXT:          .byte   2                               # DW_AT_decl_line
218; CHECK-NEXT:          .vbyte  4, 82                           # DW_AT_type
219; CHECK-NEXT:          .byte   1                               # DW_AT_external
220; CHECK-NEXT:          .byte   3                               # Abbrev [3] 0x52:0x7 DW_TAG_base_type
221; CHECK-NEXT:          .vbyte  4, L..info_string4              # DW_AT_name
222; CHECK-NEXT:          .byte   5                               # DW_AT_encoding
223; CHECK-NEXT:          .byte   4                               # DW_AT_byte_size
224; CHECK-NEXT:          .byte   0                               # End Of Children Mark
225; CHECK-NEXT:  L..debug_info_end0:
226; CHECK:               .dwsect 0x80000
227; CHECK-NEXT:  L...dwrnges:
228; CHECK-NEXT:  L..debug_ranges0:
229; CHECK-NEXT:          .vbyte  4, L..func_begin0
230; CHECK-NEXT:          .vbyte  4, L..func_end0
231; CHECK-NEXT:          .vbyte  4, L..func_begin1
232; CHECK-NEXT:          .vbyte  4, L..func_end1
233; CHECK-NEXT:          .vbyte  4, 0
234; CHECK-NEXT:          .vbyte  4, 0
235; CHECK:               .dwsect 0x70000
236; CHECK-NEXT:  L...dwstr:
237; CHECK-NEXT:  L..info_string0:
238; CHECK-NEXT:  	.string	"clang version 13.0.0"          # string offset=0
239; CHECK-NEXT:  L..info_string1:
240; CHECK-NEXT:  	.string	"2.c"                           # string offset=21
241; CHECK-NEXT:  L..info_string2:
242; CHECK-NEXT:  	.string	"debug"                         # string offset=25
243; CHECK-NEXT:  L..info_string3:
244; CHECK-NEXT:  	.string	"bar"                           # string offset=31
245; CHECK-NEXT:  L..info_string4:
246; CHECK-NEXT:  	.string	"int"                           # string offset=35
247; CHECK-NEXT:  L..info_string5:
248; CHECK-NEXT:  	.string	"main"                          # string offset=39
249; CHECK-NEXT:          .toc
250; CHECK:               .dwsect 0x20000
251; CHECK-NEXT:  L...dwline:
252; CHECK-NEXT:  L..debug_line_0:
253; CHECK-NEXT:  .set L..line_table_start0, L..debug_line_0-4
254; CHECK-NEXT:          .vbyte  2, 3
255; CHECK-NEXT:          .vbyte  4, L..prologue_end0-L..prologue_start0
256; CHECK-NEXT:  L..prologue_start0:
257; CHECK-NEXT:          .byte   4
258; CHECK-NEXT:          .byte   1
259; CHECK-NEXT:          .byte   -5
260; CHECK-NEXT:          .byte   14
261; CHECK-NEXT:          .byte   13
262; CHECK-NEXT:          .byte   0
263; CHECK-NEXT:          .byte   1
264; CHECK-NEXT:          .byte   1
265; CHECK-NEXT:          .byte   1
266; CHECK-NEXT:          .byte   1
267; CHECK-NEXT:          .byte   0
268; CHECK-NEXT:          .byte   0
269; CHECK-NEXT:          .byte   0
270; CHECK-NEXT:          .byte   1
271; CHECK-NEXT:          .byte   0
272; CHECK-NEXT:          .byte   0
273; CHECK-NEXT:          .byte   1
274; CHECK-NEXT:          .byte   "debug"
275; CHECK-NEXT:          .byte   0
276; CHECK-NEXT:          .byte   0
277; CHECK-NEXT:          .byte   "2.c"
278; CHECK-NEXT:          .byte   0
279; CHECK-NEXT:          .byte   1
280; CHECK-NEXT:          .byte   0
281; CHECK-NEXT:          .byte   0
282; CHECK-NEXT:          .byte   0
283; CHECK-NEXT:  L..prologue_end0:
284; CHECK-NEXT:          .byte   0                               # Set address to L..tmp0
285; CHECK-NEXT:          .byte   5
286; CHECK-NEXT:          .byte   2
287; CHECK-NEXT:          .vbyte  4, L..tmp0
288; CHECK-NEXT:          .byte   1                               # Start sequence
289; CHECK-NEXT:          .byte   5
290; CHECK-NEXT:          .byte   12
291; CHECK-NEXT:          .byte   10
292; CHECK-NEXT:          .byte   0                               # Set address to L..tmp1
293; CHECK-NEXT:          .byte   5
294; CHECK-NEXT:          .byte   2
295; CHECK-NEXT:          .vbyte  4, L..tmp1
296; CHECK-NEXT:          .byte   3                               # Advance line 0
297; CHECK-NEXT:          .byte   0
298; CHECK-NEXT:          .byte   1
299; CHECK-NEXT:          .byte   0                               # Set address to L..func_end0
300; CHECK-NEXT:          .byte   5
301; CHECK-NEXT:          .byte   2
302; CHECK-NEXT:          .vbyte  4, L..func_end0
303; CHECK-NEXT:          .byte   0                               # End sequence
304; CHECK-NEXT:          .byte   1
305; CHECK-NEXT:          .byte   1
306; CHECK-NEXT:          .byte   0                               # Set address to L..tmp3
307; CHECK-NEXT:          .byte   5
308; CHECK-NEXT:          .byte   2
309; CHECK-NEXT:          .vbyte  4, L..tmp3
310; CHECK-NEXT:          .byte   19                              # Start sequence
311; CHECK-NEXT:          .byte   5
312; CHECK-NEXT:          .byte   10
313; CHECK-NEXT:          .byte   10
314; CHECK-NEXT:          .byte   0                               # Set address to L..tmp5
315; CHECK-NEXT:          .byte   5
316; CHECK-NEXT:          .byte   2
317; CHECK-NEXT:          .vbyte  4, L..tmp5
318; CHECK-NEXT:          .byte   3                               # Advance line 1
319; CHECK-NEXT:          .byte   1
320; CHECK-NEXT:          .byte   1
321; CHECK-NEXT:          .byte   5
322; CHECK-NEXT:          .byte   3
323; CHECK-NEXT:          .byte   6
324; CHECK-NEXT:          .byte   0                               # Set address to L..tmp6
325; CHECK-NEXT:          .byte   5
326; CHECK-NEXT:          .byte   2
327; CHECK-NEXT:          .vbyte  4, L..tmp6
328; CHECK-NEXT:          .byte   3                               # Advance line 0
329; CHECK-NEXT:          .byte   0
330; CHECK-NEXT:          .byte   1
331; CHECK-NEXT:          .byte   0                               # Set address to L..func_end1
332; CHECK-NEXT:          .byte   5
333; CHECK-NEXT:          .byte   2
334; CHECK-NEXT:          .vbyte  4, L..func_end1
335; CHECK-NEXT:          .byte   0                               # End sequence
336; CHECK-NEXT:          .byte   1
337; CHECK-NEXT:          .byte   1
338; CHECK-NEXT:  L..debug_line_end0:
339