diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LinkStage.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LinkStage.kt index e07029121d5..41eecd7089f 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LinkStage.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/LinkStage.kt @@ -13,6 +13,8 @@ typealias ExecutableFile = String internal abstract class PlatformFlags(val distribution: Distribution) { val properties = distribution.properties + abstract val llvmLtoNooptFlags: List + abstract val llvmLtoOptFlags: List abstract val llvmLtoFlags: List abstract val llvmLlcFlags: List @@ -28,6 +30,8 @@ internal abstract class PlatformFlags(val distribution: Distribution) { internal open class MacOSPlatform(distribution: Distribution) : PlatformFlags(distribution) { + override val llvmLtoNooptFlags = properties.propertyList("llvmLtoNooptFlags.osx") + override val llvmLtoOptFlags = properties.propertyList("llvmLtoOptFlags.osx") override val llvmLtoFlags = properties.propertyList("llvmLtoFlags.osx") override val llvmLlcFlags = properties.propertyList("llvmLlcFlags.osx") @@ -45,7 +49,7 @@ internal open class MacOSPlatform(distribution: Distribution) override fun linkCommand(objectFiles: List, executable: String, optimize: Boolean): List { return mutableListOf(linker, "-demangle") + - if (optimize) listOf("-object_path_lto", "temporary.o", "-lto_library", distribution.libLTO) else {listOf()} + + listOf("-object_path_lto", "temporary.o", "-lto_library", distribution.libLTO) + listOf( "-dynamic", "-arch", arch) + osVersionMin + listOf("-syslibroot", "$targetSysRoot", @@ -83,6 +87,8 @@ internal open class LinuxPlatform(distribution: Distribution) val llvmLib = distribution.llvmLib val libGcc = distribution.libGcc + override val llvmLtoNooptFlags = properties.propertyList("llvmLtoNooptFlags.linux") + override val llvmLtoOptFlags = properties.propertyList("llvmLtoOptFlags.linux") override val llvmLtoFlags = properties.propertyList("llvmLtoFlags.linux") override val llvmLlcFlags = properties.propertyList("llvmLlcFlags.linux") @@ -181,8 +187,11 @@ internal class LinkStage(val context: Context) { val tool = distribution.llvmLto val command = mutableListOf(tool, "-o", combined) + command.addAll(platform.llvmLtoFlags) if (optimize) { - command.addAll(platform.llvmLtoFlags) + command.addAll(platform.llvmLtoOptFlags) + } else { + command.addAll(platform.llvmLtoNooptFlags) } command.addAll(files) runTool(*command.toTypedArray()) @@ -273,7 +282,9 @@ internal class LinkStage(val context: Context) { objectFiles = if (optimize) { listOf( llvmLto(bitcodeFiles ) ) } else { - bitcodeFiles.map{ it -> llvmLlc(it) } + listOf( llvmLto(bitcodeFiles ) ) + // Or, alternatively, go through llc bitcode compiler. + //bitcodeFiles.map{ it -> llvmLlc(it) } } } phaser.phase(KonanPhase.LINKER) { diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/LlvmDeclarations.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/LlvmDeclarations.kt index 488444ef22f..97eba1d293c 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/LlvmDeclarations.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/LlvmDeclarations.kt @@ -3,6 +3,7 @@ package org.jetbrains.kotlin.backend.konan.llvm import kotlinx.cinterop.* import llvm.* import org.jetbrains.kotlin.backend.konan.Context +import org.jetbrains.kotlin.backend.konan.KonanConfigKeys import org.jetbrains.kotlin.backend.konan.descriptors.* import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.ir.IrElement @@ -336,6 +337,10 @@ private class DeclarationsGeneratorVisitor(override val context: Context) : LLVMAddFunction(context.llvmModule, symbolName, llvmFunctionType)!! } + if (!context.config.configuration.getBoolean(KonanConfigKeys.OPTIMIZATION)) { + LLVMAddTargetDependentFunctionAttr(llvmFunction, "no-frame-pointer-elim", "true") + } + this.functions[descriptor] = FunctionLlvmDeclarations(llvmFunction) } } diff --git a/backend.native/konan.properties b/backend.native/konan.properties index ec2c04b25e6..f8962db1db1 100644 --- a/backend.native/konan.properties +++ b/backend.native/konan.properties @@ -8,7 +8,9 @@ arch.osx = x86_64 sysRoot.osx = target-sysroot-1-darwin-macos libffiDir.osx = libffi-3.2.1-2-darwin-macos llvmHome.osx = clang+llvm-3.9.0-darwin-macos -llvmLtoFlags.osx = -O3 -function-sections -exported-symbol=_Konan_main +llvmLtoFlags.osx = -exported-symbol=_Konan_main +llvmLtoOptFlags.osx = -O3 -function-sections +llvmLtoNooptFlags.osx = -O1 llvmLlcFlags.osx = -mtriple=x86_64-apple-macosx10.10.0 --disable-fp-elim linkerKonanFlags.osx = -lc++ linkerOptimizationFlags.osx = -dead_strip @@ -22,7 +24,6 @@ sysRoot.osx-ios = target-sysroot-1-darwin-macos targetSysRoot.osx-ios = target-sysroot-2-darwin-ios libffiDir.osx-ios = libffi-3.2.1-2-darwin-ios llvmHome.osx-ios = clang+llvm-3.9.0-darwin-macos -llvmLtoFlags.osx-ios = -O3 -function-sections -exported-symbol=_Konan_main llvmLlcFlags.osx-ios = -mtriple=arm64-apple-ios5.0.0 --disable-fp-elim linkerKonanFlags.osx-ios = -lc++ linkerOptimizationFlags.osx-ios = -dead_strip @@ -39,7 +40,6 @@ sysRoot.osx-ios-sim = target-sysroot-1-darwin-macos targetSysRoot.osx-ios-sim = target-sysroot-1-darwin-ios-sim libffiDir.osx-ios-sim = libffi-3.2.1-2-darwin-ios-sim llvmHome.osx-ios-sim = clang+llvm-3.9.0-darwin-macos -llvmLtoFlags.osx-ios-sim = -O3 -function-sections -exported-symbol=_Konan_main llvmLlcFlags.osx-ios-sim = -mtriple=x86_64-apple-ios5.0.0 --disable-fp-elim linkerKonanFlags.osx-ios-sim = -lc++ linkerOptimizationFlags.osx-ios-sim = -dead_strip @@ -56,7 +56,9 @@ libffiDir.linux = libffi-3.2.1-2-linux-x86-64 llvmHome.linux = clang+llvm-3.9.0-linux-x86-64 libGcc.linux = target-gcc-toolchain-3-linux-x86-64/lib/gcc/x86_64-unknown-linux-gnu/4.8.5 gccToolChain.linux = target-gcc-toolchain-3-linux-x86-64 -llvmLtoFlags.linux = -O3 -function-sections -exported-symbol=Konan_main +llvmLtoFlags.linux = -exported-symbol=Konan_main +llvmLtoOptFlags.linux = -O3 -function-sections +llvmLtoNooptFlags.linux = -O1 llvmLlcFlags.linux = -march=x86-64 linkerKonanFlags.linux = -Bstatic -lstdc++ -Bdynamic -ldl -lm -lpthread linkerOptimizationFlags.linux = --gc-sections @@ -72,7 +74,6 @@ libffiDir.linux-raspberrypi = libffi-3.2.1-2-raspberrypi llvmHome.linux-raspberrypi = clang+llvm-3.9.0-linux-x86-64 libGcc.linux-raspberrypi = target-sysroot-1-raspberrypi/lib/gcc/arm-linux-gnueabihf/4.8.3/ gccToolChain.linux-raspberrypi = target-gcc-toolchain-3-linux-x86-64 -llvmLtoFlags.linux-raspberrypi = -O3 -function-sections -exported-symbol=Konan_main llvmLlcFlags.linux-raspberrypi = -mtriple=armv7-unknown-linux-gnueabihf --disable-fp-elim -float-abi=hard linkerKonanFlags.linux-raspberrypi = -Bstatic -lstdc++ -Bdynamic -ldl -lm -lc -lpthread -fuse-ld=gold entrySelector.linux-raspberrypi = --defsym main=Konan_main