Skip to content

Commit

Permalink
Fix debuginfo for ScalarPair abi parameters
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
wesleywiser committed Sep 13, 2021
1 parent 7790af4 commit 4e8701e
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 24 deletions.
25 changes: 10 additions & 15 deletions compiler/rustc_codegen_ssa/src/mir/debuginfo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};
Expand Down Expand Up @@ -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
Expand Down
19 changes: 10 additions & 9 deletions src/test/debuginfo/msvc-scalarpair-params.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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

Expand All @@ -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]
Expand Down

0 comments on commit 4e8701e

Please sign in to comment.