Skip to content

Commit 09f25f4

Browse files
committed
Add file and line metadata for struct/union members
1 parent 992ae7f commit 09f25f4

File tree

4 files changed

+39
-12
lines changed

4 files changed

+39
-12
lines changed

compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ fn build_pointer_or_reference_di_node<'ll, 'tcx>(
264264
layout.fields.offset(abi::FAT_PTR_ADDR),
265265
DIFlags::FlagZero,
266266
data_ptr_type_di_node,
267+
None,
267268
),
268269
build_field_di_node(
269270
cx,
@@ -273,6 +274,7 @@ fn build_pointer_or_reference_di_node<'ll, 'tcx>(
273274
layout.fields.offset(abi::FAT_PTR_EXTRA),
274275
DIFlags::FlagZero,
275276
type_di_node(cx, extra_field.ty),
277+
None,
276278
),
277279
]
278280
},
@@ -949,15 +951,17 @@ fn build_field_di_node<'ll, 'tcx>(
949951
offset: Size,
950952
flags: DIFlags,
951953
type_di_node: &'ll DIType,
954+
def_id: Option<DefId>,
952955
) -> &'ll DIType {
956+
let (file_metadata, line_number) = file_metadata_from_def_id(cx, def_id);
953957
unsafe {
954958
llvm::LLVMRustDIBuilderCreateMemberType(
955959
DIB(cx),
956960
owner,
957961
name.as_ptr().cast(),
958962
name.len(),
959-
unknown_file_metadata(cx),
960-
UNKNOWN_LINE_NUMBER,
963+
file_metadata,
964+
line_number,
961965
size_and_align.0.bits(),
962966
size_and_align.1.bits() as u32,
963967
offset.bits(),
@@ -1016,6 +1020,7 @@ fn build_struct_type_di_node<'ll, 'tcx>(
10161020
struct_type_and_layout.fields.offset(i),
10171021
DIFlags::FlagZero,
10181022
type_di_node(cx, field_layout.ty),
1023+
Some(f.did),
10191024
)
10201025
})
10211026
.collect()
@@ -1074,6 +1079,7 @@ fn build_upvar_field_di_nodes<'ll, 'tcx>(
10741079
layout.fields.offset(index),
10751080
DIFlags::FlagZero,
10761081
type_di_node(cx, up_var_ty),
1082+
None,
10771083
)
10781084
})
10791085
.collect()
@@ -1118,6 +1124,7 @@ fn build_tuple_type_di_node<'ll, 'tcx>(
11181124
tuple_type_and_layout.fields.offset(index),
11191125
DIFlags::FlagZero,
11201126
type_di_node(cx, component_type),
1127+
None,
11211128
)
11221129
})
11231130
.collect()
@@ -1198,6 +1205,7 @@ fn build_union_type_di_node<'ll, 'tcx>(
11981205
Size::ZERO,
11991206
DIFlags::FlagZero,
12001207
type_di_node(cx, field_layout.ty),
1208+
Some(f.did),
12011209
)
12021210
})
12031211
.collect()
@@ -1271,14 +1279,7 @@ pub fn build_global_var_di_node<'ll>(cx: &CodegenCx<'ll, '_>, def_id: DefId, glo
12711279
// We may want to remove the namespace scope if we're in an extern block (see
12721280
// https://github.com/rust-lang/rust/pull/46457#issuecomment-351750952).
12731281
let var_scope = get_namespace_for_item(cx, def_id);
1274-
let span = tcx.def_span(def_id);
1275-
1276-
let (file_metadata, line_number) = if !span.is_dummy() {
1277-
let loc = cx.lookup_debug_loc(span.lo());
1278-
(file_metadata(cx, &loc.file), loc.line)
1279-
} else {
1280-
(unknown_file_metadata(cx), UNKNOWN_LINE_NUMBER)
1281-
};
1282+
let (file_metadata, line_number) = file_metadata_from_def_id(cx, Some(def_id));
12821283

12831284
let is_local_to_unit = is_node_local_to_unit(cx, def_id);
12841285
let variable_type = Instance::mono(cx.tcx, def_id).ty(cx.tcx, ty::ParamEnv::reveal_all());
@@ -1401,6 +1402,7 @@ fn build_vtable_type_di_node<'ll, 'tcx>(
14011402
field_offset,
14021403
DIFlags::FlagZero,
14031404
field_type_di_node,
1405+
None,
14041406
))
14051407
})
14061408
.collect()
@@ -1551,3 +1553,15 @@ pub fn tuple_field_name(field_index: usize) -> Cow<'static, str> {
15511553
.map(|s| Cow::from(*s))
15521554
.unwrap_or_else(|| Cow::from(format!("__{}", field_index)))
15531555
}
1556+
1557+
pub fn file_metadata_from_def_id<'ll>(
1558+
cx: &CodegenCx<'ll, '_>,
1559+
def_id: Option<DefId>,
1560+
) -> (&'ll DIFile, c_uint) {
1561+
if let Some(def_id) = def_id && let span = cx.tcx.def_span(def_id) && !span.is_dummy() {
1562+
let loc = cx.lookup_debug_loc(span.lo());
1563+
(file_metadata(cx, &loc.file), loc.line)
1564+
} else {
1565+
(unknown_file_metadata(cx), UNKNOWN_LINE_NUMBER)
1566+
}
1567+
}

compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/cpp_like.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,7 @@ fn build_single_variant_union_fields<'ll, 'tcx>(
372372
Size::ZERO,
373373
DIFlags::FlagZero,
374374
variant_struct_type_wrapper_di_node,
375+
None,
375376
),
376377
unsafe {
377378
llvm::LLVMRustDIBuilderCreateStaticMemberType(
@@ -549,6 +550,7 @@ fn build_variant_struct_wrapper_type_di_node<'ll, 'tcx>(
549550
Size::ZERO,
550551
DIFlags::FlagZero,
551552
variant_struct_type_di_node,
553+
None,
552554
));
553555

554556
let build_assoc_const =
@@ -848,6 +850,7 @@ fn build_union_fields_for_direct_tag_enum_or_generator<'ll, 'tcx>(
848850
lo_offset,
849851
DIFlags::FlagZero,
850852
type_di_node,
853+
None,
851854
));
852855

853856
unions_fields.push(build_field_di_node(
@@ -858,6 +861,7 @@ fn build_union_fields_for_direct_tag_enum_or_generator<'ll, 'tcx>(
858861
hi_offset,
859862
DIFlags::FlagZero,
860863
type_di_node,
864+
None,
861865
));
862866
} else {
863867
unions_fields.push(build_field_di_node(
@@ -868,6 +872,7 @@ fn build_union_fields_for_direct_tag_enum_or_generator<'ll, 'tcx>(
868872
enum_type_and_layout.fields.offset(tag_field),
869873
DIFlags::FlagZero,
870874
tag_base_type_di_node,
875+
None,
871876
));
872877
}
873878

compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,7 @@ fn build_enum_variant_struct_type_di_node<'ll, 'tcx>(
292292
variant_layout.fields.offset(field_index),
293293
DIFlags::FlagZero,
294294
type_di_node(cx, field_layout.ty),
295+
None,
295296
)
296297
})
297298
.collect::<SmallVec<_>>()
@@ -375,6 +376,7 @@ pub fn build_generator_variant_struct_type_di_node<'ll, 'tcx>(
375376
variant_layout.fields.offset(field_index),
376377
DIFlags::FlagZero,
377378
type_di_node(cx, field_type),
379+
None,
378380
)
379381
})
380382
.collect();
@@ -392,6 +394,7 @@ pub fn build_generator_variant_struct_type_di_node<'ll, 'tcx>(
392394
generator_type_and_layout.fields.offset(index),
393395
DIFlags::FlagZero,
394396
type_di_node(cx, upvar_ty),
397+
None,
395398
)
396399
})
397400
.collect();

tests/codegen/issue-98678.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,16 @@ pub enum MyCppLikeEnum {
1515
}
1616

1717
// CHECK: !DICompositeType({{.*"}}MyType{{".*}}file: ![[#FILE]]{{.*}}line: [[# @LINE + 1]],
18-
pub struct MyType;
18+
pub struct MyType {
19+
// CHECK: !DIDerivedType({{.*"}}i{{".*}}file: ![[#FILE]]{{.*}}line: [[# @LINE + 1]],
20+
i: i32,
21+
}
1922

2023
// CHECK: !DICompositeType({{.*"}}MyUnion{{".*}}file: ![[#FILE]]{{.*}}line: [[# @LINE + 1]],
2124
pub union MyUnion {
22-
i: i32, // TODO fields are still wrong
25+
// CHECK: !DIDerivedType({{.*"}}i{{".*}}file: ![[#FILE]]{{.*}}line: [[# @LINE + 1]],
26+
i: i32,
27+
// CHECK: !DIDerivedType({{.*"}}f{{".*}}file: ![[#FILE]]{{.*}}line: [[# @LINE + 1]],
2328
f: f32,
2429
}
2530

0 commit comments

Comments
 (0)