From 4236bb22fb8cbe14e77a4465901784bcb8a7f1d6 Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Mon, 20 Nov 2017 14:09:28 +0300 Subject: [PATCH] Deal with entry points and launcher bcs for shared object generation. --- .../org/jetbrains/kotlin/backend/konan/CompilerOutput.kt | 6 +++++- .../org/jetbrains/kotlin/backend/konan/Distribution.kt | 1 + .../org/jetbrains/kotlin/backend/konan/KonanConfig.kt | 5 +++++ .../jetbrains/kotlin/backend/konan/llvm/EntryPoint.kt | 3 +-- build.gradle | 9 +++++++-- 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt index c15805c94a2..93d3c53704d 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/CompilerOutput.kt @@ -33,8 +33,12 @@ internal fun produceOutput(context: Context) { val output = "$program.kt.bc" context.bitcodeFileName = output + val nativeLibraries = + context.config.nativeLibraries + + context.config.defaultNativeLibraries + PhaseManager(context).phase(KonanPhase.BITCODE_LINKER) { - for (library in context.config.nativeLibraries) { + for (library in nativeLibraries) { val libraryModule = parseBitcodeFile(library) val failed = LLVMLinkModules2(llvmModule, libraryModule) if (failed != 0) { diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Distribution.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Distribution.kt index f3d442f249e..55783f7db1f 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Distribution.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Distribution.kt @@ -46,6 +46,7 @@ class Distribution(val targetManager: TargetManager, val klib = "$konanHome/klib" val stdlib = "$klib/common/stdlib" + val defaultNatives = "$konanHome/konan/targets/${targetName}/native" val runtime = runtimeFileOverride ?: "$stdlib/targets/${targetName}/native/runtime.bc" val dependenciesDir = DependencyProcessor.defaultDependenciesRoot.absolutePath diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt index 218b5797357..e38139e0cba 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfig.kt @@ -103,6 +103,11 @@ class KonanConfig(val project: Project, val configuration: CompilerConfiguration private val loadedDescriptors = loadLibMetadata() + internal val defaultNativeLibraries = + if (produce == CompilerOutputKind.PROGRAM) + File(distribution.defaultNatives).listFiles.map { it.absolutePath } + else emptyList() + internal val nativeLibraries: List = configuration.getList(KonanConfigKeys.NATIVE_LIBRARY_FILES) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/EntryPoint.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/EntryPoint.kt index 9086e6313c3..db9f064e34c 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/EntryPoint.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/EntryPoint.kt @@ -37,8 +37,7 @@ import org.jetbrains.kotlin.utils.alwaysTrue internal fun findMainEntryPoint(context: Context): FunctionDescriptor? { val config = context.config.configuration - if (config.get(KonanConfigKeys.PRODUCE) != PROGRAM && - config.get(KonanConfigKeys.PRODUCE) != DYNAMIC) return null + if (config.get(KonanConfigKeys.PRODUCE) != PROGRAM) return null val entryPoint = FqName(config.get(KonanConfigKeys.ENTRY) ?: if (context.shouldGenerateTestRunner()) testEntryName else defaultEntryName) diff --git a/build.gradle b/build.gradle index 7ee0a4019bc..7d9201c69d7 100644 --- a/build.gradle +++ b/build.gradle @@ -259,16 +259,21 @@ targetList.each { target -> destinationDir distDir from(project(':runtime').file("build/$target")) { - include("*.bc") + include("runtime.bc") into("$stdlib/targets/$target/native") } + from(project(':runtime').file("build/$target")) { + include("*.bc") + exclude("runtime.bc") + into("konan/targets/$target/native") + } from(project(':runtime').file("build/${target}Stdlib")) { include('**') into(stdlib) } from(project(':runtime').file("build/${target}Start.bc")) { rename("${target}Start.bc", 'start.bc') - into("$stdlib/targets/$target/native") + into("konan/targets/$target/native") } if (target == 'wasm32') { from(project(':runtime').file('src/launcher/js')) {