Skip to content

Commit b0e3ed6

Browse files
[debuginfo] Use IndexMap instead of FxHashMap while generating cpp-like generator debuginfo.
1 parent 95d7591 commit b0e3ed6

File tree

1 file changed

+15
-6
lines changed
  • compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums

1 file changed

+15
-6
lines changed

compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/cpp_like.rs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ use rustc_codegen_ssa::{
55
debuginfo::{type_names::compute_debuginfo_type_name, wants_c_like_enum_debuginfo},
66
traits::ConstMethods,
77
};
8-
use rustc_data_structures::fx::FxHashMap;
8+
9+
use rustc_index::vec::IndexVec;
910
use rustc_middle::{
1011
bug,
1112
ty::{
@@ -680,6 +681,7 @@ fn build_union_fields_for_direct_tag_generator<'ll, 'tcx>(
680681

681682
let common_upvar_names = closure_saved_names_of_captured_variables(cx.tcx, generator_def_id);
682683
let variant_range = generator_substs.variant_range(generator_def_id, cx.tcx);
684+
let variant_count = (variant_range.start.as_u32()..variant_range.end.as_u32()).len();
683685

684686
let tag_base_type = tag_base_type(cx, generator_type_and_layout);
685687

@@ -691,10 +693,17 @@ fn build_union_fields_for_direct_tag_generator<'ll, 'tcx>(
691693
.map(|variant_index| (variant_index, GeneratorSubsts::variant_name(variant_index))),
692694
);
693695

694-
let discriminants: FxHashMap<VariantIdx, DiscrResult> = generator_substs
695-
.discriminants(generator_def_id, cx.tcx)
696-
.map(|(variant_index, discr)| (variant_index, DiscrResult::Value(discr.val)))
697-
.collect();
696+
let discriminants: IndexVec<VariantIdx, DiscrResult> = {
697+
let discriminants_iter = generator_substs.discriminants(generator_def_id, cx.tcx);
698+
let mut discriminants: IndexVec<VariantIdx, DiscrResult> =
699+
IndexVec::with_capacity(variant_count);
700+
for (variant_index, discr) in discriminants_iter {
701+
// Assert that the index in the IndexMap matches up with the given VariantIdx.
702+
assert_eq!(variant_index, discriminants.next_index());
703+
discriminants.push(DiscrResult::Value(discr.val));
704+
}
705+
discriminants
706+
};
698707

699708
// Build the type node for each field.
700709
let variant_field_infos: SmallVec<VariantFieldInfo<'ll>> = variant_range
@@ -721,7 +730,7 @@ fn build_union_fields_for_direct_tag_generator<'ll, 'tcx>(
721730
variant_index,
722731
variant_struct_type_di_node,
723732
source_info,
724-
discr: discriminants[&variant_index],
733+
discr: discriminants[variant_index],
725734
}
726735
})
727736
.collect();

0 commit comments

Comments
 (0)