Skip to content

Commit

Permalink
debuginfo: give unique names to closure and generator types
Browse files Browse the repository at this point in the history
Closure types have been moved to the namespace where they
are defined, and both closure and generator type names now
include the disambiguator.

This fixes an exception when lldb prints nested closures.

Fixes #57822
  • Loading branch information
philipc committed Aug 25, 2019
1 parent bea0372 commit fbe3f3e
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 5 deletions.
10 changes: 7 additions & 3 deletions src/librustc_codegen_llvm/debuginfo/metadata.rs
Original file line number Diff line number Diff line change
Expand Up @@ -683,11 +683,13 @@ pub fn type_metadata(
}
ty::Closure(def_id, substs) => {
let upvar_tys : Vec<_> = substs.upvar_tys(def_id, cx.tcx).collect();
let containing_scope = get_namespace_for_item(cx, def_id);
prepare_tuple_metadata(cx,
t,
&upvar_tys,
unique_type_id,
usage_site_span).finalize(cx)
usage_site_span,
Some(containing_scope)).finalize(cx)
}
ty::Generator(def_id, substs, _) => {
let upvar_tys : Vec<_> = substs.prefix_tys(def_id, cx.tcx).map(|t| {
Expand Down Expand Up @@ -728,7 +730,8 @@ pub fn type_metadata(
t,
&tys,
unique_type_id,
usage_site_span).finalize(cx)
usage_site_span,
NO_SCOPE_METADATA).finalize(cx)
}
_ => {
bug!("debuginfo: unexpected type in type_metadata: {:?}", t)
Expand Down Expand Up @@ -1205,14 +1208,15 @@ fn prepare_tuple_metadata(
component_types: &[Ty<'tcx>],
unique_type_id: UniqueTypeId,
span: Span,
containing_scope: Option<&'ll DIScope>,
) -> RecursiveTypeDescription<'ll, 'tcx> {
let tuple_name = compute_debuginfo_type_name(cx.tcx, tuple_type, false);

let struct_stub = create_struct_stub(cx,
tuple_type,
&tuple_name[..],
unique_type_id,
NO_SCOPE_METADATA);
containing_scope);

create_and_register_recursive_type_forward_declaration(
cx,
Expand Down
12 changes: 10 additions & 2 deletions src/librustc_codegen_ssa/debuginfo/type_names.rs
Original file line number Diff line number Diff line change
Expand Up @@ -190,11 +190,19 @@ pub fn push_debuginfo_type_name<'tcx>(
// processing
visited.remove(t);
},
ty::Closure(..) => {
ty::Closure(def_id, ..) => {
output.push_str("closure");
let disambiguator = tcx.def_key(def_id).disambiguated_data.disambiguator;
if disambiguator != 0 {
output.push_str(&format!("-{}", disambiguator));
}
}
ty::Generator(..) => {
ty::Generator(def_id, ..) => {
output.push_str("generator");
let disambiguator = tcx.def_key(def_id).disambiguated_data.disambiguator;
if disambiguator != 0 {
output.push_str(&format!("-{}", disambiguator));
}
}
ty::Error |
ty::Infer(_) |
Expand Down
55 changes: 55 additions & 0 deletions src/test/debuginfo/issue-57822.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
// This test makes sure that the LLDB pretty printer does not throw an exception
// for nested closures and generators.

// Require LLVM with DW_TAG_variant_part and a gdb that can read it.
// min-system-llvm-version: 8.0
// min-gdb-version: 8.2
// ignore-tidy-linelength

// compile-flags:-g

// === GDB TESTS ===================================================================================

// gdb-command:run

// gdb-command:print g
// gdb-check:$1 = issue_57822::main::closure-1 (issue_57822::main::closure (1))

// gdb-command:print b
// gdb-check:$2 = issue_57822::main::generator-3 {__0: issue_57822::main::generator-2 {__0: 2, <<variant>>: {[...]}}, <<variant>>: {[...]}}

// === LLDB TESTS ==================================================================================

// lldb-command:run

// lldb-command:print g
// lldbg-check:(issue_57822::main::closure-1) $0 = closure-1(closure(1))

// lldb-command:print b
// lldbg-check:(issue_57822::main::generator-3) $1 = generator-3(generator-2(2))

#![feature(omit_gdb_pretty_printer_section, generators, generator_trait)]
#![omit_gdb_pretty_printer_section]

use std::ops::Generator;
use std::pin::Pin;

fn main() {
let mut x = 1;
let f = move || x;
let g = move || f();

let mut y = 2;
let mut a = move || {
y += 1;
yield;
};
let mut b = move || {
Pin::new(&mut a).resume();
yield;
};

zzz(); // #break
}

fn zzz() { () }

0 comments on commit fbe3f3e

Please sign in to comment.