diff --git a/Make.inc b/Make.inc index 216fc6fd7adde..b9d94d561ec91 100644 --- a/Make.inc +++ b/Make.inc @@ -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 @@ -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) @@ -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 diff --git a/Makefile b/Makefile index 20d131ee8524c..b193b3849c6aa 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/contrib/refresh_checksums.mk b/contrib/refresh_checksums.mk index 5a787b0b67cb1..fa7cddc705958 100644 --- a/contrib/refresh_checksums.mk +++ b/contrib/refresh_checksums.mk @@ -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 diff --git a/deps/checksums/mmtk_julia b/deps/checksums/mmtk_julia new file mode 100644 index 0000000000000..dc8fdb9cc4ca3 --- /dev/null +++ b/deps/checksums/mmtk_julia @@ -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 \ No newline at end of file diff --git a/deps/checksums/mmtk_julia-b69acf5af7a7dd97c1cc6fd99f7c2d51b477f214.tar.gz/md5 b/deps/checksums/mmtk_julia-b69acf5af7a7dd97c1cc6fd99f7c2d51b477f214.tar.gz/md5 deleted file mode 100644 index fc6955c8f2e7b..0000000000000 --- a/deps/checksums/mmtk_julia-b69acf5af7a7dd97c1cc6fd99f7c2d51b477f214.tar.gz/md5 +++ /dev/null @@ -1 +0,0 @@ -1911cf084d26c48e2ed58af3d268b4b6 diff --git a/deps/checksums/mmtk_julia-b69acf5af7a7dd97c1cc6fd99f7c2d51b477f214.tar.gz/sha512 b/deps/checksums/mmtk_julia-b69acf5af7a7dd97c1cc6fd99f7c2d51b477f214.tar.gz/sha512 deleted file mode 100644 index ea916976895a3..0000000000000 --- a/deps/checksums/mmtk_julia-b69acf5af7a7dd97c1cc6fd99f7c2d51b477f214.tar.gz/sha512 +++ /dev/null @@ -1 +0,0 @@ -75beab54398989c46b62e714b242cf6705d88d220f40c21e494e0f29161437f5fbe9ba05b543d2353a1ad76f4239ac4025b476be0be864649f310f14935289fe diff --git a/deps/mmtk/mmtk.h b/deps/mmtk/mmtk.h new file mode 100644 index 0000000000000..c88204a769c41 --- /dev/null +++ b/deps/mmtk/mmtk.h @@ -0,0 +1,113 @@ +#ifndef MMTK_H +#define MMTK_H + +#include +#include +#include + +#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 diff --git a/deps/mmtk/mmtkMutator.h b/deps/mmtk/mmtkMutator.h new file mode 100644 index 0000000000000..2f513406353f2 --- /dev/null +++ b/deps/mmtk/mmtkMutator.h @@ -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 +#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 diff --git a/deps/mmtk_julia.mk b/deps/mmtk_julia.mk index ccf638e9211bb..7e075b6b3b531 100644 --- a/deps/mmtk_julia.mk +++ b/deps/mmtk_julia.mk @@ -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))) @@ -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 diff --git a/deps/mmtk_julia.version b/deps/mmtk_julia.version index 60f7cffe7b4de..74df4b3de61cc 100644 --- a/deps/mmtk_julia.version +++ b/deps/mmtk_julia.version @@ -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