Auto merge of #104342 - mweber15:add_file_location_to_more_types, r=wesleywiser
Require `type_map::stub` callers to supply file information This change attaches file information (`DIFile` reference and line number) to struct debug info nodes. Before: ``` ; foo.ll ... !5 = !DIFile(filename: "<unknown>", directory: "") ... !16 = !DICompositeType(tag: DW_TAG_structure_type, name: "MyType", scope: !2, file: !5, size: 32, align: 32, elements: !17, templateParams: !19, identifier: "4cb373851db92e732c4cb5651b886dd0") ... ``` After: ``` ; foo.ll ... !3 = !DIFile(filename: "foo.rs", directory: "/home/matt/src/rust98678", checksumkind: CSK_SHA1, checksum: "bcb9f08512c8f3b8181ef4726012bc6807bc9be4") ... !16 = !DICompositeType(tag: DW_TAG_structure_type, name: "MyType", scope: !2, file: !3, line: 3, size: 32, align: 32, elements: !17, templateParams: !19, identifier: "9e5968c7af39c148acb253912b7f409f") ... ``` Fixes #98678 r? `@wesleywiser`
This commit is contained in:
@@ -203,6 +203,7 @@ fn build_pointer_or_reference_di_node<'ll, 'tcx>(
|
||||
Stub::Struct,
|
||||
unique_type_id,
|
||||
&ptr_type_debuginfo_name,
|
||||
None,
|
||||
cx.size_and_align_of(ptr_type),
|
||||
NO_SCOPE_METADATA,
|
||||
DIFlags::FlagZero,
|
||||
@@ -259,6 +260,7 @@ fn build_pointer_or_reference_di_node<'ll, 'tcx>(
|
||||
layout.fields.offset(abi::WIDE_PTR_ADDR),
|
||||
DIFlags::FlagZero,
|
||||
data_ptr_type_di_node,
|
||||
None,
|
||||
),
|
||||
build_field_di_node(
|
||||
cx,
|
||||
@@ -268,6 +270,7 @@ fn build_pointer_or_reference_di_node<'ll, 'tcx>(
|
||||
layout.fields.offset(abi::WIDE_PTR_EXTRA),
|
||||
DIFlags::FlagZero,
|
||||
type_di_node(cx, extra_field.ty),
|
||||
None,
|
||||
),
|
||||
]
|
||||
},
|
||||
@@ -369,6 +372,7 @@ fn build_dyn_type_di_node<'ll, 'tcx>(
|
||||
Stub::Struct,
|
||||
unique_type_id,
|
||||
&type_name,
|
||||
None,
|
||||
cx.size_and_align_of(dyn_type),
|
||||
NO_SCOPE_METADATA,
|
||||
DIFlags::FlagZero,
|
||||
@@ -722,6 +726,14 @@ fn build_cpp_f16_di_node<'ll, 'tcx>(cx: &CodegenCx<'ll, 'tcx>) -> DINodeCreation
|
||||
// `f16`'s value to be displayed using a Natvis visualiser in `intrinsic.natvis`.
|
||||
let float_ty = cx.tcx.types.f16;
|
||||
let bits_ty = cx.tcx.types.u16;
|
||||
let def_location = if cx.sess().opts.unstable_opts.debug_info_type_line_numbers {
|
||||
match float_ty.kind() {
|
||||
ty::Adt(def, _) => Some(file_metadata_from_def_id(cx, Some(def.did()))),
|
||||
_ => None,
|
||||
}
|
||||
} else {
|
||||
None
|
||||
};
|
||||
type_map::build_type_with_children(
|
||||
cx,
|
||||
type_map::stub(
|
||||
@@ -729,12 +741,21 @@ fn build_cpp_f16_di_node<'ll, 'tcx>(cx: &CodegenCx<'ll, 'tcx>) -> DINodeCreation
|
||||
Stub::Struct,
|
||||
UniqueTypeId::for_ty(cx.tcx, float_ty),
|
||||
"f16",
|
||||
def_location,
|
||||
cx.size_and_align_of(float_ty),
|
||||
NO_SCOPE_METADATA,
|
||||
DIFlags::FlagZero,
|
||||
),
|
||||
// Fields:
|
||||
|cx, float_di_node| {
|
||||
let def_id = if cx.sess().opts.unstable_opts.debug_info_type_line_numbers {
|
||||
match bits_ty.kind() {
|
||||
ty::Adt(def, _) => Some(def.did()),
|
||||
_ => None,
|
||||
}
|
||||
} else {
|
||||
None
|
||||
};
|
||||
smallvec![build_field_di_node(
|
||||
cx,
|
||||
float_di_node,
|
||||
@@ -743,6 +764,7 @@ fn build_cpp_f16_di_node<'ll, 'tcx>(cx: &CodegenCx<'ll, 'tcx>) -> DINodeCreation
|
||||
Size::ZERO,
|
||||
DIFlags::FlagZero,
|
||||
type_di_node(cx, bits_ty),
|
||||
def_id,
|
||||
)]
|
||||
},
|
||||
NO_GENERICS,
|
||||
@@ -839,6 +861,7 @@ fn build_foreign_type_di_node<'ll, 'tcx>(
|
||||
Stub::Struct,
|
||||
unique_type_id,
|
||||
&compute_debuginfo_type_name(cx.tcx, t, false),
|
||||
None,
|
||||
cx.size_and_align_of(t),
|
||||
Some(get_namespace_for_item(cx, def_id)),
|
||||
DIFlags::FlagZero,
|
||||
@@ -989,15 +1012,22 @@ fn build_field_di_node<'ll, 'tcx>(
|
||||
offset: Size,
|
||||
flags: DIFlags,
|
||||
type_di_node: &'ll DIType,
|
||||
def_id: Option<DefId>,
|
||||
) -> &'ll DIType {
|
||||
let (file_metadata, line_number) = if cx.sess().opts.unstable_opts.debug_info_type_line_numbers
|
||||
{
|
||||
file_metadata_from_def_id(cx, def_id)
|
||||
} else {
|
||||
(unknown_file_metadata(cx), UNKNOWN_LINE_NUMBER)
|
||||
};
|
||||
unsafe {
|
||||
llvm::LLVMRustDIBuilderCreateMemberType(
|
||||
DIB(cx),
|
||||
owner,
|
||||
name.as_c_char_ptr(),
|
||||
name.len(),
|
||||
unknown_file_metadata(cx),
|
||||
UNKNOWN_LINE_NUMBER,
|
||||
file_metadata,
|
||||
line_number,
|
||||
size_and_align.0.bits(),
|
||||
size_and_align.1.bits() as u32,
|
||||
offset.bits(),
|
||||
@@ -1041,6 +1071,11 @@ fn build_struct_type_di_node<'ll, 'tcx>(
|
||||
let containing_scope = get_namespace_for_item(cx, adt_def.did());
|
||||
let struct_type_and_layout = cx.layout_of(struct_type);
|
||||
let variant_def = adt_def.non_enum_variant();
|
||||
let def_location = if cx.sess().opts.unstable_opts.debug_info_type_line_numbers {
|
||||
Some(file_metadata_from_def_id(cx, Some(adt_def.did())))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
type_map::build_type_with_children(
|
||||
cx,
|
||||
@@ -1049,6 +1084,7 @@ fn build_struct_type_di_node<'ll, 'tcx>(
|
||||
Stub::Struct,
|
||||
unique_type_id,
|
||||
&compute_debuginfo_type_name(cx.tcx, struct_type, false),
|
||||
def_location,
|
||||
size_and_align_of(struct_type_and_layout),
|
||||
Some(containing_scope),
|
||||
visibility_di_flags(cx, adt_def.did(), adt_def.did()),
|
||||
@@ -1068,6 +1104,11 @@ fn build_struct_type_di_node<'ll, 'tcx>(
|
||||
Cow::Borrowed(f.name.as_str())
|
||||
};
|
||||
let field_layout = struct_type_and_layout.field(cx, i);
|
||||
let def_id = if cx.sess().opts.unstable_opts.debug_info_type_line_numbers {
|
||||
Some(f.did)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
build_field_di_node(
|
||||
cx,
|
||||
owner,
|
||||
@@ -1076,6 +1117,7 @@ fn build_struct_type_di_node<'ll, 'tcx>(
|
||||
struct_type_and_layout.fields.offset(i),
|
||||
visibility_di_flags(cx, f.did, adt_def.did()),
|
||||
type_di_node(cx, field_layout.ty),
|
||||
def_id,
|
||||
)
|
||||
})
|
||||
.collect()
|
||||
@@ -1125,6 +1167,7 @@ fn build_upvar_field_di_nodes<'ll, 'tcx>(
|
||||
layout.fields.offset(index),
|
||||
DIFlags::FlagZero,
|
||||
type_di_node(cx, up_var_ty),
|
||||
None,
|
||||
)
|
||||
})
|
||||
.collect()
|
||||
@@ -1150,6 +1193,7 @@ fn build_tuple_type_di_node<'ll, 'tcx>(
|
||||
Stub::Struct,
|
||||
unique_type_id,
|
||||
&type_name,
|
||||
None,
|
||||
size_and_align_of(tuple_type_and_layout),
|
||||
NO_SCOPE_METADATA,
|
||||
DIFlags::FlagZero,
|
||||
@@ -1168,6 +1212,7 @@ fn build_tuple_type_di_node<'ll, 'tcx>(
|
||||
tuple_type_and_layout.fields.offset(index),
|
||||
DIFlags::FlagZero,
|
||||
type_di_node(cx, component_type),
|
||||
None,
|
||||
)
|
||||
})
|
||||
.collect()
|
||||
@@ -1189,6 +1234,12 @@ fn build_closure_env_di_node<'ll, 'tcx>(
|
||||
let containing_scope = get_namespace_for_item(cx, def_id);
|
||||
let type_name = compute_debuginfo_type_name(cx.tcx, closure_env_type, false);
|
||||
|
||||
let def_location = if cx.sess().opts.unstable_opts.debug_info_type_line_numbers {
|
||||
Some(file_metadata_from_def_id(cx, Some(def_id)))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
type_map::build_type_with_children(
|
||||
cx,
|
||||
type_map::stub(
|
||||
@@ -1196,6 +1247,7 @@ fn build_closure_env_di_node<'ll, 'tcx>(
|
||||
Stub::Struct,
|
||||
unique_type_id,
|
||||
&type_name,
|
||||
def_location,
|
||||
cx.size_and_align_of(closure_env_type),
|
||||
Some(containing_scope),
|
||||
DIFlags::FlagZero,
|
||||
@@ -1219,6 +1271,11 @@ fn build_union_type_di_node<'ll, 'tcx>(
|
||||
let containing_scope = get_namespace_for_item(cx, union_def_id);
|
||||
let union_ty_and_layout = cx.layout_of(union_type);
|
||||
let type_name = compute_debuginfo_type_name(cx.tcx, union_type, false);
|
||||
let def_location = if cx.sess().opts.unstable_opts.debug_info_type_line_numbers {
|
||||
Some(file_metadata_from_def_id(cx, Some(union_def_id)))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
type_map::build_type_with_children(
|
||||
cx,
|
||||
@@ -1227,6 +1284,7 @@ fn build_union_type_di_node<'ll, 'tcx>(
|
||||
Stub::Union,
|
||||
unique_type_id,
|
||||
&type_name,
|
||||
def_location,
|
||||
size_and_align_of(union_ty_and_layout),
|
||||
Some(containing_scope),
|
||||
DIFlags::FlagZero,
|
||||
@@ -1239,6 +1297,11 @@ fn build_union_type_di_node<'ll, 'tcx>(
|
||||
.enumerate()
|
||||
.map(|(i, f)| {
|
||||
let field_layout = union_ty_and_layout.field(cx, i);
|
||||
let def_id = if cx.sess().opts.unstable_opts.debug_info_type_line_numbers {
|
||||
Some(f.did)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
build_field_di_node(
|
||||
cx,
|
||||
owner,
|
||||
@@ -1247,6 +1310,7 @@ fn build_union_type_di_node<'ll, 'tcx>(
|
||||
Size::ZERO,
|
||||
DIFlags::FlagZero,
|
||||
type_di_node(cx, field_layout.ty),
|
||||
def_id,
|
||||
)
|
||||
})
|
||||
.collect()
|
||||
@@ -1321,14 +1385,7 @@ pub(crate) fn build_global_var_di_node<'ll>(
|
||||
// We may want to remove the namespace scope if we're in an extern block (see
|
||||
// https://github.com/rust-lang/rust/pull/46457#issuecomment-351750952).
|
||||
let var_scope = get_namespace_for_item(cx, def_id);
|
||||
let span = hygiene::walk_chain_collapsed(tcx.def_span(def_id), DUMMY_SP);
|
||||
|
||||
let (file_metadata, line_number) = if !span.is_dummy() {
|
||||
let loc = cx.lookup_debug_loc(span.lo());
|
||||
(file_metadata(cx, &loc.file), loc.line)
|
||||
} else {
|
||||
(unknown_file_metadata(cx), UNKNOWN_LINE_NUMBER)
|
||||
};
|
||||
let (file_metadata, line_number) = file_metadata_from_def_id(cx, Some(def_id));
|
||||
|
||||
let is_local_to_unit = is_node_local_to_unit(cx, def_id);
|
||||
|
||||
@@ -1418,6 +1475,7 @@ fn build_vtable_type_di_node<'ll, 'tcx>(
|
||||
Stub::VTableTy { vtable_holder },
|
||||
unique_type_id,
|
||||
&vtable_type_name,
|
||||
None,
|
||||
(size, pointer_align),
|
||||
NO_SCOPE_METADATA,
|
||||
DIFlags::FlagArtificial,
|
||||
@@ -1455,6 +1513,7 @@ fn build_vtable_type_di_node<'ll, 'tcx>(
|
||||
field_offset,
|
||||
DIFlags::FlagZero,
|
||||
field_type_di_node,
|
||||
None,
|
||||
))
|
||||
})
|
||||
.collect()
|
||||
@@ -1606,3 +1665,20 @@ fn tuple_field_name(field_index: usize) -> Cow<'static, str> {
|
||||
.map(|s| Cow::from(*s))
|
||||
.unwrap_or_else(|| Cow::from(format!("__{field_index}")))
|
||||
}
|
||||
|
||||
pub(crate) type DefinitionLocation<'ll> = (&'ll DIFile, c_uint);
|
||||
|
||||
pub(crate) fn file_metadata_from_def_id<'ll>(
|
||||
cx: &CodegenCx<'ll, '_>,
|
||||
def_id: Option<DefId>,
|
||||
) -> DefinitionLocation<'ll> {
|
||||
if let Some(def_id) = def_id
|
||||
&& let span = hygiene::walk_chain_collapsed(cx.tcx.def_span(def_id), DUMMY_SP)
|
||||
&& !span.is_dummy()
|
||||
{
|
||||
let loc = cx.lookup_debug_loc(span.lo());
|
||||
(file_metadata(cx, &loc.file), loc.line)
|
||||
} else {
|
||||
(unknown_file_metadata(cx), UNKNOWN_LINE_NUMBER)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user