Skip to content

Commit db1f816

Browse files
committed
Refactor map entry layout calculations to use canonical ABI
1 parent b80b41a commit db1f816

1 file changed

Lines changed: 44 additions & 20 deletions

File tree

crates/environ/src/fact/trampoline.rs

Lines changed: 44 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2732,26 +2732,50 @@ impl<'a, 'b> Compiler<'a, 'b> {
27322732
let src_opts = src.opts();
27332733
let dst_opts = dst.opts();
27342734

2735-
// Each map entry is a tuple<K, V> following record layout rules:
2736-
// key at offset 0, padding to value_align, value, trailing padding
2737-
// to entry_align.
2738-
let (src_key_size, src_key_align) = self.types.size_align(src_mem_opts, &src_map_ty.key);
2739-
let (src_value_size, src_value_align) =
2740-
self.types.size_align(src_mem_opts, &src_map_ty.value);
2741-
let src_entry_align = src_key_align.max(src_value_align);
2742-
let src_value_offset =
2743-
(src_key_size + src_value_align - 1) & !(src_value_align - 1);
2744-
let src_tuple_size =
2745-
(src_value_offset + src_value_size + src_entry_align - 1) & !(src_entry_align - 1);
2746-
2747-
let (dst_key_size, dst_key_align) = self.types.size_align(dst_mem_opts, &dst_map_ty.key);
2748-
let (dst_value_size, dst_value_align) =
2749-
self.types.size_align(dst_mem_opts, &dst_map_ty.value);
2750-
let dst_entry_align = dst_key_align.max(dst_value_align);
2751-
let dst_value_offset =
2752-
(dst_key_size + dst_value_align - 1) & !(dst_value_align - 1);
2753-
let dst_tuple_size =
2754-
(dst_value_offset + dst_value_size + dst_entry_align - 1) & !(dst_entry_align - 1);
2735+
// Each map entry is a tuple<K, V> following record layout rules.
2736+
let src_key_abi = self.types.canonical_abi(&src_map_ty.key);
2737+
let src_value_abi = self.types.canonical_abi(&src_map_ty.value);
2738+
let src_entry_abi =
2739+
CanonicalAbiInfo::record([src_key_abi, src_value_abi].into_iter());
2740+
let (_, src_key_align) = self.types.size_align(src_mem_opts, &src_map_ty.key);
2741+
let (_, src_value_align) = self.types.size_align(src_mem_opts, &src_map_ty.value);
2742+
let (src_tuple_size, src_entry_align) = if src_mem_opts.memory64 {
2743+
(src_entry_abi.size64, src_entry_abi.align64)
2744+
} else {
2745+
(src_entry_abi.size32, src_entry_abi.align32)
2746+
};
2747+
let src_value_offset = {
2748+
let mut offset = 0u32;
2749+
if src_mem_opts.memory64 {
2750+
src_key_abi.next_field64(&mut offset);
2751+
src_value_abi.next_field64(&mut offset)
2752+
} else {
2753+
src_key_abi.next_field32(&mut offset);
2754+
src_value_abi.next_field32(&mut offset)
2755+
}
2756+
};
2757+
2758+
let dst_key_abi = self.types.canonical_abi(&dst_map_ty.key);
2759+
let dst_value_abi = self.types.canonical_abi(&dst_map_ty.value);
2760+
let dst_entry_abi =
2761+
CanonicalAbiInfo::record([dst_key_abi, dst_value_abi].into_iter());
2762+
let (_, dst_key_align) = self.types.size_align(dst_mem_opts, &dst_map_ty.key);
2763+
let (_, dst_value_align) = self.types.size_align(dst_mem_opts, &dst_map_ty.value);
2764+
let (dst_tuple_size, dst_entry_align) = if dst_mem_opts.memory64 {
2765+
(dst_entry_abi.size64, dst_entry_abi.align64)
2766+
} else {
2767+
(dst_entry_abi.size32, dst_entry_abi.align32)
2768+
};
2769+
let dst_value_offset = {
2770+
let mut offset = 0u32;
2771+
if dst_mem_opts.memory64 {
2772+
dst_key_abi.next_field64(&mut offset);
2773+
dst_value_abi.next_field64(&mut offset)
2774+
} else {
2775+
dst_key_abi.next_field32(&mut offset);
2776+
dst_value_abi.next_field32(&mut offset)
2777+
}
2778+
};
27552779

27562780
let src_mem = self.memory_operand(src_opts, src_ptr, src_entry_align);
27572781

0 commit comments

Comments
 (0)