diff --git a/vmkit/examples/binarytrees.rs b/vmkit/examples/binarytrees.rs index 2572b7a..da39de9 100644 --- a/vmkit/examples/binarytrees.rs +++ b/vmkit/examples/binarytrees.rs @@ -32,6 +32,7 @@ static METADATA: GCMetadata<BenchVM> = GCMetadata { instance_size: size_of::<Node>(), compute_size: None, alignment: 16, + compute_alignment: None, }; struct BenchVM { diff --git a/vmkit/src/bdwgc_shim.rs b/vmkit/src/bdwgc_shim.rs index 8697479..76e087a 100644 --- a/vmkit/src/bdwgc_shim.rs +++ b/vmkit/src/bdwgc_shim.rs @@ -33,7 +33,7 @@ use crate::{ }; use easy_bitfield::*; use mmtk::{ - util::Address, + util::{options::PlanSelector, Address}, vm::{ slot::{SimpleSlot, UnimplementedMemorySlice}, ObjectTracer, @@ -326,6 +326,7 @@ struct MarkStackMeta<'a> { static CONSERVATIVE_METADATA: GCMetadata<BDWGC> = GCMetadata { alignment: 8, instance_size: 0, + compute_alignment: None, compute_size: Some(|object| { let header = object.header::<BDWGC>().metadata(); ObjectSize::decode(header.meta) * BDWGC::MIN_ALIGNMENT @@ -508,10 +509,10 @@ pub static mut GC_VERBOSE: i32 = 0; static BUILDER: LazyLock<Mutex<MMTKBuilder>> = LazyLock::new(|| { Mutex::new({ let mut builder = MMTKBuilder::new(); - builder - .options - .plan - .set(mmtk::util::options::PlanSelector::Immix); + builder.options.read_env_var_settings(); + if !matches!(*builder.options.plan, PlanSelector::Immix | PlanSelector::MarkSweep) { + builder.options.plan.set(PlanSelector::Immix); + } builder }) }); diff --git a/vmkit/src/object_model/metadata.rs b/vmkit/src/object_model/metadata.rs index 93915a8..d49fee4 100644 --- a/vmkit/src/object_model/metadata.rs +++ b/vmkit/src/object_model/metadata.rs @@ -14,6 +14,7 @@ pub struct GCMetadata<VM: VirtualMachine> { pub instance_size: usize, pub compute_size: Option<fn(VMKitObject) -> usize>, pub alignment: usize, + pub compute_alignment: Option<fn(VMKitObject) -> usize>, } #[derive(Debug)] diff --git a/vmkit/src/object_model/object.rs b/vmkit/src/object_model/object.rs index fdbc6ed..ce54e3e 100644 --- a/vmkit/src/object_model/object.rs +++ b/vmkit/src/object_model/object.rs @@ -3,12 +3,12 @@ use crate::threading::Thread; use crate::{mm::MemoryManager, VirtualMachine}; use atomic::Atomic; use core::ops::Range; -use std::hash::Hash; use mmtk::util::{ constants::LOG_BYTES_IN_ADDRESS, conversions::raw_align_up, Address, ObjectReference, }; use mmtk::vm::slot::{MemorySlice, SimpleSlot, Slot}; use std::fmt; +use std::hash::Hash; use std::marker::PhantomData; use super::{ @@ -127,8 +127,18 @@ impl VMKitObject { /// # Returns /// /// * `usize` - The alignment of the object. - pub fn alignment<VM: VirtualMachine>(&self) -> usize { - self.header::<VM>().metadata().gc_metadata().alignment + pub fn alignment<VM: VirtualMachine>(self) -> usize { + let alignment = self.header::<VM>().metadata().gc_metadata().alignment; + if alignment == 0 { + return self + .header::<VM>() + .metadata() + .gc_metadata() + .compute_alignment + .map(|f| f(self)) + .unwrap_or(VM::MAX_ALIGNMENT); + } + alignment } /// Returns the number of bytes used by the `VMKitObject`. @@ -644,12 +654,12 @@ impl<SL: SlotExtra> Eq for SimpleMemorySlice<SL> {} impl<SL: SlotExtra> Clone for SimpleMemorySlice<SL> { fn clone(&self) -> Self { - Self { range: self.range.clone() } + Self { + range: self.range.clone(), + } } } - - pub struct SimpleMemorySliceRangeIterator<SL: SlotExtra = SimpleSlot> { cursor: Address, end: Address,