From 7844dc5228845aa10375d624d4b105211bf73455 Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Wed, 28 Aug 2019 19:51:57 +0700 Subject: [PATCH] Add "_main" as alias to "Konan_main" via LLVMAddAlias --- .../org/jetbrains/kotlin/cli/bc/K2Native.kt | 40 +++++------------- .../kotlin/backend/konan/BitcodeEmbedding.kt | 33 ++------------- .../kotlin/backend/konan/CompilerOutput.kt | 17 ++++++-- .../jetbrains/kotlin/backend/konan/Linker.kt | 14 +------ .../kotlin/backend/konan/llvm/IrToBitcode.kt | 42 ------------------- konan/konan.properties | 15 ------- 6 files changed, 29 insertions(+), 132 deletions(-) diff --git a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt index dc3df5e66fa..21f2562b85a 100644 --- a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt +++ b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt @@ -205,7 +205,7 @@ class K2Native : CLICompiler() { put(FRAMEWORK_IMPORT_HEADERS, arguments.frameworkImportHeaders.toNonNullList()) arguments.emitLazyObjCHeader?.let { put(EMIT_LAZY_OBJC_HEADER_FILE, it) } - put(BITCODE_EMBEDDING_MODE, selectBitcodeEmbeddingMode(this, arguments, outputKind)) + put(BITCODE_EMBEDDING_MODE, selectBitcodeEmbeddingMode(this, arguments)) put(DEBUG_INFO_VERSION, arguments.debugInfoFormatVersion.toInt()) put(COVERAGE, arguments.coverage) put(LIBRARIES_TO_COVER, arguments.coveredLibraries.toNonNullList()) @@ -247,41 +247,21 @@ private fun selectFrameworkType( private fun selectBitcodeEmbeddingMode( configuration: CompilerConfiguration, - arguments: K2NativeCompilerArguments, - outputKind: CompilerOutputKind -): BitcodeEmbedding.Mode { - - if (outputKind != CompilerOutputKind.FRAMEWORK) { - return BitcodeEmbedding.Mode.NONE.also { - val flag = when { - arguments.embedBitcodeMarker -> EMBED_BITCODE_MARKER_FLAG - arguments.embedBitcode -> EMBED_BITCODE_FLAG - else -> return@also - } - + arguments: K2NativeCompilerArguments +): BitcodeEmbedding.Mode = when { + arguments.embedBitcodeMarker -> { + if (arguments.embedBitcode) { configuration.report( STRONG_WARNING, - "'$flag' is only supported when producing frameworks, " + - "but the compiler is producing ${outputKind.name.toLowerCase()}" + "'$EMBED_BITCODE_FLAG' is ignored because '$EMBED_BITCODE_MARKER_FLAG' is specified" ) } + BitcodeEmbedding.Mode.MARKER } - - return when { - arguments.embedBitcodeMarker -> { - if (arguments.embedBitcode) { - configuration.report( - STRONG_WARNING, - "'$EMBED_BITCODE_FLAG' is ignored because '$EMBED_BITCODE_MARKER_FLAG' is specified" - ) - } - BitcodeEmbedding.Mode.MARKER - } - arguments.embedBitcode -> { - BitcodeEmbedding.Mode.FULL - } - else -> BitcodeEmbedding.Mode.NONE + arguments.embedBitcode -> { + BitcodeEmbedding.Mode.FULL } + else -> BitcodeEmbedding.Mode.NONE } private fun selectExportedLibraries( diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/BitcodeEmbedding.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/BitcodeEmbedding.kt index 2c027216f10..8f71776b589 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/BitcodeEmbedding.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/BitcodeEmbedding.kt @@ -1,9 +1,5 @@ package org.jetbrains.kotlin.backend.konan -import org.jetbrains.kotlin.backend.konan.llvm.Int8 -import org.jetbrains.kotlin.backend.konan.llvm.Llvm -import org.jetbrains.kotlin.konan.target.CompilerOutputKind - object BitcodeEmbedding { enum class Mode { @@ -17,31 +13,10 @@ object BitcodeEmbedding { } internal fun getClangOptions(config: KonanConfig): List = when (config.bitcodeEmbeddingMode) { - BitcodeEmbedding.Mode.NONE -> listOf("-fembed-bitcode=off") - BitcodeEmbedding.Mode.MARKER -> listOf("-fembed-bitcode=marker") - BitcodeEmbedding.Mode.FULL -> listOf("-fembed-bitcode=all") + Mode.NONE -> listOf("-fembed-bitcode=off") + Mode.MARKER -> listOf("-fembed-bitcode=marker") + Mode.FULL -> listOf("-fembed-bitcode=all") } - private val KonanConfig.bitcodeEmbeddingMode get() = configuration.get(KonanConfigKeys.BITCODE_EMBEDDING_MODE)!!.also { - require(it == Mode.NONE || this.produce == CompilerOutputKind.FRAMEWORK) { - "${it.name.toLowerCase()} bitcode embedding mode is not supported when producing ${this.produce.name.toLowerCase()}" - } - } - - internal fun processModule(llvm: Llvm) = when (llvm.context.config.bitcodeEmbeddingMode) { - Mode.NONE -> {} - Mode.MARKER -> { - addEmptyMarker(llvm, "konan_llvm_bitcode", "__LLVM,__bitcode") - addEmptyMarker(llvm, "konan_llvm_cmdline", "__LLVM,__cmdline") - } - Mode.FULL -> { - addEmptyMarker(llvm, "konan_llvm_asm", "__LLVM,__asm") - } - } - - private fun addEmptyMarker(llvm: Llvm, name: String, section: String) { - val global = llvm.staticData.placeGlobal(name, Int8(0), isExported = false) - global.setSection(section) - llvm.usedGlobals += global.llvmGlobal - } + private val KonanConfig.bitcodeEmbeddingMode get() = configuration.get(KonanConfigKeys.BITCODE_EMBEDDING_MODE)!! } \ No newline at end of file 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 68140ced357..7a9ad2520e6 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 @@ -4,9 +4,7 @@ */ package org.jetbrains.kotlin.backend.konan -import llvm.LLVMLinkModules2 -import llvm.LLVMModuleRef -import llvm.LLVMWriteBitcodeToFile +import llvm.* import org.jetbrains.kotlin.backend.konan.library.impl.buildLibrary import org.jetbrains.kotlin.backend.konan.llvm.* import org.jetbrains.kotlin.backend.konan.llvm.Llvm @@ -57,6 +55,16 @@ private fun runLlvmPipeline(context: Context) = when { else -> {} } +private fun insertAliasToEntryPoint(context: Context) { + val nomain = context.config.configuration.get(KonanConfigKeys.NOMAIN) ?: false + if (context.config.produce != CompilerOutputKind.PROGRAM || nomain) + return + val module = context.llvmModule + val entryPoint = LLVMGetNamedFunction(module, "Konan_main") + ?: error("Module doesn't contain `Konan_main`") + LLVMAddAlias(module, LLVMTypeOf(entryPoint)!!, entryPoint, "main") +} + internal fun produceOutput(context: Context) { val config = context.config.configuration @@ -83,6 +91,9 @@ internal fun produceOutput(context: Context) { } linkAllDependecies(context, generatedBitcodeFiles) runLlvmPipeline(context) + // Insert `_main` after pipeline so we won't worry about optimizations + // corrupting entry point. + insertAliasToEntryPoint(context) LLVMWriteBitcodeToFile(context.llvmModule!!, output) } CompilerOutputKind.LIBRARY -> { diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Linker.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Linker.kt index 93152557667..ac88e124f21 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Linker.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Linker.kt @@ -24,22 +24,11 @@ internal class Linker(val context: Context) { private val platform = context.config.platform private val config = context.config.configuration private val linkerOutput = determineLinkerOutput(context) - private val nomain = config.get(KonanConfigKeys.NOMAIN) ?: false private val linker = platform.linker private val target = context.config.target private val optimize = context.shouldOptimize() private val debug = context.config.debug || context.config.lightDebug - // Ideally we'd want to have - // #pragma weak main = Konan_main - // in the launcher.cpp. - // Unfortunately, anything related to weak linking on MacOS - // only seems to be working with dynamic libraries. - // So we stick to "-alias _main _konan_main" on Mac. - // And just do the same on Linux. - private val entryPointSelector: List - get() = if (nomain || linkerOutput != LinkerOutputKind.EXECUTABLE) emptyList() else platform.entrySelector - fun link(objectFiles: List) { val nativeDependencies = context.llvm.nativeDependenciesToLink val includedBinaries = nativeDependencies.map { it.includedPaths }.flatten() @@ -91,8 +80,7 @@ internal class Linker(val context: Context) { File(executable).delete() linker.linkCommands(objectFiles = objectFiles, executable = executable, libraries = linker.linkStaticLibraries(includedBinaries) + context.config.defaultSystemLibraries, - linkerArgs = entryPointSelector + - asLinkerArgs(config.getNotNull(KonanConfigKeys.LINKER_ARGS)) + + linkerArgs = asLinkerArgs(config.getNotNull(KonanConfigKeys.LINKER_ARGS)) + BitcodeEmbedding.getLinkerOptions(context.config) + libraryProvidedLinkerFlags + frameworkLinkerArgs, optimize = optimize, debug = debug, kind = linkerOutput, diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt index a60e8e68eaa..26b78021468 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/IrToBitcode.kt @@ -308,7 +308,6 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map