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;