From bcaf986e3a21c7866a703b7b67da7cb5ead22e40 Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Wed, 15 May 2019 19:08:19 +0700 Subject: [PATCH] [watchOS][targets] Add support for 32bit Apple Watch. --- .../kotlin/native/interop/gen/ObjCStubs.kt | 20 +++++-- .../backend/konan/OptimizationPipeline.kt | 8 +-- .../kotlin/backend/konan/cgen/CBridgeGen.kt | 2 +- .../backend/konan/objcexport/ObjCExport.kt | 2 + .../org/jetbrains/kotlin/ExecutorService.kt | 19 +++++-- .../org/jetbrains/kotlin/FrameworkTest.kt | 20 +++++-- .../main/kotlin/org/jetbrains/kotlin/Utils.kt | 2 + .../org/jetbrains/kotlin/XcRunRuntimeUtils.kt | 2 +- konan/konan.properties | 54 ++++++++++++++++++- .../jetbrains/kotlin/konan/target/Apple.kt | 2 + .../kotlin/konan/target/ClangArgs.kt | 45 +++++++++++----- .../kotlin/konan/target/ConfigurablesImpl.kt | 13 +++-- .../jetbrains/kotlin/konan/target/Linker.kt | 14 +++-- .../jetbrains/kotlin/konan/target/Platform.kt | 4 +- .../jetbrains/kotlin/konan/target/Xcode.kt | 5 ++ tools/scripts/update_xcode.sh | 4 +- 16 files changed, 171 insertions(+), 45 deletions(-) diff --git a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/ObjCStubs.kt b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/ObjCStubs.kt index 7b50ad92c3e..b2bdf6e4874 100644 --- a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/ObjCStubs.kt +++ b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/ObjCStubs.kt @@ -260,14 +260,26 @@ internal fun Type.isStret(target: KonanTarget): Boolean { else -> false } - KonanTarget.IOS_ARM32 -> when (unwrappedType) { + // See: https://developer.apple.com/library/archive/documentation/DeveloperTools/Conceptual/LowLevelABI/130-IA-32_Function_Calling_Conventions/IA32.html#//apple_ref/doc/uid/TP40002492-SW5 + // Structures 1 or 2 bytes in size are placed in EAX. + // Structures 4 or 8 bytes in size are placed in: EAX and EDX. + // Structures of other sizes are placed at the address supplied by the caller. + KonanTarget.WATCHOS_X86 -> when (unwrappedType) { + is RecordType -> { + val size = unwrappedType.decl.def!!.size + val canBePassedInRegisters = (size == 1L || size == 2L || size == 4L || size == 8L) + return !canBePassedInRegisters + } + else -> false + } + + KonanTarget.IOS_ARM32, + KonanTarget.WATCHOS_ARM32 -> when (unwrappedType) { is RecordType -> !this.isIntegerLikeType() else -> false } - - KonanTarget.WATCHOS_ARM64 -> TODO("") - else -> error(target) + else -> error("Cannot generate ObjC stubs for $target.") } } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/OptimizationPipeline.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/OptimizationPipeline.kt index 22502cd76bf..1e28eabbfef 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/OptimizationPipeline.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/OptimizationPipeline.kt @@ -53,6 +53,9 @@ private class LlvmPipelineConfiguration(context: Context) { KonanTarget.IOS_X64 -> "core2" KonanTarget.TVOS_ARM64 -> "cyclone" KonanTarget.TVOS_X64 -> "core2" + KonanTarget.WATCHOS_X86 -> "i386" + KonanTarget.WATCHOS_X64 -> "core2" + KonanTarget.WATCHOS_ARM32 -> "cortex-a7" KonanTarget.LINUX_X64 -> "x86-64" KonanTarget.MINGW_X86 -> "pentium4" KonanTarget.MINGW_X64 -> "x86-64" @@ -65,10 +68,7 @@ private class LlvmPipelineConfiguration(context: Context) { KonanTarget.ANDROID_X86 -> "i686" KonanTarget.LINUX_MIPS32 -> "mips32r2" KonanTarget.LINUX_MIPSEL32 -> "mips32r2" - KonanTarget.WATCHOS_ARM64 -> TODO("implement me") - KonanTarget.WATCHOS_ARM32 -> TODO("implement me") - KonanTarget.WATCHOS_X64 -> TODO("implement me") - KonanTarget.WATCHOS_X86 -> TODO("implement me") + KonanTarget.WATCHOS_ARM64, KonanTarget.WASM32, is KonanTarget.ZEPHYR -> error("There is no support for ${target.name} target yet.") } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt index 0a5222bfe01..5e089ccea69 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/cgen/CBridgeGen.kt @@ -637,7 +637,7 @@ private fun KotlinStubs.getNamedCStructType(kotlinClass: IrClass): CType? { // TODO: rework Boolean support. // TODO: What should be used on watchOS? private fun cBoolType(target: KonanTarget): CType? = when (target.family) { - Family.IOS, Family.TVOS -> CTypes.C99Bool + Family.IOS, Family.TVOS, Family.WATCHOS -> CTypes.C99Bool else -> CTypes.signedChar } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExport.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExport.kt index 94d97820672..103f1077cf0 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExport.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExport.kt @@ -154,6 +154,8 @@ internal class ObjCExport(val context: Context, symbolTable: SymbolTable) { KonanTarget.TVOS_ARM64 -> "AppleTVOS" KonanTarget.TVOS_X64 -> "AppleTVSimulator" KonanTarget.MACOS_X64 -> "MacOSX" + KonanTarget.WATCHOS_ARM32, KonanTarget.WATCHOS_ARM64 -> "WatchOS" + KonanTarget.WATCHOS_X86, KonanTarget.WATCHOS_X64 -> "WatchSimulator" else -> error(target) } val properties = context.config.platform.configurables as AppleConfigurables diff --git a/build-tools/src/main/kotlin/org/jetbrains/kotlin/ExecutorService.kt b/build-tools/src/main/kotlin/org/jetbrains/kotlin/ExecutorService.kt index de77726ccd8..ff9b6ea2f37 100644 --- a/build-tools/src/main/kotlin/org/jetbrains/kotlin/ExecutorService.kt +++ b/build-tools/src/main/kotlin/org/jetbrains/kotlin/ExecutorService.kt @@ -22,6 +22,7 @@ import org.gradle.api.Project import org.gradle.process.ExecResult import org.gradle.process.ExecSpec import org.gradle.util.ConfigureUtil +import org.jetbrains.kotlin.konan.target.Architecture import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.Xcode @@ -84,8 +85,10 @@ fun create(project: Project): ExecutorService { } } - KonanTarget.IOS_X64 -> simulator(project) - KonanTarget.TVOS_X64 -> simulator(project) + KonanTarget.IOS_X64, + KonanTarget.TVOS_X64, + KonanTarget.WATCHOS_X86, + KonanTarget.WATCHOS_X64 -> simulator(project) else -> { if (project.hasProperty("remote")) sshExecutor(project) @@ -220,6 +223,8 @@ private fun simulator(project: Project) : ExecutorService = object : ExecutorSer val sdk = when (target) { KonanTarget.TVOS_X64 -> Xcode.current.appletvsimulatorSdk KonanTarget.IOS_X64 -> Xcode.current.iphonesimulatorSdk + KonanTarget.WATCHOS_X64, + KonanTarget.WATCHOS_X86 -> Xcode.current.watchsimulatorSdk else -> error("Unexpected simulation target: $target") } val out = ByteArrayOutputStream() @@ -234,13 +239,21 @@ private fun simulator(project: Project) : ExecutorService = object : ExecutorSer private val device = project.findProperty("iosDevice")?.toString() ?: when (target) { KonanTarget.TVOS_X64 -> "Apple TV 4K" KonanTarget.IOS_X64 -> "iPhone 6" + KonanTarget.WATCHOS_X64, + KonanTarget.WATCHOS_X86 -> "Apple Watch Series 4 - 40mm" else -> error("Unexpected simulation target: $target") } + private val archSpecification = when (target.architecture) { + Architecture.X86 -> listOf("-a", "i386") + Architecture.X64 -> listOf() // x86-64 is used by default. + else -> error("${target.architecture} can't be used in simulator.") + }.toTypedArray() + override fun execute(action: Action): ExecResult? = project.exec { execSpec -> action.execute(execSpec) // Starting Xcode 11 `simctl spawn` requires explicit `--standalone` flag. - with(execSpec) { commandLine = listOf(simctl, "spawn", "--standalone", device, executable) + args } + with(execSpec) { commandLine = listOf(simctl, "spawn", "--standalone", *archSpecification, device, executable) + args } } } diff --git a/build-tools/src/main/kotlin/org/jetbrains/kotlin/FrameworkTest.kt b/build-tools/src/main/kotlin/org/jetbrains/kotlin/FrameworkTest.kt index 7beab5d3998..a0d16e8056d 100644 --- a/build-tools/src/main/kotlin/org/jetbrains/kotlin/FrameworkTest.kt +++ b/build-tools/src/main/kotlin/org/jetbrains/kotlin/FrameworkTest.kt @@ -100,11 +100,14 @@ open class FrameworkTest : DefaultTask() { KonanTarget.TVOS_X64 -> "appletvsimulator" KonanTarget.TVOS_ARM64 -> "appletvos" KonanTarget.MACOS_X64 -> "macosx" + KonanTarget.WATCHOS_ARM64 -> "watchos" + KonanTarget.WATCHOS_X64, KonanTarget.WATCHOS_X86 -> "watchsimulator" else -> throw IllegalStateException("Test target $target is not supported") } val simulatorPath = when (target) { KonanTarget.TVOS_X64, KonanTarget.IOS_X64, + KonanTarget.WATCHOS_X86, KonanTarget.WATCHOS_X64 -> Xcode.current.getLatestSimulatorRuntimeFor(target, configs.osVersionMin)?.bundlePath?.let { "$it/Contents/Resources/RuntimeRoot/usr/lib/swift" } @@ -120,7 +123,10 @@ open class FrameworkTest : DefaultTask() { // Hopefully, lexicographical comparison will work. val newMacos = System.getProperty("os.version").compareTo("10.14.4") >= 0 val dyldLibraryPathKey = when (target) { - KonanTarget.IOS_X64, KonanTarget.TVOS_X64 -> "SIMCTL_CHILD_DYLD_LIBRARY_PATH" + KonanTarget.IOS_X64, + KonanTarget.WATCHOS_X86, + KonanTarget.WATCHOS_X64, + KonanTarget.TVOS_X64 -> "SIMCTL_CHILD_DYLD_LIBRARY_PATH" else -> "DYLD_LIBRARY_PATH" } return if (newMacos && target == KonanTarget.MACOS_X64) emptyMap() else mapOf( @@ -139,7 +145,7 @@ open class FrameworkTest : DefaultTask() { |stdout: $stdOut |stderr: $stdErr """.trimMargin()) - check(exitCode == 0) { "Execution failed with exit code: $exitCode "} + check(exitCode == 0) { "Execution failed with exit code: $exitCode " } } private fun validateBitcodeEmbedding(frameworkBinary: String) { @@ -153,10 +159,16 @@ open class FrameworkTest : DefaultTask() { val bitcodeBuildTool = "${configurables.absoluteAdditionalToolsDir}/bin/bitcode-build-tool" val ldPath = "${configurables.absoluteTargetToolchain}/usr/bin/ld" val sdk = when (testTarget) { - KonanTarget.IOS_X64, KonanTarget.TVOS_X64 -> return // bitcode-build-tool doesn't support simulators. - KonanTarget.IOS_ARM64, KonanTarget.IOS_ARM32 -> Xcode.current.iphoneosSdk + KonanTarget.IOS_X64, + KonanTarget.TVOS_X64, + KonanTarget.WATCHOS_X86, + KonanTarget.WATCHOS_X64 -> return // bitcode-build-tool doesn't support simulators. + KonanTarget.IOS_ARM64, + KonanTarget.IOS_ARM32 -> Xcode.current.iphoneosSdk KonanTarget.MACOS_X64 -> Xcode.current.macosxSdk KonanTarget.TVOS_ARM64 -> Xcode.current.appletvosSdk + KonanTarget.WATCHOS_ARM32, + KonanTarget.WATCHOS_ARM64 -> Xcode.current.watchosSdk else -> error("Cannot validate bitcode for test target $testTarget") } diff --git a/build-tools/src/main/kotlin/org/jetbrains/kotlin/Utils.kt b/build-tools/src/main/kotlin/org/jetbrains/kotlin/Utils.kt index f8526d75d2b..50d18c04986 100644 --- a/build-tools/src/main/kotlin/org/jetbrains/kotlin/Utils.kt +++ b/build-tools/src/main/kotlin/org/jetbrains/kotlin/Utils.kt @@ -218,6 +218,8 @@ fun compileSwift(project: Project, target: KonanTarget, sources: List, o KonanTarget.TVOS_X64 -> "x86_64-apple-tvos" + configs.osVersionMin KonanTarget.TVOS_ARM64 -> "arm64_64-apple-tvos" + configs.osVersionMin KonanTarget.MACOS_X64 -> "x86_64-apple-macosx" + configs.osVersionMin + KonanTarget.WATCHOS_X86 -> "i386-apple-watchos" + configs.osVersionMin + KonanTarget.WATCHOS_X64 -> "x86_64-apple-watchos" + configs.osVersionMin else -> throw IllegalStateException("Test target $target is not supported") } diff --git a/build-tools/src/main/kotlin/org/jetbrains/kotlin/XcRunRuntimeUtils.kt b/build-tools/src/main/kotlin/org/jetbrains/kotlin/XcRunRuntimeUtils.kt index 2a18710b695..235d8ef6628 100644 --- a/build-tools/src/main/kotlin/org/jetbrains/kotlin/XcRunRuntimeUtils.kt +++ b/build-tools/src/main/kotlin/org/jetbrains/kotlin/XcRunRuntimeUtils.kt @@ -33,7 +33,7 @@ private fun Xcode.getSimulatorRuntimeDescriptors(): List "iOS" - KonanTarget.WATCHOS_X64 -> "watchOS" + KonanTarget.WATCHOS_X64, KonanTarget.WATCHOS_X86 -> "watchOS" KonanTarget.TVOS_X64 -> "tvOS" else -> error("Unexpected simulator target: $target") } diff --git a/konan/konan.properties b/konan/konan.properties index 10ee660506d..f569b1e352a 100644 --- a/konan/konan.properties +++ b/konan/konan.properties @@ -161,7 +161,6 @@ target-sysroot-9-tvos_x64.default = \ remote:internal arch.tvos_x64 = x86_64 -entrySelector.tvos_x64 = -alias _Konan_main _main targetSysRoot.tvos_x64 = target-sysroot-9-tvos_x64 clangFlags.tvos_x64 = -cc1 -emit-obj -disable-llvm-passes -x ir @@ -188,7 +187,6 @@ target-sysroot-9-tvos_arm64.default = \ remote:internal arch.tvos_arm64 = arm64 -entrySelector.tvos_arm64 = -alias _Konan_main _main targetSysRoot.tvos_arm64 = target-sysroot-9-tvos_arm64 clangFlags.tvos_arm64 = -cc1 -emit-obj -disable-llvm-passes -x ir @@ -205,6 +203,58 @@ osVersionMinFlagLd.tvos_arm64 = -tvos_version_min osVersionMinFlagClang.tvos_arm64 = -mtvos-version-min osVersionMin.tvos_arm64 = 9.0 +# watchOS armv7k +targetToolchain.macos_x64-watchos_arm32 = target-toolchain-9-macos_x64 +dependencies.macos_x64-watchos_arm32 = \ + libffi-3.2.1-3-darwin-macos \ + clang-llvm-6.0.1-darwin-macos + +target-sysroot-9-watchos_arm32.default = \ + remote:internal + +arch.watchos_arm32 = armv7k +targetSysRoot.watchos_arm32 = target-sysroot-9-watchos_arm32 + +clangFlags.watchos_arm32 = -cc1 -emit-obj -disable-llvm-passes -x ir +clangNooptFlags.watchos_arm32 = -O1 +clangOptFlags.watchos_arm32 = -O3 +clangDebugFlags.watchos_arm32 = -O0 +clangDynamicFlags.watchos_arm32 = + +linkerKonanFlags.watchos_arm32 = -lSystem -lc++ -lobjc -framework Foundation -sdk_version 5.0 +linkerOptimizationFlags.watchos_arm32 = -dead_strip +linkerNoDebugFlags.watchos_arm32 = -S +linkerDynamicFlags.watchos_arm32 = -dylib +osVersionMinFlagLd.watchos_arm32 = -watchos_version_min +osVersionMinFlagClang.watchos_arm32 = -mwatchos-version-min +osVersionMin.watchos_arm32 = 5.0 + +# Apple's watchOS i386 simulator. +targetToolchain.macos_x64-watchos_x86 = target-toolchain-9-macos_x64 +dependencies.macos_x64-watchos_x86 = \ + libffi-3.2.1-3-darwin-macos \ + clang-llvm-6.0.1-darwin-macos + +target-sysroot-9-watchos_x86.default = \ + remote:internal + +arch.watchos_x86 = i386 +targetSysRoot.watchos_x86 = target-sysroot-9-watchos_x86 + +clangFlags.watchos_x86 = -cc1 -emit-obj -disable-llvm-passes -x ir +clangNooptFlags.watchos_x86 = -O1 +clangOptFlags.watchos_x86 = -O3 +clangDebugFlags.watchos_x86 = -O0 +clangDynamicFlags.watchos_x86 = + +linkerKonanFlags.watchos_x86 = -lSystem -lc++ -lobjc -framework Foundation -sdk_version 5.0 +linkerOptimizationFlags.watchos_x86 = -dead_strip +linkerNoDebugFlags.watchos_x86 = -S +linkerDynamicFlags.watchos_x86 = -dylib +osVersionMinFlagLd.watchos_x86 = -watchos_simulator_version_min +osVersionMinFlagClang.watchos_x86 = -mwatchos-simulator-version-min +osVersionMin.watchos_x86 = 5.0 + # Linux x86-64. llvmHome.linux_x64 = clang-llvm-6.0.1-linux-x86-64 libffiDir.linux_x64 = libffi-3.2.1-2-linux-x86-64 diff --git a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Apple.kt b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Apple.kt index 220dd126db0..ceb72c911e0 100644 --- a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Apple.kt +++ b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Apple.kt @@ -37,6 +37,8 @@ class AppleConfigurablesImpl( KonanTarget.IOS_X64 -> xcodePartsProvider.xcode.iphonesimulatorSdk KonanTarget.TVOS_ARM64 -> xcodePartsProvider.xcode.appletvosSdk KonanTarget.TVOS_X64 -> xcodePartsProvider.xcode.appletvsimulatorSdk + KonanTarget.WATCHOS_ARM64, KonanTarget.WATCHOS_ARM32 -> xcodePartsProvider.xcode.watchosSdk + KonanTarget.WATCHOS_X64, KonanTarget.WATCHOS_X86 -> xcodePartsProvider.xcode.watchsimulatorSdk else -> error(target) } XcodePartsProvider.InternalServer -> absolute(sdkDependency) diff --git a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/ClangArgs.kt b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/ClangArgs.kt index 4ac105d9053..e69fad3067a 100644 --- a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/ClangArgs.kt +++ b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/ClangArgs.kt @@ -88,14 +88,23 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con KonanTarget.IOS_ARM64 -> listOf("-stdlib=libc++", "-arch", "arm64", "-isysroot", absoluteTargetSysRoot, "-miphoneos-version-min=$osVersionMin") + KonanTarget.IOS_X64 -> + listOf("-stdlib=libc++", "-isysroot", absoluteTargetSysRoot, "-miphoneos-version-min=$osVersionMin") + KonanTarget.TVOS_ARM64 -> listOf("-stdlib=libc++", "-arch", "arm64", "-isysroot", absoluteTargetSysRoot, "-mtvos-version-min=$osVersionMin") KonanTarget.TVOS_X64 -> listOf("-stdlib=libc++", "-isysroot", absoluteTargetSysRoot, "-mtvos-simulator-version-min=$osVersionMin") - KonanTarget.IOS_X64 -> - listOf("-stdlib=libc++", "-isysroot", absoluteTargetSysRoot, "-miphoneos-version-min=$osVersionMin") + KonanTarget.WATCHOS_ARM32 -> + listOf("-stdlib=libc++", "-arch", "armv7k", "-isysroot", absoluteTargetSysRoot, "-mwatchos-version-min=$osVersionMin") + + KonanTarget.WATCHOS_X86 -> + listOf("-stdlib=libc++", "-arch", "i386", "-isysroot", absoluteTargetSysRoot, "-mwatchos-simulator-version-min=$osVersionMin") + + KonanTarget.WATCHOS_ARM64 -> TODO("implement me") + KonanTarget.WATCHOS_X64 -> TODO("implement me") KonanTarget.ANDROID_ARM32, KonanTarget.ANDROID_ARM64, KonanTarget.ANDROID_X86, KonanTarget.ANDROID_X64 -> { @@ -126,11 +135,6 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con "-Xclang", "-isystem$absoluteTargetSysRoot/include/compat", "-Xclang", "-isystem$absoluteTargetSysRoot/include/libc") - KonanTarget.WATCHOS_ARM64 -> TODO("implement me") - KonanTarget.WATCHOS_ARM32 -> TODO("implement me") - KonanTarget.WATCHOS_X64 -> TODO("implement me") - KonanTarget.WATCHOS_X86 -> TODO("implement me") - is KonanTarget.ZEPHYR -> listOf("-target", targetArg!!, "-fno-rtti", @@ -148,7 +152,6 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con "-isystem$absoluteTargetSysRoot/include/libc" ) + (configurables as ZephyrConfigurables).boardSpecificClangFlags - } return result } @@ -258,6 +261,27 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con "-DKONAN_CORE_SYMBOLICATION=1", "-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1") + KonanTarget.WATCHOS_ARM32 -> + listOf("-DKONAN_OBJC_INTEROP=1", + "-DKONAN_IOS", + "-DKONAN_ARM32=1", + "-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1", + "-DKONAN_REPORT_BACKTRACE_TO_IOS_CRASH_LOG=1", + "-DMACHSIZE=32", + // See explanation for ios_arm32 above. + "-DKONAN_NO_64BIT_ATOMIC=1", + "-DKONAN_NO_UNALIGNED_ACCESS=1") + + KonanTarget.WATCHOS_X86 -> + listOf("-DKONAN_OBJC_INTEROP=1", + "-DKONAN_IOS=1", + "-DKONAN_X86=1", + "-DKONAN_CORE_SYMBOLICATION=1", + "-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1") + + KonanTarget.WATCHOS_ARM64 -> TODO("implement me") + KonanTarget.WATCHOS_X64 -> TODO("implement me") + KonanTarget.ANDROID_ARM32 -> listOf("-D__ANDROID__", "-DUSE_GCC_UNWIND=1", @@ -305,11 +329,6 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con "-DKONAN_NO_MEMMEM", "-DKONAN_NO_CTORS_SECTION=1") - KonanTarget.WATCHOS_ARM64 -> TODO("implement me") - KonanTarget.WATCHOS_ARM32 -> TODO("implement me") - KonanTarget.WATCHOS_X64 -> TODO("implement me") - KonanTarget.WATCHOS_X86 -> TODO("implement me") - is KonanTarget.ZEPHYR -> listOf( "-DKONAN_ZEPHYR=1", "-DKONAN_NO_FFI=1", diff --git a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/ConfigurablesImpl.kt b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/ConfigurablesImpl.kt index 0f4cdec1a97..fa4524b7c10 100644 --- a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/ConfigurablesImpl.kt +++ b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/ConfigurablesImpl.kt @@ -40,21 +40,28 @@ class ZephyrConfigurablesImpl(target: KonanTarget, properties: Properties, baseD fun loadConfigurables(target: KonanTarget, properties: Properties, baseDir: String?) = when (target) { KonanTarget.LINUX_X64, KonanTarget.LINUX_ARM32_HFP, KonanTarget.LINUX_ARM64 -> LinuxConfigurablesImpl(target, properties, baseDir) + KonanTarget.LINUX_MIPS32, KonanTarget.LINUX_MIPSEL32 -> LinuxMIPSConfigurablesImpl(target, properties, baseDir) + KonanTarget.MACOS_X64, KonanTarget.IOS_ARM32, KonanTarget.IOS_ARM64, KonanTarget.IOS_X64, - KonanTarget.TVOS_ARM64, KonanTarget.TVOS_X64 -> + KonanTarget.TVOS_ARM64, KonanTarget.TVOS_X64, + KonanTarget.WATCHOS_ARM64, KonanTarget.WATCHOS_ARM32, + KonanTarget.WATCHOS_X64, KonanTarget.WATCHOS_X86 -> AppleConfigurablesImpl(target, properties, baseDir) + KonanTarget.ANDROID_ARM32, KonanTarget.ANDROID_ARM64, KonanTarget.ANDROID_X86, KonanTarget.ANDROID_X64 -> AndroidConfigurablesImpl(target, properties, baseDir) + KonanTarget.MINGW_X64, KonanTarget.MINGW_X86 -> MingwConfigurablesImpl(target, properties, baseDir) + KonanTarget.WASM32 -> WasmConfigurablesImpl(target, properties, baseDir) - KonanTarget.WATCHOS_ARM64, KonanTarget.WATCHOS_ARM32, KonanTarget.WATCHOS_X64, KonanTarget.WATCHOS_X86-> TODO("unimplemented: $target") + is KonanTarget.ZEPHYR -> ZephyrConfigurablesImpl(target, properties, baseDir) - } +} diff --git a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Linker.kt b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Linker.kt index 60d60cf8c09..8dfeb735cc2 100644 --- a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Linker.kt +++ b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Linker.kt @@ -445,23 +445,27 @@ fun linker(configurables: Configurables): LinkerFlags = when (configurables.target) { KonanTarget.LINUX_X64, KonanTarget.LINUX_ARM32_HFP, KonanTarget.LINUX_ARM64 -> LinuxBasedLinker(configurables as LinuxConfigurables) + KonanTarget.LINUX_MIPS32, KonanTarget.LINUX_MIPSEL32 -> LinuxBasedLinker(configurables as LinuxMIPSConfigurables) + KonanTarget.MACOS_X64, KonanTarget.TVOS_X64, KonanTarget.TVOS_ARM64, - KonanTarget.IOS_ARM32, KonanTarget.IOS_ARM64, KonanTarget.IOS_X64 -> + KonanTarget.IOS_ARM32, KonanTarget.IOS_ARM64, KonanTarget.IOS_X64, + KonanTarget.WATCHOS_ARM64, KonanTarget.WATCHOS_ARM32, + KonanTarget.WATCHOS_X64, KonanTarget.WATCHOS_X86 -> MacOSBasedLinker(configurables as AppleConfigurables) + KonanTarget.ANDROID_ARM32, KonanTarget.ANDROID_ARM64, KonanTarget.ANDROID_X86, KonanTarget.ANDROID_X64 -> AndroidLinker(configurables as AndroidConfigurables) + KonanTarget.MINGW_X64, KonanTarget.MINGW_X86 -> MingwLinker(configurables as MingwConfigurables) + KonanTarget.WASM32 -> WasmLinker(configurables as WasmConfigurables) - KonanTarget.WATCHOS_ARM64 -> TODO("implement me") - KonanTarget.WATCHOS_ARM32 -> TODO("implement me") - KonanTarget.WATCHOS_X64 -> TODO("implement me") - KonanTarget.WATCHOS_X86 -> TODO("implement me") + is KonanTarget.ZEPHYR -> ZephyrLinker(configurables as ZephyrConfigurables) } diff --git a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Platform.kt b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Platform.kt index 6aeb83882db..b9ace4c126d 100644 --- a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Platform.kt +++ b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Platform.kt @@ -49,8 +49,6 @@ class PlatformManager(distribution: Distribution = Distribution(), experimental: * TODO: Don't forget to delete this field and replace all its usages to `enabled`. */ val filteredOutEnabledButNotSupported - get() = enabled.filterNot { it == KonanTarget.WATCHOS_X64 || - it == KonanTarget.WATCHOS_X86|| it == KonanTarget.WATCHOS_ARM64 || it == KonanTarget.WATCHOS_ARM32 - } + get() = enabled.filterNot { it == KonanTarget.WATCHOS_X64 || it == KonanTarget.WATCHOS_ARM64 } } diff --git a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Xcode.kt b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Xcode.kt index 28c3c14c7db..15842206e40 100644 --- a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Xcode.kt +++ b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/Xcode.kt @@ -27,6 +27,8 @@ interface Xcode { val version: String val appletvosSdk: String val appletvsimulatorSdk: String + val watchosSdk: String + val watchsimulatorSdk: String // Xcode.app/Contents/Developer/usr val additionalTools: String val simulatorRuntimes: String @@ -58,6 +60,9 @@ private object CurrentXcode : Xcode { override val iphonesimulatorSdk by lazy { getSdkPath("iphonesimulator") } override val appletvosSdk by lazy { getSdkPath("appletvos") } override val appletvsimulatorSdk by lazy { getSdkPath("appletvsimulator") } + override val watchosSdk: String by lazy { getSdkPath("watchos") } + override val watchsimulatorSdk: String by lazy { getSdkPath("watchsimulator") } + override val version by lazy { xcrun("xcodebuild", "-version") diff --git a/tools/scripts/update_xcode.sh b/tools/scripts/update_xcode.sh index a2eabf3497a..0eb5377bf33 100755 --- a/tools/scripts/update_xcode.sh +++ b/tools/scripts/update_xcode.sh @@ -2,14 +2,14 @@ # "brew install coreutils" for grealpath. KONAN_TOOLCHAIN_VERSION=9 -SDKS="macosx iphoneos iphonesimulator appletvos appletvsimulator" +SDKS="macosx iphoneos iphonesimulator appletvos appletvsimulator watchos watchsimulator" TARBALL_macosx=target-sysroot-$KONAN_TOOLCHAIN_VERSION-macos_x64 TARBALL_iphoneos=target-sysroot-$KONAN_TOOLCHAIN_VERSION-ios_arm64 TARBALL_iphonesimulator=target-sysroot-$KONAN_TOOLCHAIN_VERSION-ios_x64 TARBALL_appletvos=target-sysroot-$KONAN_TOOLCHAIN_VERSION-tvos_arm64 TARBALL_appletvsimulator=target-sysroot-$KONAN_TOOLCHAIN_VERSION-tvos_x64 TARBALL_watchos=target-sysroot-$KONAN_TOOLCHAIN_VERSION-watchos_arm32 -TARBALL_watchsimulator=target-sysroot-$KONAN_TOOLCHAIN_VERSION-watchos_x64 +TARBALL_watchsimulator=target-sysroot-$KONAN_TOOLCHAIN_VERSION-watchos_x86 TARBALL_xcode=target-toolchain-$KONAN_TOOLCHAIN_VERSION-macos_x64 TARBALL_xcode_addon=xcode-addon-$KONAN_TOOLCHAIN_VERSION-macos_x64 OUT=`pwd`