Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions mmtk/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions mmtk/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,9 @@ probe = "0.5"
# - 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 = "37d81218028d788f7a24158aac0588c3f6925d08" }
# mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "37d81218028d788f7a24158aac0588c3f6925d08" }
# Uncomment the following to build locally
# mmtk = { path = "../repos/mmtk-core" }
mmtk = { path = "../../mmtk-core" }

[build-dependencies]
built = { version = "0.7.7", features = ["git2"] }
Expand Down
3 changes: 2 additions & 1 deletion mmtk/src/object_model.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ use mmtk::vm::*;
pub struct VMObjectModel<const COMPRESSED: bool> {}

impl<const COMPRESSED: bool> ObjectModel<OpenJDK<COMPRESSED>> for VMObjectModel<COMPRESSED> {
const GLOBAL_LOG_BIT_SPEC: VMGlobalLogBitSpec = vm_metadata::LOGGING_SIDE_METADATA_SPEC;
const GLOBAL_OBJECT_UNLOG_BIT_SPEC: VMGlobalObjectUnlogBitSpec = vm_metadata::OBJECT_LOGGING_SIDE_METADATA_SPEC;
const GLOBAL_FIELD_UNLOG_BIT_SPEC: VMGlobalFieldUnlogBitSpec = vm_metadata::FIELD_LOGGING_SIDE_METADATA_SPEC;

const LOCAL_FORWARDING_POINTER_SPEC: VMLocalForwardingPointerSpec =
vm_metadata::FORWARDING_POINTER_METADATA_SPEC;
Expand Down
5 changes: 5 additions & 0 deletions mmtk/src/slots.rs
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,11 @@ impl<const COMPRESSED: bool> Slot for OpenJDKSlot<COMPRESSED> {
unsafe { self.addr.store(object) }
}
}

fn to_address(&self) -> Address {
assert!(!COMPRESSED);
self.addr
Comment on lines +210 to +211

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just realized this issue in my branch. I think something like the below is better:

Suggested change
assert!(!COMPRESSED);
self.addr
if COMPRESSED {
self.untagged_address()
} else {
self.addr
}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I will eventually do this. Currently the 1 bit per word field unlog bit side metadata doesn't work for compressed pointers, so I want it to fail loud. To support compressed pointers, I will introduce an alternative 1 bit per 32 bit field unlog bit side metadata and give the VM binding the option to select that.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah fair enough. Makes sense. I just found this bug in my branch so I thought it'd be better to make a comment here in case you also have issues with the same in the future.

}
}

/// A range of OpenJDKSlot, usually used for arrays.
Expand Down
6 changes: 5 additions & 1 deletion mmtk/src/vm_metadata/constants.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,11 @@ pub(crate) const FORWARDING_POINTER_OFFSET: isize = 0;

/// Global logging bit metadata spec
/// 1 bit per object
pub(crate) const LOGGING_SIDE_METADATA_SPEC: VMGlobalLogBitSpec = VMGlobalLogBitSpec::side_first();
pub(crate) const OBJECT_LOGGING_SIDE_METADATA_SPEC: VMGlobalObjectUnlogBitSpec =
VMGlobalObjectUnlogBitSpec::side_first();

pub(crate) const FIELD_LOGGING_SIDE_METADATA_SPEC: VMGlobalFieldUnlogBitSpec =
VMGlobalFieldUnlogBitSpec::side_after(OBJECT_LOGGING_SIDE_METADATA_SPEC.as_spec());

// Global MetadataSpecs - End

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@

#define __ masm->

void MMTkObjectBarrierSetAssembler::object_reference_write_post(MacroAssembler* masm, DecoratorSet decorators, Address dst, Register val, Register tmp1, Register tmp2, Register tmp3) const {
void MMTkGenBarrierSetAssembler::object_reference_write_post(MacroAssembler* masm, DecoratorSet decorators, Address dst, Register val, Register tmp1, Register tmp2, Register tmp3) const {
if (can_remove_barrier(decorators, val, /* skip_const_null */ true)) return;
object_reference_write_pre_or_post(masm, decorators, dst, val, tmp1, tmp2, tmp3, /* pre = */ false);
}

void MMTkObjectBarrierSetAssembler::arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, bool is_oop,
void MMTkGenBarrierSetAssembler::arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, bool is_oop,
Register src, Register dst, Register count, Register tmp, RegSet saved_regs) {
// see also void G1BarrierSetAssembler::gen_write_ref_array_post_barrier
assert_different_registers(src, dst, count);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
#define MMTK_OPENJDK_MMTK_OBJECT_BARRIER_SET_ASSEMBLER_AARCH64_HPP

#include "utilities/macros.hpp"
#include CPU_HEADER(mmtkUnlogBitBarrierSetAssembler)
#include CPU_HEADER(mmtkObjectUnlogBitBarrierSetAssembler)

//////////////////// Assembler ////////////////////

class MMTkObjectBarrierSetAssembler: public MMTkUnlogBitBarrierSetAssembler {
class MMTkGenBarrierSetAssembler: public MMTkObjectUnlogBitBarrierSetAssembler {
protected:
virtual void object_reference_write_post(MacroAssembler* masm, DecoratorSet decorators, Address dst, Register val, Register tmp1, Register tmp2, Register tmp3) const override;
public:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@
#include "c1/c1_MacroAssembler.hpp"

#include "utilities/macros.hpp"
#include CPU_HEADER(mmtkUnlogBitBarrierSetAssembler)
#include CPU_HEADER(mmtkObjectUnlogBitBarrierSetAssembler)

#include <cstdint>

//////////////////// Assembler ////////////////////

#define __ masm->

void MMTkUnlogBitBarrierSetAssembler::emit_check_unlog_bit_fast_path(MacroAssembler* masm, Label &done, Register obj, Register tmp1, Register tmp2, Register tmp3) {
void MMTkObjectUnlogBitBarrierSetAssembler::emit_check_unlog_bit_fast_path(MacroAssembler* masm, Label &done, Register obj, Register tmp1, Register tmp2, Register tmp3) {
// Note that `tmp1` and `tmp2` are actual temporary registers available for use,
// not the `tmp1` and `tmp2` from `store_at`.
assert_different_registers(obj, tmp1, tmp2, tmp3);
Expand All @@ -33,7 +33,7 @@ void MMTkUnlogBitBarrierSetAssembler::emit_check_unlog_bit_fast_path(MacroAssemb

#define __ masm->

void MMTkUnlogBitBarrierSetAssembler::object_reference_write_pre_or_post(MacroAssembler* masm, DecoratorSet decorators, Address dst, Register val, Register tmp1, Register tmp2, Register tmp3, bool pre) {
void MMTkObjectUnlogBitBarrierSetAssembler::object_reference_write_pre_or_post(MacroAssembler* masm, DecoratorSet decorators, Address dst, Register val, Register tmp1, Register tmp2, Register tmp3, bool pre) {
Label done;
Register obj = dst.base();
if (mmtk_enable_barrier_fastpath) {
Expand Down Expand Up @@ -80,7 +80,7 @@ void MMTkUnlogBitBarrierSetAssembler::object_reference_write_pre_or_post(MacroAs

#define __ ce->masm()->

void MMTkUnlogBitBarrierSetAssembler::generate_c1_unlog_bit_barrier_slow_path_stub(LIR_Assembler* ce, MMTkC1UnlogBitBarrierSlowPathStub* stub) const {
void MMTkObjectUnlogBitBarrierSetAssembler::generate_c1_unlog_bit_barrier_slow_path_stub(LIR_Assembler* ce, MMTkC1UnlogBitBarrierSlowPathStub* stub) const {
MMTkBarrierSetC1* bs = (MMTkBarrierSetC1*) BarrierSet::barrier_set()->barrier_set_c1();
__ bind(*stub->entry());
ce->store_parameter(stub->src->as_pointer_register(), 0);
Expand All @@ -94,7 +94,7 @@ void MMTkUnlogBitBarrierSetAssembler::generate_c1_unlog_bit_barrier_slow_path_st
}

void MMTkC1UnlogBitBarrierSlowPathStub::emit_code(LIR_Assembler* ce) {
MMTkUnlogBitBarrierSetAssembler* bs = (MMTkUnlogBitBarrierSetAssembler*) BarrierSet::barrier_set()->barrier_set_assembler();
MMTkObjectUnlogBitBarrierSetAssembler* bs = (MMTkObjectUnlogBitBarrierSetAssembler*) BarrierSet::barrier_set()->barrier_set_assembler();
bs->generate_c1_unlog_bit_barrier_slow_path_stub(ce, this);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

//////////////////// Assembler ////////////////////

class MMTkUnlogBitBarrierSetAssembler: public MMTkBarrierSetAssembler {
class MMTkObjectUnlogBitBarrierSetAssembler: public MMTkBarrierSetAssembler {
protected:
static void emit_check_unlog_bit_fast_path(MacroAssembler* masm, Label &done, Register obj, Register tmp1, Register tmp2, Register tmp3);
static void object_reference_write_pre_or_post(MacroAssembler* masm, DecoratorSet decorators, Address dst, Register val, Register tmp1, Register tmp2, Register tmp3, bool pre);
Expand Down
4 changes: 2 additions & 2 deletions openjdk/cpu/aarch64/mmtkSATBBarrierSetAssembler_aarch64.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
#define MMTK_OPENJDK_MMTK_SATB_BARRIER_SET_ASSEMBLER_AARCH64_HPP

#include "utilities/macros.hpp"
#include CPU_HEADER(mmtkUnlogBitBarrierSetAssembler)
#include CPU_HEADER(mmtkObjectUnlogBitBarrierSetAssembler)

//////////////////// Assembler ////////////////////

class MMTkSATBBarrierSetAssembler: public MMTkUnlogBitBarrierSetAssembler {
class MMTkSATBBarrierSetAssembler: public MMTkObjectUnlogBitBarrierSetAssembler {
protected:
virtual void object_reference_write_pre(MacroAssembler* masm, DecoratorSet decorators, Address dst, Register val, Register tmp1, Register tmp2, Register tmp3) const override;
public:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
// li a1,0
// mv a0,a4
// tail _Z32object_reference_write_slow_callPvS_m
void MMTkObjectBarrierSetAssembler::object_reference_write_post(MacroAssembler* masm, DecoratorSet decorators, Address dst, Register val, Register tmp1, Register tmp2) const {
void MMTkGenBarrierSetAssembler::object_reference_write_post(MacroAssembler* masm, DecoratorSet decorators, Address dst, Register val, Register tmp1, Register tmp2) const {
// tmp1 and tmp2 is from MacroAssembler::access_store_at
// For do_oop_store, we have three tmps, x28/t3, x29/t4, x13/a3
// printf("object_reference_write_post\n");
Expand Down Expand Up @@ -83,7 +83,7 @@ void MMTkObjectBarrierSetAssembler::object_reference_write_post(MacroAssembler*
}
}

void MMTkObjectBarrierSetAssembler::arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, bool is_oop,
void MMTkGenBarrierSetAssembler::arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, bool is_oop,
Register src, Register dst, Register count, Register tmp, RegSet saved_regs) {
// see also void G1BarrierSetAssembler::gen_write_ref_array_post_barrier
assert_different_registers(src, dst, count);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#ifndef MMTK_OPENJDK_MMTK_OBJECT_BARRIER_SET_ASSEMBLER_RISCV_HPP
#define MMTK_OPENJDK_MMTK_OBJECT_BARRIER_SET_ASSEMBLER_RISCV_HPP

class MMTkObjectBarrierSetAssembler: public MMTkBarrierSetAssembler {
class MMTkGenBarrierSetAssembler: public MMTkBarrierSetAssembler {
protected:
virtual void object_reference_write_post(MacroAssembler* masm, DecoratorSet decorators, Address dst, Register val, Register tmp1, Register tmp2) const override;
public:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@

#define __ masm->

void MMTkObjectBarrierSetAssembler::object_reference_write_post(MacroAssembler* masm, DecoratorSet decorators, Address dst, Register val, Register tmp1, Register tmp2, Register tmp3, bool compensate_val_reg) const {
void MMTkGenBarrierSetAssembler::object_reference_write_post(MacroAssembler* masm, DecoratorSet decorators, Address dst, Register val, Register tmp1, Register tmp2, Register tmp3, bool compensate_val_reg) const {
if (can_remove_barrier(decorators, val, /* skip_const_null */ true)) return;
object_reference_write_pre_or_post(masm, decorators, dst, val, tmp1, tmp2, tmp3, /* pre = */ false);
}

void MMTkObjectBarrierSetAssembler::arraycopy_prologue(MacroAssembler* masm, DecoratorSet decorators, BasicType type, Register src, Register dst, Register count) {
void MMTkGenBarrierSetAssembler::arraycopy_prologue(MacroAssembler* masm, DecoratorSet decorators, BasicType type, Register src, Register dst, Register count) {
// `count` or `dst` register values may get overwritten after the array copy, and `arraycopy_epilogue` can receive invalid addresses.
// Save the register values here and restore them in `arraycopy_epilogue`.
// See https://github.com/openjdk/jdk/blob/jdk-11%2B19/src/hotspot/cpu/x86/gc/shared/modRefBarrierSetAssembler_x86.cpp#L37-L50
Expand All @@ -31,7 +31,7 @@ void MMTkObjectBarrierSetAssembler::arraycopy_prologue(MacroAssembler* masm, Dec
}
}

void MMTkObjectBarrierSetAssembler::arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, BasicType type, Register src, Register dst, Register count) {
void MMTkGenBarrierSetAssembler::arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, BasicType type, Register src, Register dst, Register count) {
bool checkcast = (decorators & ARRAYCOPY_CHECKCAST) != 0;
bool disjoint = (decorators & ARRAYCOPY_DISJOINT) != 0;
bool obj_int = type == T_OBJECT LP64_ONLY(&& UseCompressedOops);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
#define MMTK_OPENJDK_MMTK_OBJECT_BARRIER_SET_ASSEMBLER_X86_HPP

#include "utilities/macros.hpp"
#include CPU_HEADER(mmtkUnlogBitBarrierSetAssembler)
#include CPU_HEADER(mmtkObjectUnlogBitBarrierSetAssembler)

//////////////////// Assembler ////////////////////

class MMTkObjectBarrierSetAssembler: public MMTkUnlogBitBarrierSetAssembler {
class MMTkGenBarrierSetAssembler: public MMTkObjectUnlogBitBarrierSetAssembler {
protected:
virtual void object_reference_write_post(MacroAssembler* masm, DecoratorSet decorators, Address dst, Register val, Register tmp1, Register tmp2, Register tmp3, bool compensate_val_reg) const override;
public:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@
#include "c1/c1_MacroAssembler.hpp"

#include "utilities/macros.hpp"
#include CPU_HEADER(mmtkUnlogBitBarrierSetAssembler)
#include CPU_HEADER(mmtkObjectUnlogBitBarrierSetAssembler)

#include <cstdint>

//////////////////// Assembler ////////////////////

#define __ masm->

void MMTkUnlogBitBarrierSetAssembler::emit_check_unlog_bit_fast_path(MacroAssembler* masm, Label &done, Register obj, Register tmp1, Register tmp2, Register tmp3) {
void MMTkObjectUnlogBitBarrierSetAssembler::emit_check_unlog_bit_fast_path(MacroAssembler* masm, Label &done, Register obj, Register tmp1, Register tmp2, Register tmp3) {
// Note that `tmp1` and `tmp2` are actual temporary registers available for use,
// not the `tmp1` and `tmp2` from `store_at`.
assert_different_registers(obj, tmp1, tmp2, tmp3);
Expand All @@ -39,7 +39,7 @@ void MMTkUnlogBitBarrierSetAssembler::emit_check_unlog_bit_fast_path(MacroAssemb

#define __ masm->

void MMTkUnlogBitBarrierSetAssembler::object_reference_write_pre_or_post(MacroAssembler* masm, DecoratorSet decorators, Address dst, Register val, Register tmp1, Register tmp2, Register tmp3, bool pre) {
void MMTkObjectUnlogBitBarrierSetAssembler::object_reference_write_pre_or_post(MacroAssembler* masm, DecoratorSet decorators, Address dst, Register val, Register tmp1, Register tmp2, Register tmp3, bool pre) {
Label done;
Register obj = dst.base();
if (mmtk_enable_barrier_fastpath) {
Expand All @@ -62,8 +62,8 @@ void MMTkUnlogBitBarrierSetAssembler::object_reference_write_pre_or_post(MacroAs
// compressed oops, the `val` register will be holding a compressed pointer to the target object
// due to the way `BarrierSetAssembler::store_at` works. If the write barrier needs to know the
// target, we will need to decompress it before passing it to the barrier slow path.
__ xorptr(c_rarg1, c_rarg1);
__ xorptr(c_rarg2, c_rarg2);
__ lea(c_rarg1, dst);
__ movptr(c_rarg2, val);

address entry_point = mmtk_enable_barrier_fastpath ? FN_ADDR(MMTkBarrierSetRuntime::object_reference_write_slow_call)
: pre ? FN_ADDR(MMTkBarrierSetRuntime::object_reference_write_pre_call)
Expand All @@ -86,7 +86,7 @@ void MMTkUnlogBitBarrierSetAssembler::object_reference_write_pre_or_post(MacroAs

#define __ ce->masm()->

void MMTkUnlogBitBarrierSetAssembler::generate_c1_unlog_bit_barrier_slow_path_stub(LIR_Assembler* ce, MMTkC1UnlogBitBarrierSlowPathStub* stub) const {
void MMTkObjectUnlogBitBarrierSetAssembler::generate_c1_unlog_bit_barrier_slow_path_stub(LIR_Assembler* ce, MMTkC1UnlogBitBarrierSlowPathStub* stub) const {
MMTkBarrierSetC1* bs = (MMTkBarrierSetC1*) BarrierSet::barrier_set()->barrier_set_c1();
__ bind(*stub->entry());
ce->store_parameter(stub->src->as_pointer_register(), 0);
Expand All @@ -100,7 +100,7 @@ void MMTkUnlogBitBarrierSetAssembler::generate_c1_unlog_bit_barrier_slow_path_st
}

void MMTkC1UnlogBitBarrierSlowPathStub::emit_code(LIR_Assembler* ce) {
MMTkUnlogBitBarrierSetAssembler* bs = (MMTkUnlogBitBarrierSetAssembler*) BarrierSet::barrier_set()->barrier_set_assembler();
MMTkObjectUnlogBitBarrierSetAssembler* bs = (MMTkObjectUnlogBitBarrierSetAssembler*) BarrierSet::barrier_set()->barrier_set_assembler();
bs->generate_c1_unlog_bit_barrier_slow_path_stub(ce, this);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

//////////////////// Assembler ////////////////////

class MMTkUnlogBitBarrierSetAssembler: public MMTkBarrierSetAssembler {
class MMTkObjectUnlogBitBarrierSetAssembler: public MMTkBarrierSetAssembler {
protected:
static void emit_check_unlog_bit_fast_path(MacroAssembler* masm, Label &done, Register obj, Register tmp1, Register tmp2, Register tmp3);
static void object_reference_write_pre_or_post(MacroAssembler* masm, DecoratorSet decorators, Address dst, Register val, Register tmp1, Register tmp2, Register tmp3, bool pre);
Expand Down
4 changes: 2 additions & 2 deletions openjdk/cpu/x86/mmtkSATBBarrierSetAssembler_x86.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
#define MMTK_OPENJDK_MMTK_SATB_BARRIER_SET_ASSEMBLER_X86_HPP

#include "utilities/macros.hpp"
#include CPU_HEADER(mmtkUnlogBitBarrierSetAssembler)
#include CPU_HEADER(mmtkObjectUnlogBitBarrierSetAssembler)

//////////////////// Assembler ////////////////////

class MMTkSATBBarrierSetAssembler: public MMTkUnlogBitBarrierSetAssembler {
class MMTkSATBBarrierSetAssembler: public MMTkObjectUnlogBitBarrierSetAssembler {
protected:
virtual void object_reference_write_pre(MacroAssembler* masm, DecoratorSet decorators, Address dst, Register val, Register tmp1, Register tmp2, Register tmp3) const override;
public:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#ifndef MMTK_OPENJDK_MMTK_OBJECT_BARRIER_SET_ASSEMBLER_ZERO_HPP
#define MMTK_OPENJDK_MMTK_OBJECT_BARRIER_SET_ASSEMBLER_ZERO_HPP

class MMTkObjectBarrierSetAssembler;
class MMTkGenBarrierSetAssembler;
#endif // MMTK_OPENJDK_MMTK_OBJECT_BARRIER_SET_ASSEMBLER_ZERO_HPP
4 changes: 2 additions & 2 deletions openjdk/share/barriers/mmtkObjectBarrier.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#include "../mmtkBarrierSet.hpp"
#include "utilities/macros.hpp"
#include CPU_HEADER(mmtkBarrierSetAssembler)
#include CPU_HEADER(mmtkObjectBarrierSetAssembler)
#include CPU_HEADER(mmtkGenBarrierSetAssembler)
#include "mmtkUnlogBitBarrier.hpp"
#ifdef COMPILER1
#include "../mmtkBarrierSetC1.hpp"
Expand Down Expand Up @@ -67,7 +67,7 @@ class MMTkObjectBarrierSetC2;

struct MMTkObjectBarrier: MMTkBarrierImpl<
MMTkObjectBarrierSetRuntime,
MMTkObjectBarrierSetAssembler,
MMTkGenBarrierSetAssembler,
MMTkObjectBarrierSetC1,
MMTkObjectBarrierSetC2
> {};
Expand Down
Loading