@@ -26,6 +26,9 @@ EXTERN_C void JIT_WriteBarrier_End();
26
26
27
27
EXTERN_C void JIT_WriteBarrier_PreGrow64 (Object **dst, Object *ref);
28
28
EXTERN_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
29
32
EXTERN_C void JIT_WriteBarrier_PreGrow64_Patch_Label_CardTable ();
30
33
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
31
34
EXTERN_C void JIT_WriteBarrier_PreGrow64_Patch_Label_CardBundleTable ();
@@ -79,6 +82,9 @@ EXTERN_C void JIT_WriteBarrier_Bit_Region64_End();
79
82
EXTERN_C void JIT_WriteBarrier_WriteWatch_PreGrow64 (Object **dst, Object *ref);
80
83
EXTERN_C void JIT_WriteBarrier_WriteWatch_PreGrow64_Patch_Label_WriteWatchTable ();
81
84
EXTERN_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
82
88
EXTERN_C void JIT_WriteBarrier_WriteWatch_PreGrow64_Patch_Label_CardTable ();
83
89
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
84
90
EXTERN_C void JIT_WriteBarrier_WriteWatch_PreGrow64_Patch_Label_CardBundleTable ();
@@ -172,9 +178,15 @@ void WriteBarrierManager::Validate()
172
178
#endif
173
179
174
180
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
175
184
pCardTableImmediate = CALC_PATCH_LOCATION (JIT_WriteBarrier_PreGrow64, Patch_Label_CardTable, 2 );
176
185
177
186
_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
178
190
_ASSERTE_ALL_BUILDS ((reinterpret_cast <UINT64>(pCardTableImmediate) & 0x7 ) == 0 );
179
191
180
192
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
@@ -239,10 +251,16 @@ void WriteBarrierManager::Validate()
239
251
240
252
pWriteWatchTableImmediate = CALC_PATCH_LOCATION (JIT_WriteBarrier_WriteWatch_PreGrow64, Patch_Label_WriteWatchTable, 2 );
241
253
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
242
257
pCardTableImmediate = CALC_PATCH_LOCATION (JIT_WriteBarrier_WriteWatch_PreGrow64, Patch_Label_CardTable, 2 );
243
258
244
259
_ASSERTE_ALL_BUILDS ((reinterpret_cast <UINT64>(pWriteWatchTableImmediate) & 0x7 ) == 0 );
245
260
_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
246
264
_ASSERTE_ALL_BUILDS ((reinterpret_cast <UINT64>(pCardTableImmediate) & 0x7 ) == 0 );
247
265
248
266
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
@@ -433,11 +451,17 @@ int WriteBarrierManager::ChangeWriteBarrierTo(WriteBarrierType newWriteBarrier,
433
451
case WRITE_BARRIER_PREGROW64:
434
452
{
435
453
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
436
457
m_pCardTableImmediate = CALC_PATCH_LOCATION (JIT_WriteBarrier_PreGrow64, Patch_Label_CardTable, 2 );
437
458
438
459
// Make sure that we will be bashing the right places (immediates should be hardcoded to 0x0f0f0f0f0f0f0f0f0).
439
460
_ASSERTE_ALL_BUILDS (0xf0f0f0f0f0f0f0f0 == *(UINT64*)m_pLowerBoundImmediate);
440
461
_ASSERTE_ALL_BUILDS (0xf0f0f0f0f0f0f0f0 == *(UINT64*)m_pCardTableImmediate);
462
+ #ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
463
+ _ASSERTE_ALL_BUILDS (0xf0f0f0f0f0f0f0f0 == *(UINT64*)m_pUpperBoundImmediate);
464
+ #endif
441
465
442
466
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
443
467
m_pCardBundleTableImmediate = CALC_PATCH_LOCATION (JIT_WriteBarrier_PreGrow64, Patch_Label_CardBundleTable, 2 );
@@ -529,11 +553,17 @@ int WriteBarrierManager::ChangeWriteBarrierTo(WriteBarrierType newWriteBarrier,
529
553
{
530
554
m_pWriteWatchTableImmediate = CALC_PATCH_LOCATION (JIT_WriteBarrier_WriteWatch_PreGrow64, Patch_Label_WriteWatchTable, 2 );
531
555
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
532
559
m_pCardTableImmediate = CALC_PATCH_LOCATION (JIT_WriteBarrier_WriteWatch_PreGrow64, Patch_Label_CardTable, 2 );
533
560
534
561
// Make sure that we will be bashing the right places (immediates should be hardcoded to 0x0f0f0f0f0f0f0f0f0).
535
562
_ASSERTE_ALL_BUILDS (0xf0f0f0f0f0f0f0f0 == *(UINT64*)m_pWriteWatchTableImmediate);
536
563
_ASSERTE_ALL_BUILDS (0xf0f0f0f0f0f0f0f0 == *(UINT64*)m_pLowerBoundImmediate);
564
+ #ifdef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
565
+ _ASSERTE_ALL_BUILDS (0xf0f0f0f0f0f0f0f0 == *(UINT64*)m_pUpperBoundImmediate);
566
+ #endif
537
567
_ASSERTE_ALL_BUILDS (0xf0f0f0f0f0f0f0f0 == *(UINT64*)m_pCardTableImmediate);
538
568
539
569
#ifdef FEATURE_MANUALLY_MANAGED_CARD_BUNDLES
@@ -788,6 +818,12 @@ int WriteBarrierManager::UpdateEphemeralBounds(bool isRuntimeSuspended)
788
818
case WRITE_BARRIER_WRITE_WATCH_BYTE_REGIONS64:
789
819
case WRITE_BARRIER_WRITE_WATCH_BIT_REGIONS64:
790
820
#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
791
827
{
792
828
// Change immediate if different from new g_ephermeral_high.
793
829
if (*(UINT64*)m_pUpperBoundImmediate != (size_t )g_ephemeral_high)
@@ -797,11 +833,13 @@ int WriteBarrierManager::UpdateEphemeralBounds(bool isRuntimeSuspended)
797
833
stompWBCompleteActions |= SWB_ICACHE_FLUSH;
798
834
}
799
835
}
836
+ #ifndef FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
800
837
FALLTHROUGH;
801
838
case WRITE_BARRIER_PREGROW64:
802
839
#ifdef FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
803
840
case WRITE_BARRIER_WRITE_WATCH_PREGROW64:
804
841
#endif // FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
842
+ #endif // FEATURE_UNITY_NULLGC_WRITEBARRIER_PATCH
805
843
{
806
844
// Change immediate if different from new g_ephermeral_low.
807
845
if (*(UINT64*)m_pLowerBoundImmediate != (size_t )g_ephemeral_low)
0 commit comments