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.
This commit is contained in:
parent
7790af4d88
commit
4e8701e620
2 changed files with 20 additions and 24 deletions
|
@ -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
|
||||
|
|
|
@ -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]
|
||||
|
|
Loading…
Reference in a new issue