mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-14 02:49:40 +00:00
Set the kind for local variables created by &str and slice arguments to LocalVariable
This commit is contained in:
parent
921ec4b3fc
commit
615fd141bd
@ -320,6 +320,8 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||||||
) -> Option<IndexVec<mir::Local, Vec<PerLocalVarDebugInfo<'tcx, Bx::DIVariable>>>> {
|
) -> Option<IndexVec<mir::Local, Vec<PerLocalVarDebugInfo<'tcx, Bx::DIVariable>>>> {
|
||||||
let full_debug_info = self.cx.sess().opts.debuginfo == DebugInfo::Full;
|
let full_debug_info = self.cx.sess().opts.debuginfo == DebugInfo::Full;
|
||||||
|
|
||||||
|
let target_is_msvc = self.cx.sess().target.is_like_msvc;
|
||||||
|
|
||||||
if !full_debug_info && self.cx.sess().fewer_names() {
|
if !full_debug_info && self.cx.sess().fewer_names() {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
@ -341,11 +343,29 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||||||
&& var.source_info.scope == mir::OUTERMOST_SOURCE_SCOPE
|
&& var.source_info.scope == mir::OUTERMOST_SOURCE_SCOPE
|
||||||
{
|
{
|
||||||
let arg_index = place.local.index() - 1;
|
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),
|
||||||
|
}
|
||||||
|
} else {
|
||||||
// FIXME(eddyb) shouldn't `ArgumentVariable` indices be
|
// FIXME(eddyb) shouldn't `ArgumentVariable` indices be
|
||||||
// offset in closures to account for the hidden environment?
|
// offset in closures to account for the hidden environment?
|
||||||
// Also, is this `+ 1` needed at all?
|
// Also, is this `+ 1` needed at all?
|
||||||
VariableKind::ArgumentVariable(arg_index + 1)
|
VariableKind::ArgumentVariable(arg_index + 1)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
VariableKind::LocalVariable
|
VariableKind::LocalVariable
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user