@@ -26,6 +26,9 @@ EXTERN_C void JIT_WriteBarrier_End();
2626
2727EXTERN_C void JIT_WriteBarrier_PreGrow64 (Object **dst, Object *ref);
2828EXTERN_C void JIT_WriteBarrier_PreGrow64_Patch_Label_Lower ();
29+ #ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
30+ EXTERN_C void JIT_WriteBarrier_PreGrow64_Patch_Label_Upper ();
31+ #endif
2932EXTERN_C void JIT_WriteBarrier_PreGrow64_Patch_Label_CardTable ();
3033#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
3134EXTERN_C void JIT_WriteBarrier_PreGrow64_Patch_Label_CardBundleTable ();
@@ -79,6 +82,9 @@ EXTERN_C void JIT_WriteBarrier_Bit_Region64_End();
7982EXTERN_C void JIT_WriteBarrier_WriteWatch_PreGrow64 (Object **dst, Object *ref);
8083EXTERN_C void JIT_WriteBarrier_WriteWatch_PreGrow64_Patch_Label_WriteWatchTable ();
8184EXTERN_C void JIT_WriteBarrier_WriteWatch_PreGrow64_Patch_Label_Lower ();
85+ #ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
86+ EXTERN_C void JIT_WriteBarrier_WriteWatch_PreGrow64_Patch_Label_Upper ();
87+ #endif
8288EXTERN_C void JIT_WriteBarrier_WriteWatch_PreGrow64_Patch_Label_CardTable ();
8389#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
8490EXTERN_C void JIT_WriteBarrier_WriteWatch_PreGrow64_Patch_Label_CardBundleTable ();
@@ -172,9 +178,15 @@ void WriteBarrierManager::Validate()
172178#endif
173179
174180 pLowerBoundImmediate = CALC_PATCH_LOCATION (JIT_WriteBarrier_PreGrow64, Patch_Label_Lower, 2 );
181+ #ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
182+ pUpperBoundImmediate = CALC_PATCH_LOCATION (JIT_WriteBarrier_PreGrow64, Patch_Label_Upper, 2 );
183+ #endif
175184 pCardTableImmediate = CALC_PATCH_LOCATION (JIT_WriteBarrier_PreGrow64, Patch_Label_CardTable, 2 );
176185
177186 _ASSERTE_ALL_BUILDS ((reinterpret_cast <UINT64>(pLowerBoundImmediate) & 0x7 ) == 0 );
187+ #ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
188+ _ASSERTE_ALL_BUILDS ((reinterpret_cast <UINT64>(pUpperBoundImmediate) & 0x7 ) == 0 );
189+ #endif
178190 _ASSERTE_ALL_BUILDS ((reinterpret_cast <UINT64>(pCardTableImmediate) & 0x7 ) == 0 );
179191
180192#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
@@ -239,10 +251,16 @@ void WriteBarrierManager::Validate()
239251
240252 pWriteWatchTableImmediate = CALC_PATCH_LOCATION (JIT_WriteBarrier_WriteWatch_PreGrow64, Patch_Label_WriteWatchTable, 2 );
241253 pLowerBoundImmediate = CALC_PATCH_LOCATION (JIT_WriteBarrier_WriteWatch_PreGrow64, Patch_Label_Lower, 2 );
254+ #ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
255+ pUpperBoundImmediate = CALC_PATCH_LOCATION (JIT_WriteBarrier_WriteWatch_PreGrow64, Patch_Label_Upper, 2 );
256+ #endif
242257 pCardTableImmediate = CALC_PATCH_LOCATION (JIT_WriteBarrier_WriteWatch_PreGrow64, Patch_Label_CardTable, 2 );
243258
244259 _ASSERTE_ALL_BUILDS ((reinterpret_cast <UINT64>(pWriteWatchTableImmediate) & 0x7 ) == 0 );
245260 _ASSERTE_ALL_BUILDS ((reinterpret_cast <UINT64>(pLowerBoundImmediate) & 0x7 ) == 0 );
261+ #ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
262+ _ASSERTE_ALL_BUILDS ((reinterpret_cast <UINT64>(pUpperBoundImmediate) & 0x7 ) == 0 );
263+ #endif
246264 _ASSERTE_ALL_BUILDS ((reinterpret_cast <UINT64>(pCardTableImmediate) & 0x7 ) == 0 );
247265
248266#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
@@ -433,11 +451,17 @@ int WriteBarrierManager::ChangeWriteBarrierTo(WriteBarrierType newWriteBarrier,
433451 case WRITE_BARRIER_PREGROW64:
434452 {
435453 m_pLowerBoundImmediate = CALC_PATCH_LOCATION (JIT_WriteBarrier_PreGrow64, Patch_Label_Lower, 2 );
454+ #ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
455+ m_pUpperBoundImmediate = CALC_PATCH_LOCATION (JIT_WriteBarrier_PreGrow64, Patch_Label_Upper, 2 );
456+ #endif
436457 m_pCardTableImmediate = CALC_PATCH_LOCATION (JIT_WriteBarrier_PreGrow64, Patch_Label_CardTable, 2 );
437458
438459 // Make sure that we will be bashing the right places (immediates should be hardcoded to 0x0f0f0f0f0f0f0f0f0).
439460 _ASSERTE_ALL_BUILDS (0xf0f0f0f0f0f0f0f0 == *(UINT64*)m_pLowerBoundImmediate);
440461 _ASSERTE_ALL_BUILDS (0xf0f0f0f0f0f0f0f0 == *(UINT64*)m_pCardTableImmediate);
462+ #ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
463+ _ASSERTE_ALL_BUILDS (0xf0f0f0f0f0f0f0f0 == *(UINT64*)m_pUpperBoundImmediate);
464+ #endif
441465
442466#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
443467 m_pCardBundleTableImmediate = CALC_PATCH_LOCATION (JIT_WriteBarrier_PreGrow64, Patch_Label_CardBundleTable, 2 );
@@ -529,11 +553,17 @@ int WriteBarrierManager::ChangeWriteBarrierTo(WriteBarrierType newWriteBarrier,
529553 {
530554 m_pWriteWatchTableImmediate = CALC_PATCH_LOCATION (JIT_WriteBarrier_WriteWatch_PreGrow64, Patch_Label_WriteWatchTable, 2 );
531555 m_pLowerBoundImmediate = CALC_PATCH_LOCATION (JIT_WriteBarrier_WriteWatch_PreGrow64, Patch_Label_Lower, 2 );
556+ #ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
557+ m_pUpperBoundImmediate = CALC_PATCH_LOCATION (JIT_WriteBarrier_WriteWatch_PreGrow64, Patch_Label_Upper, 2 );
558+ #endif
532559 m_pCardTableImmediate = CALC_PATCH_LOCATION (JIT_WriteBarrier_WriteWatch_PreGrow64, Patch_Label_CardTable, 2 );
533560
534561 // Make sure that we will be bashing the right places (immediates should be hardcoded to 0x0f0f0f0f0f0f0f0f0).
535562 _ASSERTE_ALL_BUILDS (0xf0f0f0f0f0f0f0f0 == *(UINT64*)m_pWriteWatchTableImmediate);
536563 _ASSERTE_ALL_BUILDS (0xf0f0f0f0f0f0f0f0 == *(UINT64*)m_pLowerBoundImmediate);
564+ #ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
565+ _ASSERTE_ALL_BUILDS (0xf0f0f0f0f0f0f0f0 == *(UINT64*)m_pUpperBoundImmediate);
566+ #endif
537567 _ASSERTE_ALL_BUILDS (0xf0f0f0f0f0f0f0f0 == *(UINT64*)m_pCardTableImmediate);
538568
539569#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
@@ -788,6 +818,12 @@ int WriteBarrierManager::UpdateEphemeralBounds(bool isRuntimeSuspended)
788818 case WRITE_BARRIER_WRITE_WATCH_BYTE_REGIONS64:
789819 case WRITE_BARRIER_WRITE_WATCH_BIT_REGIONS64:
790820#endif // FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
821+ #ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
822+ case WRITE_BARRIER_PREGROW64:
823+ #ifdef FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
824+ case WRITE_BARRIER_WRITE_WATCH_PREGROW64:
825+ #endif // FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
826+ #endif // FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
791827 {
792828 // Change immediate if different from new g_ephermeral_high.
793829 if (*(UINT64*)m_pUpperBoundImmediate != (size_t )g_ephemeral_high)
@@ -797,11 +833,13 @@ int WriteBarrierManager::UpdateEphemeralBounds(bool isRuntimeSuspended)
797833 stompWBCompleteActions |= SWB_ICACHE_FLUSH;
798834 }
799835 }
836+ #ifndef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
800837 FALLTHROUGH;
801838 case WRITE_BARRIER_PREGROW64:
802839#ifdef FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
803840 case WRITE_BARRIER_WRITE_WATCH_PREGROW64:
804841#endif // FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
842+ #endif // FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
805843 {
806844 // Change immediate if different from new g_ephermeral_low.
807845 if (*(UINT64*)m_pLowerBoundImmediate != (size_t )g_ephemeral_low)
0 commit comments