diff --git a/mmtk/Cargo.lock b/mmtk/Cargo.lock index db8791e1..02b0c582 100644 --- a/mmtk/Cargo.lock +++ b/mmtk/Cargo.lock @@ -340,7 +340,7 @@ dependencies = [ [[package]] name = "mmtk" version = "0.14.0" -source = "git+https://github.com/mmtk/mmtk-core.git?rev=d8bcf90991224cfe06153689b14c3e1eea0e025e#d8bcf90991224cfe06153689b14c3e1eea0e025e" +source = "git+https://github.com/mmtk/mmtk-core.git?rev=76131c493be38e421f5fb157f9900f850584554f#76131c493be38e421f5fb157f9900f850584554f" dependencies = [ "atomic", "atomic-traits", @@ -363,7 +363,7 @@ dependencies = [ [[package]] name = "mmtk-macros" version = "0.14.0" -source = "git+https://github.com/mmtk/mmtk-core.git?rev=d8bcf90991224cfe06153689b14c3e1eea0e025e#d8bcf90991224cfe06153689b14c3e1eea0e025e" +source = "git+https://github.com/mmtk/mmtk-core.git?rev=76131c493be38e421f5fb157f9900f850584554f#76131c493be38e421f5fb157f9900f850584554f" dependencies = [ "proc-macro-error", "proc-macro2", diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index f8ea0764..1c916c26 100644 --- a/mmtk/Cargo.toml +++ b/mmtk/Cargo.toml @@ -29,7 +29,7 @@ once_cell = "1.10.0" # - 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 = "d8bcf90991224cfe06153689b14c3e1eea0e025e" } +mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "76131c493be38e421f5fb157f9900f850584554f" } # Uncomment the following to build locally # mmtk = { path = "../repos/mmtk-core" } diff --git a/mmtk/src/gc_work.rs b/mmtk/src/gc_work.rs index 098092e5..8d1ccb45 100644 --- a/mmtk/src/gc_work.rs +++ b/mmtk/src/gc_work.rs @@ -1,6 +1,6 @@ use std::sync::atomic::Ordering; -use super::{OpenJDK, UPCALLS}; +use super::{OpenJDK, OpenJDKEdge, UPCALLS}; use mmtk::scheduler::*; use mmtk::vm::RootsWorkFactory; use mmtk::MMTK; @@ -8,17 +8,17 @@ use scanning::to_edges_closure; macro_rules! scan_roots_work { ($struct_name: ident, $func_name: ident) => { - pub struct $struct_name { + pub struct $struct_name> { factory: F, } - impl $struct_name { + impl> $struct_name { pub fn new(factory: F) -> Self { Self { factory } } } - impl GCWork for $struct_name { + impl> GCWork for $struct_name { fn do_work(&mut self, _worker: &mut GCWorker, _mmtk: &'static MMTK) { unsafe { ((*UPCALLS).$func_name)(to_edges_closure(&mut self.factory)); @@ -43,17 +43,17 @@ scan_roots_work!( scan_roots_work!(ScanWeakProcessorRoots, scan_weak_processor_roots); scan_roots_work!(ScanVMThreadRoots, scan_vm_thread_roots); -pub struct ScanCodeCacheRoots { +pub struct ScanCodeCacheRoots> { factory: F, } -impl ScanCodeCacheRoots { +impl> ScanCodeCacheRoots { pub fn new(factory: F) -> Self { Self { factory } } } -impl GCWork for ScanCodeCacheRoots { +impl> GCWork for ScanCodeCacheRoots { fn do_work(&mut self, _worker: &mut GCWorker, _mmtk: &'static MMTK) { // Collect all the cached roots let mut edges = Vec::with_capacity(crate::CODE_CACHE_ROOTS_SIZE.load(Ordering::Relaxed)); diff --git a/mmtk/src/lib.rs b/mmtk/src/lib.rs index 45898b6b..5656a544 100644 --- a/mmtk/src/lib.rs +++ b/mmtk/src/lib.rs @@ -114,12 +114,21 @@ pub static GLOBAL_ALLOC_BIT_ADDRESS: uintptr_t = #[derive(Default)] pub struct OpenJDK; +/// The type of edges in OpenJDK. +/// +/// TODO: We currently make it an alias to Address to make the change minimal. +/// If we support CompressedOOPs, we should define an enum type to support both +/// compressed and uncompressed OOPs. +pub type OpenJDKEdge = Address; + impl VMBinding for OpenJDK { type VMObjectModel = object_model::VMObjectModel; type VMScanning = scanning::VMScanning; type VMCollection = collection::VMCollection; type VMActivePlan = active_plan::VMActivePlan; type VMReferenceGlue = reference_glue::VMReferenceGlue; + + type VMEdge = OpenJDKEdge; } use std::sync::atomic::AtomicBool; diff --git a/mmtk/src/object_scanning.rs b/mmtk/src/object_scanning.rs index ae9277dc..4ad2b43a 100644 --- a/mmtk/src/object_scanning.rs +++ b/mmtk/src/object_scanning.rs @@ -1,5 +1,5 @@ use super::abi::*; -use super::UPCALLS; +use super::{OpenJDKEdge, UPCALLS}; use mmtk::util::constants::*; use mmtk::util::opaque_pointer::*; use mmtk::util::{Address, ObjectReference}; @@ -7,12 +7,12 @@ use mmtk::vm::EdgeVisitor; use std::{mem, slice}; trait OopIterate: Sized { - fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor); + fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor); } impl OopIterate for OopMapBlock { #[inline] - fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor) { + fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor) { let start = oop.get_field_address(self.offset); for i in 0..self.count as usize { let edge = start + (i << LOG_BYTES_IN_ADDRESS); @@ -23,7 +23,7 @@ impl OopIterate for OopMapBlock { impl OopIterate for InstanceKlass { #[inline] - fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor) { + fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor) { let oop_maps = self.nonstatic_oop_maps(); for map in oop_maps { map.oop_iterate(oop, closure) @@ -33,7 +33,7 @@ impl OopIterate for InstanceKlass { impl OopIterate for InstanceMirrorKlass { #[inline] - fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor) { + fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor) { self.instance_klass.oop_iterate(oop, closure); // if (Devirtualizer::do_metadata(closure)) { // Klass* klass = java_lang_Class::as_Klass(obj); @@ -74,7 +74,7 @@ impl OopIterate for InstanceMirrorKlass { impl OopIterate for InstanceClassLoaderKlass { #[inline] - fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor) { + fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor) { self.instance_klass.oop_iterate(oop, closure); // if (Devirtualizer::do_metadata(closure)) { // ClassLoaderData* cld = java_lang_ClassLoader::loader_data(obj); @@ -88,7 +88,7 @@ impl OopIterate for InstanceClassLoaderKlass { impl OopIterate for ObjArrayKlass { #[inline] - fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor) { + fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor) { let array = unsafe { oop.as_array_oop() }; for oop in unsafe { array.data::(BasicType::T_OBJECT) } { closure.visit_edge(Address::from_ref(oop as &Oop)); @@ -98,7 +98,7 @@ impl OopIterate for ObjArrayKlass { impl OopIterate for TypeArrayKlass { #[inline] - fn oop_iterate(&self, _oop: Oop, _closure: &mut impl EdgeVisitor) { + fn oop_iterate(&self, _oop: Oop, _closure: &mut impl EdgeVisitor) { // Performance tweak: We skip processing the klass pointer since all // TypeArrayKlasses are guaranteed processed via the null class loader. } @@ -106,7 +106,7 @@ impl OopIterate for TypeArrayKlass { impl OopIterate for InstanceRefKlass { #[inline] - fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor) { + fn oop_iterate(&self, oop: Oop, closure: &mut impl EdgeVisitor) { use crate::abi::*; use crate::api::{add_phantom_candidate, add_soft_candidate, add_weak_candidate}; self.instance_klass.oop_iterate(oop, closure); @@ -139,7 +139,7 @@ impl InstanceRefKlass { !*SINGLETON.get_options().no_reference_types } #[inline] - fn process_ref_as_strong(oop: Oop, closure: &mut impl EdgeVisitor) { + fn process_ref_as_strong(oop: Oop, closure: &mut impl EdgeVisitor) { let referent_addr = Self::referent_address(oop); closure.visit_edge(referent_addr); let discovered_addr = Self::discovered_address(oop); @@ -148,14 +148,14 @@ impl InstanceRefKlass { } #[allow(unused)] -fn oop_iterate_slow(oop: Oop, closure: &mut impl EdgeVisitor, tls: OpaquePointer) { +fn oop_iterate_slow(oop: Oop, closure: &mut impl EdgeVisitor, tls: OpaquePointer) { unsafe { ((*UPCALLS).scan_object)(closure as *mut _ as _, mem::transmute(oop), tls); } } #[inline] -fn oop_iterate(oop: Oop, closure: &mut impl EdgeVisitor) { +fn oop_iterate(oop: Oop, closure: &mut impl EdgeVisitor) { let klass_id = oop.klass.id; debug_assert!( klass_id as i32 >= 0 && (klass_id as i32) < 6, @@ -192,7 +192,11 @@ fn oop_iterate(oop: Oop, closure: &mut impl EdgeVisitor) { } #[inline] -pub fn scan_object(object: ObjectReference, closure: &mut impl EdgeVisitor, _tls: VMWorkerThread) { +pub fn scan_object( + object: ObjectReference, + closure: &mut impl EdgeVisitor, + _tls: VMWorkerThread, +) { // println!("*****scan_object(0x{:x}) -> \n 0x{:x}, 0x{:x} \n", // object, // unsafe { *(object.value() as *const usize) }, diff --git a/mmtk/src/scanning.rs b/mmtk/src/scanning.rs index 8323d9eb..eeef2fc5 100644 --- a/mmtk/src/scanning.rs +++ b/mmtk/src/scanning.rs @@ -1,5 +1,5 @@ use super::gc_work::*; -use super::{NewBuffer, SINGLETON, UPCALLS}; +use super::{NewBuffer, OpenJDKEdge, SINGLETON, UPCALLS}; use crate::{EdgesClosure, OpenJDK}; use mmtk::memory_manager; use mmtk::scheduler::WorkBucketStage; @@ -13,7 +13,7 @@ pub struct VMScanning {} const WORK_PACKET_CAPACITY: usize = 4096; -extern "C" fn report_edges_and_renew_buffer( +extern "C" fn report_edges_and_renew_buffer>( ptr: *mut Address, length: usize, capacity: usize, @@ -34,7 +34,7 @@ extern "C" fn report_edges_and_renew_buffer( NewBuffer { ptr, capacity } } -pub(crate) fn to_edges_closure(factory: &mut F) -> EdgesClosure { +pub(crate) fn to_edges_closure>(factory: &mut F) -> EdgesClosure { EdgesClosure { func: report_edges_and_renew_buffer:: as *const _, data: factory as *mut F as *mut libc::c_void, @@ -45,7 +45,7 @@ impl Scanning for VMScanning { const SCAN_MUTATORS_IN_SAFEPOINT: bool = false; const SINGLE_THREAD_MUTATOR_SCANNING: bool = false; - fn scan_object( + fn scan_object>( tls: VMWorkerThread, object: ObjectReference, edge_visitor: &mut EV, @@ -58,7 +58,7 @@ impl Scanning for VMScanning { // TODO } - fn scan_thread_roots(_tls: VMWorkerThread, mut factory: impl RootsWorkFactory) { + fn scan_thread_roots(_tls: VMWorkerThread, mut factory: impl RootsWorkFactory) { unsafe { ((*UPCALLS).scan_all_thread_roots)(to_edges_closure(&mut factory)); } @@ -67,7 +67,7 @@ impl Scanning for VMScanning { fn scan_thread_root( _tls: VMWorkerThread, mutator: &'static mut Mutator, - mut factory: impl RootsWorkFactory, + mut factory: impl RootsWorkFactory, ) { let tls = mutator.get_tls(); unsafe { @@ -75,7 +75,7 @@ impl Scanning for VMScanning { } } - fn scan_vm_specific_roots(_tls: VMWorkerThread, factory: impl RootsWorkFactory) { + fn scan_vm_specific_roots(_tls: VMWorkerThread, factory: impl RootsWorkFactory) { memory_manager::add_work_packets( &SINGLETON, WorkBucketStage::Prepare,