Fix determinism of compiled modules (#3229)

* Fix determinism of compiled modules

Currently wasmtime's compilation artifacts are not deterministic due to
the usage of `HashMap` during serialization which has randomized order
of its elements. This commit fixes that by switching to a sorted
`BTreeMap` for various maps. A test is also added to ensure determinism.

If in the future the performance of `BTreeMap` is not as good as
`HashMap` for some of these cases we can implement a fancier
`serialize_with`-style solution where we sort keys during serialization,
but only during serialization and otherwise use a `HashMap`.

* fix lightbeam
This commit is contained in:
Alex Crichton
2021-08-23 17:08:19 -05:00
committed by GitHub
parent eb21ae149a
commit f3977f1d97
7 changed files with 63 additions and 20 deletions

View File

@@ -16,7 +16,7 @@ use memoffset::offset_of;
use more_asserts::assert_lt;
use std::alloc::Layout;
use std::any::Any;
use std::collections::HashMap;
use std::collections::BTreeMap;
use std::convert::TryFrom;
use std::hash::Hash;
use std::ptr::NonNull;
@@ -511,13 +511,13 @@ impl Instance {
fn find_passive_segment<'a, I, D, T>(
index: I,
index_map: &HashMap<I, usize>,
index_map: &BTreeMap<I, usize>,
data: &'a Vec<D>,
dropped: &EntitySet<I>,
) -> &'a [T]
where
D: AsRef<[T]>,
I: EntityRef + Hash,
I: EntityRef + Ord,
{
match index_map.get(&index) {
Some(index) if !dropped.contains(I::new(*index)) => data[*index].as_ref(),