diff --git a/mmtk/Cargo.lock b/mmtk/Cargo.lock index 6f7762a3..241cd5c0 100644 --- a/mmtk/Cargo.lock +++ b/mmtk/Cargo.lock @@ -98,9 +98,9 @@ checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" [[package]] name = "built" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d17f4d6e4dc36d1a02fbedc2753a096848e7c1b0772f7654eab8e2c927dd53" +checksum = "41bfbdb21256b87a8b5e80fab81a8eed158178e812fd7ba451907518b2742f16" dependencies = [ "git2", ] @@ -122,17 +122,18 @@ checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] name = "cc" -version = "1.0.91" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd97381a8cc6493395a5afc4c691c1084b3768db713b73aa215217aa245d153" +checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" dependencies = [ "jobserver", "libc", + "once_cell", ] [[package]] @@ -217,7 +218,7 @@ checksum = "4e018fccbeeb50ff26562ece792ed06659b9c2dae79ece77c4456bb10d9bf79b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -228,9 +229,9 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "either" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" [[package]] name = "enum-map" @@ -249,7 +250,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -347,9 +348,9 @@ dependencies = [ [[package]] name = "jobserver" -version = "0.1.28" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" dependencies = [ "libc", ] @@ -392,9 +393,9 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -424,7 +425,7 @@ dependencies = [ [[package]] name = "mmtk" version = "0.24.0" -source = "git+https://github.com/mmtk/mmtk-core.git?rev=e79e94e744660c486d5471f252ff05c4248bcea9#e79e94e744660c486d5471f252ff05c4248bcea9" +source = "git+https://github.com/mmtk/mmtk-core.git?rev=a02803b4104519ff2289234101a2dd8ceedd1bc7#a02803b4104519ff2289234101a2dd8ceedd1bc7" dependencies = [ "atomic", "atomic-traits", @@ -459,12 +460,12 @@ dependencies = [ [[package]] name = "mmtk-macros" version = "0.24.0" -source = "git+https://github.com/mmtk/mmtk-core.git?rev=e79e94e744660c486d5471f252ff05c4248bcea9#e79e94e744660c486d5471f252ff05c4248bcea9" +source = "git+https://github.com/mmtk/mmtk-core.git?rev=a02803b4104519ff2289234101a2dd8ceedd1bc7#a02803b4104519ff2289234101a2dd8ceedd1bc7" dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -564,18 +565,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.79" +version = "1.0.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.35" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -687,7 +688,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.58", + "syn 2.0.60", ] [[package]] @@ -702,9 +703,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.58" +version = "2.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" +checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" dependencies = [ "proc-macro2", "quote", @@ -713,9 +714,9 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.30.10" +version = "0.30.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d7c217777061d5a2d652aea771fb9ba98b6dade657204b08c4b9604d11555b" +checksum = "87341a165d73787554941cd5ef55ad728011566fe714e987d1b976c15dbc3a83" dependencies = [ "cfg-if", "core-foundation-sys", @@ -843,13 +844,14 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", + "windows_i686_gnullvm", "windows_i686_msvc", "windows_x86_64_gnu", "windows_x86_64_gnullvm", @@ -858,42 +860,48 @@ dependencies = [ [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" [[package]] name = "windows_aarch64_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" [[package]] name = "windows_i686_gnu" -version = "0.52.4" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" [[package]] name = "windows_i686_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" [[package]] name = "windows_x86_64_gnu" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" [[package]] name = "windows_x86_64_msvc" -version = "0.52.4" +version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index 4def9482..69eefd09 100644 --- a/mmtk/Cargo.toml +++ b/mmtk/Cargo.toml @@ -32,7 +32,7 @@ memoffset = "0.9.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 = "e79e94e744660c486d5471f252ff05c4248bcea9" } +mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "a02803b4104519ff2289234101a2dd8ceedd1bc7" } # Uncomment the following to build locally # mmtk = { path = "../repos/mmtk-core" } diff --git a/mmtk/src/api.rs b/mmtk/src/api.rs index 68765039..979c38d4 100644 --- a/mmtk/src/api.rs +++ b/mmtk/src/api.rs @@ -8,6 +8,7 @@ use mmtk::memory_manager; use mmtk::plan::BarrierSelector; use mmtk::scheduler::GCWorker; use mmtk::util::alloc::AllocatorSelector; +use mmtk::util::api_util::NullableObjectReference; use mmtk::util::opaque_pointer::*; use mmtk::util::{Address, ObjectReference}; use mmtk::AllocationSemantics; @@ -492,13 +493,8 @@ pub extern "C" fn add_finalizer(object: ObjectReference) { } #[no_mangle] -pub extern "C" fn get_finalized_object() -> ObjectReference { - with_singleton!(|singleton| { - match memory_manager::get_finalized_object(singleton) { - Some(obj) => obj, - None => ObjectReference::NULL, - } - }) +pub extern "C" fn get_finalized_object() -> NullableObjectReference { + with_singleton!(|singleton| memory_manager::get_finalized_object(singleton).into()) } thread_local! { diff --git a/mmtk/src/edges.rs b/mmtk/src/edges.rs index 76be2e7e..b1395c97 100644 --- a/mmtk/src/edges.rs +++ b/mmtk/src/edges.rs @@ -127,37 +127,57 @@ impl OpenJDKEdge { /// encode an object pointer to its u32 compressed form fn compress(o: ObjectReference) -> u32 { - if o.is_null() { - 0u32 - } else { - ((o.to_raw_address() - BASE.load(Ordering::Relaxed)) >> SHIFT.load(Ordering::Relaxed)) - as u32 - } + ((o.to_raw_address() - BASE.load(Ordering::Relaxed)) >> SHIFT.load(Ordering::Relaxed)) + as u32 } /// decode an object pointer from its u32 compressed form - fn decompress(v: u32) -> ObjectReference { + fn decompress(v: u32) -> Option { if v == 0 { - ObjectReference::NULL + None + } else { + // Note on `unsafe`: `v` must be positive here, so the result must be positive. + let objref = unsafe { + ObjectReference::from_raw_address_unchecked( + BASE.load(Ordering::Relaxed) + ((v as usize) << SHIFT.load(Ordering::Relaxed)), + ) + }; + Some(objref) + } + } + + /// Store a null reference in the slot. + pub fn store_null(&self) { + if cfg!(any(target_arch = "x86", target_arch = "x86_64")) { + if COMPRESSED { + if self.is_compressed() { + self.x86_write_unaligned::(0) + } else { + self.x86_write_unaligned::(Address::ZERO) + } + } else { + self.x86_write_unaligned::(Address::ZERO) + } } else { - ObjectReference::from_raw_address( - BASE.load(Ordering::Relaxed) + ((v as usize) << SHIFT.load(Ordering::Relaxed)), - ) + debug_assert!(!COMPRESSED); + unsafe { self.addr.store(0) } } } } impl Edge for OpenJDKEdge { - fn load(&self) -> ObjectReference { + fn load(&self) -> Option { if cfg!(any(target_arch = "x86", target_arch = "x86_64")) { if COMPRESSED { if self.is_compressed() { Self::decompress(self.x86_read_unaligned::()) } else { - self.x86_read_unaligned::() + let addr = self.x86_read_unaligned::(); + ObjectReference::from_raw_address(addr) } } else { - self.x86_read_unaligned::() + let addr = self.x86_read_unaligned::(); + ObjectReference::from_raw_address(addr) } } else { debug_assert!(!COMPRESSED); diff --git a/mmtk/src/object_model.rs b/mmtk/src/object_model.rs index a35d6739..bc8326ce 100644 --- a/mmtk/src/object_model.rs +++ b/mmtk/src/object_model.rs @@ -28,10 +28,12 @@ impl ObjectModel> for VMObjectModel< ) -> ObjectReference { let bytes = unsafe { Oop::from(from).size::() }; let dst = copy_context.alloc_copy(from, bytes, ::std::mem::size_of::(), 0, copy); + debug_assert!(!dst.is_zero()); // Copy let src = from.to_raw_address(); unsafe { std::ptr::copy_nonoverlapping::(src.to_ptr(), dst.to_mut_ptr(), bytes) } - let to_obj = ObjectReference::from_raw_address(dst); + // Note on onsafe: `alloc_copy` never returns 0. + let to_obj = unsafe { ObjectReference::from_raw_address_unchecked(dst) }; copy_context.post_copy(to_obj, bytes, copy); to_obj } @@ -56,7 +58,8 @@ impl ObjectModel> for VMObjectModel< } fn get_reference_when_copied_to(_from: ObjectReference, to: Address) -> ObjectReference { - ObjectReference::from_raw_address(to) + debug_assert!(!to.is_zero()); + unsafe { ObjectReference::from_raw_address_unchecked(to) } } fn get_current_size(object: ObjectReference) -> usize { @@ -93,7 +96,8 @@ impl ObjectModel> for VMObjectModel< } fn address_to_ref(address: Address) -> ObjectReference { - ObjectReference::from_raw_address(address) + debug_assert!(!address.is_zero()); + unsafe { ObjectReference::from_raw_address_unchecked(address) } } fn dump_object(object: ObjectReference) { diff --git a/mmtk/src/reference_glue.rs b/mmtk/src/reference_glue.rs index 3ecd5f1a..4e124ac6 100644 --- a/mmtk/src/reference_glue.rs +++ b/mmtk/src/reference_glue.rs @@ -15,7 +15,7 @@ impl ReferenceGlue> for VMReferenceG let oop = Oop::from(reff); InstanceRefKlass::referent_address::(oop).store(referent); } - fn get_referent(object: ObjectReference) -> ObjectReference { + fn get_referent(object: ObjectReference) -> Option { let oop = Oop::from(object); InstanceRefKlass::referent_address::(oop).load() } @@ -24,4 +24,8 @@ impl ReferenceGlue> for VMReferenceG ((*UPCALLS).enqueue_references)(references.as_ptr(), references.len()); } } + fn clear_referent(new_reference: ObjectReference) { + let oop = Oop::from(new_reference); + InstanceRefKlass::referent_address::(oop).store_null(); + } }