frameproc-flags.ll
18.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
; RUN: llc -filetype=obj %s -o %t.obj
; RUN: llvm-pdbutil dump %t.obj -symbols | FileCheck %s
; A fairly exhaustive test of S_FRAMEPROC flags. Use the source below to compare
; the flags we set with MSVC.
; extern "C" {
;
; void *_alloca(size_t);
; struct __declspec(align(16)) _jmp_buf_str {
; unsigned __int64 Part[2];
; };
; typedef struct _jmp_buf_str jmp_buf[16];
; int __cdecl _setjmp(jmp_buf _Buf);
;
; void may_throw(void);
; void use_intptr(int *);
;
; void use_alloca(int n) {
; int *p = (int*)_alloca(n * sizeof(int));
; use_intptr(p);
; }
;
; jmp_buf g_jbuf;
; void call_setjmp(int n) {
; if (!_setjmp(g_jbuf))
; use_intptr(nullptr);
; }
;
; void use_inlineasm() {
; __asm nop
; }
;
; void cpp_eh() {
; try {
; may_throw();
; } catch (...) {
; }
; }
;
; static inline int is_marked_inline(int x, int y) {
; return x + y;
; }
; int (*use_inline())(int x, int y) {
; return &is_marked_inline;
; }
;
; void seh() {
; __try {
; may_throw();
; } __except (1) {
; }
; }
;
; void __declspec(naked) use_naked() {
; __asm ret
; }
;
; void stack_guard() {
; int arr[12] = {0};
; use_intptr(&arr[0]);
; }
; }
; CHECK-LABEL: S_GPROC32_ID [size = 52] `use_alloca`
; CHECK: S_FRAMEPROC [size = 32]
; CHECK: local fp reg = VFRAME, param fp reg = EBP
; CHECK: flags = has alloca | secure checks | opt speed
; CHECK-LABEL: S_GPROC32_ID [size = 52] `call_setjmp`
; CHECK: S_FRAMEPROC [size = 32]
; CHECK: local fp reg = NONE, param fp reg = NONE
; CHECK: flags = has setjmp | opt speed
; CHECK-LABEL: S_GPROC32_ID [size = 56] `use_inlineasm`
; CHECK: S_FRAMEPROC [size = 32]
; CHECK: local fp reg = NONE, param fp reg = NONE
; CHECK: flags = has inline asm | opt speed
; CHECK-LABEL: S_GPROC32_ID [size = 48] `cpp_eh`
; CHECK: S_FRAMEPROC [size = 32]
; CHECK: local fp reg = EBP, param fp reg = EBP
; CHECK: flags = has eh | opt speed
; CHECK-LABEL: S_GPROC32_ID [size = 52] `use_inline`
; CHECK: S_FRAMEPROC [size = 32]
; CHECK: local fp reg = NONE, param fp reg = NONE
; CHECK: flags = opt speed
; CHECK-LABEL: S_LPROC32_ID [size = 56] `is_marked_inline`
; CHECK: S_FRAMEPROC [size = 32]
; CHECK: local fp reg = NONE, param fp reg = NONE
; CHECK: flags = marked inline | opt speed
; CHECK-LABEL: S_GPROC32_ID [size = 44] `seh`
; CHECK: S_FRAMEPROC [size = 32]
; CHECK: local fp reg = EBP, param fp reg = EBP
; CHECK: flags = has seh | opt speed
; CHECK-LABEL: S_LPROC32_ID [size = 56] `?filt$0@0@seh@@`
; CHECK: S_FRAMEPROC [size = 32]
; CHECK: local fp reg = EBP, param fp reg = EBP
; CHECK: flags = opt speed
; CHECK-LABEL: S_GPROC32_ID [size = 52] `use_naked`
; CHECK: S_FRAMEPROC [size = 32]
; CHECK: local fp reg = NONE, param fp reg = NONE
; CHECK: flags = has inline asm | naked | opt speed
; CHECK-LABEL: S_GPROC32_ID [size = 52] `stack_guard`
; CHECK: S_FRAMEPROC [size = 32]
; CHECK: local fp reg = VFRAME, param fp reg = EBP
; CHECK: flags = secure checks | opt speed
; ModuleID = 'frameproc-flags.cpp'
source_filename = "frameproc-flags.cpp"
target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
target triple = "i386-pc-windows-msvc19.14.26433"
%struct._jmp_buf_str = type { [2 x i64] }
@g_jbuf = dso_local global [16 x %struct._jmp_buf_str] zeroinitializer, align 16, !dbg !0
define dso_local void @use_alloca(i32 %n) local_unnamed_addr #0 !dbg !25 {
entry:
call void @llvm.dbg.value(metadata i32 %n, metadata !29, metadata !DIExpression()), !dbg !31
%mul = shl i32 %n, 2, !dbg !32
%0 = alloca i8, i32 %mul, align 16, !dbg !32
%1 = bitcast i8* %0 to i32*, !dbg !32
call void @llvm.dbg.value(metadata i32* %1, metadata !30, metadata !DIExpression()), !dbg !32
call void @use_intptr(i32* nonnull %1), !dbg !33
ret void, !dbg !34
}
; Function Attrs: nounwind readnone speculatable
declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
; Function Attrs: argmemonly nounwind
declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) #2
declare dso_local void @use_intptr(i32*) local_unnamed_addr #3
; Function Attrs: argmemonly nounwind
declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #2
define dso_local void @call_setjmp(i32 %n) local_unnamed_addr #0 !dbg !35 {
entry:
call void @llvm.dbg.value(metadata i32 %n, metadata !37, metadata !DIExpression()), !dbg !38
%0 = call i32 (i8*, i32, ...) @_setjmp3(i8* bitcast ([16 x %struct._jmp_buf_str]* @g_jbuf to i8*), i32 0) #4, !dbg !39
%tobool = icmp eq i32 %0, 0, !dbg !39
br i1 %tobool, label %if.then, label %if.end, !dbg !39
if.then: ; preds = %entry
call void @use_intptr(i32* null), !dbg !40
br label %if.end, !dbg !40
if.end: ; preds = %entry, %if.then
ret void, !dbg !42
}
; Function Attrs: returns_twice
declare dso_local i32 @_setjmp3(i8*, i32, ...) local_unnamed_addr #4
; Function Attrs: nounwind
define dso_local void @use_inlineasm() local_unnamed_addr #5 !dbg !43 {
entry:
tail call void asm sideeffect inteldialect "nop", "~{dirflag},~{fpsr},~{flags}"() #10, !dbg !46, !srcloc !47
ret void, !dbg !48
}
define dso_local void @cpp_eh() local_unnamed_addr #0 personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) !dbg !49 {
entry:
invoke void @may_throw()
to label %try.cont unwind label %catch.dispatch, !dbg !50
catch.dispatch: ; preds = %entry
%0 = catchswitch within none [label %catch] unwind to caller, !dbg !52
catch: ; preds = %catch.dispatch
%1 = catchpad within %0 [i8* null, i32 64, i8* null], !dbg !52
catchret from %1 to label %try.cont, !dbg !53
try.cont: ; preds = %entry, %catch
ret void, !dbg !55
}
declare dso_local void @may_throw() local_unnamed_addr #3
declare dso_local i32 @__CxxFrameHandler3(...)
; Function Attrs: norecurse nounwind readnone
define dso_local nonnull i32 (i32, i32)* @use_inline() local_unnamed_addr #6 !dbg !56 {
entry:
ret i32 (i32, i32)* @"?is_marked_inline@@YAHHH@Z", !dbg !62
}
; Function Attrs: inlinehint nounwind readnone
define internal i32 @"?is_marked_inline@@YAHHH@Z"(i32 %x, i32 %y) #7 !dbg !63 {
entry:
call void @llvm.dbg.value(metadata i32 %y, metadata !65, metadata !DIExpression()), !dbg !67
call void @llvm.dbg.value(metadata i32 %x, metadata !66, metadata !DIExpression()), !dbg !67
%add = add nsw i32 %y, %x, !dbg !68
ret i32 %add, !dbg !68
}
define dso_local void @seh() #0 personality i8* bitcast (i32 (...)* @_except_handler3 to i8*) !dbg !69 {
entry:
%__exception_code = alloca i32, align 4
call void (...) @llvm.localescape(i32* nonnull %__exception_code)
invoke void @may_throw() #12
to label %__try.cont unwind label %catch.dispatch, !dbg !70
catch.dispatch: ; preds = %entry
%0 = catchswitch within none [label %__except.ret] unwind to caller, !dbg !72
__except.ret: ; preds = %catch.dispatch
%1 = catchpad within %0 [i8* bitcast (i32 ()* @"?filt$0@0@seh@@" to i8*)], !dbg !72
catchret from %1 to label %__try.cont, !dbg !72
__try.cont: ; preds = %entry, %__except.ret
ret void, !dbg !73
}
; Function Attrs: nounwind
define internal i32 @"?filt$0@0@seh@@"() #8 !dbg !74 {
entry:
%0 = tail call i8* @llvm.frameaddress(i32 1)
%1 = tail call i8* @llvm.eh.recoverfp(i8* bitcast (void ()* @seh to i8*), i8* %0)
%2 = tail call i8* @llvm.localrecover(i8* bitcast (void ()* @seh to i8*), i8* %1, i32 0)
%__exception_code = bitcast i8* %2 to i32*
%3 = getelementptr inbounds i8, i8* %0, i32 -20, !dbg !76
%4 = bitcast i8* %3 to { i32*, i8* }**, !dbg !76
%5 = load { i32*, i8* }*, { i32*, i8* }** %4, align 4, !dbg !76
%6 = getelementptr inbounds { i32*, i8* }, { i32*, i8* }* %5, i32 0, i32 0, !dbg !76
%7 = load i32*, i32** %6, align 4, !dbg !76
%8 = load i32, i32* %7, align 4, !dbg !76
store i32 %8, i32* %__exception_code, align 4, !dbg !76
ret i32 1, !dbg !76
}
; Function Attrs: nounwind readnone
declare i8* @llvm.frameaddress(i32) #9
; Function Attrs: nounwind readnone
declare i8* @llvm.eh.recoverfp(i8*, i8*) #9
; Function Attrs: nounwind readnone
declare i8* @llvm.localrecover(i8*, i8*, i32) #9
declare dso_local i32 @_except_handler3(...)
; Function Attrs: nounwind
declare void @llvm.localescape(...) #10
; Function Attrs: naked noinline nounwind
define dso_local void @use_naked() #11 !dbg !77 {
entry:
tail call void asm sideeffect inteldialect "ret", "~{dirflag},~{fpsr},~{flags}"() #10, !dbg !78, !srcloc !79
unreachable, !dbg !80
}
define dso_local void @stack_guard() local_unnamed_addr #0 !dbg !81 {
entry:
%arr = alloca [12 x i32], align 4
%0 = bitcast [12 x i32]* %arr to i8*, !dbg !87
call void @llvm.lifetime.start.p0i8(i64 48, i8* nonnull %0) #10, !dbg !87
call void @llvm.dbg.declare(metadata [12 x i32]* %arr, metadata !83, metadata !DIExpression()), !dbg !87
call void @llvm.memset.p0i8.i32(i8* nonnull align 4 %0, i8 0, i32 48, i1 false), !dbg !87
%arrayidx = getelementptr inbounds [12 x i32], [12 x i32]* %arr, i32 0, i32 0, !dbg !88
call void @use_intptr(i32* nonnull %arrayidx), !dbg !88
call void @llvm.lifetime.end.p0i8(i64 48, i8* nonnull %0) #10, !dbg !89
ret void, !dbg !89
}
; Function Attrs: argmemonly nounwind
declare void @llvm.memset.p0i8.i32(i8* nocapture writeonly, i8, i32, i1) #2
; Function Attrs: nounwind readnone speculatable
declare void @llvm.dbg.value(metadata, metadata, metadata) #1
attributes #0 = { sspstrong "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "frame-pointer"="none" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="pentium4" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { nounwind readnone speculatable }
attributes #2 = { argmemonly nounwind }
attributes #3 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "frame-pointer"="none" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="pentium4" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #4 = { returns_twice }
attributes #5 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "frame-pointer"="none" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="pentium4" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #6 = { norecurse nounwind readnone "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "frame-pointer"="none" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="pentium4" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #7 = { inlinehint nounwind readnone "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "frame-pointer"="none" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="pentium4" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #8 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "frame-pointer"="none" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="pentium4" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #9 = { nounwind readnone }
attributes #10 = { nounwind }
attributes #11 = { naked noinline nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "frame-pointer"="none" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="pentium4" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #12 = { noinline }
!llvm.dbg.cu = !{!2}
!llvm.module.flags = !{!20, !21, !22, !23}
!llvm.ident = !{!24}
!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
!1 = distinct !DIGlobalVariable(name: "g_jbuf", scope: !2, file: !3, line: 18, type: !9, isLocal: false, isDefinition: true)
!2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !3, producer: "clang version 8.0.0 ", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !4, retainedTypes: !5, globals: !8, nameTableKind: None)
!3 = !DIFile(filename: "frameproc-flags.cpp", directory: "C:\5Csrc\5Cllvm-project\5Cbuild", checksumkind: CSK_MD5, checksum: "1dd66a71668512c95552767c3a35300a")
!4 = !{}
!5 = !{!6}
!6 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !7, size: 32)
!7 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
!8 = !{!0}
!9 = !DIDerivedType(tag: DW_TAG_typedef, name: "jmp_buf", file: !3, line: 7, baseType: !10)
!10 = !DICompositeType(tag: DW_TAG_array_type, baseType: !11, size: 2048, elements: !18)
!11 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "_jmp_buf_str", file: !3, line: 4, size: 128, align: 128, flags: DIFlagTypePassByValue, elements: !12, identifier: ".?AU_jmp_buf_str@@")
!12 = !{!13}
!13 = !DIDerivedType(tag: DW_TAG_member, name: "Part", scope: !11, file: !3, line: 5, baseType: !14, size: 128)
!14 = !DICompositeType(tag: DW_TAG_array_type, baseType: !15, size: 128, elements: !16)
!15 = !DIBasicType(name: "long long unsigned int", size: 64, encoding: DW_ATE_unsigned)
!16 = !{!17}
!17 = !DISubrange(count: 2)
!18 = !{!19}
!19 = !DISubrange(count: 16)
!20 = !{i32 1, !"NumRegisterParameters", i32 0}
!21 = !{i32 2, !"CodeView", i32 1}
!22 = !{i32 2, !"Debug Info Version", i32 3}
!23 = !{i32 1, !"wchar_size", i32 2}
!24 = !{!"clang version 8.0.0 "}
!25 = distinct !DISubprogram(name: "use_alloca", scope: !3, file: !3, line: 13, type: !26, isLocal: false, isDefinition: true, scopeLine: 13, flags: DIFlagPrototyped, isOptimized: true, unit: !2, retainedNodes: !28)
!26 = !DISubroutineType(types: !27)
!27 = !{null, !7}
!28 = !{!29, !30}
!29 = !DILocalVariable(name: "n", arg: 1, scope: !25, file: !3, line: 13, type: !7)
!30 = !DILocalVariable(name: "p", scope: !25, file: !3, line: 14, type: !6)
!31 = !DILocation(line: 13, scope: !25)
!32 = !DILocation(line: 14, scope: !25)
!33 = !DILocation(line: 15, scope: !25)
!34 = !DILocation(line: 16, scope: !25)
!35 = distinct !DISubprogram(name: "call_setjmp", scope: !3, file: !3, line: 19, type: !26, isLocal: false, isDefinition: true, scopeLine: 19, flags: DIFlagPrototyped, isOptimized: true, unit: !2, retainedNodes: !36)
!36 = !{!37}
!37 = !DILocalVariable(name: "n", arg: 1, scope: !35, file: !3, line: 19, type: !7)
!38 = !DILocation(line: 19, scope: !35)
!39 = !DILocation(line: 20, scope: !35)
!40 = !DILocation(line: 21, scope: !41)
!41 = distinct !DILexicalBlock(scope: !35, file: !3, line: 20)
!42 = !DILocation(line: 22, scope: !35)
!43 = distinct !DISubprogram(name: "use_inlineasm", scope: !3, file: !3, line: 24, type: !44, isLocal: false, isDefinition: true, scopeLine: 24, flags: DIFlagPrototyped, isOptimized: true, unit: !2, retainedNodes: !4)
!44 = !DISubroutineType(types: !45)
!45 = !{null}
!46 = !DILocation(line: 25, scope: !43)
!47 = !{i32 445}
!48 = !DILocation(line: 26, scope: !43)
!49 = distinct !DISubprogram(name: "cpp_eh", scope: !3, file: !3, line: 28, type: !44, isLocal: false, isDefinition: true, scopeLine: 28, flags: DIFlagPrototyped, isOptimized: true, unit: !2, retainedNodes: !4)
!50 = !DILocation(line: 30, scope: !51)
!51 = distinct !DILexicalBlock(scope: !49, file: !3, line: 29)
!52 = !DILocation(line: 31, scope: !51)
!53 = !DILocation(line: 32, scope: !54)
!54 = distinct !DILexicalBlock(scope: !49, file: !3, line: 31)
!55 = !DILocation(line: 33, scope: !49)
!56 = distinct !DISubprogram(name: "use_inline", scope: !3, file: !3, line: 38, type: !57, isLocal: false, isDefinition: true, scopeLine: 38, flags: DIFlagPrototyped, isOptimized: true, unit: !2, retainedNodes: !4)
!57 = !DISubroutineType(types: !58)
!58 = !{!59}
!59 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !60, size: 32)
!60 = !DISubroutineType(types: !61)
!61 = !{!7, !7, !7}
!62 = !DILocation(line: 39, scope: !56)
!63 = distinct !DISubprogram(name: "is_marked_inline", linkageName: "?is_marked_inline@@YAHHH@Z", scope: !3, file: !3, line: 35, type: !60, isLocal: true, isDefinition: true, scopeLine: 35, flags: DIFlagPrototyped, isOptimized: true, unit: !2, retainedNodes: !64)
!64 = !{!65, !66}
!65 = !DILocalVariable(name: "y", arg: 2, scope: !63, file: !3, line: 35, type: !7)
!66 = !DILocalVariable(name: "x", arg: 1, scope: !63, file: !3, line: 35, type: !7)
!67 = !DILocation(line: 35, scope: !63)
!68 = !DILocation(line: 36, scope: !63)
!69 = distinct !DISubprogram(name: "seh", scope: !3, file: !3, line: 42, type: !44, isLocal: false, isDefinition: true, scopeLine: 42, flags: DIFlagPrototyped, isOptimized: true, unit: !2, retainedNodes: !4)
!70 = !DILocation(line: 44, scope: !71)
!71 = distinct !DILexicalBlock(scope: !69, file: !3, line: 43)
!72 = !DILocation(line: 45, scope: !71)
!73 = !DILocation(line: 47, scope: !69)
!74 = distinct !DISubprogram(linkageName: "?filt$0@0@seh@@", scope: !3, file: !3, line: 45, type: !75, isLocal: true, isDefinition: true, scopeLine: 45, flags: DIFlagArtificial, isOptimized: true, unit: !2, retainedNodes: !4)
!75 = !DISubroutineType(types: !4)
!76 = !DILocation(line: 45, scope: !74)
!77 = distinct !DISubprogram(name: "use_naked", scope: !3, file: !3, line: 49, type: !44, isLocal: false, isDefinition: true, scopeLine: 49, flags: DIFlagPrototyped, isOptimized: true, unit: !2, retainedNodes: !4)
!78 = !DILocation(line: 50, scope: !77)
!79 = !{i32 765}
!80 = !DILocation(line: 51, scope: !77)
!81 = distinct !DISubprogram(name: "stack_guard", scope: !3, file: !3, line: 53, type: !44, isLocal: false, isDefinition: true, scopeLine: 53, flags: DIFlagPrototyped, isOptimized: true, unit: !2, retainedNodes: !82)
!82 = !{!83}
!83 = !DILocalVariable(name: "arr", scope: !81, file: !3, line: 54, type: !84)
!84 = !DICompositeType(tag: DW_TAG_array_type, baseType: !7, size: 384, elements: !85)
!85 = !{!86}
!86 = !DISubrange(count: 12)
!87 = !DILocation(line: 54, scope: !81)
!88 = !DILocation(line: 55, scope: !81)
!89 = !DILocation(line: 56, scope: !81)