@@ -3,9 +3,11 @@ use rustc_index::vec::IndexVec;
33use rustc_middle:: middle:: codegen_fn_attrs:: CodegenFnAttrFlags ;
44use rustc_middle:: mir;
55use rustc_middle:: ty;
6+ use rustc_middle:: ty:: layout:: LayoutOf ;
67use rustc_session:: config:: DebugInfo ;
78use rustc_span:: symbol:: { kw, Symbol } ;
89use rustc_span:: { BytePos , Span } ;
10+ use rustc_target:: abi:: Abi ;
911use rustc_target:: abi:: Size ;
1012
1113use 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
0 commit comments