about summary refs log tree commit diff
diff options
context:
space:
mode:
authorCamille GILLOT <gillot.camille@gmail.com>2023-08-23 16:24:40 +0000
committerCamille GILLOT <gillot.camille@gmail.com>2023-08-26 14:21:10 +0000
commitb3bbc22cb7b3670001389c07a1e4a1c2090ae76a (patch)
treedc45b47d1668183168a75bc4ef002cc2d1994df2
parent25ed43ddf3e03835e5a2f2c25463ceea17a66ae5 (diff)
downloadrust-b3bbc22cb7b3670001389c07a1e4a1c2090ae76a.tar.gz
rust-b3bbc22cb7b3670001389c07a1e4a1c2090ae76a.zip
Do not forget to pass DWARF fragment information to LLVM.
-rw-r--r--compiler/rustc_codegen_ssa/src/mir/debuginfo.rs18
-rw-r--r--tests/codegen/sroa-fragment-debuginfo.rs27
2 files changed, 43 insertions, 2 deletions
diff --git a/compiler/rustc_codegen_ssa/src/mir/debuginfo.rs b/compiler/rustc_codegen_ssa/src/mir/debuginfo.rs
index 7df830692d3..f087df4524d 100644
--- a/compiler/rustc_codegen_ssa/src/mir/debuginfo.rs
+++ b/compiler/rustc_codegen_ssa/src/mir/debuginfo.rs
@@ -445,9 +445,23 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
             bx.store(place.llval, alloca.llval, alloca.align);
 
             // Point the debug info to `*alloca` for the current variable
-            bx.dbg_var_addr(dbg_var, dbg_loc, alloca.llval, Size::ZERO, &[Size::ZERO], None);
+            bx.dbg_var_addr(
+                dbg_var,
+                dbg_loc,
+                alloca.llval,
+                Size::ZERO,
+                &[Size::ZERO],
+                var.fragment,
+            );
         } else {
-            bx.dbg_var_addr(dbg_var, dbg_loc, base.llval, direct_offset, &indirect_offsets, None);
+            bx.dbg_var_addr(
+                dbg_var,
+                dbg_loc,
+                base.llval,
+                direct_offset,
+                &indirect_offsets,
+                var.fragment,
+            );
         }
     }
 
diff --git a/tests/codegen/sroa-fragment-debuginfo.rs b/tests/codegen/sroa-fragment-debuginfo.rs
new file mode 100644
index 00000000000..ee103cf1c8e
--- /dev/null
+++ b/tests/codegen/sroa-fragment-debuginfo.rs
@@ -0,0 +1,27 @@
+// compile-flags: -g -Zmir-opt-level=0 -Zmir-enable-passes=+ScalarReplacementOfAggregates
+// compile-flags: -Cno-prepopulate-passes
+
+#![crate_type = "lib"]
+
+pub struct Endian;
+
+#[allow(dead_code)]
+pub struct EndianSlice<'input> {
+    slice: &'input [u8],
+    endian: Endian,
+}
+
+#[no_mangle]
+pub fn test(s: &[u8]) {
+// CHECK: void @test(
+// CHECK: %slice.dbg.spill1 = alloca { ptr, i64 },
+// CHECK: %slice.dbg.spill = alloca %Endian,
+// CHECK: %s.dbg.spill = alloca { ptr, i64 },
+// CHECK: call void @llvm.dbg.declare(metadata ptr %s.dbg.spill, metadata ![[S:.*]], metadata !DIExpression()),
+// CHECK: call void @llvm.dbg.declare(metadata ptr %slice.dbg.spill, metadata ![[SLICE:.*]], metadata !DIExpression(DW_OP_LLVM_fragment, 0, 0)),
+// CHECK: call void @llvm.dbg.declare(metadata ptr %slice.dbg.spill1, metadata ![[SLICE]], metadata !DIExpression()),
+    let slice = EndianSlice { slice: s, endian: Endian };
+}
+
+// CHECK: ![[S]] = !DILocalVariable(name: "s",
+// CHECK: ![[SLICE]] = !DILocalVariable(name: "slice",