@@ -253,7 +253,9 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
253253 spill_slot
254254 }
255255
256- pub ( crate ) fn debug_new_value_to_local (
256+ // Indicates that local is set to a new value. The `layout` and `projection` are used to
257+ // calculate the offset.
258+ pub ( crate ) fn debug_new_val_to_local (
257259 & self ,
258260 bx : & mut Bx ,
259261 local : mir:: Local ,
@@ -271,31 +273,32 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
271273 None => return ,
272274 } ;
273275
274- for var in vars. iter ( ) . cloned ( ) {
275- self . debug_new_value_to_local_as_var ( bx, base, layout, projection, var) ;
276+ let DebugInfoOffset { direct_offset, indirect_offsets, result : _ } =
277+ calculate_debuginfo_offset ( bx, projection, layout) ;
278+ for var in vars. iter ( ) {
279+ let Some ( dbg_var) = var. dbg_var else {
280+ continue ;
281+ } ;
282+ let Some ( dbg_loc) = self . dbg_loc ( var. source_info ) else {
283+ continue ;
284+ } ;
285+ bx. dbg_var_value (
286+ dbg_var,
287+ dbg_loc,
288+ base. llval ,
289+ direct_offset,
290+ & indirect_offsets,
291+ & var. fragment ,
292+ ) ;
276293 }
277294 }
278295
279- fn debug_new_value_to_local_as_var (
280- & self ,
281- bx : & mut Bx ,
282- base : PlaceValue < Bx :: Value > ,
283- layout : TyAndLayout < ' tcx > ,
284- projection : & [ mir:: PlaceElem < ' tcx > ] ,
285- var : PerLocalVarDebugInfo < ' tcx , Bx :: DIVariable > ,
286- ) {
287- let Some ( dbg_var) = var. dbg_var else { return } ;
288- let Some ( dbg_loc) = self . dbg_loc ( var. source_info ) else { return } ;
289- let DebugInfoOffset { direct_offset, indirect_offsets, result : _ } =
290- calculate_debuginfo_offset ( bx, projection, layout) ;
291- bx. dbg_var_value (
292- dbg_var,
293- dbg_loc,
294- base. llval ,
295- direct_offset,
296- & indirect_offsets,
297- var. fragment ,
298- ) ;
296+ pub ( crate ) fn debug_poison_to_local ( & self , bx : & mut Bx , local : mir:: Local ) {
297+ let ty = self . monomorphize ( self . mir . local_decls [ local] . ty ) ;
298+ let layout = bx. cx ( ) . layout_of ( ty) ;
299+ let to_backend_ty = bx. cx ( ) . immediate_backend_type ( layout) ;
300+ let place_ref = PlaceRef :: new_sized ( bx. cx ( ) . const_poison ( to_backend_ty) , layout) ;
301+ self . debug_new_val_to_local ( bx, local, place_ref. val , layout, & [ ] ) ;
299302 }
300303
301304 /// Apply debuginfo and/or name, after creating the `alloca` for a local,
@@ -469,7 +472,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
469472 alloca. val . llval ,
470473 Size :: ZERO ,
471474 & [ Size :: ZERO ] ,
472- var. fragment ,
475+ & var. fragment ,
473476 ) ;
474477 } else {
475478 bx. dbg_var_addr (
@@ -478,7 +481,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
478481 base. val . llval ,
479482 direct_offset,
480483 & indirect_offsets,
481- var. fragment ,
484+ & var. fragment ,
482485 ) ;
483486 }
484487 }
@@ -500,7 +503,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
500503 let base = FunctionCx :: spill_operand_to_stack ( operand, Some ( name) , bx) ;
501504 bx. clear_dbg_loc ( ) ;
502505
503- bx. dbg_var_addr ( dbg_var, dbg_loc, base. val . llval , Size :: ZERO , & [ ] , fragment) ;
506+ bx. dbg_var_addr ( dbg_var, dbg_loc, base. val . llval , Size :: ZERO , & [ ] , & fragment) ;
504507 }
505508 }
506509 }
0 commit comments