Skip to content

Commit ad38418

Browse files
author
Javad Amiri
authored
Refactor Metadata (#76)
* update object model members * update the restructured metadata module * suggest more metadata access inlining
1 parent 3e05b07 commit ad38418

File tree

6 files changed

+217
-6
lines changed

6 files changed

+217
-6
lines changed

mmtk/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ lazy_static = "1.1"
2020
# - change branch
2121
# - change repo name
2222
# But other changes including adding/removing whitespaces in commented lines may break the CI.
23-
mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "ad824527bc7fa87dfba66cc2cd8745ad1c331b9f" }
23+
mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "a288b40997e148817d5b9fed7d8b6039f8e944c7" }
2424
# Uncomment the following to build locally
2525
# mmtk = { path = "../repos/mmtk-core" }
2626

mmtk/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ pub mod object_model;
2828
mod object_scanning;
2929
pub mod reference_glue;
3030
pub mod scanning;
31+
pub(crate) mod vm_metadata;
3132

3233
#[repr(C)]
3334
pub struct NewBuffer {

mmtk/src/object_model.rs

Lines changed: 74 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1+
use std::sync::atomic::Ordering;
2+
13
use super::UPCALLS;
2-
use crate::OpenJDK;
4+
use crate::{vm_metadata, OpenJDK};
5+
use mmtk::util::metadata::{header_metadata::HeaderMetadataSpec, MetadataSpec};
36
use mmtk::util::{Address, ObjectReference};
47
use mmtk::vm::*;
58
use mmtk::AllocationSemantics;
@@ -8,10 +11,76 @@ use mmtk::CopyContext;
811
pub struct VMObjectModel {}
912

1013
impl ObjectModel<OpenJDK> for VMObjectModel {
11-
#[cfg(target_pointer_width = "64")]
12-
const GC_BYTE_OFFSET: isize = 7;
13-
#[cfg(target_pointer_width = "32")]
14-
const GC_BYTE_OFFSET: isize = 0;
14+
// For now we use the default const from mmtk-core
15+
const GLOBAL_LOG_BIT_SPEC: MetadataSpec = vm_metadata::LOGGING_SIDE_METADATA_SPEC;
16+
17+
const LOCAL_FORWARDING_POINTER_SPEC: MetadataSpec =
18+
vm_metadata::FORWARDING_POINTER_METADATA_SPEC;
19+
const LOCAL_FORWARDING_BITS_SPEC: MetadataSpec = vm_metadata::FORWARDING_BITS_METADATA_SPEC;
20+
const LOCAL_MARK_BIT_SPEC: MetadataSpec = vm_metadata::MARKING_METADATA_SPEC;
21+
const LOCAL_LOS_MARK_NURSERY_SPEC: MetadataSpec = vm_metadata::LOS_METADATA_SPEC;
22+
23+
#[inline(always)]
24+
fn load_metadata(
25+
metadata_spec: HeaderMetadataSpec,
26+
object: ObjectReference,
27+
mask: Option<usize>,
28+
atomic_ordering: Option<Ordering>,
29+
) -> usize {
30+
vm_metadata::load_metadata(metadata_spec, object, mask, atomic_ordering)
31+
}
32+
33+
#[inline(always)]
34+
fn store_metadata(
35+
metadata_spec: HeaderMetadataSpec,
36+
object: ObjectReference,
37+
val: usize,
38+
mask: Option<usize>,
39+
atomic_ordering: Option<Ordering>,
40+
) {
41+
vm_metadata::store_metadata(metadata_spec, object, val, mask, atomic_ordering);
42+
}
43+
44+
#[inline(always)]
45+
fn compare_exchange_metadata(
46+
metadata_spec: HeaderMetadataSpec,
47+
object: ObjectReference,
48+
old_val: usize,
49+
new_val: usize,
50+
mask: Option<usize>,
51+
success_order: Ordering,
52+
failure_order: Ordering,
53+
) -> bool {
54+
vm_metadata::compare_exchange_metadata(
55+
metadata_spec,
56+
object,
57+
old_val,
58+
new_val,
59+
mask,
60+
success_order,
61+
failure_order,
62+
)
63+
}
64+
65+
#[inline(always)]
66+
fn fetch_add_metadata(
67+
metadata_spec: HeaderMetadataSpec,
68+
object: ObjectReference,
69+
val: usize,
70+
order: Ordering,
71+
) -> usize {
72+
vm_metadata::fetch_add_metadata(metadata_spec, object, val, order)
73+
}
74+
75+
#[inline(always)]
76+
fn fetch_sub_metadata(
77+
metadata_spec: HeaderMetadataSpec,
78+
object: ObjectReference,
79+
val: usize,
80+
order: Ordering,
81+
) -> usize {
82+
vm_metadata::fetch_sub_metadata(metadata_spec, object, val, order)
83+
}
1584

1685
#[inline]
1786
fn copy(

mmtk/src/vm_metadata/constants.rs

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
pub(super) use mmtk::util::constants::LOG_BITS_IN_WORD;
2+
use mmtk::util::metadata::header_metadata::HeaderMetadataSpec;
3+
#[cfg(target_pointer_width = "32")]
4+
use mmtk::util::metadata::metadata_bytes_per_chunk;
5+
use mmtk::util::metadata::side_metadata::{SideMetadataSpec, GLOBAL_SIDE_METADATA_BASE_ADDRESS};
6+
use mmtk::util::metadata::MetadataSpec;
7+
8+
#[cfg(target_pointer_width = "64")]
9+
pub(crate) const FORWARDING_BITS_OFFSET: usize = 56;
10+
#[cfg(target_pointer_width = "32")]
11+
pub(crate) const FORWARDING_BITS_OFFSET: usize = 0;
12+
13+
pub(crate) const FORWARDING_POINTER_OFFSET: usize = 0;
14+
15+
// Global MetadataSpecs - Start
16+
17+
/// Global logging bit metadata spec
18+
/// 1 bit per object
19+
pub(crate) const LOGGING_SIDE_METADATA_SPEC: MetadataSpec =
20+
MetadataSpec::OnSide(SideMetadataSpec {
21+
is_global: true,
22+
offset: GLOBAL_SIDE_METADATA_BASE_ADDRESS.as_usize(),
23+
log_num_of_bits: 0,
24+
log_min_obj_size: 3,
25+
});
26+
27+
// Global MetadataSpecs - End
28+
29+
// PolicySpecific MetadataSpecs - Start
30+
31+
/// PolicySpecific forwarding pointer metadata spec
32+
/// 1 word per object
33+
pub(crate) const FORWARDING_POINTER_METADATA_SPEC: MetadataSpec =
34+
MetadataSpec::InHeader(HeaderMetadataSpec {
35+
bit_offset: FORWARDING_POINTER_OFFSET as isize,
36+
num_of_bits: 1 << LOG_BITS_IN_WORD,
37+
});
38+
39+
/// PolicySpecific object forwarding status metadata spec
40+
/// 2 bits per object
41+
pub(crate) const FORWARDING_BITS_METADATA_SPEC: MetadataSpec =
42+
MetadataSpec::InHeader(HeaderMetadataSpec {
43+
bit_offset: FORWARDING_BITS_OFFSET as isize,
44+
num_of_bits: 2,
45+
});
46+
47+
/// PolicySpecific mark bit metadata spec
48+
/// 1 bit per object
49+
pub(crate) const MARKING_METADATA_SPEC: MetadataSpec = MetadataSpec::InHeader(HeaderMetadataSpec {
50+
bit_offset: FORWARDING_BITS_OFFSET as isize,
51+
num_of_bits: 1,
52+
});
53+
54+
/// PolicySpecific mark-and-nursery bits metadata spec
55+
/// 2-bits per object
56+
pub(crate) const LOS_METADATA_SPEC: MetadataSpec = MetadataSpec::InHeader(HeaderMetadataSpec {
57+
bit_offset: FORWARDING_BITS_OFFSET as isize,
58+
num_of_bits: 2,
59+
});
60+
61+
// PolicySpecific MetadataSpecs - End

mmtk/src/vm_metadata/global.rs

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
use mmtk::util::{metadata as mmtk_meta, ObjectReference};
2+
use std::sync::atomic::Ordering;
3+
4+
/// This function implements the `load_metadata` method from the `ObjectModel` trait.
5+
#[inline(always)]
6+
pub(crate) fn load_metadata(
7+
metadata_spec: mmtk_meta::header_metadata::HeaderMetadataSpec,
8+
object: ObjectReference,
9+
optional_mask: Option<usize>,
10+
atomic_ordering: Option<Ordering>,
11+
) -> usize {
12+
mmtk_meta::header_metadata::load_metadata(metadata_spec, object, optional_mask, atomic_ordering)
13+
}
14+
15+
/// This function implements the `store_metadata` method from the `ObjectModel` trait.
16+
#[inline(always)]
17+
pub(crate) fn store_metadata(
18+
metadata_spec: mmtk_meta::header_metadata::HeaderMetadataSpec,
19+
object: ObjectReference,
20+
val: usize,
21+
optional_mask: Option<usize>,
22+
atomic_ordering: Option<Ordering>,
23+
) {
24+
mmtk_meta::header_metadata::store_metadata(
25+
metadata_spec,
26+
object,
27+
val,
28+
optional_mask,
29+
atomic_ordering,
30+
)
31+
}
32+
33+
/// This function implements the `compare_exchange_metadata` method from the `ObjectModel` trait.
34+
#[inline(always)]
35+
pub(crate) fn compare_exchange_metadata(
36+
metadata_spec: mmtk_meta::header_metadata::HeaderMetadataSpec,
37+
object: ObjectReference,
38+
old_metadata: usize,
39+
new_metadata: usize,
40+
optional_mask: Option<usize>,
41+
success_order: Ordering,
42+
failure_order: Ordering,
43+
) -> bool {
44+
mmtk_meta::header_metadata::compare_exchange_metadata(
45+
metadata_spec,
46+
object,
47+
old_metadata,
48+
new_metadata,
49+
optional_mask,
50+
success_order,
51+
failure_order,
52+
)
53+
}
54+
55+
/// This function implements the `fetch_add_metadata` method from the `ObjectModel` trait.
56+
#[inline(always)]
57+
pub(crate) fn fetch_add_metadata(
58+
metadata_spec: mmtk_meta::header_metadata::HeaderMetadataSpec,
59+
object: ObjectReference,
60+
val: usize,
61+
order: Ordering,
62+
) -> usize {
63+
mmtk_meta::header_metadata::fetch_add_metadata(metadata_spec, object, val, order)
64+
}
65+
66+
/// This function implements the `fetch_sub_metadata` method from the `ObjectModel` trait.
67+
#[inline(always)]
68+
pub(crate) fn fetch_sub_metadata(
69+
metadata_spec: mmtk_meta::header_metadata::HeaderMetadataSpec,
70+
object: ObjectReference,
71+
val: usize,
72+
order: Ordering,
73+
) -> usize {
74+
mmtk_meta::header_metadata::fetch_sub_metadata(metadata_spec, object, val, order)
75+
}

mmtk/src/vm_metadata/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
mod constants;
2+
mod global;
3+
4+
pub(crate) use self::constants::*;
5+
pub(crate) use self::global::*;

0 commit comments

Comments
 (0)