diff options
| author | Eric Holk <ericholk@microsoft.com> | 2022-01-13 15:31:36 -0800 |
|---|---|---|
| committer | Eric Holk <ericholk@microsoft.com> | 2022-01-13 15:38:03 -0800 |
| commit | 05e1f0d7691860e44e87595e8a6a572f7c14d605 (patch) | |
| tree | bf9e562383f3e24ca72d7b89be1c794050df5283 /compiler/rustc_codegen_ssa/src/debuginfo | |
| parent | 22e491ac7ed454d34669151a8b6464cb643c9b41 (diff) | |
| download | rust-05e1f0d7691860e44e87595e8a6a572f7c14d605.tar.gz rust-05e1f0d7691860e44e87595e8a6a572f7c14d605.zip | |
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.
Diffstat (limited to 'compiler/rustc_codegen_ssa/src/debuginfo')
| -rw-r--r-- | compiler/rustc_codegen_ssa/src/debuginfo/type_names.rs | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/compiler/rustc_codegen_ssa/src/debuginfo/type_names.rs b/compiler/rustc_codegen_ssa/src/debuginfo/type_names.rs index 9ecab82dd2e..61322a6e556 100644 --- a/compiler/rustc_codegen_ssa/src/debuginfo/type_names.rs +++ b/compiler/rustc_codegen_ssa/src/debuginfo/type_names.rs @@ -519,12 +519,18 @@ fn push_unqualified_item_name( output.push_str(tcx.crate_name(def_id.krate).as_str()); } 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 // in the debug info. if cpp_like_debuginfo(tcx) { - write!(output, "generator${}", disambiguated_data.disambiguator).unwrap(); + write!(output, "{}${}", key, disambiguated_data.disambiguator).unwrap(); } else { - write!(output, "{{generator#{}}}", disambiguated_data.disambiguator).unwrap(); + write!(output, "{{{}#{}}}", key, disambiguated_data.disambiguator).unwrap(); } } _ => match disambiguated_data.data.name() { |
