From 94239c8e6cfbb777bf4cddcca8cc717498a220f3 Mon Sep 17 00:00:00 2001 From: Kunshan Wang Date: Mon, 8 Jan 2024 20:05:46 +0800 Subject: [PATCH 1/6] Make ObjectReference non-nullable --- mmtk/Cargo.lock | 274 ++++++++++++++++++++----------------- mmtk/Cargo.toml | 2 +- mmtk/src/api.rs | 6 +- mmtk/src/edges.rs | 48 +++++-- mmtk/src/object_model.rs | 9 +- mmtk/src/reference_glue.rs | 6 +- 6 files changed, 200 insertions(+), 145 deletions(-) diff --git a/mmtk/Cargo.lock b/mmtk/Cargo.lock index 459a15bd..77a44e70 100644 --- a/mmtk/Cargo.lock +++ b/mmtk/Cargo.lock @@ -11,6 +11,54 @@ dependencies = [ "memchr", ] +[[package]] +name = "anstream" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" + +[[package]] +name = "anstyle-parse" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +dependencies = [ + "anstyle", + "windows-sys", +] + [[package]] name = "atomic" version = "0.6.0" @@ -22,9 +70,9 @@ dependencies = [ [[package]] name = "atomic-traits" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b29ec3788e96fb4fdb275ccb9d62811f2fa903d76c5eb4dd6fe7d09a7ed5871f" +checksum = "707f750b93bd1b739cf9ddf85f8fe7c97a4a62c60ccf8b6f232514bd9103bedc" dependencies = [ "cfg-if", "rustc_version", @@ -50,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", ] @@ -74,14 +122,14 @@ checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] name = "cc" -version = "1.0.91" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd97381a8cc6493395a5afc4c691c1084b3768db713b73aa215217aa245d153" +checksum = "17f6e324229dc011159fcc089755d1e2e216a90d43a7dea6853ca740b84f35e7" dependencies = [ "jobserver", "libc", @@ -93,6 +141,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + [[package]] name = "core-foundation-sys" version = "0.8.6" @@ -157,13 +211,13 @@ checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] name = "delegate" -version = "0.10.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee5df75c70b95bd3aacc8e2fd098797692fb1d54121019c4de481e42f04c8a1" +checksum = "4e018fccbeeb50ff26562ece792ed06659b9c2dae79ece77c4456bb10d9bf79b" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.59", ] [[package]] @@ -174,9 +228,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" @@ -195,20 +249,30 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", +] + +[[package]] +name = "env_filter" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea" +dependencies = [ + "log", + "regex", ] [[package]] name = "env_logger" -version = "0.10.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" +checksum = "38b35839ba51819680ba087cd351788c9a3c476841207e0b8cee0b04722343b9" dependencies = [ + "anstream", + "anstyle", + "env_filter", "humantime", - "is-terminal", "log", - "regex", - "termcolor", ] [[package]] @@ -283,9 +347,9 @@ dependencies = [ [[package]] name = "jobserver" -version = "0.1.28" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" +checksum = "685a7d121ee3f65ae4fddd72b25a04bb36b6af81bc0828f7d5434c0fe60fa3a2" dependencies = [ "libc", ] @@ -360,7 +424,7 @@ dependencies = [ [[package]] name = "mmtk" version = "0.24.0" -source = "git+https://github.com/mmtk/mmtk-core.git?rev=5ab62f96c006475285b00b6d20a8b1bf83b74a4d#5ab62f96c006475285b00b6d20a8b1bf83b74a4d" +source = "git+https://github.com/wks/mmtk-core.git?rev=03fb6d4ef49b946124dca635006bc8cd35b198db#03fb6d4ef49b946124dca635006bc8cd35b198db" dependencies = [ "atomic", "atomic-traits", @@ -395,12 +459,12 @@ dependencies = [ [[package]] name = "mmtk-macros" version = "0.24.0" -source = "git+https://github.com/mmtk/mmtk-core.git?rev=5ab62f96c006475285b00b6d20a8b1bf83b74a4d#5ab62f96c006475285b00b6d20a8b1bf83b74a4d" +source = "git+https://github.com/wks/mmtk-core.git?rev=03fb6d4ef49b946124dca635006bc8cd35b198db#03fb6d4ef49b946124dca635006bc8cd35b198db" dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] @@ -456,17 +520,6 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" -[[package]] -name = "pest" -version = "2.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "311fb059dee1a7b802f036316d790138c613a4e8b180c822e3925a662e9f0c95" -dependencies = [ - "memchr", - "thiserror", - "ucd-trie", -] - [[package]] name = "pkg-config" version = "0.3.30" @@ -511,18 +564,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.79" +version = "1.0.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +checksum = "a56dea16b0a29e94408b9aa5e2940a4eedbd128a1ba20e8f7ae60fd3d465af0e" 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", ] @@ -578,9 +631,9 @@ checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" [[package]] name = "rustc_version" -version = "0.3.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ "semver", ] @@ -599,21 +652,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "semver" -version = "0.11.0" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver-parser" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" -dependencies = [ - "pest", -] +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" [[package]] name = "spin" @@ -632,21 +673,21 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strum" -version = "0.25.0" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +checksum = "5d8cec3501a5194c432b2b7976db6b7d10ec95c253208b45f83f7136aa985e29" [[package]] name = "strum_macros" -version = "0.25.3" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +checksum = "c6cf59daf282c0a494ba14fd21610a0325f9f90ec9d1231dea26bcb1d696c946" dependencies = [ "heck", "proc-macro2", "quote", "rustversion", - "syn 2.0.58", + "syn 2.0.59", ] [[package]] @@ -656,15 +697,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", - "quote", "unicode-ident", ] [[package]] name = "syn" -version = "2.0.58" +version = "2.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" +checksum = "4a6531ffc7b071655e4ce2e04bd464c4830bb585a61cabb96cf808f05172615a" dependencies = [ "proc-macro2", "quote", @@ -673,9 +713,9 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.29.11" +version = "0.30.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd727fc423c2060f6c92d9534cef765c65a6ed3f428a03d7def74a8c4348e666" +checksum = "26d7c217777061d5a2d652aea771fb9ba98b6dade657204b08c4b9604d11555b" dependencies = [ "cfg-if", "core-foundation-sys", @@ -683,36 +723,7 @@ dependencies = [ "ntapi", "once_cell", "rayon", - "winapi", -] - -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "thiserror" -version = "1.0.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.58", + "windows", ] [[package]] @@ -730,12 +741,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" -[[package]] -name = "ucd-trie" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" - [[package]] name = "unicode-bidi" version = "0.3.15" @@ -768,6 +773,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + [[package]] name = "vcpkg" version = "0.2.15" @@ -797,19 +808,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] -name = "winapi-util" -version = "0.1.6" +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" dependencies = [ - "winapi", + "windows-core", + "windows-targets", ] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "windows-core" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets", +] [[package]] name = "windows-sys" @@ -822,13 +843,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", @@ -837,42 +859,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 e2c939f6..82f48ed2 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 = "5ab62f96c006475285b00b6d20a8b1bf83b74a4d" } +mmtk = { git = "https://github.com/wks/mmtk-core.git", rev = "03fb6d4ef49b946124dca635006bc8cd35b198db" } # Uncomment the following to build locally # mmtk = { path = "../repos/mmtk-core" } diff --git a/mmtk/src/api.rs b/mmtk/src/api.rs index 7ab73867..0bd95e0d 100644 --- a/mmtk/src/api.rs +++ b/mmtk/src/api.rs @@ -488,11 +488,11 @@ pub extern "C" fn add_finalizer(object: ObjectReference) { } #[no_mangle] -pub extern "C" fn get_finalized_object() -> ObjectReference { +pub extern "C" fn get_finalized_object() -> Address { with_singleton!(|singleton| { match memory_manager::get_finalized_object(singleton) { - Some(obj) => obj, - None => ObjectReference::NULL, + Some(obj) => obj.to_raw_address(), + None => Address::ZERO, } }) } diff --git a/mmtk/src/edges.rs b/mmtk/src/edges.rs index 76be2e7e..b68f13d2 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`: The result cannot be zero, so it is safe to use here. + 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..eedbe0de 100644 --- a/mmtk/src/object_model.rs +++ b/mmtk/src/object_model.rs @@ -31,7 +31,8 @@ impl ObjectModel> for VMObjectModel< // 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 +57,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 +95,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(); + } } From 3c02d5cef733a38eedd803ba0da18ad25d20da9b Mon Sep 17 00:00:00 2001 From: Kunshan Wang Date: Fri, 19 Apr 2024 15:39:05 +0800 Subject: [PATCH 2/6] Minor fixes --- mmtk/src/api.rs | 31 ++++++++++++++++++++++++------- mmtk/src/edges.rs | 2 +- mmtk/src/object_model.rs | 1 + 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/mmtk/src/api.rs b/mmtk/src/api.rs index 079b25b2..7771d309 100644 --- a/mmtk/src/api.rs +++ b/mmtk/src/api.rs @@ -18,6 +18,28 @@ use std::cell::RefCell; use std::ffi::{CStr, CString}; use std::sync::atomic::Ordering; +/// An `Option` encoded as a `usize`. It guarantees that `None` is encoded as 0, +/// and `Some(objref)` is encoded as the underlying `usize` of `objref` itself. It is intended for +/// passing values to or from C++ code. +/// Notes: The Rust ABI currently doesn't guarantee the encoding of `None`. +#[repr(transparent)] +pub struct NullableObjectReference(usize); + +impl From for Option { + fn from(value: NullableObjectReference) -> Self { + ObjectReference::from_raw_address(unsafe { Address::from_usize(value.0) }) + } +} + +impl From> for NullableObjectReference { + fn from(value: Option) -> Self { + let encoded = value + .map(|obj| obj.to_raw_address().as_usize()) + .unwrap_or(0); + Self(encoded) + } +} + macro_rules! with_singleton { (|$x: ident| $($expr:tt)*) => { if crate::use_compressed_oops() { @@ -492,13 +514,8 @@ pub extern "C" fn add_finalizer(object: ObjectReference) { } #[no_mangle] -pub extern "C" fn get_finalized_object() -> Address { - with_singleton!(|singleton| { - match memory_manager::get_finalized_object(singleton) { - Some(obj) => obj.to_raw_address(), - None => Address::ZERO, - } - }) +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 b68f13d2..b1395c97 100644 --- a/mmtk/src/edges.rs +++ b/mmtk/src/edges.rs @@ -136,7 +136,7 @@ impl OpenJDKEdge { if v == 0 { None } else { - // Note on `unsafe`: The result cannot be zero, so it is safe to use here. + // 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)), diff --git a/mmtk/src/object_model.rs b/mmtk/src/object_model.rs index eedbe0de..e4c9ce3f 100644 --- a/mmtk/src/object_model.rs +++ b/mmtk/src/object_model.rs @@ -28,6 +28,7 @@ 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) } From 38d6200d0045d7c76bf3061ae2286fb9b76e3c02 Mon Sep 17 00:00:00 2001 From: Kunshan Wang Date: Fri, 19 Apr 2024 15:52:31 +0800 Subject: [PATCH 3/6] Typo --- mmtk/src/object_model.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mmtk/src/object_model.rs b/mmtk/src/object_model.rs index e4c9ce3f..bc8326ce 100644 --- a/mmtk/src/object_model.rs +++ b/mmtk/src/object_model.rs @@ -28,7 +28,7 @@ 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()); + 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) } From a436c3073c44faa3df3a98944b6c70dc8b21e06f Mon Sep 17 00:00:00 2001 From: Kunshan Wang Date: Wed, 24 Apr 2024 14:59:05 +0800 Subject: [PATCH 4/6] Use NullableObjectReference from mmtk-core --- mmtk/Cargo.lock | 13 +++++++------ mmtk/Cargo.toml | 2 +- mmtk/src/api.rs | 23 +---------------------- 3 files changed, 9 insertions(+), 29 deletions(-) diff --git a/mmtk/Cargo.lock b/mmtk/Cargo.lock index 0a93af83..e2c6864a 100644 --- a/mmtk/Cargo.lock +++ b/mmtk/Cargo.lock @@ -127,12 +127,13 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f6e324229dc011159fcc089755d1e2e216a90d43a7dea6853ca740b84f35e7" +checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" dependencies = [ "jobserver", "libc", + "once_cell", ] [[package]] @@ -347,9 +348,9 @@ dependencies = [ [[package]] name = "jobserver" -version = "0.1.30" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685a7d121ee3f65ae4fddd72b25a04bb36b6af81bc0828f7d5434c0fe60fa3a2" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" dependencies = [ "libc", ] @@ -424,7 +425,7 @@ dependencies = [ [[package]] name = "mmtk" version = "0.24.0" -source = "git+https://github.com/wks/mmtk-core.git?rev=19b86419e74c1d3147b10871f5c1d0fec46c40e2#19b86419e74c1d3147b10871f5c1d0fec46c40e2" +source = "git+https://github.com/wks/mmtk-core.git?rev=6aa75cd72247d12b9568dc321c46feca6572a512#6aa75cd72247d12b9568dc321c46feca6572a512" dependencies = [ "atomic", "atomic-traits", @@ -459,7 +460,7 @@ dependencies = [ [[package]] name = "mmtk-macros" version = "0.24.0" -source = "git+https://github.com/wks/mmtk-core.git?rev=19b86419e74c1d3147b10871f5c1d0fec46c40e2#19b86419e74c1d3147b10871f5c1d0fec46c40e2" +source = "git+https://github.com/wks/mmtk-core.git?rev=6aa75cd72247d12b9568dc321c46feca6572a512#6aa75cd72247d12b9568dc321c46feca6572a512" dependencies = [ "proc-macro-error", "proc-macro2", diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index fca0fcd8..16c69b59 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/wks/mmtk-core.git", rev = "19b86419e74c1d3147b10871f5c1d0fec46c40e2" } +mmtk = { git = "https://github.com/wks/mmtk-core.git", rev = "6aa75cd72247d12b9568dc321c46feca6572a512" } # Uncomment the following to build locally # mmtk = { path = "../repos/mmtk-core" } diff --git a/mmtk/src/api.rs b/mmtk/src/api.rs index 7771d309..a1816ef0 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::apiutils::NullableObjectReference; use mmtk::util::opaque_pointer::*; use mmtk::util::{Address, ObjectReference}; use mmtk::AllocationSemantics; @@ -18,28 +19,6 @@ use std::cell::RefCell; use std::ffi::{CStr, CString}; use std::sync::atomic::Ordering; -/// An `Option` encoded as a `usize`. It guarantees that `None` is encoded as 0, -/// and `Some(objref)` is encoded as the underlying `usize` of `objref` itself. It is intended for -/// passing values to or from C++ code. -/// Notes: The Rust ABI currently doesn't guarantee the encoding of `None`. -#[repr(transparent)] -pub struct NullableObjectReference(usize); - -impl From for Option { - fn from(value: NullableObjectReference) -> Self { - ObjectReference::from_raw_address(unsafe { Address::from_usize(value.0) }) - } -} - -impl From> for NullableObjectReference { - fn from(value: Option) -> Self { - let encoded = value - .map(|obj| obj.to_raw_address().as_usize()) - .unwrap_or(0); - Self(encoded) - } -} - macro_rules! with_singleton { (|$x: ident| $($expr:tt)*) => { if crate::use_compressed_oops() { From 5858e241a6dcc6436d3ba1d27d184935b34d78a5 Mon Sep 17 00:00:00 2001 From: Kunshan Wang Date: Fri, 26 Apr 2024 14:48:45 +0800 Subject: [PATCH 5/6] apiutils -> api_util --- mmtk/Cargo.lock | 8 ++++---- mmtk/Cargo.toml | 2 +- mmtk/src/api.rs | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mmtk/Cargo.lock b/mmtk/Cargo.lock index e2c6864a..1f7d0787 100644 --- a/mmtk/Cargo.lock +++ b/mmtk/Cargo.lock @@ -393,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", @@ -425,7 +425,7 @@ dependencies = [ [[package]] name = "mmtk" version = "0.24.0" -source = "git+https://github.com/wks/mmtk-core.git?rev=6aa75cd72247d12b9568dc321c46feca6572a512#6aa75cd72247d12b9568dc321c46feca6572a512" +source = "git+https://github.com/wks/mmtk-core.git?rev=edd0d0af8104446e2effdfd7aea6e6d35800217a#edd0d0af8104446e2effdfd7aea6e6d35800217a" dependencies = [ "atomic", "atomic-traits", @@ -460,7 +460,7 @@ dependencies = [ [[package]] name = "mmtk-macros" version = "0.24.0" -source = "git+https://github.com/wks/mmtk-core.git?rev=6aa75cd72247d12b9568dc321c46feca6572a512#6aa75cd72247d12b9568dc321c46feca6572a512" +source = "git+https://github.com/wks/mmtk-core.git?rev=edd0d0af8104446e2effdfd7aea6e6d35800217a#edd0d0af8104446e2effdfd7aea6e6d35800217a" dependencies = [ "proc-macro-error", "proc-macro2", diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index 16c69b59..263407ac 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/wks/mmtk-core.git", rev = "6aa75cd72247d12b9568dc321c46feca6572a512" } +mmtk = { git = "https://github.com/wks/mmtk-core.git", rev = "edd0d0af8104446e2effdfd7aea6e6d35800217a" } # Uncomment the following to build locally # mmtk = { path = "../repos/mmtk-core" } diff --git a/mmtk/src/api.rs b/mmtk/src/api.rs index a1816ef0..979c38d4 100644 --- a/mmtk/src/api.rs +++ b/mmtk/src/api.rs @@ -8,7 +8,7 @@ use mmtk::memory_manager; use mmtk::plan::BarrierSelector; use mmtk::scheduler::GCWorker; use mmtk::util::alloc::AllocatorSelector; -use mmtk::util::apiutils::NullableObjectReference; +use mmtk::util::api_util::NullableObjectReference; use mmtk::util::opaque_pointer::*; use mmtk::util::{Address, ObjectReference}; use mmtk::AllocationSemantics; From 1e4a42a8331d4cc3def1a2ee204a2daab3a55437 Mon Sep 17 00:00:00 2001 From: mmtkgc-bot Date: Sat, 27 Apr 2024 14:32:28 +0000 Subject: [PATCH 6/6] Update mmtk-core to a02803b4104519ff2289234101a2dd8ceedd1bc7 --- mmtk/Cargo.lock | 4 ++-- mmtk/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mmtk/Cargo.lock b/mmtk/Cargo.lock index 1f7d0787..241cd5c0 100644 --- a/mmtk/Cargo.lock +++ b/mmtk/Cargo.lock @@ -425,7 +425,7 @@ dependencies = [ [[package]] name = "mmtk" version = "0.24.0" -source = "git+https://github.com/wks/mmtk-core.git?rev=edd0d0af8104446e2effdfd7aea6e6d35800217a#edd0d0af8104446e2effdfd7aea6e6d35800217a" +source = "git+https://github.com/mmtk/mmtk-core.git?rev=a02803b4104519ff2289234101a2dd8ceedd1bc7#a02803b4104519ff2289234101a2dd8ceedd1bc7" dependencies = [ "atomic", "atomic-traits", @@ -460,7 +460,7 @@ dependencies = [ [[package]] name = "mmtk-macros" version = "0.24.0" -source = "git+https://github.com/wks/mmtk-core.git?rev=edd0d0af8104446e2effdfd7aea6e6d35800217a#edd0d0af8104446e2effdfd7aea6e6d35800217a" +source = "git+https://github.com/mmtk/mmtk-core.git?rev=a02803b4104519ff2289234101a2dd8ceedd1bc7#a02803b4104519ff2289234101a2dd8ceedd1bc7" dependencies = [ "proc-macro-error", "proc-macro2", diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index 263407ac..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/wks/mmtk-core.git", rev = "edd0d0af8104446e2effdfd7aea6e6d35800217a" } +mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "a02803b4104519ff2289234101a2dd8ceedd1bc7" } # Uncomment the following to build locally # mmtk = { path = "../repos/mmtk-core" }