Generate more precise generator names
Currently all generators are named with a `generator$N` suffix, regardless of where they come from. This means an `async fn` shows up as a generator in stack traces, which can be surprising to async programmers since they should not need to know that async functions are implementated using generators. This change generators a different name depending on the generator kind, allowing us to tell whether the generator is the result of an async block, an async closure, an async fn, or a plain generator.
This commit is contained in:
parent
22e491ac7e
commit
05e1f0d769
2 changed files with 9 additions and 3 deletions
|
@ -519,12 +519,18 @@ fn push_unqualified_item_name(
|
||||||
output.push_str(tcx.crate_name(def_id.krate).as_str());
|
output.push_str(tcx.crate_name(def_id.krate).as_str());
|
||||||
}
|
}
|
||||||
DefPathData::ClosureExpr if tcx.generator_kind(def_id).is_some() => {
|
DefPathData::ClosureExpr if tcx.generator_kind(def_id).is_some() => {
|
||||||
|
let key = match tcx.generator_kind(def_id).unwrap() {
|
||||||
|
hir::GeneratorKind::Async(hir::AsyncGeneratorKind::Block) => "async_block",
|
||||||
|
hir::GeneratorKind::Async(hir::AsyncGeneratorKind::Closure) => "async_closure",
|
||||||
|
hir::GeneratorKind::Async(hir::AsyncGeneratorKind::Fn) => "async_fn",
|
||||||
|
hir::GeneratorKind::Gen => "generator",
|
||||||
|
};
|
||||||
// Generators look like closures, but we want to treat them differently
|
// Generators look like closures, but we want to treat them differently
|
||||||
// in the debug info.
|
// in the debug info.
|
||||||
if cpp_like_debuginfo(tcx) {
|
if cpp_like_debuginfo(tcx) {
|
||||||
write!(output, "generator${}", disambiguated_data.disambiguator).unwrap();
|
write!(output, "{}${}", key, disambiguated_data.disambiguator).unwrap();
|
||||||
} else {
|
} else {
|
||||||
write!(output, "{{generator#{}}}", disambiguated_data.disambiguator).unwrap();
|
write!(output, "{{{}#{}}}", key, disambiguated_data.disambiguator).unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => match disambiguated_data.data.name() {
|
_ => match disambiguated_data.data.name() {
|
||||||
|
|
|
@ -17,7 +17,7 @@ async fn async_fn_test() {
|
||||||
// FIXME: No way to reliably check the filename.
|
// FIXME: No way to reliably check the filename.
|
||||||
|
|
||||||
// CHECK-DAG: [[ASYNC_FN:!.*]] = !DINamespace(name: "async_fn_test"
|
// CHECK-DAG: [[ASYNC_FN:!.*]] = !DINamespace(name: "async_fn_test"
|
||||||
// CHECK-DAG: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_union_type, name: "generator$0"
|
// CHECK-DAG: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_union_type, name: "async_fn$0"
|
||||||
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "variant0", scope: [[GEN]],
|
// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "variant0", scope: [[GEN]],
|
||||||
// For brevity, we only check the struct name and members of the last variant.
|
// For brevity, we only check the struct name and members of the last variant.
|
||||||
// CHECK-SAME: file: [[FILE:![0-9]*]], line: 11,
|
// CHECK-SAME: file: [[FILE:![0-9]*]], line: 11,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue