debuginfo: Refactor debuginfo generation for types -- Address review comments.
This commit is contained in:
parent
19707b0ff2
commit
9580a7115d
5 changed files with 25 additions and 19 deletions
|
@ -359,7 +359,10 @@ fn build_dyn_type_di_node<'ll, 'tcx>(
|
||||||
NO_GENERICS,
|
NO_GENERICS,
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
bug!("Only ty::Dynamic is valid for dyn_type_metadata(). Found {:?} instead.", dyn_type)
|
bug!(
|
||||||
|
"Only ty::Dynamic is valid for build_dyn_type_di_node(). Found {:?} instead.",
|
||||||
|
dyn_type
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -390,15 +393,15 @@ fn build_slice_type_di_node<'ll, 'tcx>(
|
||||||
ty::Str => cx.tcx.types.u8,
|
ty::Str => cx.tcx.types.u8,
|
||||||
_ => {
|
_ => {
|
||||||
bug!(
|
bug!(
|
||||||
"Only ty::Slice is valid for slice_type_metadata(). Found {:?} instead.",
|
"Only ty::Slice is valid for build_slice_type_di_node(). Found {:?} instead.",
|
||||||
slice_type
|
slice_type
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let element_type_metadata = type_di_node(cx, element_type);
|
let element_type_di_node = type_di_node(cx, element_type);
|
||||||
return_if_di_node_created_in_meantime!(cx, unique_type_id);
|
return_if_di_node_created_in_meantime!(cx, unique_type_id);
|
||||||
DINodeCreationResult { di_node: element_type_metadata, already_stored_in_typemap: false }
|
DINodeCreationResult { di_node: element_type_di_node, already_stored_in_typemap: false }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the debuginfo node for the given type.
|
/// Get the debuginfo node for the given type.
|
||||||
|
@ -445,7 +448,7 @@ pub fn type_di_node<'ll, 'tcx>(cx: &CodegenCx<'ll, 'tcx>, t: Ty<'tcx>) -> &'ll D
|
||||||
ty::Tuple(_) => build_tuple_type_di_node(cx, unique_type_id),
|
ty::Tuple(_) => build_tuple_type_di_node(cx, unique_type_id),
|
||||||
// Type parameters from polymorphized functions.
|
// Type parameters from polymorphized functions.
|
||||||
ty::Param(_) => build_param_type_di_node(cx, t),
|
ty::Param(_) => build_param_type_di_node(cx, t),
|
||||||
_ => bug!("debuginfo: unexpected type in type_metadata: {:?}", t),
|
_ => bug!("debuginfo: unexpected type in type_di_node(): {:?}", t),
|
||||||
};
|
};
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -456,7 +459,7 @@ pub fn type_di_node<'ll, 'tcx>(cx: &CodegenCx<'ll, 'tcx>, t: Ty<'tcx>) -> &'ll D
|
||||||
Some(di_node) => di_node,
|
Some(di_node) => di_node,
|
||||||
None => {
|
None => {
|
||||||
bug!(
|
bug!(
|
||||||
"expected type di_node for unique \
|
"expected type debuginfo node for unique \
|
||||||
type ID '{:?}' to already be in \
|
type ID '{:?}' to already be in \
|
||||||
the `debuginfo::TypeMap` but it \
|
the `debuginfo::TypeMap` but it \
|
||||||
was not.",
|
was not.",
|
||||||
|
@ -754,7 +757,7 @@ pub fn build_compile_unit_di_node<'ll, 'tcx>(
|
||||||
name_in_debuginfo.push("@");
|
name_in_debuginfo.push("@");
|
||||||
name_in_debuginfo.push(codegen_unit_name);
|
name_in_debuginfo.push(codegen_unit_name);
|
||||||
|
|
||||||
debug!("compile_unit_metadata: {:?}", name_in_debuginfo);
|
debug!("build_compile_unit_di_node: {:?}", name_in_debuginfo);
|
||||||
let rustc_producer =
|
let rustc_producer =
|
||||||
format!("rustc version {}", option_env!("CFG_VERSION").expect("CFG_VERSION"),);
|
format!("rustc version {}", option_env!("CFG_VERSION").expect("CFG_VERSION"),);
|
||||||
// FIXME(#41252) Remove "clang LLVM" if we can get GDB and LLVM to play nice.
|
// FIXME(#41252) Remove "clang LLVM" if we can get GDB and LLVM to play nice.
|
||||||
|
@ -1003,7 +1006,7 @@ fn closure_saved_names_of_captured_variables(tcx: TyCtxt<'_>, def_id: DefId) ->
|
||||||
fn build_upvar_field_di_nodes<'ll, 'tcx>(
|
fn build_upvar_field_di_nodes<'ll, 'tcx>(
|
||||||
cx: &CodegenCx<'ll, 'tcx>,
|
cx: &CodegenCx<'ll, 'tcx>,
|
||||||
closure_or_generator_ty: Ty<'tcx>,
|
closure_or_generator_ty: Ty<'tcx>,
|
||||||
closure_or_generator_metadata: &'ll DIType,
|
closure_or_generator_di_node: &'ll DIType,
|
||||||
) -> SmallVec<&'ll DIType> {
|
) -> SmallVec<&'ll DIType> {
|
||||||
let (&def_id, up_var_tys) = match closure_or_generator_ty.kind() {
|
let (&def_id, up_var_tys) = match closure_or_generator_ty.kind() {
|
||||||
ty::Generator(def_id, substs, _) => {
|
ty::Generator(def_id, substs, _) => {
|
||||||
|
@ -1016,7 +1019,7 @@ fn build_upvar_field_di_nodes<'ll, 'tcx>(
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
bug!(
|
bug!(
|
||||||
"new_upvar_member_descriptions() called with non-closure-or-generator-type: {:?}",
|
"build_upvar_field_di_nodes() called with non-closure-or-generator-type: {:?}",
|
||||||
closure_or_generator_ty
|
closure_or_generator_ty
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -1038,7 +1041,7 @@ fn build_upvar_field_di_nodes<'ll, 'tcx>(
|
||||||
.map(|(index, (up_var_ty, capture_name))| {
|
.map(|(index, (up_var_ty, capture_name))| {
|
||||||
build_field_di_node(
|
build_field_di_node(
|
||||||
cx,
|
cx,
|
||||||
closure_or_generator_metadata,
|
closure_or_generator_di_node,
|
||||||
capture_name,
|
capture_name,
|
||||||
cx.size_and_align_of(up_var_ty),
|
cx.size_and_align_of(up_var_ty),
|
||||||
layout.fields.offset(index),
|
layout.fields.offset(index),
|
||||||
|
@ -1074,14 +1077,14 @@ fn build_tuple_type_di_node<'ll, 'tcx>(
|
||||||
DIFlags::FlagZero,
|
DIFlags::FlagZero,
|
||||||
),
|
),
|
||||||
// Fields:
|
// Fields:
|
||||||
|cx, tuple_metadata| {
|
|cx, tuple_di_node| {
|
||||||
component_types
|
component_types
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.enumerate()
|
.enumerate()
|
||||||
.map(|(index, component_type)| {
|
.map(|(index, component_type)| {
|
||||||
build_field_di_node(
|
build_field_di_node(
|
||||||
cx,
|
cx,
|
||||||
tuple_metadata,
|
tuple_di_node,
|
||||||
&tuple_field_name(index),
|
&tuple_field_name(index),
|
||||||
cx.size_and_align_of(component_type),
|
cx.size_and_align_of(component_type),
|
||||||
tuple_type_and_layout.fields.offset(index),
|
tuple_type_and_layout.fields.offset(index),
|
||||||
|
@ -1095,14 +1098,14 @@ fn build_tuple_type_di_node<'ll, 'tcx>(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Builds the debufinfo node for a closure environment.
|
/// Builds the debuginfo node for a closure environment.
|
||||||
fn build_closure_env_di_node<'ll, 'tcx>(
|
fn build_closure_env_di_node<'ll, 'tcx>(
|
||||||
cx: &CodegenCx<'ll, 'tcx>,
|
cx: &CodegenCx<'ll, 'tcx>,
|
||||||
unique_type_id: UniqueTypeId<'tcx>,
|
unique_type_id: UniqueTypeId<'tcx>,
|
||||||
) -> DINodeCreationResult<'ll> {
|
) -> DINodeCreationResult<'ll> {
|
||||||
let closure_env_type = unique_type_id.expect_ty();
|
let closure_env_type = unique_type_id.expect_ty();
|
||||||
let &ty::Closure(def_id, _substs) = closure_env_type.kind() else {
|
let &ty::Closure(def_id, _substs) = closure_env_type.kind() else {
|
||||||
bug!("new_closure_env_metadata() called with non-closure-type: {:?}", closure_env_type)
|
bug!("build_closure_env_di_node() called with non-closure-type: {:?}", closure_env_type)
|
||||||
};
|
};
|
||||||
let containing_scope = get_namespace_for_item(cx, def_id);
|
let containing_scope = get_namespace_for_item(cx, def_id);
|
||||||
let type_name = compute_debuginfo_type_name(cx.tcx, closure_env_type, false);
|
let type_name = compute_debuginfo_type_name(cx.tcx, closure_env_type, false);
|
||||||
|
@ -1225,7 +1228,7 @@ fn build_generic_type_param_di_nodes<'ll, 'tcx>(
|
||||||
if let GenericArgKind::Type(ty) = kind.unpack() {
|
if let GenericArgKind::Type(ty) = kind.unpack() {
|
||||||
let actual_type =
|
let actual_type =
|
||||||
cx.tcx.normalize_erasing_regions(ParamEnv::reveal_all(), ty);
|
cx.tcx.normalize_erasing_regions(ParamEnv::reveal_all(), ty);
|
||||||
let actual_type_metadata = type_di_node(cx, actual_type);
|
let actual_type_di_node = type_di_node(cx, actual_type);
|
||||||
let name = name.as_str();
|
let name = name.as_str();
|
||||||
Some(unsafe {
|
Some(unsafe {
|
||||||
llvm::LLVMRustDIBuilderCreateTemplateTypeParameter(
|
llvm::LLVMRustDIBuilderCreateTemplateTypeParameter(
|
||||||
|
@ -1233,7 +1236,7 @@ fn build_generic_type_param_di_nodes<'ll, 'tcx>(
|
||||||
None,
|
None,
|
||||||
name.as_ptr().cast(),
|
name.as_ptr().cast(),
|
||||||
name.len(),
|
name.len(),
|
||||||
actual_type_metadata,
|
actual_type_di_node,
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -126,6 +126,8 @@ fn tag_base_type<'ll, 'tcx>(
|
||||||
// If the niche is the NULL value of a reference, then `discr_enum_ty` will be
|
// If the niche is the NULL value of a reference, then `discr_enum_ty` will be
|
||||||
// a RawPtr. CodeView doesn't know what to do with enums whose base type is a
|
// a RawPtr. CodeView doesn't know what to do with enums whose base type is a
|
||||||
// pointer so we fix this up to just be `usize`.
|
// pointer so we fix this up to just be `usize`.
|
||||||
|
// DWARF might be able to deal with this but with an integer type we are on
|
||||||
|
// the safe side there too.
|
||||||
cx.data_layout().ptr_sized_integer()
|
cx.data_layout().ptr_sized_integer()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -145,7 +145,6 @@ impl<'ll> DINodeCreationResult<'ll> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(dead_code)]
|
|
||||||
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
|
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
|
||||||
pub enum Stub<'ll> {
|
pub enum Stub<'ll> {
|
||||||
Struct,
|
Struct,
|
||||||
|
@ -233,7 +232,7 @@ pub(super) fn stub<'ll, 'tcx>(
|
||||||
/// This function enables creating debuginfo nodes that can recursively refer to themselves.
|
/// This function enables creating debuginfo nodes that can recursively refer to themselves.
|
||||||
/// It will first insert the given stub into the type map and only then execute the `members`
|
/// It will first insert the given stub into the type map and only then execute the `members`
|
||||||
/// and `generics` closures passed in. These closures have access to the stub so they can
|
/// and `generics` closures passed in. These closures have access to the stub so they can
|
||||||
/// directly attach fields to them. If build the type of a field transitively refers back
|
/// directly attach fields to them. If the type of a field transitively refers back
|
||||||
/// to the type currently being built, the stub will already be found in the type map,
|
/// to the type currently being built, the stub will already be found in the type map,
|
||||||
/// which effectively breaks the recursion cycle.
|
/// which effectively breaks the recursion cycle.
|
||||||
pub(super) fn build_type_with_children<'ll, 'tcx>(
|
pub(super) fn build_type_with_children<'ll, 'tcx>(
|
||||||
|
|
|
@ -364,7 +364,7 @@ fn push_debuginfo_type_name<'tcx>(
|
||||||
// "{async_fn_env#0}<T1, T2, ...>", etc.
|
// "{async_fn_env#0}<T1, T2, ...>", etc.
|
||||||
// In the case of cpp-like debuginfo, the name additionally gets wrapped inside of
|
// In the case of cpp-like debuginfo, the name additionally gets wrapped inside of
|
||||||
// an artificial `enum$<>` type, as defined in msvc_enum_fallback().
|
// an artificial `enum$<>` type, as defined in msvc_enum_fallback().
|
||||||
if cpp_like_debuginfo && matches!(t.kind(), ty::Generator(..)) {
|
if cpp_like_debuginfo && t.is_generator() {
|
||||||
let ty_and_layout = tcx.layout_of(ParamEnv::reveal_all().and(t)).unwrap();
|
let ty_and_layout = tcx.layout_of(ParamEnv::reveal_all().and(t)).unwrap();
|
||||||
msvc_enum_fallback(
|
msvc_enum_fallback(
|
||||||
tcx,
|
tcx,
|
||||||
|
|
|
@ -669,6 +669,8 @@ impl<'test> TestCx<'test> {
|
||||||
// type is present in the PDB, which is very confusing.
|
// type is present in the PDB, which is very confusing.
|
||||||
// Therefore we delete any existing PDB file before compiling the test
|
// Therefore we delete any existing PDB file before compiling the test
|
||||||
// case.
|
// case.
|
||||||
|
// FIXME: If can reliably detect that MSVC's link.exe is used, then
|
||||||
|
// passing `/INCREMENTAL:NO` might be a cleaner way to do this.
|
||||||
let pdb_file = exe_file.with_extension(".pdb");
|
let pdb_file = exe_file.with_extension(".pdb");
|
||||||
if pdb_file.exists() {
|
if pdb_file.exists() {
|
||||||
std::fs::remove_file(pdb_file).unwrap();
|
std::fs::remove_file(pdb_file).unwrap();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue