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/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",
@@ -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)
@@ -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
@@ -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)