Add Platform detection support. (#2737)

This commit is contained in:
Nikolay Igotti
2019-03-05 22:08:00 +03:00
committed by GitHub
parent 7519bcec14
commit 9ded272398
4 changed files with 152 additions and 3 deletions
+56
View File
@@ -167,4 +167,60 @@ void CheckIsMainThread() {
ThrowIncorrectDereferenceException();
}
int Konan_Platform_canAccessUnaligned() {
#if KONAN_NO_UNALIGNED_ACCESS
return 0;
#else
return 1;
#endif
}
int Konan_Platform_isLittleEndian() {
#ifdef __BIG_ENDIAN__
return 0;
#else
return 1;
#endif
}
int Konan_Platform_getOsFamily() {
#if KONAN_MACOSX
return 1;
#elif KONAN_IOS
return 2;
#elif KONAN_LINUX
return 3;
#elif KONAN_WINDOWS
return 4;
#elif KONAN_ANDROID
return 5;
#elif KONAN_WASM
return 6;
#else
#warning "Unknown platform"
return 0;
#endif
}
int Konan_Platform_getCpuArchitecture() {
#if KONAN_ARM32
return 1;
#elif KONAN_ARM64
return 2;
#elif KONAN_X86
return 3;
#elif KONAN_X64
return 4;
#elif KONAN_MIPS
return 5;
#elif KONAN_MIPSEL
return 6;
#elif KONAN_WASM
return 7;
#else
#warning "Unknown CPU"
return 0;
#endif
}
} // extern "C"
@@ -52,4 +52,5 @@ public typealias SharedImmutable = kotlin.native.concurrent.SharedImmutable
*/
@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.BINARY)
public annotation class CName(val externName: String = "", val shortName: String = "")
public annotation class CName(val externName: String = "", val shortName: String = "")
@@ -0,0 +1,73 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the LICENSE file.
*/
package kotlin.native
/**
* Operating system family.
*/
public enum class OsFamily {
UNKNOWN,
MACOSX,
IOS,
LINUX,
WINDOWS,
ANDROID,
WASM
}
/**
* Central Processor Unit architecture.
*/
public enum class CpuArchitecture(val bitness: Int) {
UNKNOWN(-1),
ARM32(32),
ARM64(64),
X86(32),
X64(64),
MIPS32(32),
MIPSEL32(32),
WASM32(32);
}
/**
* Object describing the current platform program executes upon.
*/
public object Platform {
/**
* Check if current architecture allows unaligned access to wider than byte locations.
*/
public val canAccessUnaligned: Boolean
get() = Platform_canAccessUnaligned() != 0
/**
* Check if byte order of the current platform is least significant byte (LSB) first, aka little endian.
*/
public val isLittleEndian: Boolean
get() = Platform_isLittleEndian() != 0
/**
* Operating system family program executes upon.
*/
public val osFamily: OsFamily
get() = OsFamily.values()[Platform_getOsFamily()]
/**
* Architechture of the CPU program executes upon.
*/
public val cpuArchitecture: CpuArchitecture
get() = CpuArchitecture.values()[Platform_getCpuArchitecture()]
}
@SymbolName("Konan_Platform_canAccessUnaligned")
private external fun Platform_canAccessUnaligned(): Int
@SymbolName("Konan_Platform_isLittleEndian")
private external fun Platform_isLittleEndian(): Int
@SymbolName("Konan_Platform_getOsFamily")
private external fun Platform_getOsFamily(): Int
@SymbolName("Konan_Platform_getCpuArchitecture")
private external fun Platform_getCpuArchitecture(): Int
@@ -123,18 +123,24 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con
get() = when (target) {
KonanTarget.LINUX_X64 ->
listOf("-DUSE_GCC_UNWIND=1",
"-DKONAN_LINUX=1",
"-DKONAN_X64=1",
"-DUSE_ELF_SYMBOLS=1",
"-DELFSIZE=64",
"-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1")
KonanTarget.LINUX_ARM32_HFP ->
listOf("-DUSE_GCC_UNWIND=1",
"-DKONAN_LINUX=1",
"-DKONAN_ARM32=1",
"-DUSE_ELF_SYMBOLS=1",
"-DELFSIZE=32",
"-DKONAN_NO_UNALIGNED_ACCESS=1")
KonanTarget.LINUX_MIPS32 ->
listOf("-DUSE_GCC_UNWIND=1",
"-DKONAN_LINUX=1",
"-DKONAN_MIPS32=1",
"-DUSE_ELF_SYMBOLS=1",
"-DELFSIZE=32",
// TODO: reconsider, once target MIPS can do proper 64-bit load/store/CAS.
@@ -143,6 +149,8 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con
KonanTarget.LINUX_MIPSEL32 ->
listOf("-DUSE_GCC_UNWIND=1",
"-DKONAN_LINUX=1",
"-DKONAN_MIPSEL32=1",
"-DUSE_ELF_SYMBOLS=1",
"-DELFSIZE=32",
// TODO: reconsider, once target MIPS can do proper 64-bit load/store/CAS.
@@ -153,17 +161,22 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con
listOf("-DUSE_GCC_UNWIND=1",
"-DUSE_PE_COFF_SYMBOLS=1",
"-DKONAN_WINDOWS=1",
if (target == KonanTarget.MINGW_X64) "-DKONAN_X64=1" else "-DKONAN_X86=1",
"-DKONAN_NO_MEMMEM=1",
"-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1")
KonanTarget.MACOS_X64 ->
listOf("-DKONAN_OSX=1",
"-DKONAN_MACOSX=1",
"-DKONAN_X64=1",
"-DKONAN_OBJC_INTEROP=1",
"-DKONAN_CORE_SYMBOLICATION=1",
"-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1")
KonanTarget.IOS_ARM32 ->
listOf("-DKONAN_OBJC_INTEROP=1",
"-DKONAN_IOS",
"-DKONAN_ARM32=1",
"-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1",
"-DKONAN_REPORT_BACKTRACE_TO_IOS_CRASH_LOG=1",
"-DMACHSIZE=32",
@@ -176,12 +189,16 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con
KonanTarget.IOS_ARM64 ->
listOf("-DKONAN_OBJC_INTEROP=1",
"-DKONAN_IOS=1",
"-DKONAN_ARM64=1",
"-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1",
"-DKONAN_REPORT_BACKTRACE_TO_IOS_CRASH_LOG=1",
"-DMACHSIZE=64")
KonanTarget.IOS_X64 ->
listOf("-DKONAN_OBJC_INTEROP=1",
"-DKONAN_IOS=1",
"-DKONAN_X64=1",
"-DKONAN_CORE_SYMBOLICATION=1",
"-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1")
@@ -190,7 +207,8 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con
"-DUSE_GCC_UNWIND=1",
"-DUSE_ELF_SYMBOLS=1",
"-DELFSIZE=32",
"-DKONAN_ANDROID",
"-DKONAN_ANDROID=1",
"-DKONAN_ARM32=1",
"-DKONAN_NO_UNALIGNED_ACCESS=1")
KonanTarget.ANDROID_ARM64 ->
@@ -198,7 +216,8 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con
"-DUSE_GCC_UNWIND=1",
"-DUSE_ELF_SYMBOLS=1",
"-DELFSIZE=64",
"-DKONAN_ANDROID",
"-DKONAN_ANDROID=1",
"-DKONAN_ARM64=1",
"-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1")
KonanTarget.WASM32 ->