diff --git a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt index 621fc11563b..12602cd55c4 100644 --- a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt +++ b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt @@ -300,28 +300,17 @@ class K2Native : CLICompiler() { DestroyRuntimeMode.ON_SHUTDOWN } }) - val assertGcSupported = { - if (memoryModel != MemoryModel.EXPERIMENTAL) { - configuration.report(ERROR, "-Xgc is only supported for -memory-model experimental") - } + if (arguments.gc != null && memoryModel != MemoryModel.EXPERIMENTAL) { + configuration.report(ERROR, "-Xgc is only supported for -memory-model experimental") } - put(GARBAGE_COLLECTOR, when (arguments.gc) { - null -> GC.SAME_THREAD_MARK_AND_SWEEP - "noop" -> { - assertGcSupported() - GC.NOOP - } - "stms" -> { - assertGcSupported() - GC.SAME_THREAD_MARK_AND_SWEEP - } - "cms" -> { - assertGcSupported() - GC.CONCURRENT_MARK_AND_SWEEP - } + putIfNotNull(GARBAGE_COLLECTOR, when (arguments.gc) { + null -> null + "noop" -> GC.NOOP + "stms" -> GC.SAME_THREAD_MARK_AND_SWEEP + "cms" -> GC.CONCURRENT_MARK_AND_SWEEP else -> { configuration.report(ERROR, "Unsupported GC ${arguments.gc}") - GC.SAME_THREAD_MARK_AND_SWEEP + null } }) if (memoryModel != MemoryModel.EXPERIMENTAL && arguments.gcAggressive) { diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt index 6f413d57dd5..7b576957d81 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt @@ -81,7 +81,19 @@ class KonanConfig(val project: Project, val configuration: CompilerConfiguration } } val destroyRuntimeMode: DestroyRuntimeMode get() = configuration.get(KonanConfigKeys.DESTROY_RUNTIME_MODE)!! - val gc: GC get() = configuration.get(KonanConfigKeys.GARBAGE_COLLECTOR)!! + val gc: GC by lazy { + val configGc = configuration.get(KonanConfigKeys.GARBAGE_COLLECTOR) + val (gcFallbackReason, realGc) = when { + configGc == GC.CONCURRENT_MARK_AND_SWEEP && !target.supportsThreads() -> + "Concurrent mark and sweep gc is not supported for this target. Fallback to Same thread mark and sweep is done" to GC.SAME_THREAD_MARK_AND_SWEEP + configGc == null -> null to GC.SAME_THREAD_MARK_AND_SWEEP + else -> null to configGc + } + if (gcFallbackReason != null) { + configuration.report(CompilerMessageSeverity.STRONG_WARNING, gcFallbackReason) + } + realGc + } val gcAggressive: Boolean get() = configuration.get(KonanConfigKeys.GARBAGE_COLLECTOR_AGRESSIVE)!! val runtimeAssertsMode: RuntimeAssertsMode get() = configuration.get(BinaryOptions.runtimeAssertionsMode) ?: RuntimeAssertsMode.IGNORE val workerExceptionHandling: WorkerExceptionHandling get() = configuration.get(KonanConfigKeys.WORKER_EXCEPTION_HANDLING)!! diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/Utils.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/Utils.kt index 589fb3dd7ed..52571b340f1 100644 --- a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/Utils.kt +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/Utils.kt @@ -386,6 +386,8 @@ fun targetSupportsLibBacktrace(targetName: String) = fun targetSupportsCoreSymbolication(targetName: String) = HostManager().targetByName(targetName).supportsCoreSymbolication() +fun targetSupportsThreads(targetName: String) = + HostManager().targetByName(targetName).supportsThreads() fun Project.mergeManifestsByTargets(source: File, destination: File) { logger.info("Merging manifests: $source -> $destination") diff --git a/kotlin-native/runtime/build.gradle.kts b/kotlin-native/runtime/build.gradle.kts index 52730a895b2..fe028fd0c41 100644 --- a/kotlin-native/runtime/build.gradle.kts +++ b/kotlin-native/runtime/build.gradle.kts @@ -188,6 +188,8 @@ bitcode { create("experimental_memory_manager_cms", file("src/mm")) { headersDirs += files("src/gc/cms/cpp", "src/gc/common/cpp") includeRuntime() + + onlyIf { targetSupportsThreads(target) } } create("common_gc_noop", file("src/gc/common")) { @@ -203,6 +205,8 @@ bitcode { create("common_gc_cms", file("src/gc/common")) { headersDirs += files("src/gc/cms/cpp", "src/mm/cpp") includeRuntime() + + onlyIf { targetSupportsThreads(target) } } create("noop_gc", file("src/gc/noop")) { @@ -218,6 +222,8 @@ bitcode { create("concurrent_ms_gc", file("src/gc/cms")) { headersDirs += files("src/gc/cms/cpp", "src/gc/common/cpp", "src/mm/cpp") includeRuntime() + + onlyIf { targetSupportsThreads(target) } } }