ART: Emit runtime read barrier checks only in slow-debug

Move runtime read barrier check emission to slow-debug to have
better control over when this instrumentation is done.

Bug: 35644369
Bug: 68025088
Test: m test-art-host
Test: manual inspection of core image code
Change-Id: I69b3b6f243c30813a741fe9e0a460f1543c6bc5d
diff --git a/compiler/driver/compiler_options.cc b/compiler/driver/compiler_options.cc
index c0a9a05..1780b1d 100644
--- a/compiler/driver/compiler_options.cc
+++ b/compiler/driver/compiler_options.cc
@@ -20,6 +20,7 @@
 
 #include "android-base/stringprintf.h"
 
+#include "base/runtime_debug.h"
 #include "base/variant_map.h"
 #include "cmdline_parser.h"
 #include "compiler_options_map-inl.h"
@@ -68,17 +69,16 @@
   // because we don't want to include the PassManagerOptions definition from the header file.
 }
 
+namespace {
+
+bool kEmitRuntimeReadBarrierChecks = kIsDebugBuild &&
+    RegisterRuntimeDebugFlag(&kEmitRuntimeReadBarrierChecks);
+
+}  // namespace
+
 bool CompilerOptions::EmitRunTimeChecksInDebugMode() const {
-  // Run-time checks (e.g. Marking Register checks) are only emitted
-  // in debug mode, and
-  // - when running on device; or
-  // - when running on host, but only
-  //   - when compiling the core image (which is used only for testing); or
-  //   - when JIT compiling (only relevant for non-native methods).
-  // This is to prevent these checks from being emitted into pre-opted
-  // boot image or apps, as these are compiled with dex2oatd.
-  return kIsDebugBuild &&
-      (kIsTargetBuild || IsCoreImage() || Runtime::Current()->UseJitCompilation());
+  // Run-time checks (e.g. Marking Register checks) are only emitted in slow-debug mode.
+  return kEmitRuntimeReadBarrierChecks;
 }
 
 bool CompilerOptions::ParseDumpInitFailures(const std::string& option, std::string* error_msg) {