Skip to content

Commit 68af337

Browse files
committed
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.
1 parent baf5ea1 commit 68af337

File tree

2 files changed

+18
-22
lines changed

2 files changed

+18
-22
lines changed

compiler/rustc_codegen_ssa/src/mir/debuginfo.rs

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ use rustc_index::vec::IndexVec;
33
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
44
use rustc_middle::mir;
55
use rustc_middle::ty;
6+
use rustc_middle::ty::layout::LayoutOf;
67
use rustc_session::config::DebugInfo;
78
use rustc_span::symbol::{kw, Symbol};
89
use rustc_span::{BytePos, Span};
10+
use rustc_target::abi::Abi;
911
use rustc_target::abi::Size;
1012

1113
use super::operand::{OperandRef, OperandValue};
@@ -368,21 +370,14 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
368370
{
369371
let arg_index = place.local.index() - 1;
370372
if target_is_msvc {
371-
// Rust compiler decomposes every &str or slice argument into two components:
372-
// a pointer to the memory address where the data is stored and a usize representing
373-
// the length of the str (or slice). These components will later be used to reconstruct
374-
// the original argument inside the body of the function that owns it (see the
375-
// definition of debug_introduce_local for more details).
376-
//
377-
// Since the original argument is declared inside a function rather than being passed
378-
// in as an argument, it must be marked as a LocalVariable for MSVC debuggers to visualize
379-
// its data correctly. (See issue #81894 for an in-depth description of the problem).
380-
match *var_ty.kind() {
381-
ty::Ref(_, inner_type, _) => match *inner_type.kind() {
382-
ty::Slice(_) | ty::Str => VariableKind::LocalVariable,
383-
_ => VariableKind::ArgumentVariable(arg_index + 1),
384-
},
385-
_ => VariableKind::ArgumentVariable(arg_index + 1),
373+
// ScalarPair parameters are spilled to the stack so they need to
374+
// be marked as a `LocalVariable` for MSVC debuggers to visualize
375+
// their data correctly. (See #81894 & #88625)
376+
let var_ty_layout = self.cx.layout_of(var_ty);
377+
if let Abi::ScalarPair(_, _) = var_ty_layout.abi {
378+
VariableKind::LocalVariable
379+
} else {
380+
VariableKind::ArgumentVariable(arg_index + 1)
386381
}
387382
} else {
388383
// FIXME(eddyb) shouldn't `ArgumentVariable` indices be

src/test/debuginfo/msvc-scalarpair-params.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66
// cdb-command: dx r1
77
// cdb-check:r1 : (0xa..0xc) [Type: core::ops::range::Range<u32>]
88
// cdb-command: dx r2
9-
// cdb-check:r2 : 0x14 [Type: core::ops::range::Range<u64> *]
9+
// cdb-check:r2 : (0x14..0x1e) [Type: core::ops::range::Range<u64>]
1010

1111
// cdb-command: g
1212

1313
// cdb-command: dx r1
1414
// cdb-check:r1 : (0x9..0x64) [Type: core::ops::range::Range<u32>]
1515
// cdb-command: dx r2
16-
// cdb-check:r2 : 0xc [Type: core::ops::range::Range<u64> *]
16+
// cdb-check:r2 : (0xc..0x5a) [Type: core::ops::range::Range<u64>]
1717

1818
// cdb-command: g
1919

@@ -22,8 +22,9 @@
2222
// cdb-check: [variant] : Some
2323
// cdb-check: [+0x004] __0 : 0x4d2 [Type: [...]]
2424
// cdb-command: dx o2
25-
// cdb-check:o2 : 0x1 [Type: enum$<core::option::Option<u64> > *]
26-
// cdb-check: [variant]
25+
// cdb-check:o2 : Some [Type: enum$<core::option::Option<u64> >]
26+
// cdb-check: [variant] : Some
27+
// cdb-check: [+0x008] __0 : 0x162e [Type: unsigned __int64]
2728

2829
// cdb-command: g
2930

@@ -32,9 +33,9 @@
3233
// cdb-check: [0] : 0xa [Type: unsigned int]
3334
// cdb-check: [1] : 0x14 [Type: unsigned int]
3435
// cdb-command: dx t2
35-
// cdb-check:t2 : 0x1e [Type: tuple$<u64,u64> *]
36-
// cdb-check: [0] : Unable to read memory at Address 0x1e
37-
// cdb-check: [1] : Unable to read memory at Address 0x26
36+
// cdb-check:t2 : (0x1e, 0x28) [Type: tuple$<u64,u64>]
37+
// cdb-check: [0] : 0x1e [Type: unsigned __int64]
38+
// cdb-check: [1] : 0x28 [Type: unsigned __int64]
3839

3940
// cdb-command: g
4041

0 commit comments

Comments
 (0)