From 58bb4e698b4b50f030b245a0867dc0ee9539cca8 Mon Sep 17 00:00:00 2001 From: Nikolay Igotti Date: Thu, 5 Sep 2019 11:36:07 +0300 Subject: [PATCH] Support Android x86. (#3314) --- .../backend/konan/OptimizationPipeline.kt | 2 +- konan/konan.properties | 90 +++++++++++++------ .../kotlin/konan/target/ClangArgs.kt | 16 +++- .../kotlin/konan/target/ConfigurablesImpl.kt | 4 +- .../jetbrains/kotlin/konan/target/Linker.kt | 4 +- .../jetbrains/kotlin/konan/target/Platform.kt | 2 +- 6 files changed, 80 insertions(+), 38 deletions(-) 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 68e6fbb7aaf..76b51a98cd8 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 @@ -60,7 +60,7 @@ private class LlvmPipelineConfiguration(context: Context) { KonanTarget.ANDROID_ARM32 -> "arm7tdmi" KonanTarget.ANDROID_ARM64 -> "cortex-a57" KonanTarget.ANDROID_X64 -> "x86-64" - KonanTarget.ANDROID_X86 -> TODO("implement me") + KonanTarget.ANDROID_X86 -> "i686" KonanTarget.LINUX_MIPS32 -> "mips32r2" KonanTarget.LINUX_MIPSEL32 -> "mips32r2" KonanTarget.WATCHOS_ARM64 -> TODO("implement me") diff --git a/konan/konan.properties b/konan/konan.properties index 0699d966120..d8915a64346 100644 --- a/konan/konan.properties +++ b/konan/konan.properties @@ -372,33 +372,6 @@ targetSysRoot.android_arm32 = target-sysroot-1-android_ndk linkerKonanFlags.android_arm32 = -lm -lstdc++ -landroid -llog -latomic # Android ARM64, based on NDK. -targetToolchain.macos_x64-android_x64 = target-toolchain-1-osx-android_ndk -dependencies.macos_x64-android_x64 = \ - clang-llvm-6.0.1-darwin-macos \ - target-sysroot-1-android_ndk \ - target-toolchain-1-osx-android_ndk \ - libffi-3.2.1-3-darwin-macos -targetToolchain.linux_x64-android_x64 = target-toolchain-1-linux-android_ndk -dependencies.linux_x64-android_x64 = \ - clang-llvm-6.0.1-linux-x86-64 \ - target-sysroot-1-android_ndk \ - target-toolchain-1-linux-android_ndk \ - libffi-3.2.1-2-linux-x86-64 -targetToolchain.mingw_x64-android_x64 = target-toolchain-1-windows-android_ndk -dependencies.mingw_x64-android_x64 = \ - msys2-mingw-w64-x86_64-gcc-7.3.0-clang-llvm-lld-6.0.1-2 \ - target-sysroot-1-android_ndk \ - target-toolchain-1-windows-android_ndk \ - libffi-3.2.1-mingw-w64-x86-64 - -quadruple.android_arm64 = aarch64-linux-android -entrySelector.android_arm64 = -Wl,--defsym -Wl,main=Konan_main -clangFlags.android_arm64 = -cc1 -target-cpu cortex-a57 -emit-obj -disable-llvm-passes -x ir -femulated-tls -mrelocation-model pic -targetSysRoot.android_arm64 = target-sysroot-1-android_ndk -linkerKonanFlags.android_arm64 = -lm -lstdc++ -landroid -llog -latomic -linkerNoDebugFlags.android_arm64 = -Wl,-S - -# Android X64, based on NDK. targetToolchain.macos_x64-android_arm64 = target-toolchain-1-osx-android_ndk dependencies.macos_x64-android_arm64 = \ clang-llvm-6.0.1-darwin-macos \ @@ -418,12 +391,73 @@ dependencies.mingw_x64-android_arm64 = \ target-toolchain-1-windows-android_ndk \ libffi-3.2.1-mingw-w64-x86-64 +quadruple.android_arm64 = aarch64-linux-android +entrySelector.android_arm64 = -Wl,--defsym -Wl,main=Konan_main +clangFlags.android_arm64 = -cc1 -target-cpu cortex-a57 -emit-obj -disable-llvm-passes -x ir -femulated-tls -mrelocation-model pic +clangOptFlags.android_arm64 = -O3 -ffunction-sections +clangNooptFlags.android_arm64 = -O1 +targetSysRoot.android_arm64 = target-sysroot-1-android_ndk +linkerKonanFlags.android_arm64 = -lm -lstdc++ -landroid -llog -latomic +linkerNoDebugFlags.android_arm64 = -Wl,-S + +# Android X86, based on NDK. +targetToolchain.macos_x64-android_x86 = target-toolchain-1-osx-android_ndk +dependencies.macos_x64-android_x86 = \ + clang-llvm-6.0.1-darwin-macos \ + target-sysroot-1-android_ndk \ + target-toolchain-1-osx-android_ndk \ + libffi-3.2.1-3-darwin-macos +targetToolchain.linux_x64-android_x86 = target-toolchain-1-linux-android_ndk +dependencies.linux_x64-android_x86 = \ + clang-llvm-6.0.1-linux-x86-64 \ + target-sysroot-1-android_ndk \ + target-toolchain-1-linux-android_ndk \ + libffi-3.2.1-2-linux-x86-64 +targetToolchain.mingw_x64-android_x86 = target-toolchain-1-windows-android_ndk +dependencies.mingw_x64-android_x86 = \ + msys2-mingw-w64-x86_64-gcc-7.3.0-clang-llvm-lld-6.0.1-2 \ + target-sysroot-1-android_ndk \ + target-toolchain-1-windows-android_ndk \ + libffi-3.2.1-mingw-w64-x86-64 + +quadruple.android_x86 = i686-linux-android +entrySelector.android_x86 = -Wl,--defsym -Wl,main=Konan_main +clangFlags.android_x86 = -cc1 -target-cpu i686 -emit-obj -disable-llvm-passes -x ir -femulated-tls -mrelocation-model pic +clangOptFlags.android_x86 = -O3 -ffunction-sections +clangNooptFlags.android_x86 = -O1 +targetSysRoot.android_x86 = target-sysroot-1-android_ndk +linkerKonanFlags.android_x86 = -lm -lstdc++ -landroid -llog -latomic +linkerNoDebugFlags.android_x86 = -Wl,-S + +# Android X64, based on NDK. +targetToolchain.macos_x64-android_x64 = target-toolchain-1-osx-android_ndk +dependencies.macos_x64-android_x64 = \ + clang-llvm-6.0.1-darwin-macos \ + target-sysroot-1-android_ndk \ + target-toolchain-1-osx-android_ndk \ + libffi-3.2.1-3-darwin-macos +targetToolchain.linux_x64-android_x64 = target-toolchain-1-linux-android_ndk +dependencies.linux_x64-android_x64 = \ + clang-llvm-6.0.1-linux-x86-64 \ + target-sysroot-1-android_ndk \ + target-toolchain-1-linux-android_ndk \ + libffi-3.2.1-2-linux-x86-64 +targetToolchain.mingw_x64-android_x64 = target-toolchain-1-windows-android_ndk +dependencies.mingw_x64-android_x64 = \ + msys2-mingw-w64-x86_64-gcc-7.3.0-clang-llvm-lld-6.0.1-2 \ + target-sysroot-1-android_ndk \ + target-toolchain-1-windows-android_ndk \ + libffi-3.2.1-mingw-w64-x86-64 + quadruple.android_x64 = x86_64-linux-android entrySelector.android_x64 = -Wl,--defsym -Wl,main=Konan_main clangFlags.android_x64 = -cc1 -target-cpu x86-64 -emit-obj -disable-llvm-passes -x ir -femulated-tls -mrelocation-model pic +clangOptFlags.android_x64 = -O3 -ffunction-sections +clangNooptFlags.android_x64 = -O1 targetSysRoot.android_x64 = target-sysroot-1-android_ndk linkerKonanFlags.android_x64 = -lm -lstdc++ -landroid -llog -latomic -linkerNoDebugFlags.android_ax64 = -Wl,-S +linkerNoDebugFlags.android_x64 = -Wl,-S + # Windows x86-64, based on mingw-w64. llvmHome.mingw_x64 = msys2-mingw-w64-x86_64-gcc-7.3.0-clang-llvm-lld-6.0.1-2 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 49e29a6a1e8..1f8d6bf8676 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 @@ -21,7 +21,7 @@ import org.jetbrains.kotlin.konan.file.File internal object Android { const val API = "21" private val architectureMap = mapOf( - // KonanTarget.X86 to "x86", + KonanTarget.ANDROID_X86 to "x86", KonanTarget.ANDROID_X64 to "x86_64", KonanTarget.ANDROID_ARM32 to "arm", KonanTarget.ANDROID_ARM64 to "arm64" @@ -85,7 +85,8 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con KonanTarget.IOS_X64 -> listOf("-stdlib=libc++", "-isysroot", absoluteTargetSysRoot, "-miphoneos-version-min=9.0.0") - KonanTarget.ANDROID_ARM32, KonanTarget.ANDROID_ARM64, KonanTarget.ANDROID_X64 -> { + KonanTarget.ANDROID_ARM32, KonanTarget.ANDROID_ARM64, + KonanTarget.ANDROID_X86, KonanTarget.ANDROID_X64 -> { val clangTarget = targetArg!! val architectureDir = Android.architectureDirForTarget(target) val toolchainSysroot = "$absoluteTargetToolchain/sysroot" @@ -113,7 +114,6 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con "-Xclang", "-isystem$absoluteTargetSysRoot/include/compat", "-Xclang", "-isystem$absoluteTargetSysRoot/include/libc") - KonanTarget.ANDROID_X86 -> TODO("implement me") KonanTarget.WATCHOS_ARM64 -> TODO("implement me") KonanTarget.WATCHOS_ARM32 -> TODO("implement me") KonanTarget.WATCHOS_X64 -> TODO("implement me") @@ -251,6 +251,15 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con "-DKONAN_ARM64=1", "-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1") + KonanTarget.ANDROID_X86 -> + listOf("-D__ANDROID__", + "-DUSE_GCC_UNWIND=1", + "-DUSE_ELF_SYMBOLS=1", + "-DELFSIZE=32", + "-DKONAN_ANDROID=1", + "-DKONAN_X86=1", + "-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1") + KonanTarget.ANDROID_X64 -> listOf("-D__ANDROID__", "-DUSE_GCC_UNWIND=1", @@ -271,7 +280,6 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con "-DKONAN_NO_MEMMEM", "-DKONAN_NO_CTORS_SECTION=1") - KonanTarget.ANDROID_X86 -> TODO("implement me") KonanTarget.WATCHOS_ARM64 -> TODO("implement me") KonanTarget.WATCHOS_ARM32 -> TODO("implement me") KonanTarget.WATCHOS_X64 -> TODO("implement me") 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 55ed48bb547..c7386ccdb3b 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 @@ -44,13 +44,13 @@ fun loadConfigurables(target: KonanTarget, properties: Properties, baseDir: Stri LinuxMIPSConfigurablesImpl(target, properties, baseDir) KonanTarget.MACOS_X64, KonanTarget.IOS_ARM32, KonanTarget.IOS_ARM64, KonanTarget.IOS_X64 -> AppleConfigurablesImpl(target, properties, baseDir) - KonanTarget.ANDROID_ARM32, KonanTarget.ANDROID_ARM64, KonanTarget.ANDROID_X64 -> + 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.ANDROID_X86-> TODO("unimplemented: $target") KonanTarget.WATCHOS_ARM64, KonanTarget.WATCHOS_ARM32, KonanTarget.WATCHOS_X64, KonanTarget.WATCHOS_X86-> TODO("unimplemented: $target") KonanTarget.TVOS_ARM64, KonanTarget.TVOS_X64 -> TODO("unimplemented: $target") is KonanTarget.ZEPHYR -> 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 b9309337314..af158c1b80c 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 @@ -439,13 +439,13 @@ fun linker(configurables: Configurables): LinkerFlags = LinuxBasedLinker(configurables as LinuxMIPSConfigurables) KonanTarget.MACOS_X64, KonanTarget.IOS_ARM32, KonanTarget.IOS_ARM64, KonanTarget.IOS_X64 -> MacOSBasedLinker(configurables as AppleConfigurables) - KonanTarget.ANDROID_ARM32, KonanTarget.ANDROID_ARM64, KonanTarget.ANDROID_X64 -> + 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.ANDROID_X86 -> TODO("implement me") KonanTarget.WATCHOS_ARM64 -> TODO("implement me") KonanTarget.WATCHOS_ARM32 -> TODO("implement me") KonanTarget.WATCHOS_X64 -> TODO("implement me") 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 3d083731586..461bd695a56 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,7 +49,7 @@ 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.ANDROID_X86 || it == KonanTarget.WATCHOS_X64 || + get() = enabled.filterNot { it == KonanTarget.WATCHOS_X64 || it == KonanTarget.WATCHOS_X86|| it == KonanTarget.WATCHOS_ARM64 || it == KonanTarget.WATCHOS_ARM32 || it == KonanTarget.TVOS_X64 || it == KonanTarget.TVOS_ARM64} }