From 9ded2723982e852661d917ba236b51eb0ac04ca4 Mon Sep 17 00:00:00 2001 From: Nikolay Igotti Date: Tue, 5 Mar 2019 22:08:00 +0300 Subject: [PATCH] Add Platform detection support. (#2737) --- runtime/src/main/cpp/Runtime.cpp | 56 ++++++++++++++ .../main/kotlin/kotlin/native/Annotations.kt | 3 +- .../src/main/kotlin/kotlin/native/Platform.kt | 73 +++++++++++++++++++ .../kotlin/konan/target/ClangArgs.kt | 23 +++++- 4 files changed, 152 insertions(+), 3 deletions(-) create mode 100644 runtime/src/main/kotlin/kotlin/native/Platform.kt diff --git a/runtime/src/main/cpp/Runtime.cpp b/runtime/src/main/cpp/Runtime.cpp index 4699de7bfd9..92992a1a0aa 100644 --- a/runtime/src/main/cpp/Runtime.cpp +++ b/runtime/src/main/cpp/Runtime.cpp @@ -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" diff --git a/runtime/src/main/kotlin/kotlin/native/Annotations.kt b/runtime/src/main/kotlin/kotlin/native/Annotations.kt index c68d2de147e..3e9babe4fc7 100644 --- a/runtime/src/main/kotlin/kotlin/native/Annotations.kt +++ b/runtime/src/main/kotlin/kotlin/native/Annotations.kt @@ -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 = "") \ No newline at end of file +public annotation class CName(val externName: String = "", val shortName: String = "") + diff --git a/runtime/src/main/kotlin/kotlin/native/Platform.kt b/runtime/src/main/kotlin/kotlin/native/Platform.kt new file mode 100644 index 00000000000..119043d1480 --- /dev/null +++ b/runtime/src/main/kotlin/kotlin/native/Platform.kt @@ -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 diff --git a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/ClangArgs.kt b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/ClangArgs.kt index dfd765dcd50..38e3a1306c8 100644 --- a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/ClangArgs.kt +++ b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/ClangArgs.kt @@ -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 ->