Support linux/arm64.

This commit is contained in:
Nikolay Igotti
2019-04-22 17:53:32 +03:00
committed by Ilya Matveev
parent e2f6cba307
commit c3638e48dc
4 changed files with 25 additions and 7 deletions
@@ -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",
"-I$absoluteTargetSysRoot/usr/include/c++/4.8.3/arm-linux-gnueabihf") "-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 -> KonanTarget.LINUX_MIPS32 ->
listOf("-target", targetArg!!, listOf("-target", targetArg!!,
"--sysroot=$absoluteTargetSysRoot", "--sysroot=$absoluteTargetSysRoot",
@@ -137,6 +143,13 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con
"-DELFSIZE=32", "-DELFSIZE=32",
"-DKONAN_NO_UNALIGNED_ACCESS=1") "-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 -> KonanTarget.LINUX_MIPS32 ->
listOf("-DUSE_GCC_UNWIND=1", listOf("-DUSE_GCC_UNWIND=1",
"-DKONAN_LINUX=1", "-DKONAN_LINUX=1",
@@ -38,7 +38,7 @@ class ZephyrConfigurablesImpl(target: KonanTarget, properties: Properties, baseD
fun loadConfigurables(target: KonanTarget, properties: Properties, baseDir: String?) = when (target) { 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) LinuxConfigurablesImpl(target, properties, baseDir)
KonanTarget.LINUX_MIPS32, KonanTarget.LINUX_MIPSEL32 -> KonanTarget.LINUX_MIPS32, KonanTarget.LINUX_MIPSEL32 ->
LinuxMIPSConfigurablesImpl(target, properties, baseDir) LinuxMIPSConfigurablesImpl(target, properties, baseDir)
@@ -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_X86 : KonanTarget( "mingw_x86", Family.MINGW, Architecture.X86)
object MINGW_X64 : KonanTarget( "mingw_x64", Family.MINGW, Architecture.X64) object MINGW_X64 : KonanTarget( "mingw_x64", Family.MINGW, Architecture.X64)
object MACOS_X64 : KonanTarget( "macos_x64", Family.OSX, 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_ARM32_HFP :KonanTarget( "linux_arm32_hfp", Family.LINUX, Architecture.ARM32)
object LINUX_MIPS32 : KonanTarget( "linux_mips32", Family.LINUX, Architecture.MIPS32) object LINUX_MIPS32 : KonanTarget( "linux_mips32", Family.LINUX, Architecture.MIPS32)
object LINUX_MIPSEL32 : KonanTarget( "linux_mipsel32", Family.LINUX, Architecture.MIPSEL32) 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( private val predefinedTargets = listOf(
ANDROID_ARM32, ANDROID_ARM64, ANDROID_ARM32, ANDROID_ARM64,
IOS_ARM32, IOS_ARM64, IOS_X64, 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, MINGW_X64, MINGW_X86,
MACOS_X64, MACOS_X64,
WASM32) WASM32)
@@ -177,6 +178,7 @@ open class HostManager(protected val distribution: Distribution = Distribution()
LINUX_X64 to setOf( LINUX_X64 to setOf(
LINUX_X64, LINUX_X64,
LINUX_ARM32_HFP, LINUX_ARM32_HFP,
LINUX_ARM64,
LINUX_MIPS32, LINUX_MIPS32,
LINUX_MIPSEL32, LINUX_MIPSEL32,
ANDROID_ARM32, ANDROID_ARM32,
@@ -188,6 +190,7 @@ open class HostManager(protected val distribution: Distribution = Distribution()
MINGW_X86, MINGW_X86,
LINUX_X64, LINUX_X64,
LINUX_ARM32_HFP, LINUX_ARM32_HFP,
LINUX_ARM64,
ANDROID_ARM32, ANDROID_ARM32,
// TODO: toolchain to be fixed for that to work. // TODO: toolchain to be fixed for that to work.
// ANDROID_ARM64, // ANDROID_ARM64,
@@ -200,6 +203,7 @@ open class HostManager(protected val distribution: Distribution = Distribution()
IOS_X64, IOS_X64,
LINUX_X64, LINUX_X64,
LINUX_ARM32_HFP, LINUX_ARM32_HFP,
LINUX_ARM64,
ANDROID_ARM32, ANDROID_ARM32,
ANDROID_ARM64, ANDROID_ARM64,
WASM32 WASM32
@@ -253,7 +253,7 @@ open class LinuxBasedLinker(targetProperties: LinuxBasedConfigurables)
private val ar = if (HostManager.hostIsMac) "$absoluteTargetToolchain/bin/llvm-ar" private val ar = if (HostManager.hostIsMac) "$absoluteTargetToolchain/bin/llvm-ar"
else "$absoluteTargetToolchain/bin/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 linker = "$absoluteLlvmHome/bin/ld.lld"
private val specificLibs = abiSpecificLibraries.map { "-L${absoluteTargetSysRoot}/$it" } private val specificLibs = abiSpecificLibraries.map { "-L${absoluteTargetSysRoot}/$it" }
@@ -268,6 +268,7 @@ open class LinuxBasedLinker(targetProperties: LinuxBasedConfigurables)
val isMips = (configurables is LinuxMIPSConfigurables) val isMips = (configurables is LinuxMIPSConfigurables)
val dynamic = kind == LinkerOutputKind.DYNAMIC_LIBRARY 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? // TODO: Can we extract more to the konan.configurables?
return listOf(Command(linker).apply { return listOf(Command(linker).apply {
+"--sysroot=${absoluteTargetSysRoot}" +"--sysroot=${absoluteTargetSysRoot}"
@@ -280,8 +281,8 @@ open class LinuxBasedLinker(targetProperties: LinuxBasedConfigurables)
+dynamicLinker +dynamicLinker
+"-o" +"-o"
+executable +executable
if (!dynamic) +"$absoluteTargetSysRoot/usr/lib64/crt1.o" if (!dynamic) +"$absoluteTargetSysRoot/$crtPrefix/crt1.o"
+"$absoluteTargetSysRoot/usr/lib64/crti.o" +"$absoluteTargetSysRoot/$crtPrefix/crti.o"
+if (dynamic) "$libGcc/crtbeginS.o" else "$libGcc/crtbegin.o" +if (dynamic) "$libGcc/crtbeginS.o" else "$libGcc/crtbegin.o"
+"-L$llvmLib" +"-L$llvmLib"
+"-L$libGcc" +"-L$libGcc"
@@ -296,7 +297,7 @@ open class LinuxBasedLinker(targetProperties: LinuxBasedConfigurables)
+listOf("-lgcc", "--as-needed", "-lgcc_s", "--no-as-needed", +listOf("-lgcc", "--as-needed", "-lgcc_s", "--no-as-needed",
"-lc", "-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" +if (dynamic) "$libGcc/crtendS.o" else "$libGcc/crtend.o"
+"$absoluteTargetSysRoot/usr/lib64/crtn.o" +"$absoluteTargetSysRoot/$crtPrefix/crtn.o"
+libraries +libraries
+linkerArgs +linkerArgs
}) })
@@ -408,7 +409,7 @@ open class ZephyrLinker(targetProperties: ZephyrConfigurables)
fun linker(configurables: Configurables): LinkerFlags = fun linker(configurables: Configurables): LinkerFlags =
when (configurables.target) { when (configurables.target) {
KonanTarget.LINUX_X64, KonanTarget.LINUX_ARM32_HFP -> KonanTarget.LINUX_X64, KonanTarget.LINUX_ARM32_HFP, KonanTarget.LINUX_ARM64 ->
LinuxBasedLinker(configurables as LinuxConfigurables) LinuxBasedLinker(configurables as LinuxConfigurables)
KonanTarget.LINUX_MIPS32, KonanTarget.LINUX_MIPSEL32 -> KonanTarget.LINUX_MIPS32, KonanTarget.LINUX_MIPSEL32 ->
LinuxBasedLinker(configurables as LinuxMIPSConfigurables) LinuxBasedLinker(configurables as LinuxMIPSConfigurables)