@@ -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