Allow all GCs when not using read barrier

Currently we are trying to force userfaultfd GC when
ART_USE_READ_BARRIER=false. But that doesn't work for targets attempting
to use semi-space GC.

Bug: 243181908
Test: ART_DEFAULT_GC_TYPE=SS ART_USE_READ_BARRIER=false
art/test/testrunner/testrunner.py --host

Change-Id: I0e17df4c7451bb627150ad9ca70030f315c4995f
diff --git a/build/art.go b/build/art.go
index 56df142..672f282 100644
--- a/build/art.go
+++ b/build/art.go
@@ -38,10 +38,12 @@
 	opt := ctx.Config().GetenvWithDefault("ART_NDEBUG_OPT_FLAG", "-O3")
 	cflags = append(cflags, opt)
 
+	tlab := false
 	gcType := ctx.Config().GetenvWithDefault("ART_DEFAULT_GC_TYPE", "CMC")
 
 	if ctx.Config().IsEnvTrue("ART_TEST_DEBUG_GC") {
 		gcType = "SS"
+		tlab = true
 	}
 
 	cflags = append(cflags, "-DART_DEFAULT_GC_TYPE_IS_"+gcType)
@@ -72,10 +74,14 @@
 		// Eventually, make it such that we force CC only if ART_USE_READ_BARRIER
 		// was set to true explicitly during build time.
 		cflags = append(cflags, "-DART_FORCE_USE_READ_BARRIER=1")
+		tlab = true
+	} else if gcType == "CMC" {
+		tlab = true
 	}
-	// The only GC which does not want ART_USE_TLAB set is CMS, which isn't actually used.
-	// When read-barrier is not set, we use userfaultfd GC.
-	cflags = append(cflags, "-DART_USE_TLAB=1")
+
+	if tlab {
+		cflags = append(cflags, "-DART_USE_TLAB=1")
+	}
 
 	cdexLevel := ctx.Config().GetenvWithDefault("ART_DEFAULT_COMPACT_DEX_LEVEL", "fast")
 	cflags = append(cflags, "-DART_DEFAULT_COMPACT_DEX_LEVEL="+cdexLevel)
diff --git a/cmdline/cmdline_types.h b/cmdline/cmdline_types.h
index 8c535a6..b16f069 100644
--- a/cmdline/cmdline_types.h
+++ b/cmdline/cmdline_types.h
@@ -527,6 +527,8 @@
     return gc::kCollectorTypeSS;
   } else if (option == "CC") {
     return gc::kCollectorTypeCC;
+  } else if (option == "CMC") {
+    return gc::kCollectorTypeCMC;
   } else {
     return gc::kCollectorTypeNone;
   }
diff --git a/runtime/gc/collector/mark_compact.cc b/runtime/gc/collector/mark_compact.cc
index 0b8d901..f2817cf 100644
--- a/runtime/gc/collector/mark_compact.cc
+++ b/runtime/gc/collector/mark_compact.cc
@@ -99,13 +99,14 @@
 }
 #endif
 
-#ifdef ART_FORCE_USE_READ_BARRIER
-const bool gUseReadBarrier = kUseBakerReadBarrier || kUseTableLookupReadBarrier;
-#else
+// The other cases are defined as a constexpr in runtime/read_barrier_config.h
+#ifndef ART_FORCE_USE_READ_BARRIER
 const bool gUseReadBarrier = (kUseBakerReadBarrier || kUseTableLookupReadBarrier)
                              && !ShouldUseUserfaultfd();
-#endif
+#ifdef ART_DEFAULT_GC_TYPE_IS_CMC
 const bool gUseUserfaultfd = !gUseReadBarrier;
+#endif
+#endif
 
 namespace gc {
 namespace collector {
diff --git a/runtime/gc/collector_type.h b/runtime/gc/collector_type.h
index 8fdb524..c20e3a7 100644
--- a/runtime/gc/collector_type.h
+++ b/runtime/gc/collector_type.h
@@ -71,6 +71,7 @@
     kCollectorTypeSS
 #elif ART_DEFAULT_GC_TYPE_IS_CMS
     kCollectorTypeCMS
+#else
 #error "ART default GC type must be set"
 #endif
     ;  // NOLINT [whitespace/semicolon] [5]
diff --git a/runtime/read_barrier_config.h b/runtime/read_barrier_config.h
index e974b04..d5baee2 100644
--- a/runtime/read_barrier_config.h
+++ b/runtime/read_barrier_config.h
@@ -62,8 +62,17 @@
 static constexpr bool kUseTableLookupReadBarrier = false;
 #endif
 
+#ifdef ART_FORCE_USE_READ_BARRIER
+constexpr bool gUseReadBarrier = kUseBakerReadBarrier || kUseTableLookupReadBarrier;
+constexpr bool gUseUserfaultfd = !gUseReadBarrier;
+#else
 extern const bool gUseReadBarrier;
+#ifdef ART_DEFAULT_GC_TYPE_IS_CMC
 extern const bool gUseUserfaultfd;
+#else
+constexpr bool gUseUserfaultfd = false;
+#endif
+#endif
 
 // Disabled for performance reasons.
 static constexpr bool kCheckDebugDisallowReadBarrierCount = kIsDebugBuild;