diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt index d9cab47523c..e27859c099f 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.backend.konan import llvm.* -import org.jetbrains.kotlin.backend.konan.cexport.produceCAdapterBitcode import org.jetbrains.kotlin.backend.konan.driver.PhaseContext import org.jetbrains.kotlin.backend.konan.llvm.* import org.jetbrains.kotlin.backend.konan.llvm.objc.patchObjCRuntimeModule @@ -15,6 +14,7 @@ import org.jetbrains.kotlin.konan.target.CompilerOutputKind import org.jetbrains.kotlin.library.BaseKotlinLibrary import org.jetbrains.kotlin.library.uniqueName import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty +import java.io.File /** * Supposed to be true for a single LLVM module within final binary. @@ -142,23 +142,15 @@ internal fun insertAliasToEntryPoint(context: PhaseContext, module: LLVMModuleRe LLVMAddAlias(module, LLVMTypeOf(entryPoint)!!, entryPoint, "main") } -internal fun linkBitcodeDependencies(generationState: NativeGenerationState) { +internal fun linkBitcodeDependencies(generationState: NativeGenerationState, + generatedBitcodeFiles: List) { val config = generationState.config - val tempFiles = generationState.tempFiles val produce = config.produce - val generatedBitcodeFiles = - if (produce == CompilerOutputKind.DYNAMIC || produce == CompilerOutputKind.STATIC) { - produceCAdapterBitcode( - config.clang, - tempFiles.cAdapterCppName, - tempFiles.cAdapterBitcodeName) - listOf(tempFiles.cAdapterBitcodeName) - } else emptyList() if (produce == CompilerOutputKind.FRAMEWORK && config.produceStaticFramework) { embedAppleLinkerOptionsToBitcode(generationState.llvm, config) } - linkAllDependencies(generationState, generatedBitcodeFiles) + linkAllDependencies(generationState, generatedBitcodeFiles.map { it.absoluteFile.normalize().path }) } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cexport/CAdapterCompile.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cexport/CAdapterCompile.kt index b740dd1a50d..07f7e0a210d 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cexport/CAdapterCompile.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cexport/CAdapterCompile.kt @@ -7,10 +7,17 @@ package org.jetbrains.kotlin.backend.konan.cexport import org.jetbrains.kotlin.konan.exec.* import org.jetbrains.kotlin.konan.target.* -import org.jetbrains.kotlin.konan.file.* +import java.io.File -// Fourth phase of C export: compile runtime bindings to bitcode. -fun produceCAdapterBitcode(clang: ClangArgs, cppFileName: String, bitcodeFileName: String) { - val clangCommand = clang.clangCXX("-std=c++17", cppFileName, "-emit-llvm", "-c", "-o", bitcodeFileName) +/** + * Fourth phase of C export: compile runtime bindings to bitcode. + */ +fun produceCAdapterBitcode(clang: ClangArgs, cppFile: File, bitcodeFile: File) { + val clangCommand = clang.clangCXX( + "-std=c++17", + cppFile.absoluteFile.normalize().path, + "-emit-llvm", "-c", + "-o", bitcodeFile.absoluteFile.normalize().path + ) Command(clangCommand).execute() } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/Bitcode.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/Bitcode.kt index 523ad379f9d..69c980277b4 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/Bitcode.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/Bitcode.kt @@ -102,11 +102,11 @@ internal val CStubsPhase = createSimpleNamedCompilerPhase produceCStubs(context) } ) -internal val LinkBitcodeDependenciesPhase = createSimpleNamedCompilerPhase( +internal val LinkBitcodeDependenciesPhase = createSimpleNamedCompilerPhase>( name = "LinkBitcodeDependencies", description = "Link bitcode dependencies", postactions = getDefaultLlvmModuleActions(), - op = { context, _ -> linkBitcodeDependencies(context) } + op = { context, input -> linkBitcodeDependencies(context, input) } ) internal val VerifyBitcodePhase = createSimpleNamedCompilerPhase( 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 9c050d17d7f..9826f223f18 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,7 @@ package org.jetbrains.kotlin.backend.konan.driver.phases +import org.jetbrains.kotlin.backend.konan.cexport.* import org.jetbrains.kotlin.backend.konan.cexport.CAdapterApiExporter import org.jetbrains.kotlin.backend.konan.cexport.CAdapterExportedElements import org.jetbrains.kotlin.backend.konan.cexport.CAdapterGenerator @@ -39,4 +40,16 @@ internal val CExportGenerateApiPhase = createSimpleNamedCompilerPhase( + name = "CExportCompileAdapter", + description = "Compile C++ adapter to bitcode" +) { context, input -> + produceCAdapterBitcode(context.config.clang, input.cppAdapterFile, input.bitcodeAdapterFile) } \ 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 7f4c0f15c87..11eb44e2fc0 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 @@ -174,14 +174,20 @@ internal fun PhaseEngine.runBackendCodegen(module: IrModu } mergeDependencies(module, dependenciesToCompile) runCodegen(module) - if (context.config.produce.isNativeLibrary) { + val generatedBitcodeFiles = if (context.config.produce.isNativeLibrary) { + val cppAdapterFile = context.tempFiles.cAdapterCpp.javaFile() + val bitcodeAdapterFile = context.tempFiles.cAdapterBitcode.javaFile() val input = CExportGenerateApiInput( context.context.cAdapterExportedElements!!, headerFile = context.outputFiles.cAdapterHeader.javaFile(), defFile = if (context.config.target.family == Family.MINGW) context.outputFiles.cAdapterDef.javaFile() else null, - cppAdapterFile = context.tempFiles.cAdapterCpp.javaFile() + cppAdapterFile = cppAdapterFile ) runPhase(CExportGenerateApiPhase, input) + runPhase(CExportCompileAdapterPhase, CExportCompileAdapterInput(cppAdapterFile, bitcodeAdapterFile)) + listOf(bitcodeAdapterFile) + } else { + emptyList() } runPhase(CStubsPhase) // TODO: Consider extracting llvmModule and friends from nativeGenerationState and pass them explicitly. @@ -194,7 +200,7 @@ internal fun PhaseEngine.runBackendCodegen(module: IrModu if (context.shouldPrintBitCode()) { runPhase(PrintBitcodePhase, llvmModule) } - runPhase(LinkBitcodeDependenciesPhase) + runPhase(LinkBitcodeDependenciesPhase, generatedBitcodeFiles) } /**