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 18, 2025
1 parent a6defc1 commit 4313103
Show file tree
Hide file tree
Showing 3 changed files with 234 additions and 0 deletions.
7 changes: 7 additions & 0 deletions Make.inc
Original file line number Diff line number Diff line change
Expand Up @@ -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
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
#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

0 comments on commit 4313103

Please sign in to comment.