Add Platform detection support. (#2737)
This commit is contained in:
@@ -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 ->
|
||||
|
||||
Reference in New Issue
Block a user