From b0e3ed6e8dc6782ae86707e2332a9d42a44935d6 Mon Sep 17 00:00:00 2001 From: Michael Woerister Date: Thu, 11 Aug 2022 11:09:24 +0200 Subject: [debuginfo] Use IndexMap instead of FxHashMap while generating cpp-like generator debuginfo. --- .../src/debuginfo/metadata/enums/cpp_like.rs | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) (limited to 'compiler/rustc_codegen_llvm/src/debuginfo') 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 = generator_substs - .discriminants(generator_def_id, cx.tcx) - .map(|(variant_index, discr)| (variant_index, DiscrResult::Value(discr.val))) - .collect(); + let discriminants: IndexVec = { + let discriminants_iter = generator_substs.discriminants(generator_def_id, cx.tcx); + let mut discriminants: IndexVec = + 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> = 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(); -- cgit 1.4.1-3-g733a5