11#include "mmtk_julia.h"
22#include "mmtk.h"
3+ #include "mmtkMutator.h"
34#include <stdbool.h>
45#include <stddef.h>
56#include "gc.h"
@@ -36,23 +37,6 @@ JL_DLLEXPORT void (jl_mmtk_harness_end)(void)
3637 mmtk_harness_end ();
3738}
3839
39- STATIC_INLINE void * alloc_default_object (jl_ptls_t ptls , size_t size , int offset ) {
40- int64_t delta = (- offset - (int64_t )(ptls -> cursor )) & 15 ; // aligned to 16
41- uint64_t aligned_addr = (uint64_t )ptls -> cursor + delta ;
42-
43- if (__unlikely (aligned_addr + size > (uint64_t )ptls -> limit )) {
44- jl_ptls_t ptls2 = jl_current_task -> ptls ;
45- ptls2 -> mmtk_mutator_ptr -> allocators .immix [0 ].cursor = ptls2 -> cursor ;
46- void * res = mmtk_alloc (ptls2 -> mmtk_mutator_ptr , size , 16 , offset , 0 );
47- ptls2 -> cursor = ptls2 -> mmtk_mutator_ptr -> allocators .immix [0 ].cursor ;
48- ptls2 -> limit = ptls2 -> mmtk_mutator_ptr -> allocators .immix [0 ].limit ;
49- return res ;
50- } else {
51- ptls -> cursor = (void * ) (aligned_addr + size );
52- return (void * ) aligned_addr ;
53- }
54- }
55-
5640JL_DLLEXPORT jl_value_t * jl_mmtk_gc_alloc_default (jl_ptls_t ptls , int pool_offset ,
5741 int osize , void * ty )
5842{
@@ -62,16 +46,16 @@ JL_DLLEXPORT jl_value_t *jl_mmtk_gc_alloc_default(jl_ptls_t ptls, int pool_offse
6246 jl_value_t * v ;
6347 if ((uintptr_t )ty != jl_buff_tag ) {
6448 // v needs to be 16 byte aligned, therefore v_tagged needs to be offset accordingly to consider the size of header
65- jl_taggedvalue_t * v_tagged = (jl_taggedvalue_t * )mmtk_alloc (ptls -> mmtk_mutator_ptr , osize , 16 , sizeof (jl_taggedvalue_t ), 0 ); // (jl_taggedvalue_t *) alloc_default_object(ptls, osize, sizeof(jl_taggedvalue_t) );
49+ jl_taggedvalue_t * v_tagged = (jl_taggedvalue_t * )mmtk_alloc (& ptls -> mmtk_mutator , osize , 16 , sizeof (jl_taggedvalue_t ), 0 );
6650 v = jl_valueof (v_tagged );
67- mmtk_post_alloc (ptls -> mmtk_mutator_ptr , v , osize , 0 );
51+ mmtk_post_alloc (& ptls -> mmtk_mutator , v , osize , 0 );
6852 } else {
6953 // allocating an extra word to store the size of buffer objects
70- jl_taggedvalue_t * v_tagged = (jl_taggedvalue_t * )mmtk_alloc (ptls -> mmtk_mutator_ptr , osize + sizeof (jl_taggedvalue_t ), 16 , 0 , 0 ); // (jl_taggedvalue_t *) alloc_default_object(ptls, osize + sizeof(jl_taggedvalue_t) , 0);
54+ jl_taggedvalue_t * v_tagged = (jl_taggedvalue_t * )mmtk_alloc (& ptls -> mmtk_mutator , osize + sizeof (jl_taggedvalue_t ), 16 , 0 , 0 );
7155 jl_value_t * v_tagged_aligned = ((jl_value_t * )((char * )(v_tagged ) + sizeof (jl_taggedvalue_t )));
7256 v = jl_valueof (v_tagged_aligned );
7357 mmtk_store_obj_size_c (v , osize + sizeof (jl_taggedvalue_t ));
74- mmtk_post_alloc (ptls -> mmtk_mutator_ptr , v , osize + sizeof (jl_taggedvalue_t ), 0 );
58+ mmtk_post_alloc (& ptls -> mmtk_mutator , v , osize + sizeof (jl_taggedvalue_t ), 0 );
7559 }
7660
7761 ptls -> gc_num .allocd += osize ;
@@ -95,7 +79,7 @@ JL_DLLEXPORT jl_value_t *jl_mmtk_gc_alloc_big(jl_ptls_t ptls, size_t sz)
9579 jl_throw (jl_memory_exception );
9680 }
9781
98- bigval_t * v = (bigval_t * )mmtk_alloc_large (ptls -> mmtk_mutator_ptr , allocsz , JL_CACHE_BYTE_ALIGNMENT , 0 , 2 );
82+ bigval_t * v = (bigval_t * )mmtk_alloc_large (& ptls -> mmtk_mutator , allocsz , JL_CACHE_BYTE_ALIGNMENT , 0 , 2 );
9983
10084 if (v == NULL ) {
10185 assert (0 && "Allocation failed" );
@@ -107,7 +91,7 @@ JL_DLLEXPORT jl_value_t *jl_mmtk_gc_alloc_big(jl_ptls_t ptls, size_t sz)
10791 ptls -> gc_num .bigalloc ++ ;
10892
10993 jl_value_t * result = jl_valueof (& v -> header );
110- mmtk_post_alloc (ptls -> mmtk_mutator_ptr , result , allocsz , 2 );
94+ mmtk_post_alloc (& ptls -> mmtk_mutator , result , allocsz , 2 );
11195
11296 return result ;
11397}
@@ -147,7 +131,7 @@ static void mmtk_sweep_malloced_arrays(void) JL_NOTSAFEPOINT
147131extern void mark_metadata_scanned (jl_value_t * obj );
148132extern int8_t check_metadata_scanned (jl_value_t * obj );
149133
150- int8_t object_has_been_scanned (jl_value_t * obj )
134+ int8_t object_has_been_scanned (void * obj )
151135{
152136 uintptr_t tag = (uintptr_t )jl_typeof (obj );
153137 jl_datatype_t * vt = (jl_datatype_t * )tag ;
@@ -164,7 +148,7 @@ int8_t object_has_been_scanned(jl_value_t* obj)
164148 return 0 ;
165149}
166150
167- void mark_object_as_scanned (jl_value_t * obj ) {
151+ void mark_object_as_scanned (void * obj ) {
168152 if (jl_object_in_image ((jl_value_t * )obj )) {
169153 jl_taggedvalue_t * o = jl_astaggedvalue (obj );
170154 o -> bits .gc = GC_MARKED ;
@@ -185,8 +169,9 @@ void mmtk_exit_from_safepoint(int8_t old_state) {
185169// it will block until GC is done
186170// that thread simply exits from block_for_gc without executing finalizers
187171// when executing finalizers do not let another thread do GC (set a variable such that while that variable is true, no GC can be done)
188- int8_t set_gc_initial_state (jl_ptls_t ptls )
172+ int8_t set_gc_initial_state (void * ptls_raw )
189173{
174+ jl_ptls_t ptls = (jl_ptls_t ) ptls_raw ;
190175 int8_t old_state = jl_atomic_load_relaxed (& ((jl_ptls_t )ptls )-> gc_state );
191176 jl_atomic_store_release (& ((jl_ptls_t )ptls )-> gc_state , JL_GC_STATE_WAITING );
192177 if (!jl_safepoint_start_gc ()) {
@@ -231,8 +216,9 @@ void wait_for_the_world(void)
231216 }
232217}
233218
234- size_t get_lo_size (jl_value_t * obj )
219+ size_t get_lo_size (void * obj_raw )
235220{
221+ jl_value_t * obj = (jl_value_t * ) obj_raw ;
236222 jl_taggedvalue_t * v = jl_astaggedvalue (obj );
237223 // bigval_header: but we cannot access the function here. So use container_of instead.
238224 bigval_t * hdr = container_of (v , bigval_t , header );
@@ -246,18 +232,12 @@ void set_jl_last_err(int e)
246232
247233int get_jl_last_err (void )
248234{
249- gc_n_threads = jl_atomic_load_acquire (& jl_n_threads );
250- gc_all_tls_states = jl_atomic_load_relaxed (& jl_all_tls_states );
251- for (int t_i = 0 ; t_i < gc_n_threads ; t_i ++ ) {
252- jl_ptls_t ptls = gc_all_tls_states [t_i ];
253- ptls -> cursor = 0 ;
254- ptls -> limit = 0 ;
255- }
256235 return errno ;
257236}
258237
259- void * get_obj_start_ref (jl_value_t * obj )
238+ void * get_obj_start_ref (void * obj_raw )
260239{
240+ jl_value_t * obj = (jl_value_t * ) obj_raw ;
261241 uintptr_t tag = (uintptr_t )jl_typeof (obj );
262242 jl_datatype_t * vt = (jl_datatype_t * )tag ;
263243 void * obj_start_ref ;
@@ -271,8 +251,9 @@ void* get_obj_start_ref(jl_value_t* obj)
271251 return obj_start_ref ;
272252}
273253
274- size_t get_so_size (jl_value_t * obj )
254+ size_t get_so_size (void * obj_raw )
275255{
256+ jl_value_t * obj = (jl_value_t * ) obj_raw ;
276257 uintptr_t tag = (uintptr_t )jl_typeof (obj );
277258 jl_datatype_t * vt = (jl_datatype_t * )tag ;
278259
@@ -392,8 +373,10 @@ size_t get_so_size(jl_value_t* obj)
392373 return 0 ;
393374}
394375
395- void run_finalizer_function (jl_value_t * o , jl_value_t * ff , bool is_ptr )
376+ void run_finalizer_function (void * o_raw , void * ff_raw , bool is_ptr )
396377{
378+ jl_value_t * o = (jl_value_t * ) o_raw ;
379+ jl_value_t * ff = (jl_value_t * ) ff_raw ;
397380 if (is_ptr ) {
398381 run_finalizer (jl_current_task , (jl_value_t * )(((uintptr_t )o ) | 1 ), (jl_value_t * )ff );
399382 } else {
@@ -423,7 +406,7 @@ void mmtk_jl_run_pending_finalizers(void* ptls) {
423406 }
424407}
425408
426- void mmtk_jl_run_finalizers (jl_ptls_t ptls ) {
409+ void mmtk_jl_run_finalizers (void * ptls ) {
427410 // Only disable finalizers on current thread
428411 // Doing this on all threads is racy (it's impossible to check
429412 // or wait for finalizers on other threads without dead lock).
@@ -663,7 +646,7 @@ static void jl_gc_queue_remset_mmtk(jl_ptls_t ptls2)
663646 }
664647}
665648
666- void calculate_roots (jl_ptls_t ptls )
649+ void calculate_roots (void * ptls_raw )
667650{
668651 for (int t_i = 0 ; t_i < gc_n_threads ; t_i ++ )
669652 gc_premark (gc_all_tls_states [t_i ]);
@@ -682,8 +665,8 @@ void calculate_roots(jl_ptls_t ptls)
682665 queue_roots ();
683666}
684667
685- JL_DLLEXPORT void scan_julia_exc_obj (jl_task_t * obj , closure_pointer closure , ProcessEdgeFn process_edge ) {
686- jl_task_t * ta = (jl_task_t * )obj ;
668+ JL_DLLEXPORT void scan_julia_exc_obj (void * obj_raw , closure_pointer closure , ProcessEdgeFn process_edge ) {
669+ jl_task_t * ta = (jl_task_t * )obj_raw ;
687670
688671 if (ta -> excstack ) { // inlining label `excstack` from mark_loop
689672 // if it is not managed by MMTk, nothing needs to be done because the object does not need to be scanned
@@ -745,8 +728,9 @@ const bool PRINT_OBJ_TYPE = false;
745728 * directly (not an edge), specifying whether to scan the object or not; and only scan the object
746729 * (necessary for boot image / non-MMTk objects)
747730**/
748- JL_DLLEXPORT void scan_julia_obj (jl_value_t * obj , closure_pointer closure , ProcessEdgeFn process_edge , ProcessOffsetEdgeFn process_offset_edge )
731+ JL_DLLEXPORT void scan_julia_obj (void * obj_raw , closure_pointer closure , ProcessEdgeFn process_edge , ProcessOffsetEdgeFn process_offset_edge )
749732{
733+ jl_value_t * obj = (jl_value_t * ) obj_raw ;
750734 uintptr_t tag = (uintptr_t )jl_typeof (obj );
751735 jl_datatype_t * vt = (jl_datatype_t * )tag ; // type of obj
752736
@@ -962,6 +946,10 @@ void update_gc_time(uint64_t inc) {
962946 gc_num .total_time += inc ;
963947}
964948
949+ uintptr_t get_abi_structs_checksum_c (void ) {
950+ return sizeof (MMTkMutatorContext );
951+ }
952+
965953Julia_Upcalls mmtk_upcalls = (Julia_Upcalls ) {
966954 .scan_julia_obj = scan_julia_obj ,
967955 .scan_julia_exc_obj = scan_julia_exc_obj ,
@@ -986,4 +974,5 @@ Julia_Upcalls mmtk_upcalls = (Julia_Upcalls) {
986974 .exit_from_safepoint = mmtk_exit_from_safepoint ,
987975 .jl_hrtime = jl_hrtime ,
988976 .update_gc_time = update_gc_time ,
977+ .get_abi_structs_checksum_c = get_abi_structs_checksum_c ,
989978};
0 commit comments