From 5b1fb687fb546f6ec0f2d37ffec507526e7539a7 Mon Sep 17 00:00:00 2001 From: Luis Eduardo de Souza Amorim Date: Tue, 19 Mar 2024 00:30:14 +0000 Subject: [PATCH 01/11] Adding macros to push roots that are not transitively pinned (only pinned) --- mmtk/src/julia_scanning.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mmtk/src/julia_scanning.rs b/mmtk/src/julia_scanning.rs index ea679fd8..dd74221d 100644 --- a/mmtk/src/julia_scanning.rs +++ b/mmtk/src/julia_scanning.rs @@ -385,7 +385,7 @@ pub unsafe fn mmtk_scan_gcstack>( let s_nroots_addr = ::std::ptr::addr_of!((*s).nroots); let mut nroots = read_stack(Address::from_ptr(s_nroots_addr), offset, lb, ub); debug_assert!(nroots.as_usize() as u32 <= UINT32_MAX); - let mut nr = nroots >> 2; + let mut nr = nroots >> 3; loop { let rts = Address::from_mut_ptr(s).shift::
(2); @@ -431,7 +431,7 @@ pub unsafe fn mmtk_scan_gcstack>( let s_nroots_addr = ::std::ptr::addr_of!((*s).nroots); let new_nroots = read_stack(Address::from_ptr(s_nroots_addr), offset, lb, ub); nroots = new_nroots; - nr = nroots >> 2; + nr = nroots >> 3; continue; } } From a44cfe2bc6e1ca627ab76e9fb041f05d2eacc4b4 Mon Sep 17 00:00:00 2001 From: Luis Eduardo de Souza Amorim Date: Tue, 19 Mar 2024 00:51:00 +0000 Subject: [PATCH 02/11] Processing pinned and transitively pinned roots separately --- mmtk/src/julia_scanning.rs | 6 ++- mmtk/src/scanning.rs | 91 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 91 insertions(+), 6 deletions(-) diff --git a/mmtk/src/julia_scanning.rs b/mmtk/src/julia_scanning.rs index dd74221d..81c23902 100644 --- a/mmtk/src/julia_scanning.rs +++ b/mmtk/src/julia_scanning.rs @@ -278,6 +278,8 @@ pub unsafe fn scan_julia_object>(obj: Address, clos let ta = obj.to_ptr::(); + // transitively pinnig of stack roots happens during root + // processing so it's fine to have only one closure here mmtk_scan_gcstack(ta, closure); let layout = (*jl_task_type).layout; @@ -447,14 +449,14 @@ pub unsafe fn mmtk_scan_gcstack>( } #[inline(always)] -unsafe fn read_stack(addr: Address, offset: isize, lb: u64, ub: u64) -> Address { +pub unsafe fn read_stack(addr: Address, offset: isize, lb: u64, ub: u64) -> Address { let real_addr = get_stack_addr(addr, offset, lb, ub); real_addr.load::
() } #[inline(always)] -fn get_stack_addr(addr: Address, offset: isize, lb: u64, ub: u64) -> Address { +pub fn get_stack_addr(addr: Address, offset: isize, lb: u64, ub: u64) -> Address { if addr.as_usize() >= lb as usize && addr.as_usize() < ub as usize { return addr + offset; } else { diff --git a/mmtk/src/scanning.rs b/mmtk/src/scanning.rs index f66c4a06..3d4c85fe 100644 --- a/mmtk/src/scanning.rs +++ b/mmtk/src/scanning.rs @@ -1,9 +1,11 @@ use crate::edges::JuliaVMEdge; +use crate::julia_scanning::{get_stack_addr, process_edge, read_stack}; +use crate::julia_types::{mmtk_jl_gcframe_t, mmtk_jl_task_t, UINT32_MAX}; use crate::{SINGLETON, UPCALLS}; use mmtk::memory_manager; use mmtk::scheduler::*; -use mmtk::util::opaque_pointer::*; use mmtk::util::ObjectReference; +use mmtk::util::{opaque_pointer::*, Address}; use mmtk::vm::edge_shape::Edge; use mmtk::vm::EdgeVisitor; use mmtk::vm::ObjectTracerContext; @@ -50,17 +52,17 @@ impl Scanning for VMScanning { use crate::julia_scanning::*; use crate::julia_types::*; - use mmtk::util::Address; let ptls: &mut mmtk__jl_tls_states_t = unsafe { std::mem::transmute(mutator.mutator_tls) }; - let mut edge_buffer = EdgeBuffer { buffer: vec![] }; // need to be tpinned as they're all from the shadow stack + let mut edge_buffer = EdgeBuffer { buffer: vec![] }; // need to be transitively pinned + let mut pinning_edge_buffer = EdgeBuffer { buffer: vec![] }; // roots from the shadow stack that we know that do not need to be transitively pinned let mut node_buffer = vec![]; // Scan thread local from ptls: See gc_queue_thread_local in gc.c let mut root_scan_task = |task: *const mmtk__jl_task_t, task_is_root: bool| { if !task.is_null() { unsafe { - crate::julia_scanning::mmtk_scan_gcstack(task, &mut edge_buffer); + mmtk_scan_gcstack_roots(task, &mut edge_buffer, &mut pinning_edge_buffer); } if task_is_root { // captures wrong root nodes before creating the work @@ -134,6 +136,13 @@ impl Scanning for VMScanning { { factory.create_process_tpinning_roots_work(tpinning_roots); } + for pinning_roots in pinning_edge_buffer + .buffer + .chunks(CAPACITY_PER_PACKET) + .map(|c| c.to_vec()) + { + factory.create_process_pinning_roots_work(pinning_roots); + } for nodes in node_buffer.chunks(CAPACITY_PER_PACKET).map(|c| c.to_vec()) { factory.create_process_pinning_roots_work(nodes); } @@ -189,6 +198,80 @@ impl Scanning for VMScanning { } } +pub unsafe fn mmtk_scan_gcstack_roots>( + ta: *const mmtk_jl_task_t, + closure: &mut EV, + tp_closure: &mut EV, +) { + let stkbuf = (*ta).stkbuf; + let copy_stack = (*ta).copy_stack_custom(); + + let mut s = (*ta).gcstack; + let (mut offset, mut lb, mut ub) = (0 as isize, 0 as u64, u64::MAX); + + #[cfg(feature = "julia_copy_stack")] + if stkbuf != std::ptr::null_mut() && copy_stack != 0 && (*ta).ptls == std::ptr::null_mut() { + if ((*ta).tid as i16) < 0 { + panic!("tid must be positive.") + } + let stackbase = ((*UPCALLS).get_stackbase)((*ta).tid); + ub = stackbase as u64; + lb = ub - ((*ta).copy_stack() as u64); + offset = (*ta).stkbuf as isize - lb as isize; + } + + if s != std::ptr::null_mut() { + let s_nroots_addr = ::std::ptr::addr_of!((*s).nroots); + let mut nroots = read_stack(Address::from_ptr(s_nroots_addr), offset, lb, ub); + debug_assert!(nroots.as_usize() as u32 <= UINT32_MAX); + let mut nr = nroots >> 3; + + loop { + let rts = Address::from_mut_ptr(s).shift::
(2); + let mut i = 0; + while i < nr { + if (nroots.as_usize() & 4) != 0 { + // root is pinning and not transitively pinning + if (nroots.as_usize() & 1) != 0 { + let slot = read_stack(rts.shift::
(i as isize), offset, lb, ub); + let real_addr = get_stack_addr(slot, offset, lb, ub); + process_edge(tp_closure, real_addr); + } else { + let real_addr = + get_stack_addr(rts.shift::
(i as isize), offset, lb, ub); + process_edge(tp_closure, real_addr); + } + } else { + if (nroots.as_usize() & 1) != 0 { + let slot = read_stack(rts.shift::
(i as isize), offset, lb, ub); + let real_addr = get_stack_addr(slot, offset, lb, ub); + process_edge(closure, real_addr); + } else { + let real_addr = + get_stack_addr(rts.shift::
(i as isize), offset, lb, ub); + process_edge(closure, real_addr); + } + } + + i += 1; + } + + let s_prev_address = ::std::ptr::addr_of!((*s).prev); + let sprev = read_stack(Address::from_ptr(s_prev_address), offset, lb, ub); + if sprev.is_zero() { + break; + } + + s = sprev.to_mut_ptr::(); + let s_nroots_addr = ::std::ptr::addr_of!((*s).nroots); + let new_nroots = read_stack(Address::from_ptr(s_nroots_addr), offset, lb, ub); + nroots = new_nroots; + nr = nroots >> 3; + continue; + } + } +} + pub fn process_object>(object: ObjectReference, closure: &mut EV) { let addr = object.to_raw_address(); unsafe { From cc704a4a91496e2d6796296dee9b4547fad937fd Mon Sep 17 00:00:00 2001 From: Luis Eduardo de Souza Amorim Date: Tue, 19 Mar 2024 01:06:04 +0000 Subject: [PATCH 03/11] Renaming the variables to make things clearer --- mmtk/src/scanning.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/mmtk/src/scanning.rs b/mmtk/src/scanning.rs index 3d4c85fe..17f77087 100644 --- a/mmtk/src/scanning.rs +++ b/mmtk/src/scanning.rs @@ -54,7 +54,7 @@ impl Scanning for VMScanning { use crate::julia_types::*; let ptls: &mut mmtk__jl_tls_states_t = unsafe { std::mem::transmute(mutator.mutator_tls) }; - let mut edge_buffer = EdgeBuffer { buffer: vec![] }; // need to be transitively pinned + let mut tpinning_edge_buffer = EdgeBuffer { buffer: vec![] }; // need to be transitively pinned let mut pinning_edge_buffer = EdgeBuffer { buffer: vec![] }; // roots from the shadow stack that we know that do not need to be transitively pinned let mut node_buffer = vec![]; @@ -62,7 +62,7 @@ impl Scanning for VMScanning { let mut root_scan_task = |task: *const mmtk__jl_task_t, task_is_root: bool| { if !task.is_null() { unsafe { - mmtk_scan_gcstack_roots(task, &mut edge_buffer, &mut pinning_edge_buffer); + mmtk_scan_gcstack_roots(task, &mut tpinning_edge_buffer, &mut pinning_edge_buffer); } if task_is_root { // captures wrong root nodes before creating the work @@ -129,7 +129,7 @@ impl Scanning for VMScanning { // Push work const CAPACITY_PER_PACKET: usize = 4096; - for tpinning_roots in edge_buffer + for tpinning_roots in tpinning_edge_buffer .buffer .chunks(CAPACITY_PER_PACKET) .map(|c| c.to_vec()) @@ -200,8 +200,8 @@ impl Scanning for VMScanning { pub unsafe fn mmtk_scan_gcstack_roots>( ta: *const mmtk_jl_task_t, - closure: &mut EV, - tp_closure: &mut EV, + tpinned_closure: &mut EV, + pinned_closure: &mut EV, ) { let stkbuf = (*ta).stkbuf; let copy_stack = (*ta).copy_stack_custom(); @@ -235,21 +235,21 @@ pub unsafe fn mmtk_scan_gcstack_roots>( if (nroots.as_usize() & 1) != 0 { let slot = read_stack(rts.shift::
(i as isize), offset, lb, ub); let real_addr = get_stack_addr(slot, offset, lb, ub); - process_edge(tp_closure, real_addr); + process_edge(pinned_closure, real_addr); } else { let real_addr = get_stack_addr(rts.shift::
(i as isize), offset, lb, ub); - process_edge(tp_closure, real_addr); + process_edge(pinned_closure, real_addr); } } else { if (nroots.as_usize() & 1) != 0 { let slot = read_stack(rts.shift::
(i as isize), offset, lb, ub); let real_addr = get_stack_addr(slot, offset, lb, ub); - process_edge(closure, real_addr); + process_edge(tpinned_closure, real_addr); } else { let real_addr = get_stack_addr(rts.shift::
(i as isize), offset, lb, ub); - process_edge(closure, real_addr); + process_edge(tpinned_closure, real_addr); } } From 851facf065c94fa5859f0021f32a67c5835a6d71 Mon Sep 17 00:00:00 2001 From: Luis Eduardo de Souza Amorim Date: Tue, 19 Mar 2024 01:06:22 +0000 Subject: [PATCH 04/11] Updating julia_version and julia_repo --- mmtk/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index f666cd24..861f9b15 100644 --- a/mmtk/Cargo.toml +++ b/mmtk/Cargo.toml @@ -9,8 +9,8 @@ edition = "2018" # Metadata for the Julia repository [package.metadata.julia] # Our CI matches the following line and extract mmtk/julia. If this line is updated, please check ci yaml files and make sure it works. -julia_repo = "https://github.com/mmtk/julia.git" -julia_version = "09e025b25c65e5842b6eeeb3c81ba4cab97f5192" +julia_repo = "https://github.com/udesou/julia.git" +julia_version = "94d63722a0ea3f1381ec400bae50f27ec76e8c32" [lib] crate-type = ["cdylib"] From 36d5dfd4d2e1ed5ea144ecc7e5ab3edbbf453acb Mon Sep 17 00:00:00 2001 From: Luis Eduardo de Souza Amorim Date: Tue, 19 Mar 2024 01:14:31 +0000 Subject: [PATCH 05/11] Updating mmtk_scan_gcstack_roots function --- mmtk/src/scanning.rs | 55 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 4 deletions(-) diff --git a/mmtk/src/scanning.rs b/mmtk/src/scanning.rs index 17f77087..c22737e4 100644 --- a/mmtk/src/scanning.rs +++ b/mmtk/src/scanning.rs @@ -62,7 +62,11 @@ impl Scanning for VMScanning { let mut root_scan_task = |task: *const mmtk__jl_task_t, task_is_root: bool| { if !task.is_null() { unsafe { - mmtk_scan_gcstack_roots(task, &mut tpinning_edge_buffer, &mut pinning_edge_buffer); + mmtk_scan_gcstack_roots( + task, + &mut tpinning_edge_buffer, + &mut pinning_edge_buffer, + ); } if task_is_root { // captures wrong root nodes before creating the work @@ -206,6 +210,12 @@ pub unsafe fn mmtk_scan_gcstack_roots>( let stkbuf = (*ta).stkbuf; let copy_stack = (*ta).copy_stack_custom(); + #[cfg(feature = "julia_copy_stack")] + if stkbuf != std::ptr::null_mut() && copy_stack != 0 { + let stkbuf_edge = Address::from_ptr(::std::ptr::addr_of!((*ta).stkbuf)); + process_edge(closure, stkbuf_edge); + } + let mut s = (*ta).gcstack; let (mut offset, mut lb, mut ub) = (0 as isize, 0 as u64, u64::MAX); @@ -230,8 +240,8 @@ pub unsafe fn mmtk_scan_gcstack_roots>( let rts = Address::from_mut_ptr(s).shift::
(2); let mut i = 0; while i < nr { + // root should be only pinned and not transitively pinned if (nroots.as_usize() & 4) != 0 { - // root is pinning and not transitively pinning if (nroots.as_usize() & 1) != 0 { let slot = read_stack(rts.shift::
(i as isize), offset, lb, ub); let real_addr = get_stack_addr(slot, offset, lb, ub); @@ -239,9 +249,29 @@ pub unsafe fn mmtk_scan_gcstack_roots>( } else { let real_addr = get_stack_addr(rts.shift::
(i as isize), offset, lb, ub); + + let slot = read_stack(rts.shift::
(i as isize), offset, lb, ub); + use crate::julia_finalizer::gc_ptr_tag; + // malloced pointer tagged in jl_gc_add_quiescent + // skip both the next element (native function), and the object + if slot & 3usize == 3 { + i += 2; + continue; + } + + // pointer is not malloced but function is native, so skip it + if gc_ptr_tag(slot, 1) { + process_offset_edge(pinned_closure, real_addr, 1); + i += 2; + continue; + } + process_edge(pinned_closure, real_addr); } + + i += 1; } else { + // root should be transitively pinned if (nroots.as_usize() & 1) != 0 { let slot = read_stack(rts.shift::
(i as isize), offset, lb, ub); let real_addr = get_stack_addr(slot, offset, lb, ub); @@ -249,11 +279,28 @@ pub unsafe fn mmtk_scan_gcstack_roots>( } else { let real_addr = get_stack_addr(rts.shift::
(i as isize), offset, lb, ub); + + let slot = read_stack(rts.shift::
(i as isize), offset, lb, ub); + use crate::julia_finalizer::gc_ptr_tag; + // malloced pointer tagged in jl_gc_add_quiescent + // skip both the next element (native function), and the object + if slot & 3usize == 3 { + i += 2; + continue; + } + + // pointer is not malloced but function is native, so skip it + if gc_ptr_tag(slot, 1) { + process_offset_edge(tpinned_closure, real_addr, 1); + i += 2; + continue; + } + process_edge(tpinned_closure, real_addr); } - } - i += 1; + i += 1; + } } let s_prev_address = ::std::ptr::addr_of!((*s).prev); From 5eae7fc65bd3b85fdf6ee897796f7f12ce903f99 Mon Sep 17 00:00:00 2001 From: Luis Eduardo de Souza Amorim Date: Tue, 19 Mar 2024 01:16:30 +0000 Subject: [PATCH 06/11] Bugfix --- mmtk/src/scanning.rs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/mmtk/src/scanning.rs b/mmtk/src/scanning.rs index c22737e4..215ecc38 100644 --- a/mmtk/src/scanning.rs +++ b/mmtk/src/scanning.rs @@ -1,4 +1,5 @@ use crate::edges::JuliaVMEdge; +use crate::julia_scanning::process_offset_edge; use crate::julia_scanning::{get_stack_addr, process_edge, read_stack}; use crate::julia_types::{mmtk_jl_gcframe_t, mmtk_jl_task_t, UINT32_MAX}; use crate::{SINGLETON, UPCALLS}; @@ -210,12 +211,6 @@ pub unsafe fn mmtk_scan_gcstack_roots>( let stkbuf = (*ta).stkbuf; let copy_stack = (*ta).copy_stack_custom(); - #[cfg(feature = "julia_copy_stack")] - if stkbuf != std::ptr::null_mut() && copy_stack != 0 { - let stkbuf_edge = Address::from_ptr(::std::ptr::addr_of!((*ta).stkbuf)); - process_edge(closure, stkbuf_edge); - } - let mut s = (*ta).gcstack; let (mut offset, mut lb, mut ub) = (0 as isize, 0 as u64, u64::MAX); From e65fe9c26112d88e18d05f82816be0d8ffd09e65 Mon Sep 17 00:00:00 2001 From: Luis Eduardo de Souza Amorim Date: Tue, 19 Mar 2024 03:19:21 +0000 Subject: [PATCH 07/11] Refactoring mmtk_scan_gcstack function --- mmtk/src/julia_scanning.rs | 25 ++++++-- mmtk/src/scanning.rs | 118 +------------------------------------ 2 files changed, 21 insertions(+), 122 deletions(-) diff --git a/mmtk/src/julia_scanning.rs b/mmtk/src/julia_scanning.rs index 81c23902..e4109521 100644 --- a/mmtk/src/julia_scanning.rs +++ b/mmtk/src/julia_scanning.rs @@ -280,7 +280,7 @@ pub unsafe fn scan_julia_object>(obj: Address, clos // transitively pinnig of stack roots happens during root // processing so it's fine to have only one closure here - mmtk_scan_gcstack(ta, closure); + mmtk_scan_gcstack(ta, closure, None); let layout = (*jl_task_type).layout; debug_assert!((*layout).fielddesc_type() == 0); @@ -356,9 +356,10 @@ pub unsafe fn scan_julia_object>(obj: Address, clos } } -pub unsafe fn mmtk_scan_gcstack>( +pub unsafe fn mmtk_scan_gcstack<'a, EV: EdgeVisitor>( ta: *const mmtk_jl_task_t, - closure: &mut EV, + mut closure: &'a mut EV, + mut pclosure: Option<&'a mut EV>, ) { let stkbuf = (*ta).stkbuf; let copy_stack = (*ta).copy_stack_custom(); @@ -390,13 +391,25 @@ pub unsafe fn mmtk_scan_gcstack>( let mut nr = nroots >> 3; loop { + // if the 'pin' bit on the root type is not set, must transitively pin + // and therefore use transitive pinning closure + let closure_to_use: &mut &mut EV = if (nroots.as_usize() & 4) == 0 { + &mut closure + } else { + // otherwise, use the pinning closure (if available) + match &mut pclosure { + Some(c) => c, + None => &mut closure, + } + }; + let rts = Address::from_mut_ptr(s).shift::
(2); let mut i = 0; while i < nr { if (nroots.as_usize() & 1) != 0 { let slot = read_stack(rts.shift::
(i as isize), offset, lb, ub); let real_addr = get_stack_addr(slot, offset, lb, ub); - process_edge(closure, real_addr); + process_edge(*closure_to_use, real_addr); } else { let real_addr = get_stack_addr(rts.shift::
(i as isize), offset, lb, ub); @@ -412,12 +425,12 @@ pub unsafe fn mmtk_scan_gcstack>( // pointer is not malloced but function is native, so skip it if gc_ptr_tag(slot, 1) { - process_offset_edge(closure, real_addr, 1); + process_offset_edge(*closure_to_use, real_addr, 1); i += 2; continue; } - process_edge(closure, real_addr); + process_edge(*closure_to_use, real_addr); } i += 1; diff --git a/mmtk/src/scanning.rs b/mmtk/src/scanning.rs index 215ecc38..10bf7f63 100644 --- a/mmtk/src/scanning.rs +++ b/mmtk/src/scanning.rs @@ -1,7 +1,4 @@ use crate::edges::JuliaVMEdge; -use crate::julia_scanning::process_offset_edge; -use crate::julia_scanning::{get_stack_addr, process_edge, read_stack}; -use crate::julia_types::{mmtk_jl_gcframe_t, mmtk_jl_task_t, UINT32_MAX}; use crate::{SINGLETON, UPCALLS}; use mmtk::memory_manager; use mmtk::scheduler::*; @@ -63,10 +60,10 @@ impl Scanning for VMScanning { let mut root_scan_task = |task: *const mmtk__jl_task_t, task_is_root: bool| { if !task.is_null() { unsafe { - mmtk_scan_gcstack_roots( + mmtk_scan_gcstack( task, &mut tpinning_edge_buffer, - &mut pinning_edge_buffer, + Some(&mut pinning_edge_buffer), ); } if task_is_root { @@ -203,117 +200,6 @@ impl Scanning for VMScanning { } } -pub unsafe fn mmtk_scan_gcstack_roots>( - ta: *const mmtk_jl_task_t, - tpinned_closure: &mut EV, - pinned_closure: &mut EV, -) { - let stkbuf = (*ta).stkbuf; - let copy_stack = (*ta).copy_stack_custom(); - - let mut s = (*ta).gcstack; - let (mut offset, mut lb, mut ub) = (0 as isize, 0 as u64, u64::MAX); - - #[cfg(feature = "julia_copy_stack")] - if stkbuf != std::ptr::null_mut() && copy_stack != 0 && (*ta).ptls == std::ptr::null_mut() { - if ((*ta).tid as i16) < 0 { - panic!("tid must be positive.") - } - let stackbase = ((*UPCALLS).get_stackbase)((*ta).tid); - ub = stackbase as u64; - lb = ub - ((*ta).copy_stack() as u64); - offset = (*ta).stkbuf as isize - lb as isize; - } - - if s != std::ptr::null_mut() { - let s_nroots_addr = ::std::ptr::addr_of!((*s).nroots); - let mut nroots = read_stack(Address::from_ptr(s_nroots_addr), offset, lb, ub); - debug_assert!(nroots.as_usize() as u32 <= UINT32_MAX); - let mut nr = nroots >> 3; - - loop { - let rts = Address::from_mut_ptr(s).shift::
(2); - let mut i = 0; - while i < nr { - // root should be only pinned and not transitively pinned - if (nroots.as_usize() & 4) != 0 { - if (nroots.as_usize() & 1) != 0 { - let slot = read_stack(rts.shift::
(i as isize), offset, lb, ub); - let real_addr = get_stack_addr(slot, offset, lb, ub); - process_edge(pinned_closure, real_addr); - } else { - let real_addr = - get_stack_addr(rts.shift::
(i as isize), offset, lb, ub); - - let slot = read_stack(rts.shift::
(i as isize), offset, lb, ub); - use crate::julia_finalizer::gc_ptr_tag; - // malloced pointer tagged in jl_gc_add_quiescent - // skip both the next element (native function), and the object - if slot & 3usize == 3 { - i += 2; - continue; - } - - // pointer is not malloced but function is native, so skip it - if gc_ptr_tag(slot, 1) { - process_offset_edge(pinned_closure, real_addr, 1); - i += 2; - continue; - } - - process_edge(pinned_closure, real_addr); - } - - i += 1; - } else { - // root should be transitively pinned - if (nroots.as_usize() & 1) != 0 { - let slot = read_stack(rts.shift::
(i as isize), offset, lb, ub); - let real_addr = get_stack_addr(slot, offset, lb, ub); - process_edge(tpinned_closure, real_addr); - } else { - let real_addr = - get_stack_addr(rts.shift::
(i as isize), offset, lb, ub); - - let slot = read_stack(rts.shift::
(i as isize), offset, lb, ub); - use crate::julia_finalizer::gc_ptr_tag; - // malloced pointer tagged in jl_gc_add_quiescent - // skip both the next element (native function), and the object - if slot & 3usize == 3 { - i += 2; - continue; - } - - // pointer is not malloced but function is native, so skip it - if gc_ptr_tag(slot, 1) { - process_offset_edge(tpinned_closure, real_addr, 1); - i += 2; - continue; - } - - process_edge(tpinned_closure, real_addr); - } - - i += 1; - } - } - - let s_prev_address = ::std::ptr::addr_of!((*s).prev); - let sprev = read_stack(Address::from_ptr(s_prev_address), offset, lb, ub); - if sprev.is_zero() { - break; - } - - s = sprev.to_mut_ptr::(); - let s_nroots_addr = ::std::ptr::addr_of!((*s).nroots); - let new_nroots = read_stack(Address::from_ptr(s_nroots_addr), offset, lb, ub); - nroots = new_nroots; - nr = nroots >> 3; - continue; - } - } -} - pub fn process_object>(object: ObjectReference, closure: &mut EV) { let addr = object.to_raw_address(); unsafe { From f89ba4f11cd2f868bbb341b4ced45eb1ee5e0155 Mon Sep 17 00:00:00 2001 From: Luis Eduardo de Souza Amorim Date: Tue, 19 Mar 2024 03:19:33 +0000 Subject: [PATCH 08/11] Updating julia_version --- mmtk/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index 861f9b15..060f7db1 100644 --- a/mmtk/Cargo.toml +++ b/mmtk/Cargo.toml @@ -10,7 +10,7 @@ edition = "2018" [package.metadata.julia] # Our CI matches the following line and extract mmtk/julia. If this line is updated, please check ci yaml files and make sure it works. julia_repo = "https://github.com/udesou/julia.git" -julia_version = "94d63722a0ea3f1381ec400bae50f27ec76e8c32" +julia_version = "5f2b75e93742646cd74ff502624652e56336e2da" [lib] crate-type = ["cdylib"] From c40a15f002b5e0acacbbc1ab75d6538658e151dc Mon Sep 17 00:00:00 2001 From: Eduardo Souza Date: Tue, 19 Mar 2024 04:06:00 +0000 Subject: [PATCH 09/11] Adding RUST_BACKTRACE=1 to try to capture errors that happen in the runner --- .github/scripts/common.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/scripts/common.sh b/.github/scripts/common.sh index 1688a044..08906c3a 100644 --- a/.github/scripts/common.sh +++ b/.github/scripts/common.sh @@ -10,6 +10,8 @@ export MMTK_JULIA_DIR=$BINDING_PATH # Make sure we have enough heap to build Julia export MMTK_MIN_HSIZE_G=0.5 export MMTK_MAX_HSIZE_G=4 +# Print out a backtrace in case of an error +export RUST_BACKTRACE=1 # Make sure we do not get OOM killed. total_mem=$(free -m | awk '/^Mem:/ {print $2}') export JULIA_TEST_MAXRSS_MB=$total_mem From aed935c8864d2308014b3f9b9231eae715b4a6e2 Mon Sep 17 00:00:00 2001 From: Yi Lin Date: Mon, 29 Apr 2024 15:28:32 +1200 Subject: [PATCH 10/11] Update Cargo.toml --- mmtk/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index 2257fc64..5a790dab 100644 --- a/mmtk/Cargo.toml +++ b/mmtk/Cargo.toml @@ -9,8 +9,8 @@ edition = "2018" # Metadata for the Julia repository [package.metadata.julia] # Our CI matches the following line and extract mmtk/julia. If this line is updated, please check ci yaml files and make sure it works. -julia_repo = "https://github.com/udesou/julia.git" -julia_version = "5f2b75e93742646cd74ff502624652e56336e2da" +julia_repo = "https://github.com/mmtk/julia.git" +julia_version = "7d89137e498824deed21d0f071976a4abc2ae0fa" [lib] crate-type = ["cdylib"] From 459add4ef17a300da527054435a30d26dcd59e88 Mon Sep 17 00:00:00 2001 From: Yi Lin Date: Mon, 29 Apr 2024 16:01:36 +1200 Subject: [PATCH 11/11] Update Cargo.toml --- mmtk/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mmtk/Cargo.toml b/mmtk/Cargo.toml index 5a790dab..8c1e350b 100644 --- a/mmtk/Cargo.toml +++ b/mmtk/Cargo.toml @@ -10,7 +10,7 @@ edition = "2018" [package.metadata.julia] # Our CI matches the following line and extract mmtk/julia. If this line is updated, please check ci yaml files and make sure it works. julia_repo = "https://github.com/mmtk/julia.git" -julia_version = "7d89137e498824deed21d0f071976a4abc2ae0fa" +julia_version = "0ac54e680f9a8b57bb1fd8ef04919ce9898ae77b" [lib] crate-type = ["cdylib"]