From 6981a4702a93de00d03efdf260add96dfd3661df Mon Sep 17 00:00:00 2001 From: Jan Civlin <30603832+jcivlin@users.noreply.github.com> Date: Thu, 14 Mar 2024 07:20:44 -0700 Subject: [PATCH] More load-store instructions debug support (#436) --- .../move-to-solana/src/stackless/translate.rs | 37 +++-- .../0x1__signer.ll.debug_info.expected | 16 +- .../0x101__vector.ll.debug_info.expected | 137 ++++++++++++++---- 3 files changed, 149 insertions(+), 41 deletions(-) diff --git a/language/solana/move-to-solana/src/stackless/translate.rs b/language/solana/move-to-solana/src/stackless/translate.rs index 2ad0658550..6ddb93e12a 100644 --- a/language/solana/move-to-solana/src/stackless/translate.rs +++ b/language/solana/move-to-solana/src/stackless/translate.rs @@ -384,7 +384,8 @@ impl<'mm, 'up> FunctionContext<'mm, 'up> { instr_dbg.create_load_store(load, store, mty, llty, src_llval, dst_llval); } mty::Type::Reference(_, _) => { - builder.load_store(llty, src_llval, dst_llval); + let (load, store) = builder.load_store(llty, src_llval, dst_llval); + instr_dbg.create_load_store(load, store, mty, llty, src_llval, dst_llval); } mty::Type::Struct(_, _, _) => { // A move renders the source location inaccessible, but the storage is @@ -401,9 +402,11 @@ impl<'mm, 'up> FunctionContext<'mm, 'up> { self.locals[*dst] = self.locals[*src].clone(); } mty::Type::Vector(_) => { - self.module_cx + let (load, store) = self + .module_cx .llvm_builder .load_store(llty, src_llval, dst_llval); + instr_dbg.create_load_store(load, store, mty, llty, src_llval, dst_llval); } _ => todo!("{mty:?}"), } @@ -423,13 +426,16 @@ impl<'mm, 'up> FunctionContext<'mm, 'up> { | mty::PrimitiveType::U128 | mty::PrimitiveType::U256, ) => { - builder.load_store(llty, src_llval, dst_llval); + let (load, store) = builder.load_store(llty, src_llval, dst_llval); + instr_dbg.create_load_store(load, store, mty, llty, src_llval, dst_llval); } mty::Type::Struct(_, _, _) => { - builder.load_store(llty, src_llval, dst_llval); + let (load, store) = builder.load_store(llty, src_llval, dst_llval); + instr_dbg.create_load_store(load, store, mty, llty, src_llval, dst_llval); } mty::Type::Primitive(mty::PrimitiveType::Address) => { - builder.load_store(llty, src_llval, dst_llval); + let (load, store) = builder.load_store(llty, src_llval, dst_llval); + instr_dbg.create_load_store(load, store, mty, llty, src_llval, dst_llval); } mty::Type::Vector(elt_mty) => { self.module_cx.emit_rtcall_with_retval(RtCall::VecCopy( @@ -440,10 +446,14 @@ impl<'mm, 'up> FunctionContext<'mm, 'up> { } mty::Type::Reference(_, referent) => match **referent { mty::Type::Struct(_, _, _) => { - builder.load_store(llty, src_llval, dst_llval); + let (load, store) = builder.load_store(llty, src_llval, dst_llval); + instr_dbg + .create_load_store(load, store, mty, llty, src_llval, dst_llval); } _ => { - builder.load_store(llty, src_llval, dst_llval); + let (load, store) = builder.load_store(llty, src_llval, dst_llval); + instr_dbg + .create_load_store(load, store, mty, llty, src_llval, dst_llval); } }, _ => todo!("{mty:?}"), @@ -466,18 +476,23 @@ impl<'mm, 'up> FunctionContext<'mm, 'up> { | mty::PrimitiveType::Address | mty::PrimitiveType::Signer, ) => { - builder.load_store(llty, src_llval, dst_llval); + let (load, store) = builder.load_store(llty, src_llval, dst_llval); + instr_dbg.create_load_store(load, store, mty, llty, src_llval, dst_llval); } mty::Type::Reference(_, _) => { - builder.load_store(llty, src_llval, dst_llval); + let (load, store) = builder.load_store(llty, src_llval, dst_llval); + instr_dbg.create_load_store(load, store, mty, llty, src_llval, dst_llval); } mty::Type::Struct(_, _, _) => { - builder.load_store(llty, src_llval, dst_llval); + let (load, store) = builder.load_store(llty, src_llval, dst_llval); + instr_dbg.create_load_store(load, store, mty, llty, src_llval, dst_llval); } mty::Type::Vector(_) => { - self.module_cx + let (load, store) = self + .module_cx .llvm_builder .load_store(llty, src_llval, dst_llval); + instr_dbg.create_load_store(load, store, mty, llty, src_llval, dst_llval); } _ => todo!("{mty:#?}"), } diff --git a/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/basic-coin-build/0x1__signer.ll.debug_info.expected b/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/basic-coin-build/0x1__signer.ll.debug_info.expected index 5d18124059..ec7700f9d4 100644 --- a/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/basic-coin-build/0x1__signer.ll.debug_info.expected +++ b/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/basic-coin-build/0x1__signer.ll.debug_info.expected @@ -12,8 +12,10 @@ entry: %local_2 = alloca ptr, align 8 %local_3 = alloca [32 x i8], align 1 store ptr %s, ptr %local_0, align 8 - %load_store_tmp = load ptr, ptr %local_0, align 8 - store ptr %load_store_tmp, ptr %local_1, align 8 + %load_store_tmp = load ptr, ptr %local_0, align 8, !dbg !10 + store ptr %load_store_tmp, ptr %local_1, align 8, !dbg !10 + call void @llvm.dbg.declare(metadata ptr %local_0, metadata !11, metadata !DIExpression()), !dbg !10 + call void @llvm.dbg.declare(metadata ptr %local_1, metadata !13, metadata !DIExpression()), !dbg !10 %loaded_alloca = load ptr, ptr %local_1, align 8 %retval = call ptr @move_native_signer_borrow_address(ptr %loaded_alloca) store ptr %retval, ptr %local_2, align 8 @@ -26,6 +28,11 @@ entry: declare ptr @move_native_signer_borrow_address(ptr) +; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none) +declare void @llvm.dbg.declare(metadata, metadata, metadata) #0 + +attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) } + !llvm.dbg.cu = !{!0} !address_of = !{!2, !7, !8, !9} @@ -39,3 +46,8 @@ declare ptr @move_native_signer_borrow_address(ptr) !7 = distinct !DILexicalBlock(scope: !2, file: !1, line: 10) !8 = !DINamespace(name: "address_of", scope: !1) !9 = !DILocation(line: 11, column: 4, scope: !7) +!10 = !DILocation(line: 13, column: 25, scope: !2) +!11 = !DILocalVariable(name: "load_store_./../../../../../move-stdlib/sources/signer.move_13_s", scope: !12, file: !1, line: 13, type: !5) +!12 = distinct !DILexicalBlock(scope: !2, file: !1, line: 13, column: 25) +!13 = !DILocalVariable(name: "load_store_./../../../../../move-stdlib/sources/signer.move_13_s", scope: !14, file: !1, line: 13, type: !5) +!14 = distinct !DILexicalBlock(scope: !2, file: !1, line: 13, column: 25) diff --git a/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/dwarf-vector-build/0x101__vector.ll.debug_info.expected b/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/dwarf-vector-build/0x101__vector.ll.debug_info.expected index ab55f0893a..36a6d67519 100644 --- a/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/dwarf-vector-build/0x101__vector.ll.debug_info.expected +++ b/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/dwarf-vector-build/0x101__vector.ll.debug_info.expected @@ -66,15 +66,21 @@ entry: %insert_0 = insertvalue %struct.vector__Foo undef, i64 %fv.0, 0 %insert_1 = insertvalue %struct.vector__Foo %insert_0, i1 %fv.1, 1 store %struct.vector__Foo %insert_1, ptr %local_6, align 8 - %load_store_tmp = load %struct.vector__Foo, ptr %local_6, align 8 - store %struct.vector__Foo %load_store_tmp, ptr %local_3, align 8 - %load_store_tmp1 = load %struct.vector__Foo, ptr %local_3, align 8 - store %struct.vector__Foo %load_store_tmp1, ptr %local_7, align 8 + %load_store_tmp = load %struct.vector__Foo, ptr %local_6, align 8, !dbg !36 + store %struct.vector__Foo %load_store_tmp, ptr %local_3, align 8, !dbg !36 + call void @llvm.dbg.declare(metadata ptr %local_6, metadata !37, metadata !DIExpression()), !dbg !36 + call void @llvm.dbg.declare(metadata ptr %local_3, metadata !39, metadata !DIExpression()), !dbg !36 + %load_store_tmp1 = load %struct.vector__Foo, ptr %local_3, align 8, !dbg !41 + store %struct.vector__Foo %load_store_tmp1, ptr %local_7, align 8, !dbg !41 + call void @llvm.dbg.declare(metadata ptr %local_3, metadata !42, metadata !DIExpression()), !dbg !41 + call void @llvm.dbg.declare(metadata ptr %local_7, metadata !44, metadata !DIExpression()), !dbg !41 %call_arg_0 = load %struct.vector__Foo, ptr %local_7, align 8 - %retval = call { ptr, i64, i64 } @"0000000000000101_vector_singleton_2hb84uZexr9BHm"(%struct.vector__Foo %call_arg_0), !dbg !36 + %retval = call { ptr, i64, i64 } @"0000000000000101_vector_singleton_2hb84uZexr9BHm"(%struct.vector__Foo %call_arg_0), !dbg !46 store { ptr, i64, i64 } %retval, ptr %local_8, align 8 - %load_store_tmp2 = load { ptr, i64, i64 }, ptr %local_8, align 8 - store { ptr, i64, i64 } %load_store_tmp2, ptr %local_0, align 8 + %load_store_tmp2 = load { ptr, i64, i64 }, ptr %local_8, align 8, !dbg !46 + store { ptr, i64, i64 } %load_store_tmp2, ptr %local_0, align 8, !dbg !46 + call void @llvm.dbg.declare(metadata ptr %local_8, metadata !47, metadata !DIExpression()), !dbg !46 + call void @llvm.dbg.declare(metadata ptr %local_0, metadata !50, metadata !DIExpression()), !dbg !46 store ptr %local_0, ptr %local_9, align 8 store i64 0, ptr %local_10, align 8 %loaded_alloca = load ptr, ptr %local_9, align 8 @@ -84,8 +90,10 @@ entry: %load_deref_store_tmp1 = load ptr, ptr %local_11, align 8 %load_deref_store_tmp2 = load %struct.vector__Foo, ptr %load_deref_store_tmp1, align 8 store %struct.vector__Foo %load_deref_store_tmp2, ptr %local_12, align 8 - %load_store_tmp5 = load %struct.vector__Foo, ptr %local_3, align 8 - store %struct.vector__Foo %load_store_tmp5, ptr %local_13, align 8 + %load_store_tmp5 = load %struct.vector__Foo, ptr %local_3, align 8, !dbg !52 + store %struct.vector__Foo %load_store_tmp5, ptr %local_13, align 8, !dbg !52 + call void @llvm.dbg.declare(metadata ptr %local_3, metadata !53, metadata !DIExpression()), !dbg !52 + call void @llvm.dbg.declare(metadata ptr %local_13, metadata !55, metadata !DIExpression()), !dbg !52 %0 = call i1 @move_rt_struct_cmp_eq(ptr @__move_rttydesc_vector__Foo, ptr %local_12, ptr %local_13) store i1 %0, ptr %local_14, align 1 %cnd = load i1, ptr %local_14, align 1 @@ -104,15 +112,21 @@ bb_2: ; preds = %bb_1 %fv.07 = load %struct.vector__Foo, ptr %local_3, align 8 %insert_08 = insertvalue %struct.vector__Bar undef, %struct.vector__Foo %fv.07, 0 store %struct.vector__Bar %insert_08, ptr %local_17, align 8 - %load_store_tmp9 = load %struct.vector__Bar, ptr %local_17, align 8 - store %struct.vector__Bar %load_store_tmp9, ptr %local_2, align 8 - %load_store_tmp10 = load %struct.vector__Bar, ptr %local_2, align 8 - store %struct.vector__Bar %load_store_tmp10, ptr %local_18, align 8 + %load_store_tmp9 = load %struct.vector__Bar, ptr %local_17, align 8, !dbg !57 + store %struct.vector__Bar %load_store_tmp9, ptr %local_2, align 8, !dbg !57 + call void @llvm.dbg.declare(metadata ptr %local_17, metadata !58, metadata !DIExpression()), !dbg !57 + call void @llvm.dbg.declare(metadata ptr %local_2, metadata !60, metadata !DIExpression()), !dbg !57 + %load_store_tmp10 = load %struct.vector__Bar, ptr %local_2, align 8, !dbg !62 + store %struct.vector__Bar %load_store_tmp10, ptr %local_18, align 8, !dbg !62 + call void @llvm.dbg.declare(metadata ptr %local_2, metadata !63, metadata !DIExpression()), !dbg !62 + call void @llvm.dbg.declare(metadata ptr %local_18, metadata !65, metadata !DIExpression()), !dbg !62 %call_arg_011 = load %struct.vector__Bar, ptr %local_18, align 8 - %retval12 = call { ptr, i64, i64 } @"0000000000000101_vector_singleton_39QxpzcPR6oc9x"(%struct.vector__Bar %call_arg_011), !dbg !37 + %retval12 = call { ptr, i64, i64 } @"0000000000000101_vector_singleton_39QxpzcPR6oc9x"(%struct.vector__Bar %call_arg_011), !dbg !67 store { ptr, i64, i64 } %retval12, ptr %local_19, align 8 - %load_store_tmp13 = load { ptr, i64, i64 }, ptr %local_19, align 8 - store { ptr, i64, i64 } %load_store_tmp13, ptr %local_1, align 8 + %load_store_tmp13 = load { ptr, i64, i64 }, ptr %local_19, align 8, !dbg !68 + store { ptr, i64, i64 } %load_store_tmp13, ptr %local_1, align 8, !dbg !68 + call void @llvm.dbg.declare(metadata ptr %local_19, metadata !69, metadata !DIExpression()), !dbg !68 + call void @llvm.dbg.declare(metadata ptr %local_1, metadata !71, metadata !DIExpression()), !dbg !68 store ptr %local_1, ptr %local_20, align 8 store i64 0, ptr %local_21, align 8 %loaded_alloca14 = load ptr, ptr %local_20, align 8 @@ -151,13 +165,17 @@ entry: store %struct.vector__Foo %e, ptr %local_0, align 8 %retval = call { ptr, i64, i64 } @move_native_vector_empty(ptr @__move_rttydesc_vector__Foo) store { ptr, i64, i64 } %retval, ptr %local_2, align 8 - %load_store_tmp = load { ptr, i64, i64 }, ptr %local_2, align 8 - store { ptr, i64, i64 } %load_store_tmp, ptr %local_1, align 8 + %load_store_tmp = load { ptr, i64, i64 }, ptr %local_2, align 8, !dbg !73 + store { ptr, i64, i64 } %load_store_tmp, ptr %local_1, align 8, !dbg !73 + call void @llvm.dbg.declare(metadata ptr %local_2, metadata !74, metadata !DIExpression()), !dbg !73 + call void @llvm.dbg.declare(metadata ptr %local_1, metadata !76, metadata !DIExpression()), !dbg !73 store ptr %local_1, ptr %local_3, align 8 %loaded_alloca = load ptr, ptr %local_3, align 8 call void @move_native_vector_push_back(ptr @__move_rttydesc_vector__Foo, ptr %loaded_alloca, ptr %local_0) - %load_store_tmp1 = load { ptr, i64, i64 }, ptr %local_1, align 8 - store { ptr, i64, i64 } %load_store_tmp1, ptr %local_5, align 8 + %load_store_tmp1 = load { ptr, i64, i64 }, ptr %local_1, align 8, !dbg !78 + store { ptr, i64, i64 } %load_store_tmp1, ptr %local_5, align 8, !dbg !78 + call void @llvm.dbg.declare(metadata ptr %local_1, metadata !79, metadata !DIExpression()), !dbg !78 + call void @llvm.dbg.declare(metadata ptr %local_5, metadata !81, metadata !DIExpression()), !dbg !78 %retval2 = load { ptr, i64, i64 }, ptr %local_5, align 8 ret { ptr, i64, i64 } %retval2 } @@ -173,23 +191,31 @@ entry: store %struct.vector__Bar %e, ptr %local_0, align 8 %retval = call { ptr, i64, i64 } @move_native_vector_empty(ptr @__move_rttydesc_vector__Bar) store { ptr, i64, i64 } %retval, ptr %local_2, align 8 - %load_store_tmp = load { ptr, i64, i64 }, ptr %local_2, align 8 - store { ptr, i64, i64 } %load_store_tmp, ptr %local_1, align 8 + %load_store_tmp = load { ptr, i64, i64 }, ptr %local_2, align 8, !dbg !83 + store { ptr, i64, i64 } %load_store_tmp, ptr %local_1, align 8, !dbg !83 + call void @llvm.dbg.declare(metadata ptr %local_2, metadata !84, metadata !DIExpression()), !dbg !83 + call void @llvm.dbg.declare(metadata ptr %local_1, metadata !86, metadata !DIExpression()), !dbg !83 store ptr %local_1, ptr %local_3, align 8 %loaded_alloca = load ptr, ptr %local_3, align 8 call void @move_native_vector_push_back(ptr @__move_rttydesc_vector__Bar, ptr %loaded_alloca, ptr %local_0) - %load_store_tmp1 = load { ptr, i64, i64 }, ptr %local_1, align 8 - store { ptr, i64, i64 } %load_store_tmp1, ptr %local_5, align 8 + %load_store_tmp1 = load { ptr, i64, i64 }, ptr %local_1, align 8, !dbg !88 + store { ptr, i64, i64 } %load_store_tmp1, ptr %local_5, align 8, !dbg !88 + call void @llvm.dbg.declare(metadata ptr %local_1, metadata !89, metadata !DIExpression()), !dbg !88 + call void @llvm.dbg.declare(metadata ptr %local_5, metadata !91, metadata !DIExpression()), !dbg !88 %retval2 = load { ptr, i64, i64 }, ptr %local_5, align 8 ret { ptr, i64, i64 } %retval2 } +; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none) +declare void @llvm.dbg.declare(metadata, metadata, metadata) #0 + declare i1 @move_rt_struct_cmp_eq(ptr nonnull readonly dereferenceable(32), ptr nonnull readonly, ptr nonnull readonly) ; Function Attrs: cold noreturn -declare void @move_rt_abort(i64) #0 +declare void @move_rt_abort(i64) #1 -attributes #0 = { cold noreturn } +attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) } +attributes #1 = { cold noreturn } !llvm.dbg.cu = !{!0} !test_singleton_contains = !{!2, !5, !6, !7} @@ -233,5 +259,60 @@ attributes #0 = { cold noreturn } !33 = !{!20} !34 = distinct !DILexicalBlock(scope: !31, file: !1, line: 9) !35 = !DILocation(line: 11, column: 4, scope: !34) -!36 = !DILocation(line: 20, column: 26, scope: !2) -!37 = !DILocation(line: 23, column: 43, scope: !2) +!36 = !DILocation(line: 19, column: 13, scope: !2) +!37 = !DILocalVariable(name: "load_store_/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/dwarf-vector.move_19_foo1", scope: !38, file: !1, line: 19, type: !9) +!38 = distinct !DILexicalBlock(scope: !2, file: !1, line: 19, column: 13) +!39 = !DILocalVariable(name: "load_store_/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/dwarf-vector.move_19_foo1", scope: !40, file: !1, line: 19, type: !9) +!40 = distinct !DILexicalBlock(scope: !2, file: !1, line: 19, column: 13) +!41 = !DILocation(line: 20, column: 36, scope: !2) +!42 = !DILocalVariable(name: "load_store_/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/dwarf-vector.move_20_foo1", scope: !43, file: !1, line: 20, type: !9) +!43 = distinct !DILexicalBlock(scope: !2, file: !1, line: 20, column: 36) +!44 = !DILocalVariable(name: "load_store_/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/dwarf-vector.move_20_foo1", scope: !45, file: !1, line: 20, type: !9) +!45 = distinct !DILexicalBlock(scope: !2, file: !1, line: 20, column: 36) +!46 = !DILocation(line: 20, column: 26, scope: !2) +!47 = !DILocalVariable(name: "load_store_/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/dwarf-vector.move_20_singleton(foo1)", scope: !48, file: !1, line: 20, type: !49) +!48 = distinct !DILexicalBlock(scope: !2, file: !1, line: 20, column: 26) +!49 = !DIBasicType(tag: DW_TAG_unspecified_type, name: "unspecified type") +!50 = !DILocalVariable(name: "load_store_/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/dwarf-vector.move_20_singleton(foo1)", scope: !51, file: !1, line: 20, type: !49) +!51 = distinct !DILexicalBlock(scope: !2, file: !1, line: 20, column: 26) +!52 = !DILocation(line: 20, column: 49, scope: !2) +!53 = !DILocalVariable(name: "load_store_/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/dwarf-vector.move_20_foo1", scope: !54, file: !1, line: 20, type: !9) +!54 = distinct !DILexicalBlock(scope: !2, file: !1, line: 20, column: 49) +!55 = !DILocalVariable(name: "load_store_/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/dwarf-vector.move_20_foo1", scope: !56, file: !1, line: 20, type: !9) +!56 = distinct !DILexicalBlock(scope: !2, file: !1, line: 20, column: 49) +!57 = !DILocation(line: 23, column: 26, scope: !2) +!58 = !DILocalVariable(name: "load_store_/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/dwarf-vector.move_23_singleton(bar1)", scope: !59, file: !1, line: 23, type: !20) +!59 = distinct !DILexicalBlock(scope: !2, file: !1, line: 23, column: 26) +!60 = !DILocalVariable(name: "load_store_/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/dwarf-vector.move_23_singleton(bar1)", scope: !61, file: !1, line: 23, type: !20) +!61 = distinct !DILexicalBlock(scope: !2, file: !1, line: 23, column: 26) +!62 = !DILocation(line: 23, column: 25, scope: !2) +!63 = !DILocalVariable(name: "load_store_/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/dwarf-vector.move_23_&singleton(bar1)", scope: !64, file: !1, line: 23, type: !20) +!64 = distinct !DILexicalBlock(scope: !2, file: !1, line: 23, column: 25) +!65 = !DILocalVariable(name: "load_store_/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/dwarf-vector.move_23_&singleton(bar1)", scope: !66, file: !1, line: 23, type: !20) +!66 = distinct !DILexicalBlock(scope: !2, file: !1, line: 23, column: 25) +!67 = !DILocation(line: 23, column: 43, scope: !2) +!68 = !DILocation(line: 23, column: 18, scope: !2) +!69 = !DILocalVariable(name: "load_store_/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/dwarf-vector.move_23_borrow(&singleton(bar1), 0)", scope: !70, file: !1, line: 23, type: !49) +!70 = distinct !DILexicalBlock(scope: !2, file: !1, line: 23, column: 18) +!71 = !DILocalVariable(name: "load_store_/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/dwarf-vector.move_23_borrow(&singleton(bar1), 0)", scope: !72, file: !1, line: 23, type: !49) +!72 = distinct !DILexicalBlock(scope: !2, file: !1, line: 23, column: 18) +!73 = !DILocation(line: 13, column: 13, scope: !25) +!74 = !DILocalVariable(name: "load_store_/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/dwarf-vector.move_13_v", scope: !75, file: !1, line: 13, type: !49) +!75 = distinct !DILexicalBlock(scope: !25, file: !1, line: 13, column: 13) +!76 = !DILocalVariable(name: "load_store_/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/dwarf-vector.move_13_v", scope: !77, file: !1, line: 13, type: !49) +!77 = distinct !DILexicalBlock(scope: !25, file: !1, line: 13, column: 13) +!78 = !DILocation(line: 15, column: 9, scope: !25) +!79 = !DILocalVariable(name: "load_store_/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/dwarf-vector.move_15_v", scope: !80, file: !1, line: 15, type: !49) +!80 = distinct !DILexicalBlock(scope: !25, file: !1, line: 15, column: 9) +!81 = !DILocalVariable(name: "load_store_/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/dwarf-vector.move_15_v", scope: !82, file: !1, line: 15, type: !49) +!82 = distinct !DILexicalBlock(scope: !25, file: !1, line: 15, column: 9) +!83 = !DILocation(line: 13, column: 13, scope: !31) +!84 = !DILocalVariable(name: "load_store_/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/dwarf-vector.move_13_v", scope: !85, file: !1, line: 13, type: !49) +!85 = distinct !DILexicalBlock(scope: !31, file: !1, line: 13, column: 13) +!86 = !DILocalVariable(name: "load_store_/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/dwarf-vector.move_13_v", scope: !87, file: !1, line: 13, type: !49) +!87 = distinct !DILexicalBlock(scope: !31, file: !1, line: 13, column: 13) +!88 = !DILocation(line: 15, column: 9, scope: !31) +!89 = !DILocalVariable(name: "load_store_/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/dwarf-vector.move_15_v", scope: !90, file: !1, line: 15, type: !49) +!90 = distinct !DILexicalBlock(scope: !31, file: !1, line: 15, column: 9) +!91 = !DILocalVariable(name: "load_store_/language/tools/move-mv-llvm-compiler/tests/dwarf-tests/dwarf-vector.move_15_v", scope: !92, file: !1, line: 15, type: !49) +!92 = distinct !DILexicalBlock(scope: !31, file: !1, line: 15, column: 9)