diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/DynamicCompilerDriver.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/DynamicCompilerDriver.kt index f08cf130a00..e12775c2dda 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/DynamicCompilerDriver.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/DynamicCompilerDriver.kt @@ -26,6 +26,8 @@ internal class DynamicCompilerDriver : CompilerDriver() { CompilerOutputKind.DYNAMIC_CACHE, CompilerOutputKind.STATIC_CACHE, CompilerOutputKind.FRAMEWORK, + CompilerOutputKind.DYNAMIC, + CompilerOutputKind.STATIC, ) } @@ -35,8 +37,8 @@ internal class DynamicCompilerDriver : CompilerDriver() { PhaseEngine.startTopLevel(config) { engine -> when (config.produce) { CompilerOutputKind.PROGRAM -> produceBinary(engine, config, environment) - CompilerOutputKind.DYNAMIC -> error("Dynamic compiler driver does not support `dynamic` output yet.") - CompilerOutputKind.STATIC -> error("Dynamic compiler driver does not support `static` output yet.") + CompilerOutputKind.DYNAMIC -> produceCLibrary(engine, config, environment) + CompilerOutputKind.STATIC -> produceCLibrary(engine, config, environment) CompilerOutputKind.FRAMEWORK -> produceObjCFramework(engine, config, environment) CompilerOutputKind.LIBRARY -> produceKlib(engine, config, environment) CompilerOutputKind.BITCODE -> error("Dynamic compiler driver does not support `bitcode` output yet.") @@ -72,6 +74,17 @@ internal class DynamicCompilerDriver : CompilerDriver() { engine.runBackend(backendContext) } + private fun produceCLibrary(engine: PhaseEngine, config: KonanConfig, environment: KotlinCoreEnvironment) { + val frontendOutput = engine.runFrontend(config, environment) ?: return + val (psiToIrOutput, cAdapterElements) = engine.runPsiToIr(frontendOutput, isProducingLibrary = false) { + it.runPhase(BuildCExports, frontendOutput) + } + val backendContext = createBackendContext(config, frontendOutput, psiToIrOutput) { + it.cAdapterExportedElements = cAdapterElements + } + engine.runBackend(backendContext) + } + private fun produceKlib(engine: PhaseEngine, config: KonanConfig, environment: KotlinCoreEnvironment) { val frontendOutput = engine.runFrontend(config, environment) ?: return val psiToIrOutput = if (config.metadataKlib) {