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