| ; 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 = 50] `use_alloca` |
| ; CHECK: S_FRAMEPROC [size = 30] |
| ; CHECK: local fp reg = VFRAME, param fp reg = EBP |
| ; CHECK: flags = has alloca | secure checks | opt speed |
| ; CHECK-LABEL: S_GPROC32_ID [size = 51] `call_setjmp` |
| ; CHECK: S_FRAMEPROC [size = 30] |
| ; CHECK: local fp reg = NONE, param fp reg = NONE |
| ; CHECK: flags = has setjmp | opt speed |
| ; CHECK-LABEL: S_GPROC32_ID [size = 53] `use_inlineasm` |
| ; CHECK: S_FRAMEPROC [size = 30] |
| ; CHECK: local fp reg = NONE, param fp reg = NONE |
| ; CHECK: flags = has inline asm | opt speed |
| ; CHECK-LABEL: S_GPROC32_ID [size = 46] `cpp_eh` |
| ; CHECK: S_FRAMEPROC [size = 30] |
| ; CHECK: local fp reg = EBP, param fp reg = EBP |
| ; CHECK: flags = has eh | opt speed |
| ; CHECK-LABEL: S_GPROC32_ID [size = 50] `use_inline` |
| ; CHECK: S_FRAMEPROC [size = 30] |
| ; 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 = 30] |
| ; CHECK: local fp reg = NONE, param fp reg = NONE |
| ; CHECK: flags = marked inline | opt speed |
| ; CHECK-LABEL: S_GPROC32_ID [size = 43] `seh` |
| ; CHECK: S_FRAMEPROC [size = 30] |
| ; CHECK: local fp reg = EBP, param fp reg = EBP |
| ; CHECK: flags = has seh | opt speed |
| ; CHECK-LABEL: S_LPROC32_ID [size = 55] `?filt$0@0@seh@@` |
| ; CHECK: S_FRAMEPROC [size = 30] |
| ; CHECK: local fp reg = EBP, param fp reg = EBP |
| ; CHECK: flags = opt speed |
| ; CHECK-LABEL: S_GPROC32_ID [size = 49] `use_naked` |
| ; CHECK: S_FRAMEPROC [size = 30] |
| ; CHECK: local fp reg = NONE, param fp reg = NONE |
| ; CHECK: flags = has inline asm | naked | opt speed |
| ; CHECK-LABEL: S_GPROC32_ID [size = 51] `stack_guard` |
| ; CHECK: S_FRAMEPROC [size = 30] |
| ; 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.x86.seh.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.x86.seh.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" "no-frame-pointer-elim"="false" "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" "no-frame-pointer-elim"="false" "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" "no-frame-pointer-elim"="false" "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" "no-frame-pointer-elim"="false" "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" "no-frame-pointer-elim"="false" "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" "no-frame-pointer-elim"="false" "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" "no-frame-pointer-elim"="false" "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 | DIFlagTrivial, 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) |