Skip to content

Commit cff7e0f

Browse files
committed
Auto merge of #50866 - michaelwoerister:relocations-in-vec, r=<try>
[WIP] Use different datastructure for MIRI relocations This PR makes relocations in MIRI used a sorted vector instead of a `BTreeMap` which should make a few common operations more efficient. Let's see if that's true. r? @oli-obk
2 parents df40e61 + 34b4f03 commit cff7e0f

File tree

5 files changed

+558
-26
lines changed

5 files changed

+558
-26
lines changed

src/librustc/mir/interpret/mod.rs

+34-4
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ pub use self::error::{EvalError, EvalResult, EvalErrorKind, AssertMessage};
1212

1313
pub use self::value::{PrimVal, PrimValKind, Value, Pointer, ConstValue};
1414

15-
use std::collections::BTreeMap;
1615
use std::fmt;
1716
use mir;
1817
use hir::def_id::DefId;
@@ -21,8 +20,10 @@ use ty::layout::{self, Align, HasDataLayout};
2120
use middle::region;
2221
use std::iter;
2322
use std::io;
23+
use std::ops::{Deref, DerefMut};
2424
use syntax::ast::Mutability;
2525
use rustc_serialize::{Encoder, Decoder, Decodable, Encodable};
26+
use rustc_data_structures::sorted_map::SortedMap;
2627
use byteorder::{WriteBytesExt, ReadBytesExt, LittleEndian, BigEndian};
2728

2829
#[derive(Clone, Debug, PartialEq, RustcEncodable, RustcDecodable)]
@@ -244,7 +245,7 @@ pub struct Allocation {
244245
pub bytes: Vec<u8>,
245246
/// Maps from byte addresses to allocations.
246247
/// Only the first byte of a pointer is inserted into the map.
247-
pub relocations: BTreeMap<u64, AllocId>,
248+
pub relocations: Relocations,
248249
/// Denotes undefined memory. Reading from undefined memory is forbidden in miri
249250
pub undef_mask: UndefMask,
250251
/// The alignment of the allocation to detect unaligned reads.
@@ -261,7 +262,7 @@ impl Allocation {
261262
undef_mask.grow(slice.len() as u64, true);
262263
Self {
263264
bytes: slice.to_owned(),
264-
relocations: BTreeMap::new(),
265+
relocations: Relocations::new(),
265266
undef_mask,
266267
align,
267268
runtime_mutability: Mutability::Immutable,
@@ -276,7 +277,7 @@ impl Allocation {
276277
assert_eq!(size as usize as u64, size);
277278
Allocation {
278279
bytes: vec![0; size as usize],
279-
relocations: BTreeMap::new(),
280+
relocations: Relocations::new(),
280281
undef_mask: UndefMask::new(size),
281282
align,
282283
runtime_mutability: Mutability::Immutable,
@@ -286,6 +287,35 @@ impl Allocation {
286287

287288
impl<'tcx> ::serialize::UseSpecializedDecodable for &'tcx Allocation {}
288289

290+
#[derive(Clone, PartialEq, Eq, Hash, Debug, RustcEncodable, RustcDecodable)]
291+
pub struct Relocations(SortedMap<u64, AllocId>);
292+
293+
impl Relocations {
294+
pub fn new() -> Relocations {
295+
Relocations(SortedMap::new())
296+
}
297+
298+
// The caller must guarantee that the given relocations are already sorted
299+
// by address and contain no duplicates.
300+
pub fn from_presorted(r: Vec<(u64, AllocId)>) -> Relocations {
301+
Relocations(SortedMap::from_presorted_elements(r))
302+
}
303+
}
304+
305+
impl Deref for Relocations {
306+
type Target = SortedMap<u64, AllocId>;
307+
308+
fn deref(&self) -> &Self::Target {
309+
&self.0
310+
}
311+
}
312+
313+
impl DerefMut for Relocations {
314+
fn deref_mut(&mut self) -> &mut Self::Target {
315+
&mut self.0
316+
}
317+
}
318+
289319
////////////////////////////////////////////////////////////////////////////////
290320
// Methods to access integers in the target endianness
291321
////////////////////////////////////////////////////////////////////////////////

src/librustc_codegen_llvm/mir/constant.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ pub fn const_alloc_to_llvm(cx: &CodegenCx, alloc: &Allocation) -> ValueRef {
130130
let pointer_size = layout.pointer_size.bytes() as usize;
131131

132132
let mut next_offset = 0;
133-
for (&offset, &alloc_id) in &alloc.relocations {
133+
for &(offset, alloc_id) in alloc.relocations.iter() {
134134
assert_eq!(offset as usize as u64, offset);
135135
let offset = offset as usize;
136136
if offset > next_offset {

src/librustc_data_structures/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ pub mod control_flow_graph;
7373
pub mod flock;
7474
pub mod sync;
7575
pub mod owning_ref;
76+
pub mod sorted_map;
7677

7778
pub struct OnDrop<F: Fn()>(pub F);
7879

0 commit comments

Comments
 (0)