Skip to content

Commit ab6f615

Browse files
committed
WIP
1 parent cf7879f commit ab6f615

17 files changed

+908
-51
lines changed

mmtk/Cargo.lock

Lines changed: 0 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mmtk/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ probe = "0.5"
3535
# - change branch
3636
# - change repo name
3737
# But other changes including adding/removing whitespaces in commented lines may break the CI.
38-
mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "c5ead72a87bcc8cc49b5e7a62cf71d848b4b4c9b" }
38+
# mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "c5ead72a87bcc8cc49b5e7a62cf71d848b4b4c9b" }
3939
# Uncomment the following to build locally
40-
# mmtk = { path = "../repos/mmtk-core" }
40+
mmtk = { path = "../../mmtk-core" }
4141

4242
[build-dependencies]
4343
built = { version = "0.7.7", features = ["git2"] }

mmtk/src/api.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ macro_rules! with_mutator {
4747
static NO_BARRIER: sync::Lazy<CString> = sync::Lazy::new(|| CString::new("NoBarrier").unwrap());
4848
static OBJECT_BARRIER: sync::Lazy<CString> =
4949
sync::Lazy::new(|| CString::new("ObjectBarrier").unwrap());
50+
static SATB_BARRIER: sync::Lazy<CString> = sync::Lazy::new(|| CString::new("SATBBarrier").unwrap());
5051

5152
#[no_mangle]
5253
pub extern "C" fn get_mmtk_version() -> *const c_char {
@@ -59,6 +60,7 @@ pub extern "C" fn mmtk_active_barrier() -> *const c_char {
5960
match singleton.get_plan().constraints().barrier {
6061
BarrierSelector::NoBarrier => NO_BARRIER.as_ptr(),
6162
BarrierSelector::ObjectBarrier => OBJECT_BARRIER.as_ptr(),
63+
BarrierSelector::SATBBarrier => SATB_BARRIER.as_ptr(),
6264
// In case we have more barriers in mmtk-core.
6365
#[allow(unreachable_patterns)]
6466
_ => unimplemented!(),
@@ -381,6 +383,19 @@ pub extern "C" fn executable() -> bool {
381383
true
382384
}
383385

386+
#[no_mangle]
387+
pub extern "C" fn mmtk_load_reference(mutator: *mut libc::c_void, o: ObjectReference) {
388+
with_mutator!(|mutator| mutator.barrier().load_reference(o))
389+
}
390+
391+
#[no_mangle]
392+
pub extern "C" fn mmtk_object_reference_clone_pre(
393+
mutator: *mut libc::c_void,
394+
obj: ObjectReference,
395+
) {
396+
with_mutator!(|mutator| mutator.barrier().object_reference_clone_pre(obj))
397+
}
398+
384399
/// Full pre barrier
385400
#[no_mangle]
386401
pub extern "C" fn mmtk_object_reference_write_pre(

mmtk/src/collection.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,8 @@ impl<const COMPRESSED: bool> Collection<OpenJDK<COMPRESSED>> for VMCollection {
5757
((*UPCALLS).schedule_finalizer)();
5858
}
5959
}
60+
61+
fn set_concurrent_marking_state(active: bool) {
62+
unsafe { crate::CONCURRENT_MARKING_ACTIVE = if active { 1 } else { 0 } }
63+
}
6064
}

mmtk/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,9 @@ pub static VO_BIT_ADDRESS: uintptr_t =
139139
pub static FREE_LIST_ALLOCATOR_SIZE: uintptr_t =
140140
std::mem::size_of::<mmtk::util::alloc::FreeListAllocator<OpenJDK<false>>>();
141141

142+
#[no_mangle]
143+
pub static mut CONCURRENT_MARKING_ACTIVE: u8 = 0;
144+
142145
#[derive(Default)]
143146
pub struct OpenJDK<const COMPRESSED: bool>;
144147

openjdk/barriers/mmtkObjectBarrier.cpp

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,57 @@ void MMTkObjectBarrierSetAssembler::arraycopy_epilogue(MacroAssembler* masm, Dec
136136

137137
#undef __
138138

139+
#define __ sasm->
140+
141+
void MMTkObjectBarrierSetAssembler::generate_c1_post_write_barrier_runtime_stub(StubAssembler* sasm) const {
142+
__ prologue("mmtk_object_barrier", false);
143+
144+
Label done, runtime;
145+
146+
__ push(c_rarg0);
147+
__ push(c_rarg1);
148+
__ push(c_rarg2);
149+
__ push(rax);
150+
151+
__ load_parameter(0, c_rarg0);
152+
__ load_parameter(1, c_rarg1);
153+
__ load_parameter(2, c_rarg2);
154+
155+
__ bind(runtime);
156+
157+
__ save_live_registers_no_oop_map(true);
158+
159+
#if MMTK_ENABLE_BARRIER_FASTPATH
160+
__ call_VM_leaf_base(FN_ADDR(MMTkBarrierSetRuntime::object_reference_write_slow_call), 3);
161+
#else
162+
__ call_VM_leaf_base(FN_ADDR(MMTkBarrierSetRuntime::object_reference_write_post_call), 3);
163+
#endif
164+
165+
__ restore_live_registers(true);
166+
167+
__ bind(done);
168+
__ pop(rax);
169+
__ pop(c_rarg2);
170+
__ pop(c_rarg1);
171+
__ pop(c_rarg0);
172+
173+
__ epilogue();
174+
}
175+
176+
#undef __
177+
#define __ ce->masm()->
178+
179+
void MMTkObjectBarrierSetAssembler::generate_c1_post_write_barrier_stub(LIR_Assembler* ce, MMTkC1PostBarrierStub* stub) const {
180+
MMTkBarrierSetC1* bs = (MMTkBarrierSetC1*) BarrierSet::barrier_set()->barrier_set_c1();
181+
__ bind(*stub->entry());
182+
ce->store_parameter(stub->src->as_pointer_register(), 0);
183+
ce->store_parameter(stub->slot->as_pointer_register(), 1);
184+
ce->store_parameter(stub->new_val->as_pointer_register(), 2);
185+
__ call(RuntimeAddress(bs->post_barrier_c1_runtime_code_blob()->code_begin()));
186+
__ jmp(*stub->continuation());
187+
}
188+
#undef __
189+
139190
#ifdef ASSERT
140191
#define __ gen->lir(__FILE__, __LINE__)->
141192
#else
@@ -176,7 +227,7 @@ void MMTkObjectBarrierSetC1::object_reference_write_post(LIRAccess& access, LIR_
176227
new_val = new_val_reg;
177228
}
178229
assert(new_val->is_register(), "must be a register at this point");
179-
CodeStub* slow = new MMTkC1BarrierStub(src, slot, new_val);
230+
CodeStub* slow = new MMTkC1PostBarrierStub(src, slot, new_val);
180231

181232
#if MMTK_ENABLE_BARRIER_FASTPATH
182233
LIR_Opr addr = src;

openjdk/barriers/mmtkObjectBarrier.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,10 @@ class MMTkObjectBarrierSetRuntime: public MMTkBarrierSetRuntime {
3131
class MMTkObjectBarrierSetAssembler: public MMTkBarrierSetAssembler {
3232
protected:
3333
virtual void object_reference_write_post(MacroAssembler* masm, DecoratorSet decorators, Address dst, Register val, Register tmp1, Register tmp2, bool compensate_val_reg) const override;
34+
/// Generate C1 write barrier slow-call assembly code
35+
virtual void generate_c1_post_write_barrier_runtime_stub(StubAssembler* sasm) const;
3436
public:
37+
virtual void generate_c1_post_write_barrier_stub(LIR_Assembler* ce, MMTkC1PostBarrierStub* stub) const;
3538
virtual void arraycopy_prologue(MacroAssembler* masm, DecoratorSet decorators, BasicType type, Register src, Register dst, Register count) override;
3639
virtual void arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, BasicType type, Register src, Register dst, Register count) override;
3740
};

0 commit comments

Comments
 (0)