Add Platform detection support. (#2737)
This commit is contained in:
@@ -167,4 +167,60 @@ void CheckIsMainThread() {
|
|||||||
ThrowIncorrectDereferenceException();
|
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"
|
} // extern "C"
|
||||||
|
|||||||
@@ -52,4 +52,5 @@ public typealias SharedImmutable = kotlin.native.concurrent.SharedImmutable
|
|||||||
*/
|
*/
|
||||||
@Target(AnnotationTarget.FUNCTION)
|
@Target(AnnotationTarget.FUNCTION)
|
||||||
@Retention(AnnotationRetention.BINARY)
|
@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) {
|
get() = when (target) {
|
||||||
KonanTarget.LINUX_X64 ->
|
KonanTarget.LINUX_X64 ->
|
||||||
listOf("-DUSE_GCC_UNWIND=1",
|
listOf("-DUSE_GCC_UNWIND=1",
|
||||||
|
"-DKONAN_LINUX=1",
|
||||||
|
"-DKONAN_X64=1",
|
||||||
"-DUSE_ELF_SYMBOLS=1",
|
"-DUSE_ELF_SYMBOLS=1",
|
||||||
"-DELFSIZE=64",
|
"-DELFSIZE=64",
|
||||||
"-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1")
|
"-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1")
|
||||||
|
|
||||||
KonanTarget.LINUX_ARM32_HFP ->
|
KonanTarget.LINUX_ARM32_HFP ->
|
||||||
listOf("-DUSE_GCC_UNWIND=1",
|
listOf("-DUSE_GCC_UNWIND=1",
|
||||||
|
"-DKONAN_LINUX=1",
|
||||||
|
"-DKONAN_ARM32=1",
|
||||||
"-DUSE_ELF_SYMBOLS=1",
|
"-DUSE_ELF_SYMBOLS=1",
|
||||||
"-DELFSIZE=32",
|
"-DELFSIZE=32",
|
||||||
"-DKONAN_NO_UNALIGNED_ACCESS=1")
|
"-DKONAN_NO_UNALIGNED_ACCESS=1")
|
||||||
|
|
||||||
KonanTarget.LINUX_MIPS32 ->
|
KonanTarget.LINUX_MIPS32 ->
|
||||||
listOf("-DUSE_GCC_UNWIND=1",
|
listOf("-DUSE_GCC_UNWIND=1",
|
||||||
|
"-DKONAN_LINUX=1",
|
||||||
|
"-DKONAN_MIPS32=1",
|
||||||
"-DUSE_ELF_SYMBOLS=1",
|
"-DUSE_ELF_SYMBOLS=1",
|
||||||
"-DELFSIZE=32",
|
"-DELFSIZE=32",
|
||||||
// TODO: reconsider, once target MIPS can do proper 64-bit load/store/CAS.
|
// 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 ->
|
KonanTarget.LINUX_MIPSEL32 ->
|
||||||
listOf("-DUSE_GCC_UNWIND=1",
|
listOf("-DUSE_GCC_UNWIND=1",
|
||||||
|
"-DKONAN_LINUX=1",
|
||||||
|
"-DKONAN_MIPSEL32=1",
|
||||||
"-DUSE_ELF_SYMBOLS=1",
|
"-DUSE_ELF_SYMBOLS=1",
|
||||||
"-DELFSIZE=32",
|
"-DELFSIZE=32",
|
||||||
// TODO: reconsider, once target MIPS can do proper 64-bit load/store/CAS.
|
// 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",
|
listOf("-DUSE_GCC_UNWIND=1",
|
||||||
"-DUSE_PE_COFF_SYMBOLS=1",
|
"-DUSE_PE_COFF_SYMBOLS=1",
|
||||||
"-DKONAN_WINDOWS=1",
|
"-DKONAN_WINDOWS=1",
|
||||||
|
if (target == KonanTarget.MINGW_X64) "-DKONAN_X64=1" else "-DKONAN_X86=1",
|
||||||
"-DKONAN_NO_MEMMEM=1",
|
"-DKONAN_NO_MEMMEM=1",
|
||||||
"-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1")
|
"-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1")
|
||||||
|
|
||||||
KonanTarget.MACOS_X64 ->
|
KonanTarget.MACOS_X64 ->
|
||||||
listOf("-DKONAN_OSX=1",
|
listOf("-DKONAN_OSX=1",
|
||||||
|
"-DKONAN_MACOSX=1",
|
||||||
|
"-DKONAN_X64=1",
|
||||||
"-DKONAN_OBJC_INTEROP=1",
|
"-DKONAN_OBJC_INTEROP=1",
|
||||||
"-DKONAN_CORE_SYMBOLICATION=1",
|
"-DKONAN_CORE_SYMBOLICATION=1",
|
||||||
"-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1")
|
"-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1")
|
||||||
|
|
||||||
KonanTarget.IOS_ARM32 ->
|
KonanTarget.IOS_ARM32 ->
|
||||||
listOf("-DKONAN_OBJC_INTEROP=1",
|
listOf("-DKONAN_OBJC_INTEROP=1",
|
||||||
|
"-DKONAN_IOS",
|
||||||
|
"-DKONAN_ARM32=1",
|
||||||
"-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1",
|
"-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1",
|
||||||
"-DKONAN_REPORT_BACKTRACE_TO_IOS_CRASH_LOG=1",
|
"-DKONAN_REPORT_BACKTRACE_TO_IOS_CRASH_LOG=1",
|
||||||
"-DMACHSIZE=32",
|
"-DMACHSIZE=32",
|
||||||
@@ -176,12 +189,16 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con
|
|||||||
|
|
||||||
KonanTarget.IOS_ARM64 ->
|
KonanTarget.IOS_ARM64 ->
|
||||||
listOf("-DKONAN_OBJC_INTEROP=1",
|
listOf("-DKONAN_OBJC_INTEROP=1",
|
||||||
|
"-DKONAN_IOS=1",
|
||||||
|
"-DKONAN_ARM64=1",
|
||||||
"-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1",
|
"-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1",
|
||||||
"-DKONAN_REPORT_BACKTRACE_TO_IOS_CRASH_LOG=1",
|
"-DKONAN_REPORT_BACKTRACE_TO_IOS_CRASH_LOG=1",
|
||||||
"-DMACHSIZE=64")
|
"-DMACHSIZE=64")
|
||||||
|
|
||||||
KonanTarget.IOS_X64 ->
|
KonanTarget.IOS_X64 ->
|
||||||
listOf("-DKONAN_OBJC_INTEROP=1",
|
listOf("-DKONAN_OBJC_INTEROP=1",
|
||||||
|
"-DKONAN_IOS=1",
|
||||||
|
"-DKONAN_X64=1",
|
||||||
"-DKONAN_CORE_SYMBOLICATION=1",
|
"-DKONAN_CORE_SYMBOLICATION=1",
|
||||||
"-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=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_GCC_UNWIND=1",
|
||||||
"-DUSE_ELF_SYMBOLS=1",
|
"-DUSE_ELF_SYMBOLS=1",
|
||||||
"-DELFSIZE=32",
|
"-DELFSIZE=32",
|
||||||
"-DKONAN_ANDROID",
|
"-DKONAN_ANDROID=1",
|
||||||
|
"-DKONAN_ARM32=1",
|
||||||
"-DKONAN_NO_UNALIGNED_ACCESS=1")
|
"-DKONAN_NO_UNALIGNED_ACCESS=1")
|
||||||
|
|
||||||
KonanTarget.ANDROID_ARM64 ->
|
KonanTarget.ANDROID_ARM64 ->
|
||||||
@@ -198,7 +216,8 @@ class ClangArgs(private val configurables: Configurables) : Configurables by con
|
|||||||
"-DUSE_GCC_UNWIND=1",
|
"-DUSE_GCC_UNWIND=1",
|
||||||
"-DUSE_ELF_SYMBOLS=1",
|
"-DUSE_ELF_SYMBOLS=1",
|
||||||
"-DELFSIZE=64",
|
"-DELFSIZE=64",
|
||||||
"-DKONAN_ANDROID",
|
"-DKONAN_ANDROID=1",
|
||||||
|
"-DKONAN_ARM64=1",
|
||||||
"-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1")
|
"-DKONAN_HAS_CXX11_EXCEPTION_FUNCTIONS=1")
|
||||||
|
|
||||||
KonanTarget.WASM32 ->
|
KonanTarget.WASM32 ->
|
||||||
|
|||||||
Reference in New Issue
Block a user