xref: /llvm-project/llvm/test/DebugInfo/X86/stack_adjustments_trigger_cfa_frame_base.ll (revision 3be667ae5a10e276acf7d1bb7e8c29ba07578032)
1; RUN: llc < %s -filetype=obj -o %t
2; RUN: llvm-dwarfdump -v -debug-info %t | FileCheck %s
3;
4; use core::hint::black_box;
5;
6; #[inline(never)]
7; fn callee(
8;     s1: &(),
9;     s2: &(),
10;     s3: &(),
11;     s4: &(),
12;     s5: &(),
13;     s6: &(),
14;     s7: &(),
15;     s8: &(),
16;     s9: &mut (),
17; ) {
18;     black_box(s1);
19;     black_box(s2);
20;     black_box(s3);
21;     black_box(s4);
22;     black_box(s5);
23;     black_box(s6);
24;     black_box(s7);
25;     black_box(s8);
26;     black_box(s9);
27; }
28;
29; pub fn caller() {
30;     let s = ();
31;     let mut t = ();
32;     callee(&s, &s, &s, &s, &s, &s, &s, &s, &mut t);
33; }
34;
35; Test that if a call requires fiddling with the stack pointer we switch to
36; using a CFA-based DW_AT_frame_base
37
38; CHECK: DW_AT_frame_base [DW_FORM_exprloc] (DW_OP_call_frame_cfa, DW_OP_consts -{{[0-9]+}}, DW_OP_plus)
39; CHECK-NOT: DW_TAG
40; CHECK: _ZN10playground6caller
41
42; ModuleID = 'playground.71f4e8b5-cgu.0'
43source_filename = "playground.71f4e8b5-cgu.0"
44target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
45target triple = "x86_64-unknown-linux-gnu"
46
47; core::hint::black_box
48define align 1 ptr @_ZN4core4hint9black_box17h9f9a3aab786d67e0E(ptr align 1 %dummy) unnamed_addr !dbg !6 {
49start:
50  %0 = alloca ptr, align 8
51  %dummy.dbg.spill = alloca ptr, align 8
52  store ptr %dummy, ptr %dummy.dbg.spill, align 8
53  call void @llvm.dbg.declare(metadata ptr %dummy.dbg.spill, metadata !15, metadata !DIExpression()), !dbg !18
54  store ptr %dummy, ptr %0, align 8, !dbg !19
55  call void asm sideeffect "", "r,~{memory}"(ptr %0), !dbg !19, !srcloc !20
56  %1 = load ptr, ptr %0, align 8, !dbg !19, !nonnull !21, !align !22, !noundef !21
57  ret ptr %1, !dbg !23
58}
59
60; core::hint::black_box
61define align 1 ptr @_ZN4core4hint9black_box17hff24a8f6cdc261d0E(ptr align 1 %dummy) unnamed_addr !dbg !24 {
62start:
63  %0 = alloca ptr, align 8
64  %dummy.dbg.spill = alloca ptr, align 8
65  store ptr %dummy, ptr %dummy.dbg.spill, align 8
66  call void @llvm.dbg.declare(metadata ptr %dummy.dbg.spill, metadata !29, metadata !DIExpression()), !dbg !32
67  store ptr %dummy, ptr %0, align 8, !dbg !33
68  call void asm sideeffect "", "r,~{memory}"(ptr %0), !dbg !33, !srcloc !20
69  %1 = load ptr, ptr %0, align 8, !dbg !33, !nonnull !21, !align !22, !noundef !21
70  ret ptr %1, !dbg !34
71}
72
73; playground::callee
74define internal void @_ZN10playground6callee17hf55947d3dfc887f4E(ptr align 1 %s1, ptr align 1 %s2, ptr align 1 %s3, ptr align 1 %s4, ptr align 1 %s5, ptr align 1 %s6, ptr align 1 %s7, ptr align 1 %s8, ptr align 1 %s9) unnamed_addr !dbg !35 {
75start:
76  %s9.dbg.spill = alloca ptr, align 8
77  %s8.dbg.spill = alloca ptr, align 8
78  %s7.dbg.spill = alloca ptr, align 8
79  %s6.dbg.spill = alloca ptr, align 8
80  %s5.dbg.spill = alloca ptr, align 8
81  %s4.dbg.spill = alloca ptr, align 8
82  %s3.dbg.spill = alloca ptr, align 8
83  %s2.dbg.spill = alloca ptr, align 8
84  %s1.dbg.spill = alloca ptr, align 8
85  store ptr %s1, ptr %s1.dbg.spill, align 8
86  call void @llvm.dbg.declare(metadata ptr %s1.dbg.spill, metadata !41, metadata !DIExpression()), !dbg !50
87  store ptr %s2, ptr %s2.dbg.spill, align 8
88  call void @llvm.dbg.declare(metadata ptr %s2.dbg.spill, metadata !42, metadata !DIExpression()), !dbg !51
89  store ptr %s3, ptr %s3.dbg.spill, align 8
90  call void @llvm.dbg.declare(metadata ptr %s3.dbg.spill, metadata !43, metadata !DIExpression()), !dbg !52
91  store ptr %s4, ptr %s4.dbg.spill, align 8
92  call void @llvm.dbg.declare(metadata ptr %s4.dbg.spill, metadata !44, metadata !DIExpression()), !dbg !53
93  store ptr %s5, ptr %s5.dbg.spill, align 8
94  call void @llvm.dbg.declare(metadata ptr %s5.dbg.spill, metadata !45, metadata !DIExpression()), !dbg !54
95  store ptr %s6, ptr %s6.dbg.spill, align 8
96  call void @llvm.dbg.declare(metadata ptr %s6.dbg.spill, metadata !46, metadata !DIExpression()), !dbg !55
97  store ptr %s7, ptr %s7.dbg.spill, align 8
98  call void @llvm.dbg.declare(metadata ptr %s7.dbg.spill, metadata !47, metadata !DIExpression()), !dbg !56
99  store ptr %s8, ptr %s8.dbg.spill, align 8
100  call void @llvm.dbg.declare(metadata ptr %s8.dbg.spill, metadata !48, metadata !DIExpression()), !dbg !57
101  store ptr %s9, ptr %s9.dbg.spill, align 8
102  call void @llvm.dbg.declare(metadata ptr %s9.dbg.spill, metadata !49, metadata !DIExpression()), !dbg !58
103; call core::hint::black_box
104  %_10 = call align 1 ptr @_ZN4core4hint9black_box17h9f9a3aab786d67e0E(ptr align 1 %s1), !dbg !59
105; call core::hint::black_box
106  %_12 = call align 1 ptr @_ZN4core4hint9black_box17h9f9a3aab786d67e0E(ptr align 1 %s2), !dbg !60
107; call core::hint::black_box
108  %_14 = call align 1 ptr @_ZN4core4hint9black_box17h9f9a3aab786d67e0E(ptr align 1 %s3), !dbg !61
109; call core::hint::black_box
110  %_16 = call align 1 ptr @_ZN4core4hint9black_box17h9f9a3aab786d67e0E(ptr align 1 %s4), !dbg !62
111; call core::hint::black_box
112  %_18 = call align 1 ptr @_ZN4core4hint9black_box17h9f9a3aab786d67e0E(ptr align 1 %s5), !dbg !63
113; call core::hint::black_box
114  %_20 = call align 1 ptr @_ZN4core4hint9black_box17h9f9a3aab786d67e0E(ptr align 1 %s6), !dbg !64
115; call core::hint::black_box
116  %_22 = call align 1 ptr @_ZN4core4hint9black_box17h9f9a3aab786d67e0E(ptr align 1 %s7), !dbg !65
117; call core::hint::black_box
118  %_24 = call align 1 ptr @_ZN4core4hint9black_box17h9f9a3aab786d67e0E(ptr align 1 %s8), !dbg !66
119; call core::hint::black_box
120  %_26 = call align 1 ptr @_ZN4core4hint9black_box17hff24a8f6cdc261d0E(ptr align 1 %s9), !dbg !67
121  ret void, !dbg !68
122}
123
124; playground::caller
125define void @_ZN10playground6caller17h0397b5030166733dE() unnamed_addr !dbg !69 {
126start:
127  %t = alloca {}, align 1
128  %s = alloca {}, align 1
129  call void @llvm.dbg.declare(metadata ptr %s, metadata !73, metadata !DIExpression()), !dbg !77
130  call void @llvm.dbg.declare(metadata ptr %t, metadata !75, metadata !DIExpression()), !dbg !78
131; call playground::callee
132  call void @_ZN10playground6callee17hf55947d3dfc887f4E(ptr align 1 %s, ptr align 1 %s, ptr align 1 %s, ptr align 1 %s, ptr align 1 %s, ptr align 1 %s, ptr align 1 %s, ptr align 1 %s, ptr align 1 %t), !dbg !79
133  ret void, !dbg !80
134}
135
136declare void @llvm.dbg.declare(metadata, metadata, metadata)
137
138!llvm.module.flags = !{!0, !1, !2, !3}
139!llvm.dbg.cu = !{!4}
140
141!0 = !{i32 7, !"PIC Level", i32 2}
142!1 = !{i32 2, !"RtLibUseGOT", i32 1}
143!2 = !{i32 2, !"Dwarf Version", i32 4}
144!3 = !{i32 2, !"Debug Info Version", i32 3}
145!4 = distinct !DICompileUnit(language: DW_LANG_Rust, file: !5, producer: "clang LLVM (rustc version 1.69.0-nightly (e1eaa2d5d 2023-02-06))", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false)
146!5 = !DIFile(filename: "src/lib.rs/@/playground.71f4e8b5-cgu.0", directory: "/playground")
147!6 = distinct !DISubprogram(name: "black_box<&()>", linkageName: "_ZN4core4hint9black_box17h9f9a3aab786d67e0E", scope: !8, file: !7, line: 294, type: !10, scopeLine: 294, flags: DIFlagPrototyped, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition, unit: !4, templateParams: !16, retainedNodes: !14)
148!7 = !DIFile(filename: "/rustc/e1eaa2d5d4d1f5b7b89561a940718058d414e89c/library/core/src/hint.rs", directory: "", checksumkind: CSK_MD5, checksum: "2eba1ee5b9c26bf5eea6ed3dac7a7b79")
149!8 = !DINamespace(name: "hint", scope: !9)
150!9 = !DINamespace(name: "core", scope: null)
151!10 = !DISubroutineType(types: !11)
152!11 = !{!12, !12}
153!12 = !DIDerivedType(tag: DW_TAG_pointer_type, name: "&()", baseType: !13, size: 64, align: 64, dwarfAddressSpace: 0)
154!13 = !DIBasicType(name: "()", encoding: DW_ATE_unsigned)
155!14 = !{!15}
156!15 = !DILocalVariable(name: "dummy", arg: 1, scope: !6, file: !7, line: 294, type: !12)
157!16 = !{!17}
158!17 = !DITemplateTypeParameter(name: "T", type: !12)
159!18 = !DILocation(line: 294, column: 27, scope: !6)
160!19 = !DILocation(line: 295, column: 5, scope: !6)
161!20 = !{i32 382361}
162!21 = !{}
163!22 = !{i64 1}
164!23 = !DILocation(line: 296, column: 2, scope: !6)
165!24 = distinct !DISubprogram(name: "black_box<&mut ()>", linkageName: "_ZN4core4hint9black_box17hff24a8f6cdc261d0E", scope: !8, file: !7, line: 294, type: !25, scopeLine: 294, flags: DIFlagPrototyped, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition, unit: !4, templateParams: !30, retainedNodes: !28)
166!25 = !DISubroutineType(types: !26)
167!26 = !{!27, !27}
168!27 = !DIDerivedType(tag: DW_TAG_pointer_type, name: "&mut ()", baseType: !13, size: 64, align: 64, dwarfAddressSpace: 0)
169!28 = !{!29}
170!29 = !DILocalVariable(name: "dummy", arg: 1, scope: !24, file: !7, line: 294, type: !27)
171!30 = !{!31}
172!31 = !DITemplateTypeParameter(name: "T", type: !27)
173!32 = !DILocation(line: 294, column: 27, scope: !24)
174!33 = !DILocation(line: 295, column: 5, scope: !24)
175!34 = !DILocation(line: 296, column: 2, scope: !24)
176!35 = distinct !DISubprogram(name: "callee", linkageName: "_ZN10playground6callee17hf55947d3dfc887f4E", scope: !37, file: !36, line: 4, type: !38, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagLocalToUnit | DISPFlagDefinition, unit: !4, templateParams: !21, retainedNodes: !40)
177!36 = !DIFile(filename: "src/lib.rs", directory: "/playground", checksumkind: CSK_MD5, checksum: "bb1df4ba7c42e8987c349ab2cbe5f6b6")
178!37 = !DINamespace(name: "playground", scope: null)
179!38 = !DISubroutineType(types: !39)
180!39 = !{null, !12, !12, !12, !12, !12, !12, !12, !12, !27}
181!40 = !{!41, !42, !43, !44, !45, !46, !47, !48, !49}
182!41 = !DILocalVariable(name: "s1", arg: 1, scope: !35, file: !36, line: 5, type: !12)
183!42 = !DILocalVariable(name: "s2", arg: 2, scope: !35, file: !36, line: 6, type: !12)
184!43 = !DILocalVariable(name: "s3", arg: 3, scope: !35, file: !36, line: 7, type: !12)
185!44 = !DILocalVariable(name: "s4", arg: 4, scope: !35, file: !36, line: 8, type: !12)
186!45 = !DILocalVariable(name: "s5", arg: 5, scope: !35, file: !36, line: 9, type: !12)
187!46 = !DILocalVariable(name: "s6", arg: 6, scope: !35, file: !36, line: 10, type: !12)
188!47 = !DILocalVariable(name: "s7", arg: 7, scope: !35, file: !36, line: 11, type: !12)
189!48 = !DILocalVariable(name: "s8", arg: 8, scope: !35, file: !36, line: 12, type: !12)
190!49 = !DILocalVariable(name: "s9", arg: 9, scope: !35, file: !36, line: 13, type: !27)
191!50 = !DILocation(line: 5, column: 5, scope: !35)
192!51 = !DILocation(line: 6, column: 5, scope: !35)
193!52 = !DILocation(line: 7, column: 5, scope: !35)
194!53 = !DILocation(line: 8, column: 5, scope: !35)
195!54 = !DILocation(line: 9, column: 5, scope: !35)
196!55 = !DILocation(line: 10, column: 5, scope: !35)
197!56 = !DILocation(line: 11, column: 5, scope: !35)
198!57 = !DILocation(line: 12, column: 5, scope: !35)
199!58 = !DILocation(line: 13, column: 5, scope: !35)
200!59 = !DILocation(line: 15, column: 5, scope: !35)
201!60 = !DILocation(line: 16, column: 5, scope: !35)
202!61 = !DILocation(line: 17, column: 5, scope: !35)
203!62 = !DILocation(line: 18, column: 5, scope: !35)
204!63 = !DILocation(line: 19, column: 5, scope: !35)
205!64 = !DILocation(line: 20, column: 5, scope: !35)
206!65 = !DILocation(line: 21, column: 5, scope: !35)
207!66 = !DILocation(line: 22, column: 5, scope: !35)
208!67 = !DILocation(line: 23, column: 5, scope: !35)
209!68 = !DILocation(line: 24, column: 2, scope: !35)
210!69 = distinct !DISubprogram(name: "caller", linkageName: "_ZN10playground6caller17h0397b5030166733dE", scope: !37, file: !36, line: 26, type: !70, scopeLine: 26, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !4, templateParams: !21, retainedNodes: !72)
211!70 = !DISubroutineType(types: !71)
212!71 = !{null}
213!72 = !{!73, !75}
214!73 = !DILocalVariable(name: "s", scope: !74, file: !36, line: 27, type: !13, align: 1)
215!74 = distinct !DILexicalBlock(scope: !69, file: !36, line: 27, column: 5)
216!75 = !DILocalVariable(name: "t", scope: !76, file: !36, line: 28, type: !13, align: 1)
217!76 = distinct !DILexicalBlock(scope: !74, file: !36, line: 28, column: 5)
218!77 = !DILocation(line: 27, column: 9, scope: !74)
219!78 = !DILocation(line: 28, column: 9, scope: !76)
220!79 = !DILocation(line: 29, column: 5, scope: !76)
221!80 = !DILocation(line: 30, column: 2, scope: !81)
222!81 = !DILexicalBlockFile(scope: !69, file: !36, discriminator: 0)
223
224