@@ -484,54 +484,89 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
484484 None
485485 } ;
486486
487- let dbg_var = dbg_scope_and_span. map ( |( dbg_scope, _, span) | {
488- let ( var_ty, var_kind) = match var. value {
487+ let var_ty = if let Some ( ref fragment) = var. composite {
488+ self . monomorphize ( fragment. ty )
489+ } else {
490+ match var. value {
489491 mir:: VarDebugInfoContents :: Place ( place) => {
490- let var_ty = self . monomorphized_place_ty ( place. as_ref ( ) ) ;
491- let var_kind = if let Some ( arg_index) = var. argument_index
492- && place. projection . is_empty ( )
493- {
494- let arg_index = arg_index as usize ;
495- if target_is_msvc {
496- // ScalarPair parameters are spilled to the stack so they need to
497- // be marked as a `LocalVariable` for MSVC debuggers to visualize
498- // their data correctly. (See #81894 & #88625)
499- let var_ty_layout = self . cx . layout_of ( var_ty) ;
500- if let Abi :: ScalarPair ( _, _) = var_ty_layout. abi {
501- VariableKind :: LocalVariable
502- } else {
503- VariableKind :: ArgumentVariable ( arg_index)
504- }
505- } else {
506- // FIXME(eddyb) shouldn't `ArgumentVariable` indices be
507- // offset in closures to account for the hidden environment?
508- VariableKind :: ArgumentVariable ( arg_index)
509- }
510- } else {
511- VariableKind :: LocalVariable
512- } ;
513- ( var_ty, var_kind)
492+ self . monomorphized_place_ty ( place. as_ref ( ) )
514493 }
515- mir:: VarDebugInfoContents :: Const ( c) => {
516- let ty = self . monomorphize ( c. ty ( ) ) ;
517- ( ty, VariableKind :: LocalVariable )
518- }
519- mir:: VarDebugInfoContents :: Composite { ty, fragments : _ } => {
520- let ty = self . monomorphize ( ty) ;
521- ( ty, VariableKind :: LocalVariable )
494+ mir:: VarDebugInfoContents :: Const ( c) => self . monomorphize ( c. ty ( ) ) ,
495+ }
496+ } ;
497+
498+ let dbg_var = dbg_scope_and_span. map ( |( dbg_scope, _, span) | {
499+ let var_kind = if let Some ( arg_index) = var. argument_index
500+ && var. composite . is_none ( )
501+ && let mir:: VarDebugInfoContents :: Place ( place) = var. value
502+ && place. projection . is_empty ( )
503+ {
504+ let arg_index = arg_index as usize ;
505+ if target_is_msvc {
506+ // ScalarPair parameters are spilled to the stack so they need to
507+ // be marked as a `LocalVariable` for MSVC debuggers to visualize
508+ // their data correctly. (See #81894 & #88625)
509+ let var_ty_layout = self . cx . layout_of ( var_ty) ;
510+ if let Abi :: ScalarPair ( _, _) = var_ty_layout. abi {
511+ VariableKind :: LocalVariable
512+ } else {
513+ VariableKind :: ArgumentVariable ( arg_index)
514+ }
515+ } else {
516+ // FIXME(eddyb) shouldn't `ArgumentVariable` indices be
517+ // offset in closures to account for the hidden environment?
518+ VariableKind :: ArgumentVariable ( arg_index)
522519 }
520+ } else {
521+ VariableKind :: LocalVariable
523522 } ;
524523
525524 self . cx . create_dbg_var ( var. name , var_ty, dbg_scope, var_kind, span)
526525 } ) ;
527526
527+ let fragment = if let Some ( ref fragment) = var. composite {
528+ let var_layout = self . cx . layout_of ( var_ty) ;
529+
530+ let mut fragment_start = Size :: ZERO ;
531+ let mut fragment_layout = var_layout;
532+
533+ for elem in & fragment. projection {
534+ match * elem {
535+ mir:: ProjectionElem :: Field ( field, _) => {
536+ let i = field. index ( ) ;
537+ fragment_start += fragment_layout. fields . offset ( i) ;
538+ fragment_layout = fragment_layout. field ( self . cx , i) ;
539+ }
540+ _ => span_bug ! (
541+ var. source_info. span,
542+ "unsupported fragment projection `{:?}`" ,
543+ elem,
544+ ) ,
545+ }
546+ }
547+
548+ if fragment_layout. size == Size :: ZERO {
549+ // Fragment is a ZST, so does not represent anything. Avoid generating anything
550+ // as this may conflict with a fragment that covers the entire variable.
551+ continue ;
552+ } else if fragment_layout. size == var_layout. size {
553+ // Fragment covers entire variable, so as far as
554+ // DWARF is concerned, it's not really a fragment.
555+ None
556+ } else {
557+ Some ( fragment_start..fragment_start + fragment_layout. size )
558+ }
559+ } else {
560+ None
561+ } ;
562+
528563 match var. value {
529564 mir:: VarDebugInfoContents :: Place ( place) => {
530565 per_local[ place. local ] . push ( PerLocalVarDebugInfo {
531566 name : var. name ,
532567 source_info : var. source_info ,
533568 dbg_var,
534- fragment : None ,
569+ fragment,
535570 projection : place. projection ,
536571 } ) ;
537572 }
@@ -547,51 +582,15 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
547582 bx,
548583 ) ;
549584
550- bx. dbg_var_addr ( dbg_var, dbg_loc, base. llval , Size :: ZERO , & [ ] , None ) ;
551- }
552- }
553- }
554- mir:: VarDebugInfoContents :: Composite { ty, ref fragments } => {
555- let var_ty = self . monomorphize ( ty) ;
556- let var_layout = self . cx . layout_of ( var_ty) ;
557- for fragment in fragments {
558- let mut fragment_start = Size :: ZERO ;
559- let mut fragment_layout = var_layout;
560-
561- for elem in & fragment. projection {
562- match * elem {
563- mir:: ProjectionElem :: Field ( field, _) => {
564- let i = field. index ( ) ;
565- fragment_start += fragment_layout. fields . offset ( i) ;
566- fragment_layout = fragment_layout. field ( self . cx , i) ;
567- }
568- _ => span_bug ! (
569- var. source_info. span,
570- "unsupported fragment projection `{:?}`" ,
571- elem,
572- ) ,
573- }
585+ bx. dbg_var_addr (
586+ dbg_var,
587+ dbg_loc,
588+ base. llval ,
589+ Size :: ZERO ,
590+ & [ ] ,
591+ fragment,
592+ ) ;
574593 }
575-
576- let place = fragment. contents ;
577- let fragment = if fragment_layout. size == Size :: ZERO {
578- // Fragment is a ZST, so does not represent anything.
579- continue ;
580- } else if fragment_layout. size == var_layout. size {
581- // Fragment covers entire variable, so as far as
582- // DWARF is concerned, it's not really a fragment.
583- None
584- } else {
585- Some ( fragment_start..fragment_start + fragment_layout. size )
586- } ;
587-
588- per_local[ place. local ] . push ( PerLocalVarDebugInfo {
589- name : var. name ,
590- source_info : var. source_info ,
591- dbg_var,
592- fragment,
593- projection : place. projection ,
594- } ) ;
595594 }
596595 }
597596 }
0 commit comments