@@ -860,18 +860,28 @@ inline void* bump_alloc_fast(MMTkMutatorContext* mutator, uintptr_t* cursor, uin
860860 }
861861}
862862
863+ inline void mmtk_set_side_metadata (const void * side_metadata_base , void * obj ) {
864+ intptr_t addr = (intptr_t ) obj ;
865+ uint8_t * meta_addr = (uint8_t * ) side_metadata_base + (addr >> 6 );
866+ intptr_t shift = (addr >> 3 ) & 0b111 ;
867+ while (1 ) {
868+ uint8_t old_val = * meta_addr ;
869+ uint8_t new_val = old_val | (1 << shift );
870+ if (jl_atomic_cmpswap ((_Atomic (uint8_t )* )meta_addr , & old_val , new_val )) {
871+ break ;
872+ }
873+ }
874+ }
875+
863876inline void * mmtk_immix_alloc_fast (MMTkMutatorContext * mutator , size_t size , size_t align , size_t offset ) {
864877 ImmixAllocator * allocator = & mutator -> allocators .immix [MMTK_DEFAULT_IMMIX_ALLOCATOR ];
865878 return bump_alloc_fast (mutator , (uintptr_t * )& allocator -> cursor , (intptr_t )allocator -> limit , size , align , offset , 0 );
866879}
867880
868- inline void mmtk_immix_post_alloc_slow (MMTkMutatorContext * mutator , void * obj , size_t size ) {
869- mmtk_post_alloc (mutator , obj , size , 0 );
870- }
871-
872881inline void mmtk_immix_post_alloc_fast (MMTkMutatorContext * mutator , void * obj , size_t size ) {
873- // FIXME: for now, we do nothing
874- // but when supporting moving, this is where we set the valid object (VO) bit
882+ if (MMTK_NEEDS_VO_BIT ) {
883+ mmtk_set_side_metadata (MMTK_SIDE_VO_BIT_BASE_ADDRESS , obj );
884+ }
875885}
876886
877887inline void * mmtk_immortal_alloc_fast (MMTkMutatorContext * mutator , size_t size , size_t align , size_t offset ) {
@@ -881,16 +891,11 @@ inline void* mmtk_immortal_alloc_fast(MMTkMutatorContext* mutator, size_t size,
881891
882892inline void mmtk_immortal_post_alloc_fast (MMTkMutatorContext * mutator , void * obj , size_t size ) {
883893 if (MMTK_NEEDS_WRITE_BARRIER == MMTK_OBJECT_BARRIER ) {
884- intptr_t addr = (intptr_t ) obj ;
885- uint8_t * meta_addr = (uint8_t * ) (MMTK_SIDE_LOG_BIT_BASE_ADDRESS ) + (addr >> 6 );
886- intptr_t shift = (addr >> 3 ) & 0b111 ;
887- while (1 ) {
888- uint8_t old_val = * meta_addr ;
889- uint8_t new_val = old_val | (1 << shift );
890- if (jl_atomic_cmpswap ((_Atomic (uint8_t )* )meta_addr , & old_val , new_val )) {
891- break ;
892- }
893- }
894+ mmtk_set_side_metadata (MMTK_SIDE_LOG_BIT_BASE_ADDRESS , obj );
895+ }
896+
897+ if (MMTK_NEEDS_VO_BIT ) {
898+ mmtk_set_side_metadata (MMTK_SIDE_VO_BIT_BASE_ADDRESS , obj );
894899 }
895900}
896901
@@ -1069,6 +1074,16 @@ jl_value_t *jl_gc_permobj(size_t sz, void *ty) JL_NOTSAFEPOINT
10691074 return jl_valueof (o );
10701075}
10711076
1077+ jl_value_t * jl_gc_permsymbol (size_t sz ) JL_NOTSAFEPOINT
1078+ {
1079+ jl_taggedvalue_t * tag = (jl_taggedvalue_t * )jl_gc_perm_alloc (sz , 0 , sizeof (void * ), 0 );
1080+ jl_value_t * sym = jl_valueof (tag );
1081+ jl_ptls_t ptls = jl_current_task -> ptls ;
1082+ jl_set_typetagof (sym , jl_symbol_tag , 0 ); // We need to set symbol tag. The GC tag doesnt matter.
1083+ mmtk_immortal_post_alloc_fast (& ptls -> gc_tls .mmtk_mutator , sym , sz );
1084+ return sym ;
1085+ }
1086+
10721087JL_DLLEXPORT void * jl_gc_managed_malloc (size_t sz )
10731088{
10741089 jl_ptls_t ptls = jl_current_task -> ptls ;
0 commit comments