From 6f85255ec3cd05f1b4226cd6ff167e30f44c46b1 Mon Sep 17 00:00:00 2001 From: Yi Lin Date: Tue, 4 Feb 2025 03:29:00 +0000 Subject: [PATCH] Add a no_mangle function that prints object info from the space --- src/mmtk.rs | 5 +++++ src/policy/copyspace.rs | 4 ++++ src/policy/immix/immixspace.rs | 6 ++++++ src/policy/markcompactspace.rs | 4 ++++ src/policy/sft.rs | 13 +++++++++++++ src/util/object_forwarding.rs | 5 +++++ 6 files changed, 37 insertions(+) diff --git a/src/mmtk.rs b/src/mmtk.rs index 59ee97132a..565151369b 100644 --- a/src/mmtk.rs +++ b/src/mmtk.rs @@ -597,3 +597,8 @@ impl MMTK { .initialize_object_metadata(object, false) } } + +#[no_mangle] +pub fn mmtk_debug_print_object_info(object: crate::util::ObjectReference) { + println!("{}", SFT_MAP.get_checked(object.to_raw_address()).debug_get_object_info(object)) +} diff --git a/src/policy/copyspace.rs b/src/policy/copyspace.rs index ddf8e5bb04..05a2741c88 100644 --- a/src/policy/copyspace.rs +++ b/src/policy/copyspace.rs @@ -100,6 +100,10 @@ impl SFT for CopySpace { let worker = worker.into_mut::(); self.trace_object(queue, object, self.common.copy, worker) } + + fn debug_get_object_info(&self, object: ObjectReference) -> String { + format!("{}: {:?}, {:?}", self.name(), object_forwarding::debug_get_object_forwarding_info::(object), crate::policy::sft::debug_get_object_global_info(object)) + } } impl Space for CopySpace { diff --git a/src/policy/immix/immixspace.rs b/src/policy/immix/immixspace.rs index 331600bc91..d270b1dce8 100644 --- a/src/policy/immix/immixspace.rs +++ b/src/policy/immix/immixspace.rs @@ -163,6 +163,12 @@ impl SFT for ImmixSpace { ) -> ObjectReference { panic!("We do not use SFT to trace objects for Immix. sft_trace_object() cannot be used.") } + + fn debug_get_object_info(&self, object: ObjectReference) -> String { + let line = Line::from_unaligned_address(object.to_raw_address()); + let block = Block::from_unaligned_address(object.to_raw_address()); + format!("{}: marked = {}, line marked = {}, block state = {:?}, {}, {}", self.name(), self.is_marked(object), line.is_marked(self.mark_state), block.get_state(), object_forwarding::debug_get_object_forwarding_info::(object), crate::policy::sft::debug_get_object_global_info(object)) + } } impl Space for ImmixSpace { diff --git a/src/policy/markcompactspace.rs b/src/policy/markcompactspace.rs index d7ca0c0745..fb94bc7c00 100644 --- a/src/policy/markcompactspace.rs +++ b/src/policy/markcompactspace.rs @@ -102,6 +102,10 @@ impl SFT for MarkCompactSpace { // Depending on which trace it is, we should manually call either trace_mark or trace_forward. panic!("sft_trace_object() cannot be used with mark compact space") } + + fn debug_get_object_info(&self, object: ObjectReference) -> String { + format!("{}: marked = {:?}, head forwarding pointer = {:?}. {}", self.name(), MarkCompactSpace::::is_marked(object), MarkCompactSpace::::get_header_forwarding_pointer(object), crate::policy::sft::debug_get_object_global_info(object)) + } } impl Space for MarkCompactSpace { diff --git a/src/policy/sft.rs b/src/policy/sft.rs index c443b48ad3..65ca250faa 100644 --- a/src/policy/sft.rs +++ b/src/policy/sft.rs @@ -101,6 +101,19 @@ pub trait SFT { object: ObjectReference, worker: GCWorkerMutRef, ) -> ObjectReference; + + fn debug_get_object_info(&self, object: ObjectReference) -> String { + crate::policy::sft::debug_get_object_global_info(object) + } +} + +pub(crate) fn debug_get_object_global_info(object: ObjectReference) -> String { + let mut ret = String::new(); + #[cfg(feature = "vo_bit")] + { + ret += &format!("vo bit = {}", crate::util::metadata::vo_bit::is_vo_bit_set(object)); + } + ret } // Create erased VM refs for these types that will be used in `sft_trace_object()`. diff --git a/src/util/object_forwarding.rs b/src/util/object_forwarding.rs index 4b3f2411e9..123f18e646 100644 --- a/src/util/object_forwarding.rs +++ b/src/util/object_forwarding.rs @@ -233,3 +233,8 @@ pub(super) fn forwarding_bits_offset_in_forwarding_pointer() -> O pub(super) fn forwarding_bits_offset_in_forwarding_pointer() -> Option { unimplemented!() } + +pub(crate) fn debug_get_object_forwarding_info(object: ObjectReference) -> String { + let forwarding_bits = get_forwarding_status::(object); + format!("forwarding bits = {:?}, forwarding pointer = {:?}", forwarding_bits, if state_is_forwarded_or_being_forwarded(forwarding_bits) { Some(read_forwarding_pointer::(object)) } else { None }) +}