summaryrefslogtreecommitdiff
path: root/src/vm/gcenv.ee.cpp
diff options
context:
space:
mode:
authorSteve MacLean <sdmaclea.qdt@qualcommdatacenter.com>2017-06-16 15:56:35 +0000
committerSteve MacLean, Qualcomm Datacenter Technologies Inc <sdmaclea@qti.qualcomm.com>2017-08-25 14:10:47 -0400
commit7091c756f8da0e547290a2f5d43e3c4009e59010 (patch)
tree86231c55c05abf837f06fe7a65beca422fe9b83b /src/vm/gcenv.ee.cpp
parente9e3a69fe00d5e75ed09971b346f3529beba36f6 (diff)
downloadcoreclr-7091c756f8da0e547290a2f5d43e3c4009e59010.tar.gz
coreclr-7091c756f8da0e547290a2f5d43e3c4009e59010.tar.bz2
coreclr-7091c756f8da0e547290a2f5d43e3c4009e59010.zip
[Arm64] Optimize JIT_WriteBarriers
Fixes #5833 Fixes #11374 Fixes #12197
Diffstat (limited to 'src/vm/gcenv.ee.cpp')
-rw-r--r--src/vm/gcenv.ee.cpp14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/vm/gcenv.ee.cpp b/src/vm/gcenv.ee.cpp
index b61069f5fd..b135173c0f 100644
--- a/src/vm/gcenv.ee.cpp
+++ b/src/vm/gcenv.ee.cpp
@@ -861,7 +861,7 @@ void GCToEEInterface::StompWriteBarrier(WriteBarrierParameters* args)
#endif
#ifdef FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
- if (args->write_watch_table != nullptr)
+ if (g_sw_ww_enabled_for_gc_heap && (args->write_watch_table != nullptr))
{
assert(args->is_runtime_suspended);
g_sw_ww_table = args->write_watch_table;
@@ -888,6 +888,17 @@ void GCToEEInterface::StompWriteBarrier(WriteBarrierParameters* args)
g_lowest_address = args->lowest_address;
VolatileStore(&g_highest_address, args->highest_address);
+
+#if defined(_ARM64_)
+ // Need to reupdate for changes to g_highest_address g_lowest_address
+ ::StompWriteBarrierResize(args->is_runtime_suspended, args->requires_upper_bounds_check);
+
+ if(!args->is_runtime_suspended)
+ {
+ // If runtime is not suspended, force updated state to be visible to all threads
+ MemoryBarrier();
+ }
+#endif
return;
case WriteBarrierOp::StompEphemeral:
// StompEphemeral requires a new ephemeral low and a new ephemeral high
@@ -945,6 +956,7 @@ void GCToEEInterface::StompWriteBarrier(WriteBarrierParameters* args)
case WriteBarrierOp::SwitchToNonWriteWatch:
#ifdef FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
assert(args->is_runtime_suspended && "the runtime must be suspended here!");
+ g_sw_ww_table = 0;
g_sw_ww_enabled_for_gc_heap = false;
::SwitchToNonWriteWatchBarrier(true);
#else