diff --git a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt index 20ae5199ec9..f9f1b8eb2a6 100644 --- a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt +++ b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt @@ -88,6 +88,7 @@ private val knownTargets = mapOf( "ios_sim" to "ios_sim", "raspberrypi" to "raspberrypi", "android_arm32" to "android_arm32", + "android_arm64" to "android_arm64", "mingw" to "mingw" ) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanTarget.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanTarget.kt index fa6f68ffbfd..4797b49a137 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanTarget.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanTarget.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.config.CompilerConfiguration enum class KonanTarget(val suffix: String, var enabled: Boolean = false) { ANDROID_ARM32("android_arm32"), + ANDROID_ARM64("android_arm64"), IPHONE("ios"), IPHONE_SIM("ios_sim"), LINUX("linux"), @@ -40,6 +41,7 @@ class TargetManager(val config: CompilerConfiguration) { KonanTarget.LINUX.enabled = true KonanTarget.RASPBERRYPI.enabled = true KonanTarget.ANDROID_ARM32.enabled = true + KonanTarget.ANDROID_ARM64.enabled = true } KonanTarget.MINGW -> { KonanTarget.MINGW.enabled = true @@ -49,6 +51,7 @@ class TargetManager(val config: CompilerConfiguration) { KonanTarget.IPHONE.enabled = true KonanTarget.IPHONE_SIM.enabled = true KonanTarget.ANDROID_ARM32.enabled = true + KonanTarget.ANDROID_ARM64.enabled = true } else -> error("Unknown host platform: $host") 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 c77737fd4e3..9d3272dd850 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 @@ -170,7 +170,7 @@ internal class LinkStage(val context: Context) { LinuxBasedPlatform(distribution) KonanTarget.MACBOOK, KonanTarget.IPHONE, KonanTarget.IPHONE_SIM -> MacOSBasedPlatform(distribution) - KonanTarget.ANDROID_ARM32 -> + KonanTarget.ANDROID_ARM32, KonanTarget.ANDROID_ARM64 -> AndroidPlatform(distribution) KonanTarget.MINGW -> MingwPlatform(distribution) diff --git a/backend.native/konan.properties b/backend.native/konan.properties index 49734a474e5..0cf01dda713 100644 --- a/backend.native/konan.properties +++ b/backend.native/konan.properties @@ -149,12 +149,34 @@ dependencies.linux-android_arm32 = \ quadruple.android_arm32 = arm-linux-androideabi entrySelector.android_arm32 = -Wl,--defsym -Wl,main=Konan_main -llvmLtoFlags.android_arm32 = -exported-symbol=Konan_main -emulated-tls +llvmLtoFlags.android_arm32 = -exported-symbol=Konan_main -emulated-tls -relocation-model=pic llvmLtoOptFlags.android_arm32 = -O3 -function-sections llvmLtoNooptFlags.android_arm32 = -O1 targetSysRoot.android_arm32 = target-sysroot-21-android_arm32 libffiDir.android_arm32 = libffi-3.2.1-2-android_arm32 -linkerKonanFlags.android_arm32 = -lm -latomic -lstdc++ +linkerKonanFlags.android_arm32 = -lm -latomic -lstdc++ -landroid + +# Android ARM64, based on NDK for android-21. +targetToolchain.osx-android_arm64 = target-toolchain-21-osx-android_arm64 +# TODO: split dependencies to host-dependent and host-independent parts. +dependencies.osx-android_arm64 = \ + clang-llvm-3.9.0-darwin-macos \ + target-sysroot-21-android_arm64 \ + target-toolchain-21-osx-android_arm64 \ + libffi-3.2.1-2-android_arm64 +targetToolchain.linux-android_arm64 = target-toolchain-21-linux-android_arm64 +dependencies.linux-android_arm64 = \ + clang-llvm-3.9.0-linux-x86-64 \ + target-sysroot-21-android_arm64 \ + target-toolchain-21-linux-android_arm64 \ + libffi-3.2.1-2-android_arm64 + +quadruple.android_arm64 = aarch64-linux-android +entrySelector.android_arm64 = -Wl,--defsym -Wl,main=Konan_main +llvmLtoFlags.android_arm64 = -exported-symbol=Konan_main -emulated-tls -relocation-model=pic +targetSysRoot.android_arm64 = target-sysroot-21-android_arm64 +libffiDir.android_arm64 = libffi-3.2.1-2-android_arm64 +linkerKonanFlags.android_arm64 = -lm -latomic -lstdc++ -landroid # Windows x86-64, based on mingw-w64. llvmVersion.mingw = 3.9.1 diff --git a/build.gradle b/build.gradle index 6da6627e5f8..45797ce331b 100644 --- a/build.gradle +++ b/build.gradle @@ -138,11 +138,19 @@ void setupCompilationFlags() { "-D__ANDROID__", "-DUSE_GCC_UNWIND=1", "-DUSE_ELF_SYMBOLS=1", "-DELFSIZE=32", // HACKS! "-I$android_arm32SysrootDir/usr/include/c++/4.9.x", - "-I$android_arm32SysrootDir/usr/include/c++/4.9.x/arm-linux-androideabi"] - ] - } + "-I$android_arm32SysrootDir/usr/include/c++/4.9.x/arm-linux-androideabi"], + "android_arm64": + ["-target", getTargetArg("android_arm64"), + "--sysroot=$android_arm64SysrootDir", + "-D__ANDROID__", "-DUSE_GCC_UNWIND=1", "-DUSE_ELF_SYMBOLS=1", "-DELFSIZE=64", + // HACKS! + "-I$android_arm64SysrootDir/usr/include/c++/4.9.x", + "-I$android_arm64SysrootDir/usr/include/c++/4.9.x/aarch64-linux-android"] - ext.targetList = ext.targetArgs.keySet() as List + ] + } + + ext.targetList = ext.targetArgs.keySet() as List if (isLinux()) { binDir = "$gccToolchainDir/$gnuTriplet/bin" diff --git a/dependencies/build.gradle b/dependencies/build.gradle index 678d3d4b9de..2b33fc9a70d 100644 --- a/dependencies/build.gradle +++ b/dependencies/build.gradle @@ -264,6 +264,8 @@ if (isLinux() || isMac()) { dependencyTask("android_arm32", SYSROOT) dependencyTask("android_arm32", LIBFFI) + dependencyTask("android_arm64", SYSROOT) + dependencyTask("android_arm64", LIBFFI) } task update(type: Copy) {