From c3638e48dc78ae9fdd087f45e866c63ddbb4c874 Mon Sep 17 00:00:00 2001 From: Nikolay Igotti Date: Mon, 22 Apr 2019 17:53:32 +0300 Subject: [PATCH] Support linux/arm64. --- .../org/jetbrains/kotlin/konan/target/ClangArgs.kt | 13 +++++++++++++ .../kotlin/konan/target/ConfigurablesImpl.kt | 2 +- .../jetbrains/kotlin/konan/target/KonanTarget.kt | 6 +++++- .../org/jetbrains/kotlin/konan/target/Linker.kt | 11 ++++++----- 4 files changed, 25 insertions(+), 7 deletions(-) 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 38e3a1306c8..a9e8d170bcf 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 @@ -39,6 +39,12 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con "-I$absoluteTargetSysRoot/usr/include/c++/4.8.3", "-I$absoluteTargetSysRoot/usr/include/c++/4.8.3/arm-linux-gnueabihf") + KonanTarget.LINUX_ARM64 -> + listOf("-target", targetArg!!, + "--sysroot=$absoluteTargetSysRoot", + "-I$absoluteTargetSysRoot/usr/include/c++/7", + "-I$absoluteTargetSysRoot/usr/include/c++/7/aarch64-linux-gnu") + KonanTarget.LINUX_MIPS32 -> listOf("-target", targetArg!!, "--sysroot=$absoluteTargetSysRoot", @@ -137,6 +143,13 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con "-DELFSIZE=32", "-DKONAN_NO_UNALIGNED_ACCESS=1") + KonanTarget.LINUX_ARM64 -> + listOf("-DUSE_GCC_UNWIND=1", + "-DKONAN_LINUX=1", + "-DKONAN_ARM64=1", + "-DUSE_ELF_SYMBOLS=1", + "-DELFSIZE=64") + KonanTarget.LINUX_MIPS32 -> listOf("-DUSE_GCC_UNWIND=1", "-DKONAN_LINUX=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 471b5529da2..c13b3749de2 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 @@ -38,7 +38,7 @@ 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_X64, KonanTarget.LINUX_ARM32_HFP, KonanTarget.LINUX_ARM64 -> LinuxConfigurablesImpl(target, properties, baseDir) KonanTarget.LINUX_MIPS32, KonanTarget.LINUX_MIPSEL32 -> LinuxMIPSConfigurablesImpl(target, properties, baseDir) diff --git a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/KonanTarget.kt b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/KonanTarget.kt index 0de8fc0b708..fd5f838b985 100644 --- a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/KonanTarget.kt +++ b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/KonanTarget.kt @@ -53,6 +53,7 @@ sealed class KonanTarget(override val name: String, val family: Family, val arch object MINGW_X86 : KonanTarget( "mingw_x86", Family.MINGW, Architecture.X86) object MINGW_X64 : KonanTarget( "mingw_x64", Family.MINGW, Architecture.X64) object MACOS_X64 : KonanTarget( "macos_x64", Family.OSX, Architecture.X64) + object LINUX_ARM64 : KonanTarget( "linux_arm64", Family.LINUX, Architecture.ARM64) object LINUX_ARM32_HFP :KonanTarget( "linux_arm32_hfp", Family.LINUX, Architecture.ARM32) object LINUX_MIPS32 : KonanTarget( "linux_mips32", Family.LINUX, Architecture.MIPS32) object LINUX_MIPSEL32 : KonanTarget( "linux_mipsel32", Family.LINUX, Architecture.MIPSEL32) @@ -135,7 +136,7 @@ open class HostManager(protected val distribution: Distribution = Distribution() private val predefinedTargets = listOf( ANDROID_ARM32, ANDROID_ARM64, IOS_ARM32, IOS_ARM64, IOS_X64, - LINUX_X64, LINUX_ARM32_HFP, LINUX_MIPS32, LINUX_MIPSEL32, + LINUX_X64, LINUX_ARM32_HFP, LINUX_ARM64, LINUX_MIPS32, LINUX_MIPSEL32, MINGW_X64, MINGW_X86, MACOS_X64, WASM32) @@ -177,6 +178,7 @@ open class HostManager(protected val distribution: Distribution = Distribution() LINUX_X64 to setOf( LINUX_X64, LINUX_ARM32_HFP, + LINUX_ARM64, LINUX_MIPS32, LINUX_MIPSEL32, ANDROID_ARM32, @@ -188,6 +190,7 @@ open class HostManager(protected val distribution: Distribution = Distribution() MINGW_X86, LINUX_X64, LINUX_ARM32_HFP, + LINUX_ARM64, ANDROID_ARM32, // TODO: toolchain to be fixed for that to work. // ANDROID_ARM64, @@ -200,6 +203,7 @@ open class HostManager(protected val distribution: Distribution = Distribution() IOS_X64, LINUX_X64, LINUX_ARM32_HFP, + LINUX_ARM64, ANDROID_ARM32, ANDROID_ARM64, WASM32 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 be8818ad682..9f93905150f 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 @@ -253,7 +253,7 @@ open class LinuxBasedLinker(targetProperties: LinuxBasedConfigurables) private val ar = if (HostManager.hostIsMac) "$absoluteTargetToolchain/bin/llvm-ar" else "$absoluteTargetToolchain/bin/ar" - override val libGcc: String = "$absoluteTargetSysRoot/${super.libGcc}" + override val libGcc = "$absoluteTargetSysRoot/${super.libGcc}" private val linker = "$absoluteLlvmHome/bin/ld.lld" private val specificLibs = abiSpecificLibraries.map { "-L${absoluteTargetSysRoot}/$it" } @@ -268,6 +268,7 @@ open class LinuxBasedLinker(targetProperties: LinuxBasedConfigurables) val isMips = (configurables is LinuxMIPSConfigurables) val dynamic = kind == LinkerOutputKind.DYNAMIC_LIBRARY + val crtPrefix = if (configurables.target == KonanTarget.LINUX_ARM64) "usr/lib" else "usr/lib64" // TODO: Can we extract more to the konan.configurables? return listOf(Command(linker).apply { +"--sysroot=${absoluteTargetSysRoot}" @@ -280,8 +281,8 @@ open class LinuxBasedLinker(targetProperties: LinuxBasedConfigurables) +dynamicLinker +"-o" +executable - if (!dynamic) +"$absoluteTargetSysRoot/usr/lib64/crt1.o" - +"$absoluteTargetSysRoot/usr/lib64/crti.o" + if (!dynamic) +"$absoluteTargetSysRoot/$crtPrefix/crt1.o" + +"$absoluteTargetSysRoot/$crtPrefix/crti.o" +if (dynamic) "$libGcc/crtbeginS.o" else "$libGcc/crtbegin.o" +"-L$llvmLib" +"-L$libGcc" @@ -296,7 +297,7 @@ open class LinuxBasedLinker(targetProperties: LinuxBasedConfigurables) +listOf("-lgcc", "--as-needed", "-lgcc_s", "--no-as-needed", "-lc", "-lgcc", "--as-needed", "-lgcc_s", "--no-as-needed") +if (dynamic) "$libGcc/crtendS.o" else "$libGcc/crtend.o" - +"$absoluteTargetSysRoot/usr/lib64/crtn.o" + +"$absoluteTargetSysRoot/$crtPrefix/crtn.o" +libraries +linkerArgs }) @@ -408,7 +409,7 @@ open class ZephyrLinker(targetProperties: ZephyrConfigurables) fun linker(configurables: Configurables): LinkerFlags = when (configurables.target) { - KonanTarget.LINUX_X64, KonanTarget.LINUX_ARM32_HFP -> + KonanTarget.LINUX_X64, KonanTarget.LINUX_ARM32_HFP, KonanTarget.LINUX_ARM64 -> LinuxBasedLinker(configurables as LinuxConfigurables) KonanTarget.LINUX_MIPS32, KonanTarget.LINUX_MIPSEL32 -> LinuxBasedLinker(configurables as LinuxMIPSConfigurables)