Skip to content

Commit

Permalink
Adding support for building using BB version of mmtk-julia
Browse files Browse the repository at this point in the history
  • Loading branch information
udesou committed Jan 8, 2025
1 parent 3c7bc45 commit ea1e0a5
Show file tree
Hide file tree
Showing 8 changed files with 253 additions and 3 deletions.
9 changes: 8 additions & 1 deletion Make.inc
Original file line number Diff line number Diff line change
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 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.

114 changes: 114 additions & 0 deletions deps/mmtk/mmtk.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
#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);

Check warning on line 40 in deps/mmtk/mmtk.h

View workflow job for this annotation

GitHub Actions / Check whitespace

Whitespace check

trailing whitespace

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

Check warning on line 114 in deps/mmtk/mmtk.h

View workflow job for this annotation

GitHub Actions / Check whitespace

Whitespace check

trailing blank lines
115 changes: 115 additions & 0 deletions deps/mmtk/mmtkMutator.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
#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

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

View workflow job for this annotation

GitHub Actions / Check whitespace

Whitespace check

no trailing newline
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

0 comments on commit ea1e0a5

Please sign in to comment.