about summary refs log tree commit diff
diff options
context:
space:
mode:
authorWesley Wiser <wesleywiser@microsoft.com>2021-09-01 15:56:32 -0400
committerWesley Wiser <wesleywiser@microsoft.com>2021-09-13 10:51:47 -0400
commit4e8701e6200d114d9576f8cdf9721b0a81de0118 (patch)
tree2043efa07d5a039623a718ff29d612f7d3abeed5
parent7790af4d889f6238935b1da590cd113b658c53a8 (diff)
downloadrust-4e8701e6200d114d9576f8cdf9721b0a81de0118.tar.gz
rust-4e8701e6200d114d9576f8cdf9721b0a81de0118.zip
Fix debuginfo for ScalarPair abi parameters
Mark all of these as locals so the debugger does not try to interpret
them as being a pointer to the value. This extends the approach used in
PR #81898.
-rw-r--r--compiler/rustc_codegen_ssa/src/mir/debuginfo.rs25
-rw-r--r--src/test/debuginfo/msvc-scalarpair-params.rs19
2 files changed, 20 insertions, 24 deletions
diff --git a/compiler/rustc_codegen_ssa/src/mir/debuginfo.rs b/compiler/rustc_codegen_ssa/src/mir/debuginfo.rs
index c139f915e6c..c710fcc2c1d 100644
--- a/compiler/rustc_codegen_ssa/src/mir/debuginfo.rs
+++ b/compiler/rustc_codegen_ssa/src/mir/debuginfo.rs
@@ -3,9 +3,11 @@ use rustc_index::vec::IndexVec;
 use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
 use rustc_middle::mir;
 use rustc_middle::ty;
+use rustc_middle::ty::layout::LayoutOf;
 use rustc_session::config::DebugInfo;
 use rustc_span::symbol::{kw, Symbol};
 use rustc_span::{BytePos, Span};
+use rustc_target::abi::Abi;
 use rustc_target::abi::Size;
 
 use super::operand::{OperandRef, OperandValue};
@@ -368,21 +370,14 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
                         {
                             let arg_index = place.local.index() - 1;
                             if target_is_msvc {
-                                // Rust compiler decomposes every &str or slice argument into two components:
-                                // a pointer to the memory address where the data is stored and a usize representing
-                                // the length of the str (or slice). These components will later be used to reconstruct
-                                // the original argument inside the body of the function that owns it (see the
-                                // definition of debug_introduce_local for more details).
-                                //
-                                // Since the original argument is declared inside a function rather than being passed
-                                // in as an argument, it must be marked as a LocalVariable for MSVC debuggers to visualize
-                                // its data correctly. (See issue #81894 for an in-depth description of the problem).
-                                match *var_ty.kind() {
-                                    ty::Ref(_, inner_type, _) => match *inner_type.kind() {
-                                        ty::Slice(_) | ty::Str => VariableKind::LocalVariable,
-                                        _ => VariableKind::ArgumentVariable(arg_index + 1),
-                                    },
-                                    _ => VariableKind::ArgumentVariable(arg_index + 1),
+                                // ScalarPair parameters are spilled to the stack so they need to
+                                // be marked as a `LocalVariable` for MSVC debuggers to visualize
+                                // their data correctly. (See #81894 & #88625)
+                                let var_ty_layout = self.cx.layout_of(var_ty);
+                                if let Abi::ScalarPair(_, _) = var_ty_layout.abi {
+                                    VariableKind::LocalVariable
+                                } else {
+                                    VariableKind::ArgumentVariable(arg_index + 1)
                                 }
                             } else {
                                 // FIXME(eddyb) shouldn't `ArgumentVariable` indices be
diff --git a/src/test/debuginfo/msvc-scalarpair-params.rs b/src/test/debuginfo/msvc-scalarpair-params.rs
index 7ebbf79d082..3846fb42f81 100644
--- a/src/test/debuginfo/msvc-scalarpair-params.rs
+++ b/src/test/debuginfo/msvc-scalarpair-params.rs
@@ -6,14 +6,14 @@
 // cdb-command: dx r1
 // cdb-check:r1               : (0xa..0xc) [Type: core::ops::range::Range<u32>]
 // cdb-command: dx r2
-// cdb-check:r2               : 0x14 [Type: core::ops::range::Range<u64> *]
+// cdb-check:r2               : (0x14..0x1e) [Type: core::ops::range::Range<u64>]
 
 // cdb-command: g
 
 // cdb-command: dx r1
 // cdb-check:r1               : (0x9..0x64) [Type: core::ops::range::Range<u32>]
 // cdb-command: dx r2
-// cdb-check:r2               : 0xc [Type: core::ops::range::Range<u64> *]
+// cdb-check:r2               : (0xc..0x5a) [Type: core::ops::range::Range<u64>]
 
 // cdb-command: g
 
@@ -22,8 +22,9 @@
 // cdb-check:    [variant]        : Some
 // cdb-check:    [+0x004] __0              : 0x4d2 [Type: [...]]
 // cdb-command: dx o2
-// cdb-check:o2               : 0x1 [Type: enum$<core::option::Option<u64> > *]
-// cdb-check:    [variant]
+// cdb-check:o2               : Some [Type: enum$<core::option::Option<u64> >]
+// cdb-check:    [variant]        : Some
+// cdb-check:    [+0x008] __0              : 0x162e [Type: unsigned __int64]
 
 // cdb-command: g
 
@@ -32,22 +33,22 @@
 // cdb-check:    [0]              : 0xa [Type: unsigned int]
 // cdb-check:    [1]              : 0x14 [Type: unsigned int]
 // cdb-command: dx t2
-// cdb-check:t2               : 0x1e [Type: tuple$<u64,u64> *]
-// cdb-check:    [0]              : Unable to read memory at Address 0x1e
-// cdb-check:    [1]              : Unable to read memory at Address 0x26
+// cdb-check:t2               : (0x1e, 0x28) [Type: tuple$<u64,u64>]
+// cdb-check:    [0]              : 0x1e [Type: unsigned __int64]
+// cdb-check:    [1]              : 0x28 [Type: unsigned __int64]
 
 // cdb-command: g
 
 // cdb-command: dx s
 // cdb-check:s                : "this is a static str" [Type: str]
-// cdb-check:    [len]            : 0x14 [Type: unsigned __int64]
+// cdb-check:    [len]            : 0x14 [Type: unsigned [...]]
 // cdb-check:    [chars]
 
 // cdb-command: g
 
 // cdb-command: dx s
 // cdb-check:s                : { len=0x5 } [Type: slice$<u8>]
-// cdb-check:    [len]            : 0x5 [Type: unsigned __int64]
+// cdb-check:    [len]            : 0x5 [Type: unsigned [...]]
 // cdb-check:    [0]              : 0x1 [Type: unsigned char]
 // cdb-check:    [1]              : 0x2 [Type: unsigned char]
 // cdb-check:    [2]              : 0x3 [Type: unsigned char]