@@ -136,10 +136,10 @@ fn build_fixed_size_array_di_node<'ll, 'tcx>(
136
136
137
137
let upper_bound = len. eval_usize ( cx. tcx , ty:: ParamEnv :: reveal_all ( ) ) as c_longlong ;
138
138
139
- let subrange =
140
- unsafe { Some ( llvm :: LLVMRustDIBuilderGetOrCreateSubrange ( DIB ( cx) , 0 , upper_bound ) ) } ;
139
+ let subrange = unsafe { llvm :: LLVMRustDIBuilderGetOrCreateSubrange ( DIB ( cx ) , 0 , upper_bound ) } ;
140
+ debug_context ( cx) . add_di_node ( subrange ) ;
141
141
142
- let subscripts = create_DIArray ( DIB ( cx ) , & [ subrange] ) ;
142
+ let subscripts = create_DIArray ( cx , & [ Some ( subrange) ] ) ;
143
143
let di_node = unsafe {
144
144
llvm:: LLVMRustDIBuilderCreateArrayType (
145
145
DIB ( cx) ,
@@ -149,6 +149,7 @@ fn build_fixed_size_array_di_node<'ll, 'tcx>(
149
149
subscripts,
150
150
)
151
151
} ;
152
+ debug_context ( cx) . add_di_node ( di_node) ;
152
153
153
154
DINodeCreationResult :: new ( di_node, false )
154
155
}
@@ -204,6 +205,7 @@ fn build_pointer_or_reference_di_node<'ll, 'tcx>(
204
205
ptr_type_debuginfo_name. len ( ) ,
205
206
)
206
207
} ;
208
+ debug_context ( cx) . add_di_node ( di_node) ;
207
209
208
210
DINodeCreationResult { di_node, already_stored_in_typemap : false }
209
211
}
@@ -255,6 +257,7 @@ fn build_pointer_or_reference_di_node<'ll, 'tcx>(
255
257
0 ,
256
258
)
257
259
} ;
260
+ debug_context ( cx) . add_di_node ( data_ptr_type_di_node) ;
258
261
259
262
smallvec ! [
260
263
build_field_di_node(
@@ -332,9 +335,10 @@ fn build_subroutine_type_di_node<'ll, 'tcx>(
332
335
let fn_di_node = unsafe {
333
336
llvm:: LLVMRustDIBuilderCreateSubroutineType (
334
337
DIB ( cx) ,
335
- create_DIArray ( DIB ( cx ) , & signature_di_nodes[ ..] ) ,
338
+ create_DIArray ( cx , & signature_di_nodes[ ..] ) ,
336
339
)
337
340
} ;
341
+ debug_context ( cx) . add_nested_di_node ( fn_di_node, & [ 3 ] ) ;
338
342
339
343
// This is actually a function pointer, so wrap it in pointer DI.
340
344
let name = compute_debuginfo_type_name ( cx. tcx , fn_ty, false ) ;
@@ -349,6 +353,7 @@ fn build_subroutine_type_di_node<'ll, 'tcx>(
349
353
name. len ( ) ,
350
354
)
351
355
} ;
356
+ debug_context ( cx) . add_di_node ( di_node) ;
352
357
353
358
DINodeCreationResult :: new ( di_node, false )
354
359
}
@@ -498,7 +503,7 @@ pub fn type_di_node<'ll, 'tcx>(cx: &CodegenCx<'ll, 'tcx>, t: Ty<'tcx>) -> &'ll D
498
503
// FIXME(mw): Cache this via a regular UniqueTypeId instead of an extra field in the debug context.
499
504
fn recursion_marker_type_di_node < ' ll , ' tcx > ( cx : & CodegenCx < ' ll , ' tcx > ) -> & ' ll DIType {
500
505
* debug_context ( cx) . recursion_marker_type . get_or_init ( move || {
501
- unsafe {
506
+ let di_node = unsafe {
502
507
// The choice of type here is pretty arbitrary -
503
508
// anything reading the debuginfo for a recursive
504
509
// type is going to see *something* weird - the only
@@ -517,7 +522,9 @@ fn recursion_marker_type_di_node<'ll, 'tcx>(cx: &CodegenCx<'ll, 'tcx>) -> &'ll D
517
522
cx. tcx . data_layout . pointer_size . bits ( ) ,
518
523
DW_ATE_unsigned ,
519
524
)
520
- }
525
+ } ;
526
+ debug_context ( cx) . add_di_node ( di_node) ;
527
+ di_node
521
528
} )
522
529
}
523
530
@@ -595,6 +602,7 @@ fn file_metadata_raw<'ll>(
595
602
hash_value. len ( ) ,
596
603
)
597
604
} ;
605
+ debug_context ( cx) . add_di_node ( file_metadata) ;
598
606
599
607
v. insert ( file_metadata) ;
600
608
file_metadata
@@ -680,6 +688,7 @@ fn build_basic_type_di_node<'ll, 'tcx>(
680
688
encoding,
681
689
)
682
690
} ;
691
+ debug_context ( cx) . add_di_node ( ty_di_node) ;
683
692
684
693
if !cpp_like_debuginfo {
685
694
return DINodeCreationResult :: new ( ty_di_node, false ) ;
@@ -703,6 +712,7 @@ fn build_basic_type_di_node<'ll, 'tcx>(
703
712
None ,
704
713
)
705
714
} ;
715
+ debug_context ( cx) . add_di_node ( typedef_di_node) ;
706
716
707
717
DINodeCreationResult :: new ( typedef_di_node, false )
708
718
}
@@ -740,18 +750,17 @@ fn build_param_type_di_node<'ll, 'tcx>(
740
750
) -> DINodeCreationResult < ' ll > {
741
751
debug ! ( "build_param_type_di_node: {:?}" , t) ;
742
752
let name = format ! ( "{:?}" , t) ;
743
- DINodeCreationResult {
744
- di_node : unsafe {
745
- llvm:: LLVMRustDIBuilderCreateBasicType (
746
- DIB ( cx) ,
747
- name. as_ptr ( ) . cast ( ) ,
748
- name. len ( ) ,
749
- Size :: ZERO . bits ( ) ,
750
- DW_ATE_unsigned ,
751
- )
752
- } ,
753
- already_stored_in_typemap : false ,
754
- }
753
+ let di_node = unsafe {
754
+ llvm:: LLVMRustDIBuilderCreateBasicType (
755
+ DIB ( cx) ,
756
+ name. as_ptr ( ) . cast ( ) ,
757
+ name. len ( ) ,
758
+ Size :: ZERO . bits ( ) ,
759
+ DW_ATE_unsigned ,
760
+ )
761
+ } ;
762
+ debug_context ( cx) . add_di_node ( di_node) ;
763
+ DINodeCreationResult { di_node, already_stored_in_typemap : false }
755
764
}
756
765
757
766
pub fn build_compile_unit_di_node < ' ll , ' tcx > (
@@ -838,6 +847,7 @@ pub fn build_compile_unit_di_node<'ll, 'tcx>(
838
847
ptr:: null ( ) ,
839
848
0 ,
840
849
) ;
850
+ debug_context. add_di_node ( compile_unit_file) ;
841
851
842
852
let unit_metadata = llvm:: LLVMRustDIBuilderCreateCompileUnit (
843
853
debug_context. builder ,
@@ -857,6 +867,7 @@ pub fn build_compile_unit_di_node<'ll, 'tcx>(
857
867
0 ,
858
868
tcx. sess . opts . debugging_opts . split_dwarf_inlining ,
859
869
) ;
870
+ debug_context. add_di_node ( unit_metadata) ;
860
871
861
872
if tcx. sess . opts . debugging_opts . profile {
862
873
let cu_desc_metadata =
@@ -924,7 +935,7 @@ fn build_field_di_node<'ll, 'tcx>(
924
935
flags : DIFlags ,
925
936
type_di_node : & ' ll DIType ,
926
937
) -> & ' ll DIType {
927
- unsafe {
938
+ let di_node = unsafe {
928
939
llvm:: LLVMRustDIBuilderCreateMemberType (
929
940
DIB ( cx) ,
930
941
owner,
@@ -938,7 +949,9 @@ fn build_field_di_node<'ll, 'tcx>(
938
949
flags,
939
950
type_di_node,
940
951
)
941
- }
952
+ } ;
953
+ debug_context ( cx) . add_di_node ( di_node) ;
954
+ di_node
942
955
}
943
956
944
957
/// Creates the debuginfo node for a Rust struct type. Maybe be a regular struct or a tuple-struct.
@@ -1257,15 +1270,17 @@ fn build_generic_type_param_di_nodes<'ll, 'tcx>(
1257
1270
cx. tcx . normalize_erasing_regions ( ParamEnv :: reveal_all ( ) , ty) ;
1258
1271
let actual_type_di_node = type_di_node ( cx, actual_type) ;
1259
1272
let name = name. as_str ( ) ;
1260
- Some ( unsafe {
1273
+ let template_param = unsafe {
1261
1274
llvm:: LLVMRustDIBuilderCreateTemplateTypeParameter (
1262
1275
DIB ( cx) ,
1263
1276
None ,
1264
1277
name. as_ptr ( ) . cast ( ) ,
1265
1278
name. len ( ) ,
1266
1279
actual_type_di_node,
1267
1280
)
1268
- } )
1281
+ } ;
1282
+ debug_context ( cx) . add_di_node ( template_param) ;
1283
+ Some ( template_param)
1269
1284
} else {
1270
1285
None
1271
1286
}
@@ -1326,7 +1341,7 @@ pub fn build_global_var_di_node<'ll>(cx: &CodegenCx<'ll, '_>, def_id: DefId, glo
1326
1341
1327
1342
let global_align = cx. align_of ( variable_type) ;
1328
1343
1329
- unsafe {
1344
+ let di_node = unsafe {
1330
1345
llvm:: LLVMRustDIBuilderCreateStaticVariable (
1331
1346
DIB ( cx) ,
1332
1347
Some ( var_scope) ,
@@ -1341,8 +1356,9 @@ pub fn build_global_var_di_node<'ll>(cx: &CodegenCx<'ll, '_>, def_id: DefId, glo
1341
1356
global,
1342
1357
None ,
1343
1358
global_align. bytes ( ) as u32 ,
1344
- ) ;
1345
- }
1359
+ )
1360
+ } ;
1361
+ debug_context ( cx) . add_nested_di_node ( di_node, & [ 0 , 1 ] ) ;
1346
1362
}
1347
1363
1348
1364
/// Generates LLVM debuginfo for a vtable.
@@ -1467,7 +1483,7 @@ pub fn create_vtable_di_node<'ll, 'tcx>(
1467
1483
let vtable_type_di_node = build_vtable_type_di_node ( cx, ty, poly_trait_ref) ;
1468
1484
let linkage_name = "" ;
1469
1485
1470
- unsafe {
1486
+ let di_node = unsafe {
1471
1487
llvm:: LLVMRustDIBuilderCreateStaticVariable (
1472
1488
DIB ( cx) ,
1473
1489
NO_SCOPE_METADATA ,
@@ -1482,8 +1498,9 @@ pub fn create_vtable_di_node<'ll, 'tcx>(
1482
1498
vtable,
1483
1499
None ,
1484
1500
0 ,
1485
- ) ;
1486
- }
1501
+ )
1502
+ } ;
1503
+ debug_context ( cx) . add_nested_di_node ( di_node, & [ 0 , 1 ] ) ;
1487
1504
}
1488
1505
1489
1506
/// Creates an "extension" of an existing `DIScope` into another file.
@@ -1493,7 +1510,11 @@ pub fn extend_scope_to_file<'ll>(
1493
1510
file : & SourceFile ,
1494
1511
) -> & ' ll DILexicalBlock {
1495
1512
let file_metadata = file_metadata ( cx, file) ;
1496
- unsafe { llvm:: LLVMRustDIBuilderCreateLexicalBlockFile ( DIB ( cx) , scope_metadata, file_metadata) }
1513
+ let di_node = unsafe {
1514
+ llvm:: LLVMRustDIBuilderCreateLexicalBlockFile ( DIB ( cx) , scope_metadata, file_metadata)
1515
+ } ;
1516
+ debug_context ( cx) . add_di_node ( di_node) ;
1517
+ di_node
1497
1518
}
1498
1519
1499
1520
pub fn tuple_field_name ( field_index : usize ) -> Cow < ' static , str > {
0 commit comments