diff options
| author | Michael Woerister <michaelwoerister@posteo> | 2022-08-11 11:09:24 +0200 |
|---|---|---|
| committer | Michael Woerister <michaelwoerister@posteo> | 2022-08-12 10:53:08 +0200 |
| commit | b0e3ed6e8dc6782ae86707e2332a9d42a44935d6 (patch) | |
| tree | b968e209c829f325382ff58ad2c577edb465b10b /compiler/rustc_codegen_llvm/src | |
| parent | 95d75914788aaae88930701f3c419257adbf8288 (diff) | |
| download | rust-b0e3ed6e8dc6782ae86707e2332a9d42a44935d6.tar.gz rust-b0e3ed6e8dc6782ae86707e2332a9d42a44935d6.zip | |
[debuginfo] Use IndexMap instead of FxHashMap while generating cpp-like generator debuginfo.
Diffstat (limited to 'compiler/rustc_codegen_llvm/src')
| -rw-r--r-- | compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/cpp_like.rs | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/cpp_like.rs b/compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/cpp_like.rs index e3951c8d0f9..daec9303b2c 100644 --- a/compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/cpp_like.rs +++ b/compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/cpp_like.rs @@ -5,7 +5,8 @@ use rustc_codegen_ssa::{ debuginfo::{type_names::compute_debuginfo_type_name, wants_c_like_enum_debuginfo}, traits::ConstMethods, }; -use rustc_data_structures::fx::FxHashMap; + +use rustc_index::vec::IndexVec; use rustc_middle::{ bug, ty::{ @@ -680,6 +681,7 @@ fn build_union_fields_for_direct_tag_generator<'ll, 'tcx>( let common_upvar_names = closure_saved_names_of_captured_variables(cx.tcx, generator_def_id); let variant_range = generator_substs.variant_range(generator_def_id, cx.tcx); + let variant_count = (variant_range.start.as_u32()..variant_range.end.as_u32()).len(); let tag_base_type = tag_base_type(cx, generator_type_and_layout); @@ -691,10 +693,17 @@ fn build_union_fields_for_direct_tag_generator<'ll, 'tcx>( .map(|variant_index| (variant_index, GeneratorSubsts::variant_name(variant_index))), ); - let discriminants: FxHashMap<VariantIdx, DiscrResult> = generator_substs - .discriminants(generator_def_id, cx.tcx) - .map(|(variant_index, discr)| (variant_index, DiscrResult::Value(discr.val))) - .collect(); + let discriminants: IndexVec<VariantIdx, DiscrResult> = { + let discriminants_iter = generator_substs.discriminants(generator_def_id, cx.tcx); + let mut discriminants: IndexVec<VariantIdx, DiscrResult> = + IndexVec::with_capacity(variant_count); + for (variant_index, discr) in discriminants_iter { + // Assert that the index in the IndexMap matches up with the given VariantIdx. + assert_eq!(variant_index, discriminants.next_index()); + discriminants.push(DiscrResult::Value(discr.val)); + } + discriminants + }; // Build the type node for each field. let variant_field_infos: SmallVec<VariantFieldInfo<'ll>> = variant_range @@ -721,7 +730,7 @@ fn build_union_fields_for_direct_tag_generator<'ll, 'tcx>( variant_index, variant_struct_type_di_node, source_info, - discr: discriminants[&variant_index], + discr: discriminants[variant_index], } }) .collect(); |
