@@ -253,7 +253,9 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
253
253
spill_slot
254
254
}
255
255
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 (
257
259
& self ,
258
260
bx : & mut Bx ,
259
261
local : mir:: Local ,
@@ -271,31 +273,32 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
271
273
None => return ,
272
274
} ;
273
275
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
+ ) ;
276
293
}
277
294
}
278
295
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, & [ ] ) ;
299
302
}
300
303
301
304
/// 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> {
469
472
alloca. val . llval ,
470
473
Size :: ZERO ,
471
474
& [ Size :: ZERO ] ,
472
- var. fragment ,
475
+ & var. fragment ,
473
476
) ;
474
477
} else {
475
478
bx. dbg_var_addr (
@@ -478,7 +481,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
478
481
base. val . llval ,
479
482
direct_offset,
480
483
& indirect_offsets,
481
- var. fragment ,
484
+ & var. fragment ,
482
485
) ;
483
486
}
484
487
}
@@ -500,7 +503,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
500
503
let base = FunctionCx :: spill_operand_to_stack ( operand, Some ( name) , bx) ;
501
504
bx. clear_dbg_loc ( ) ;
502
505
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) ;
504
507
}
505
508
}
506
509
}
0 commit comments