Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DO NOT MERGE: Using mmtk-immix as a default GC #56858

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
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
13 changes: 10 additions & 3 deletions Make.inc
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,8 @@ HAVE_SSP := 0
WITH_GC_VERIFY := 0
WITH_GC_DEBUG_ENV := 0

# Use stock if MMTK_PLAN hasn't been defined
MMTK_PLAN ?= None
# Use Immix by default
MMTK_PLAN := Immix

# Enable DTrace support
WITH_DTRACE := 0
Expand Down Expand Up @@ -1402,7 +1402,7 @@ CSL_NEXT_GLIBCXX_VERSION=GLIBCXX_3\.4\.33|GLIBCXX_3\.5\.|GLIBCXX_4\.
# Note: we explicitly _do not_ define `CSL` here, since it requires some more
# advanced techniques to decide whether it should be installed from a BB source
# or not. See `deps/csl.mk` for more detail.
BB_PROJECTS := BLASTRAMPOLINE OPENBLAS LLVM LIBSUITESPARSE OPENLIBM GMP OPENSSL LIBSSH2 NGHTTP2 MPFR CURL LIBGIT2 PCRE LIBUV LIBUNWIND DSFMT OBJCONV ZLIB P7ZIP LLD LIBTRACYCLIENT BOLT
BB_PROJECTS := BLASTRAMPOLINE OPENBLAS LLVM LIBSUITESPARSE OPENLIBM GMP OPENSSL LIBSSH2 NGHTTP2 MPFR CURL LIBGIT2 PCRE LIBUV LIBUNWIND DSFMT OBJCONV ZLIB P7ZIP LLD LIBTRACYCLIENT BOLT MMTK_JULIA
define SET_BB_DEFAULT
# First, check to see if BB is disabled on a global setting
ifeq ($$(USE_BINARYBUILDER),0)
Expand All @@ -1426,6 +1426,13 @@ $(error "Attempting to build OpenBLAS or SuiteSparse without a functioning fortr
endif
endif

ifneq (${MMTK_PLAN},None)
# We still need some .h files from mmtk when
# building Julia using the BinaryBuilder
ifeq ($(USE_BINARYBUILDER_MMTK_JULIA),1)
MMTK_API_INC=$(JULIAHOME)/deps/mmtk/
endif
endif

# OS specific stuff

Expand Down
4 changes: 4 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,10 @@ endif
endif
endif

ifneq (${MMTK_PLAN},None)
JL_PRIVATE_LIBS-0 += libmmtk_julia
endif

# Note that we disable MSYS2's path munging here, as otherwise
# it replaces our `:`-separated list as a `;`-separated one.
define stringreplace
Expand Down
2 changes: 1 addition & 1 deletion contrib/refresh_checksums.mk
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ CLANG_TRIPLETS=$(filter %-darwin %-freebsd,$(TRIPLETS))
NON_CLANG_TRIPLETS=$(filter-out %-darwin %-freebsd,$(TRIPLETS))

# These are the projects currently using BinaryBuilder; both GCC-expanded and non-GCC-expanded:
BB_PROJECTS=openssl libssh2 nghttp2 mpfr curl libgit2 pcre libuv unwind llvmunwind dsfmt objconv p7zip zlib libsuitesparse openlibm blastrampoline libtracyclient
BB_PROJECTS=openssl libssh2 nghttp2 mpfr curl libgit2 pcre libuv unwind llvmunwind dsfmt objconv p7zip zlib libsuitesparse openlibm blastrampoline libtracyclient mmtk_julia
BB_GCC_EXPANDED_PROJECTS=openblas csl
BB_CXX_EXPANDED_PROJECTS=gmp llvm clang llvm-tools lld
# These are non-BB source-only deps
Expand Down
4 changes: 4 additions & 0 deletions deps/checksums/mmtk_julia
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
mmtk_julia-b69acf5af7a7dd97c1cc6fd99f7c2d51b477f214.tar.gz/md5/1911cf084d26c48e2ed58af3d268b4b6
mmtk_julia-b69acf5af7a7dd97c1cc6fd99f7c2d51b477f214.tar.gz/sha512/75beab54398989c46b62e714b242cf6705d88d220f40c21e494e0f29161437f5fbe9ba05b543d2353a1ad76f4239ac4025b476be0be864649f310f14935289fe
mmtk_julia.v0.30.2+0.x86_64-linux-gnu.tar.gz/md5/0b8d667927b7ae181245dd1aba467dcb
mmtk_julia.v0.30.2+0.x86_64-linux-gnu.tar.gz/sha512/df45a7b148efcbf8fe24b51899bdc78f052cd96bcf43ff8e96f4ca02851589f4d634f879e2ae23e98917ba235a533a13cf0cb092bfa4fc2a48e260ae1efc007d

This file was deleted.

This file was deleted.

113 changes: 113 additions & 0 deletions deps/mmtk/mmtk.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
#ifndef MMTK_H
#define MMTK_H

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef void* MMTk_Mutator;
typedef void* MMTk_TraceLocal;
typedef void (*ProcessSlotFn)(void* closure, void* slot);
typedef void (*ProcessOffsetSlotFn)(void* closure, void* slot, int offset);

typedef struct {
void** ptr;
size_t cap;
} RootsWorkBuffer;

typedef struct {
RootsWorkBuffer (*report_slots_func)(void** buf, size_t size, size_t cap, void* data, bool renew);
RootsWorkBuffer (*report_nodes_func)(void** buf, size_t size, size_t cap, void* data, bool renew);
RootsWorkBuffer (*report_tpinned_nodes_func)(void** buf, size_t size, size_t cap, void* data, bool renew);
void* data;
} RootsWorkClosure;

/**
* Allocation
*/
extern MMTk_Mutator mmtk_bind_mutator(void *tls, int tid);
extern void mmtk_post_bind_mutator(MMTk_Mutator mutator, MMTk_Mutator original_mutator);
extern void mmtk_destroy_mutator(MMTk_Mutator mutator);

extern void* mmtk_alloc(MMTk_Mutator mutator, size_t size,
size_t align, size_t offset, int allocator);

extern void* mmtk_alloc_large(MMTk_Mutator mutator, size_t size,
size_t align, size_t offset, int allocator);

extern void mmtk_post_alloc(MMTk_Mutator mutator, void* refer,
size_t bytes, int allocator);

extern bool mmtk_is_live_object(void* ref);
extern bool mmtk_is_mapped_object(void* ref);
extern bool mmtk_is_mapped_address(void* addr);
extern int mmtk_object_is_managed_by_mmtk(void* addr);
extern void mmtk_runtime_panic(void);
extern void mmtk_unreachable(void);
extern unsigned char mmtk_pin_object(void* obj);
extern bool mmtk_is_pinned(void* obj);
extern const char* get_mmtk_version(void);

extern void mmtk_set_vm_space(void* addr, size_t size);
extern void mmtk_immortal_region_post_alloc(void* addr, size_t size);

// Write barriers
extern void mmtk_memory_region_copy(MMTk_Mutator mutator, void* src_obj, void* src_addr, void* dst_obj, void* dst_addr, size_t size);
extern void mmtk_object_reference_write_post(MMTk_Mutator mutator, const void* src, const void* target);
extern void mmtk_object_reference_write_slow(MMTk_Mutator mutator, const void* src, const void* target);
extern const void* MMTK_SIDE_LOG_BIT_BASE_ADDRESS;

extern _Atomic(uintptr_t) JULIA_MALLOC_BYTES;

/**
* Misc
*/
extern void mmtk_gc_init(uintptr_t min_heap_size, uintptr_t max_heap_size, uintptr_t n_gcthreads, uintptr_t header_size, uintptr_t tag);
extern bool mmtk_will_never_move(void* object);
extern bool mmtk_process(char* name, char* value);
extern void mmtk_scan_region(void);
extern void mmtk_handle_user_collection_request(void *tls, uint8_t collection);
extern void mmtk_initialize_collection(void* tls);
extern void mmtk_start_control_collector(void *tls);
extern void mmtk_start_worker(void *tls, void* worker, void* mmtk);
extern void mmtk_process_julia_obj(void* addr);
extern void mmtk_register_finalizer(void* obj, void* function, bool is_ptr);
extern void mmtk_run_finalizers_for_obj(void* obj);
extern void mmtk_run_finalizers(bool at_exit);
extern void mmtk_gc_poll(void *tls);
extern void mmtk_julia_copy_stack_check(int copy_stack);
extern void* mmtk_get_possibly_forwarded(void* object);
extern void mmtk_block_thread_for_gc(void);
extern void* mmtk_new_mutator_iterator(void);
extern void* mmtk_get_next_mutator_tls(void*);
extern void* mmtk_close_mutator_iterator(void*);


/**
* VM Accounting
*/
extern size_t mmtk_free_bytes(void);
extern size_t mmtk_total_bytes(void);
extern size_t mmtk_used_bytes(void);
extern void* mmtk_starting_heap_address(void);
extern void* mmtk_last_heap_address(void);

/**
* Reference Processing
*/
extern void mmtk_add_weak_candidate(void* ref);
extern void mmtk_add_soft_candidate(void* ref);
extern void mmtk_add_phantom_candidate(void* ref);

extern void mmtk_harness_begin(void *tls);
extern void mmtk_harness_end(void);

#ifdef __cplusplus
}
#endif

#endif // MMTK_H
114 changes: 114 additions & 0 deletions deps/mmtk/mmtkMutator.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
#ifndef MMTK_JULIA_MMTK_MUTATOR_H
#define MMTK_JULIA_MMTK_MUTATOR_H

// mmtk_julia_types.h refers to the types in this file.
// So if this file is updated, make sure you regenerate Rust types for mmtk_julia_types.h.

enum Allocator {
AllocatorDefault = 0,
AllocatorImmortal = 1,
AllocatorLos = 2,
AllocatorCode = 3,
AllocatorReadOnly = 4,
};

typedef struct {
void* data;
void* vtable;
} RustDynPtr;

// These constants should match the constants defind in mmtk::util::alloc::allocators

Check warning on line 20 in deps/mmtk/mmtkMutator.h

View workflow job for this annotation

GitHub Actions / Check for new typos

perhaps "defind" should be "defined or defund".
#define MAX_BUMP_ALLOCATORS 6
#define MAX_LARGE_OBJECT_ALLOCATORS 2
#define MAX_MALLOC_ALLOCATORS 1
#define MAX_IMMIX_ALLOCATORS 1
#define MAX_FREE_LIST_ALLOCATORS 2
#define MAX_MARK_COMPACT_ALLOCATORS 1

// The following types should have the same layout as the types with the same name in MMTk core (Rust)

typedef struct {
void* tls;
void* cursor;
void* limit;
RustDynPtr space;
void* context;
} BumpAllocator;

typedef struct {
void* tls;
void* space;
void* context;
} LargeObjectAllocator;

typedef struct {
void* tls;
void* cursor;
void* limit;
void* immix_space;
void* context;
uint8_t hot;
uint8_t copy;
void* large_cursor;
void* large_limit;
uint8_t request_for_large;
uint8_t _align[7];
uint8_t line_opt_tag;
uintptr_t line_opt;
} ImmixAllocator;

typedef struct {
void* Address;
} FLBlock;

typedef struct {
FLBlock first;
FLBlock last;
size_t size;
char lock;
} FLBlockList;

typedef struct {
void* tls;
void* space;
void* context;
FLBlockList* available_blocks;
FLBlockList* available_blocks_stress;
FLBlockList* unswept_blocks;
FLBlockList* consumed_blocks;
} FreeListAllocator;

typedef struct {
void* tls;
void* space;
void* context;
} MMTkMallocAllocator; // Prefix with MMTk to avoid name clash

typedef struct {
BumpAllocator bump_allocator;
} MarkCompactAllocator;

typedef struct {
BumpAllocator bump_pointer[MAX_BUMP_ALLOCATORS];
LargeObjectAllocator large_object[MAX_LARGE_OBJECT_ALLOCATORS];
MMTkMallocAllocator malloc[MAX_MALLOC_ALLOCATORS];
ImmixAllocator immix[MAX_IMMIX_ALLOCATORS];
FreeListAllocator free_list[MAX_FREE_LIST_ALLOCATORS];
MarkCompactAllocator markcompact[MAX_MARK_COMPACT_ALLOCATORS];
} Allocators;

typedef struct {
void* allocator_mapping;
void* space_mapping;
RustDynPtr prepare_func;
RustDynPtr release_func;
} MutatorConfig;

typedef struct {
Allocators allocators;
RustDynPtr barrier;
void* mutator_tls;
RustDynPtr plan;
MutatorConfig config;
} MMTkMutatorContext;
#endif // MMTK_MUTATOR_HPP
9 changes: 9 additions & 0 deletions deps/mmtk_julia.mk
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
MMTK_MOVING := 0
MMTK_VARS := MMTK_PLAN=$(MMTK_PLAN) MMTK_MOVING=$(MMTK_MOVING)

ifneq ($(USE_BINARYBUILDER_MMTK_JULIA),1)

# Download the binding, build it from source
ifeq (${MMTK_JULIA_DIR},$(BUILDROOT)/usr/lib/mmtk_julia)
$(eval $(call git-external,mmtk_julia,MMTK_JULIA,,,$(BUILDDIR)))
Expand Down Expand Up @@ -69,3 +71,10 @@ $(build_prefix)/manifest/mmtk_julia: $(BUILDROOT)/usr/lib/libmmtk_julia.so
@echo $(UNINSTALL_mmtk_julia) > $@

endif # MMTK_JULIA_DIR

else
# We are building using the BinaryBuilder version of the binding

$(eval $(call bb-install,mmtk_julia,MMTK_JULIA,false))

endif # USE_BINARYBUILDER_MMTK_JULIA
3 changes: 3 additions & 0 deletions deps/mmtk_julia.version
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,6 @@ MMTK_JULIA_BRANCH = master
MMTK_JULIA_SHA1 = b69acf5af7a7dd97c1cc6fd99f7c2d51b477f214
MMTK_JULIA_GIT_URL := https://github.com/mmtk/mmtk-julia.git
MMTK_JULIA_TAR_URL = https://github.com/mmtk/mmtk-julia/archive/refs/tags/v0.30.2.tar.gz

MMTK_JULIA_JLL_VER := 0.30.2+0
MMTK_JULIA_JLL_NAME := mmtk_julia
Loading