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) {
diff --git a/compiler/optimizing/optimizing_cfi_test.cc b/compiler/optimizing/optimizing_cfi_test.cc
index 4ad2996..e2b2106 100644
--- a/compiler/optimizing/optimizing_cfi_test.cc
+++ b/compiler/optimizing/optimizing_cfi_test.cc
@@ -18,6 +18,7 @@
 #include <vector>
 
 #include "arch/instruction_set.h"
+#include "base/runtime_debug.h"
 #include "cfi_test.h"
 #include "driver/compiler_options.h"
 #include "gtest/gtest.h"
@@ -56,6 +57,9 @@
   ArenaAllocator* GetAllocator() { return pool_and_allocator_.GetAllocator(); }
 
   void SetUpFrame(InstructionSet isa) {
+    // Ensure that slow-debug is off, so that there is no unexpected read-barrier check emitted.
+    SetRuntimeDebugFlagsEnabled(false);
+
     // Setup simple context.
     std::string error;
     isa_features_ = InstructionSetFeatures::FromVariant(isa, "default", &error);