diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/CExport.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/CExport.kt index 391bd732297..a72398646b7 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/CExport.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/CExport.kt @@ -5,6 +5,8 @@ package org.jetbrains.kotlin.backend.konan.driver.phases +import org.jetbrains.kotlin.backend.konan.NativeGenerationState +import org.jetbrains.kotlin.backend.konan.cexport.CAdapterApiExporter import org.jetbrains.kotlin.backend.konan.cexport.CAdapterExportedElements import org.jetbrains.kotlin.backend.konan.cexport.CAdapterGenerator import org.jetbrains.kotlin.backend.konan.cexport.CAdapterTypeTranslator @@ -16,4 +18,11 @@ internal val BuildCExports = createSimpleNamedCompilerPhase( + name = "CExportGenerateApi", + description = "Create C header for the exported API", +) { context, _ -> + CAdapterApiExporter(context, context.context.cAdapterExportedElements!!).makeGlobalStruct() } \ No newline at end of file diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/TopLevelPhases.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/TopLevelPhases.kt index 42ebafa350e..edcc90a0acb 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/TopLevelPhases.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/TopLevelPhases.kt @@ -173,10 +173,14 @@ internal fun PhaseEngine.runBackendCodegen(module: IrModu } mergeDependencies(module, dependenciesToCompile) runCodegen(module) + if (context.config.produce.isNativeLibrary) { + runPhase(CExportGenerateApiPhase) + } runPhase(CStubsPhase) // TODO: Consider extracting llvmModule and friends from nativeGenerationState and pass them explicitly. // Motivation: possibility to run LTO on bitcode level after separate IR compilation. val llvmModule = context.llvm.module + // TODO: Consider dropping these in favor of proper phases dumping and validation. if (context.config.needCompilerVerification || context.config.configuration.getBoolean(KonanConfigKeys.VERIFY_BITCODE)) { runPhase(VerifyBitcodePhase, llvmModule) } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index d9fc46b749e..3f2db22ecbb 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -347,8 +347,6 @@ internal class CodeGeneratorVisitor( } private fun appendCAdapters(elements: CAdapterExportedElements) { CAdapterCodegen(codegen, generationState).buildAllAdaptersRecursively(elements) - // TODO: It is not a part of IrToBitcode. Maybe move it somewhere? - CAdapterApiExporter(generationState, elements).makeGlobalStruct() } private fun FunctionGenerationContext.initThreadLocalField(irField: IrField) {