diff --git a/julia/mmtk_julia.c b/julia/mmtk_julia.c index 88399ef7..5bba7cd2 100644 --- a/julia/mmtk_julia.c +++ b/julia/mmtk_julia.c @@ -728,7 +728,7 @@ const bool PRINT_OBJ_TYPE = false; * directly (not an edge), specifying whether to scan the object or not; and only scan the object * (necessary for boot image / non-MMTk objects) **/ -JL_DLLEXPORT void scan_julia_obj(void* obj_raw, closure_pointer closure, ProcessEdgeFn process_edge, ProcessOffsetEdgeFn process_offset_edge) +JL_DLLEXPORT void scan_julia_obj(void* obj_raw, closure_pointer closure, ProcessEdgeFn process_edge, TraceObjectImmediatelyFn trace_object_immediately) { jl_value_t* obj = (jl_value_t*) obj_raw; uintptr_t tag = (uintptr_t)jl_typeof(obj); @@ -756,7 +756,15 @@ JL_DLLEXPORT void scan_julia_obj(void* obj_raw, closure_pointer closure, Process if (flags.how == 1) { // julia-allocated buffer that needs to be marked long offset = a->offset * a->elsize; - process_offset_edge(closure, &a->data, offset); + if (offset == 0) { + process_edge(closure, &a->data); + } else { + // Special case: we need to deal with offset edge. + // We trace object immediately here. + uint8_t* data = (uint8_t*)(a->data); + uint8_t* new_obj = (uint8_t*)trace_object_immediately(closure, data - offset); + a->data = new_obj + offset; + } } if (flags.how == 2) { // malloc-allocated pointer this array object manages // should be processed below if it contains pointers diff --git a/mmtk/Cargo.lock b/mmtk/Cargo.lock index 65492a30..09e9f18f 100644 --- a/mmtk/Cargo.lock +++ b/mmtk/Cargo.lock @@ -545,7 +545,7 @@ dependencies = [ [[package]] name = "mmtk" version = "0.18.0" -source = "git+https://github.com/mmtk/mmtk-core.git?rev=f1a0bb7fbec97dd84e35a40e8be01cf5018f2f9e#f1a0bb7fbec97dd84e35a40e8be01cf5018f2f9e" +source = "git+https://github.com/qinsoon/mmtk-core.git?rev=28bde92892d699cea0e1e179931d3aeeee25e982#28bde92892d699cea0e1e179931d3aeeee25e982" dependencies = [ "atomic 0.5.1", "atomic-traits", @@ -590,7 +590,7 @@ dependencies = [ [[package]] name = "mmtk-macros" version = "0.18.0" -source = "git+https://github.com/mmtk/mmtk-core.git?rev=f1a0bb7fbec97dd84e35a40e8be01cf5018f2f9e#f1a0bb7fbec97dd84e35a40e8be01cf5018f2f9e" +source = "git+https://github.com/qinsoon/mmtk-core.git?rev=28bde92892d699cea0e1e179931d3aeeee25e982#28bde92892d699cea0e1e179931d3aeeee25e982" dependencies = [ "proc-macro-error", "proc-macro2", diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index 53745c1f..a5a77eee 100644 --- a/mmtk/Cargo.toml +++ b/mmtk/Cargo.toml @@ -29,7 +29,7 @@ lazy_static = "1.1" # - change branch # - change repo name # But other changes including adding/removing whitespaces in commented lines may break the CI -mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "f1a0bb7fbec97dd84e35a40e8be01cf5018f2f9e" } +mmtk = { git = "https://github.com/qinsoon/mmtk-core.git", rev = "28bde92892d699cea0e1e179931d3aeeee25e982" } # Uncomment the following to build locally # mmtk = { path = "../repos/mmtk-core" } log = {version = "0.4", features = ["max_level_trace", "release_max_level_off"] } diff --git a/mmtk/api/mmtk.h b/mmtk/api/mmtk.h index 263d5f70..ac6a7078 100644 --- a/mmtk/api/mmtk.h +++ b/mmtk/api/mmtk.h @@ -18,6 +18,7 @@ typedef void* MMTk_Mutator; typedef void* MMTk_TraceLocal; typedef void (*ProcessEdgeFn)(closure_pointer closure, void* slot); typedef void (*ProcessOffsetEdgeFn)(closure_pointer closure, void* slot, int offset); +typedef void* (*TraceObjectImmediatelyFn)(closure_pointer closure, void* object); /** * Allocation @@ -77,7 +78,7 @@ extern const void* MMTK_SIDE_LOG_BIT_BASE_ADDRESS; // * int is 4 bytes // * size_t is 8 bytes typedef struct { - void (* scan_julia_obj) (void* obj, closure_pointer closure, ProcessEdgeFn process_edge, ProcessOffsetEdgeFn process_offset_edge); + void (* scan_julia_obj) (void* obj, closure_pointer closure, ProcessEdgeFn process_edge, TraceObjectImmediatelyFn trace_object_immediately); void (* scan_julia_exc_obj) (void* obj, closure_pointer closure, ProcessEdgeFn process_edge); void* (* get_stackbase) (int16_t tid); void (* calculate_roots) (void* tls); diff --git a/mmtk/src/api.rs b/mmtk/src/api.rs index 054ba9fb..9d6c67b8 100644 --- a/mmtk/src/api.rs +++ b/mmtk/src/api.rs @@ -545,9 +545,7 @@ pub extern "C" fn mmtk_object_reference_write_post( memory_manager::object_reference_write_post( mutator, src, - crate::edges::JuliaVMEdge::Simple(mmtk::vm::edge_shape::SimpleEdge::from_address( - Address::ZERO, - )), + mmtk::vm::edge_shape::SimpleEdge::from_address(Address::ZERO), target, ) } @@ -561,9 +559,7 @@ pub extern "C" fn mmtk_object_reference_write_slow( use mmtk::MutatorContext; mutator.barrier().object_reference_write_slow( src, - crate::edges::JuliaVMEdge::Simple(mmtk::vm::edge_shape::SimpleEdge::from_address( - Address::ZERO, - )), + mmtk::vm::edge_shape::SimpleEdge::from_address(Address::ZERO), target, ); } diff --git a/mmtk/src/edges.rs b/mmtk/src/edges.rs index 461345ec..5fdcceae 100644 --- a/mmtk/src/edges.rs +++ b/mmtk/src/edges.rs @@ -1,79 +1,9 @@ -use atomic::Atomic; use mmtk::{ util::{Address, ObjectReference}, - vm::edge_shape::{Edge, SimpleEdge}, + vm::edge_shape::SimpleEdge, }; -/// If a VM supports multiple kinds of edges, we can use tagged union to represent all of them. -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] -pub enum JuliaVMEdge { - Simple(SimpleEdge), - Offset(OffsetEdge), -} - -unsafe impl Send for JuliaVMEdge {} - -impl Edge for JuliaVMEdge { - fn load(&self) -> ObjectReference { - match self { - JuliaVMEdge::Simple(e) => e.load(), - JuliaVMEdge::Offset(e) => e.load(), - } - } - - fn store(&self, object: ObjectReference) { - match self { - JuliaVMEdge::Simple(e) => e.store(object), - JuliaVMEdge::Offset(e) => e.store(object), - } - } -} - -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] -pub struct OffsetEdge { - slot_addr: *mut Atomic
, - offset: usize, -} - -unsafe impl Send for OffsetEdge {} - -impl OffsetEdge { - pub fn new_no_offset(address: Address) -> Self { - Self { - slot_addr: address.to_mut_ptr(), - offset: 0, - } - } - - pub fn new_with_offset(address: Address, offset: usize) -> Self { - Self { - slot_addr: address.to_mut_ptr(), - offset, - } - } - - pub fn slot_address(&self) -> Address { - Address::from_mut_ptr(self.slot_addr) - } - - pub fn offset(&self) -> usize { - self.offset - } -} - -impl Edge for OffsetEdge { - fn load(&self) -> ObjectReference { - let middle = unsafe { (*self.slot_addr).load(atomic::Ordering::Relaxed) }; - let begin = middle - self.offset; - ObjectReference::from_raw_address(begin) - } - - fn store(&self, object: ObjectReference) { - let begin = object.to_raw_address(); - let middle = begin + self.offset; - unsafe { (*self.slot_addr).store(middle, atomic::Ordering::Relaxed) } - } -} +pub type JuliaVMEdge = SimpleEdge; #[derive(Hash, Clone, PartialEq, Eq, Debug)] pub struct JuliaMemorySlice { @@ -157,7 +87,7 @@ impl Iterator for JuliaMemorySliceEdgeIterator { } else { let edge = self.cursor; self.cursor = self.cursor.shift::