1
Fork 0

Rollup merge of #93503 - michaelwoerister:fix-vtable-holder-debuginfo-regression, r=wesleywiser

debuginfo: Fix DW_AT_containing_type vtable debuginfo regression

This PR brings back the `DW_AT_containing_type` attribute for vtables after it has accidentally been removed in #89597.

It also implements a more accurate description of vtables. Instead of describing them as an array of void pointers, the compiler will now emit a struct type description with a field for each entry of the vtable.

r? ``@wesleywiser``

This PR should fix issue https://github.com/rust-lang/rust/issues/93164.
~~The PR is blocked on https://github.com/rust-lang/rust/pull/93154 because both of them modify the `codegen/debug-vtable.rs` test case.~~
This commit is contained in:
Matthias Krüger 2022-02-09 23:29:56 +01:00 committed by GitHub
commit 6d40850e09
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 214 additions and 63 deletions

View file

@ -469,7 +469,14 @@ fn push_debuginfo_type_name<'tcx>(
}
}
/// Computes a name for the global variable storing a vtable.
pub enum VTableNameKind {
// Is the name for the const/static holding the vtable?
GlobalVariable,
// Is the name for the type of the vtable?
Type,
}
/// Computes a name for the global variable storing a vtable (or the type of that global variable).
///
/// The name is of the form:
///
@ -478,10 +485,15 @@ fn push_debuginfo_type_name<'tcx>(
/// or, when generating C++-like names:
///
/// `impl$<path::to::SomeType, path::to::SomeTrait>::vtable$`
///
/// If `kind` is `VTableNameKind::Type` then the last component is `{vtable_ty}` instead of just
/// `{vtable}`, so that the type and the corresponding global variable get assigned different
/// names.
pub fn compute_debuginfo_vtable_name<'tcx>(
tcx: TyCtxt<'tcx>,
t: Ty<'tcx>,
trait_ref: Option<ty::PolyExistentialTraitRef<'tcx>>,
kind: VTableNameKind,
) -> String {
let cpp_like_debuginfo = cpp_like_debuginfo(tcx);
@ -514,7 +526,12 @@ pub fn compute_debuginfo_vtable_name<'tcx>(
push_close_angle_bracket(cpp_like_debuginfo, &mut vtable_name);
let suffix = if cpp_like_debuginfo { "::vtable$" } else { "::{vtable}" };
let suffix = match (cpp_like_debuginfo, kind) {
(true, VTableNameKind::GlobalVariable) => "::vtable$",
(false, VTableNameKind::GlobalVariable) => "::{vtable}",
(true, VTableNameKind::Type) => "::vtable_type$",
(false, VTableNameKind::Type) => "::{vtable_type}",
};
vtable_name.reserve_exact(suffix.len());
vtable_name.push_str(suffix);