Skip to content

Commit 4e8701e

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 rust-lang#81898.
1 parent 7790af4 commit 4e8701e

File tree

2 files changed

+20
-24
lines changed

2 files changed

+20
-24
lines changed

compiler/rustc_codegen_ssa/src/mir/debuginfo.rs

+10-15
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

+10-9
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,22 +33,22 @@
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

4142
// cdb-command: dx s
4243
// cdb-check:s : "this is a static str" [Type: str]
43-
// cdb-check: [len] : 0x14 [Type: unsigned __int64]
44+
// cdb-check: [len] : 0x14 [Type: unsigned [...]]
4445
// cdb-check: [chars]
4546

4647
// cdb-command: g
4748

4849
// cdb-command: dx s
4950
// cdb-check:s : { len=0x5 } [Type: slice$<u8>]
50-
// cdb-check: [len] : 0x5 [Type: unsigned __int64]
51+
// cdb-check: [len] : 0x5 [Type: unsigned [...]]
5152
// cdb-check: [0] : 0x1 [Type: unsigned char]
5253
// cdb-check: [1] : 0x2 [Type: unsigned char]
5354
// cdb-check: [2] : 0x3 [Type: unsigned char]

0 commit comments

Comments
 (0)