This module is responsible for managing the absolute addresses that allocations are located at,
and for casting between pointers and integers based on those addresses.
This is a “monotonic FxHashMap”: A FxHashMap that, when shared, can be pushed to but not
otherwise mutated. We also box items in the map. This means we can safely provide
shared references into existing items in the FxHashMap, because they will not be dropped
(from being removed) or moved (because they are boxed).
The API is completely tailored to what memory.rs needs. It is still in
a separate file to minimize the amount of code that has to care about the unsafety.
Implements a map from integer indices to data.
Rather than storing data for every index, internally, this maps entire ranges to the data.
To this end, the APIs all work on ranges, not on individual integers. Ranges are split as
necessary (e.g., when [0,5) is first associated with X, and then [1,2) is mutated).
Users must not depend on whether a range is coalesced or not, even though this is observable
via the iteration APIs.
Allocation bytes that explicitly handle the layout of the data they’re storing.
This is necessary to interface with native code that accesses the program store in Miri.
Insert rustc arguments at the beginning of the argument list that Miri wants to be
set per default, for maximal validation power.
Also disable the MIR pass that inserts an alignment check on every pointer dereference. Miri
does that too, and with a better error message.
Evaluates the entry function specified by entry_id.
Returns Some(return_code) if program execution completed.
Returns None if an evaluation error occurred.