[compiler-rt] [compiler-rt][builtins] Upstream __isPlatformOrVariantPlatformVersionAtLeast() (PR #100605)
Allan Shortlidge via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 25 10:27:22 PDT 2024
https://github.com/tshortli created https://github.com/llvm/llvm-project/pull/100605
Add `__isPlatformOrVariantPlatformVersionAtLeast()` which is used to check OS version availability from zippered libraries on macOS. This routine is needed for complete macCatalyst support in the Swift compiler.
>From 5c64dae4a7e34ed84c4a28af62735258abe20729 Mon Sep 17 00:00:00 2001
From: Allan Shortlidge <shortlidge at apple.com>
Date: Wed, 24 Jul 2024 21:20:12 -0700
Subject: [PATCH] [compiler-rt][builtins] Upstream
__isPlatformOrVariantPlatformVersionAtLeast().
Add `__isPlatformOrVariantPlatformVersionAtLeast()` which is used to check OS
version availability from zippered libraries on macOS. This routine is needed
for complete macCatalyst support in the Swift compiler.
---
compiler-rt/lib/builtins/os_version_check.c | 26 +++++++++++++++++++
.../Darwin/platform_version_check_test.c | 11 ++++++++
2 files changed, 37 insertions(+)
diff --git a/compiler-rt/lib/builtins/os_version_check.c b/compiler-rt/lib/builtins/os_version_check.c
index 01fae834ab219..b10f23a81a9c6 100644
--- a/compiler-rt/lib/builtins/os_version_check.c
+++ b/compiler-rt/lib/builtins/os_version_check.c
@@ -14,6 +14,7 @@
#ifdef __APPLE__
#include <TargetConditionals.h>
+#include <assert.h>
#include <dispatch/dispatch.h>
#include <dlfcn.h>
#include <stdint.h>
@@ -270,6 +271,8 @@ static inline uint32_t ConstructVersion(uint32_t Major, uint32_t Minor,
return ((Major & 0xffff) << 16) | ((Minor & 0xff) << 8) | (Subminor & 0xff);
}
+#define PLATFORM_MACOS 1
+
int32_t __isPlatformVersionAtLeast(uint32_t Platform, uint32_t Major,
uint32_t Minor, uint32_t Subminor) {
dispatch_once_f(&DispatchOnceCounter, NULL, initializeAvailabilityCheck);
@@ -282,6 +285,29 @@ int32_t __isPlatformVersionAtLeast(uint32_t Platform, uint32_t Major,
return AvailabilityVersionCheck(1, Versions);
}
+#if TARGET_OS_OSX
+
+int32_t __isPlatformOrVariantPlatformVersionAtLeast(
+ uint32_t Platform, uint32_t Major, uint32_t Minor, uint32_t Subminor,
+ uint32_t Platform2, uint32_t Major2, uint32_t Minor2, uint32_t Subminor2) {
+ dispatch_once_f(&DispatchOnceCounter, NULL, initializeAvailabilityCheck);
+
+ if (!AvailabilityVersionCheck) {
+ // Handle case of back-deployment for older macOS.
+ if (Platform == PLATFORM_MACOS) {
+ return __isOSVersionAtLeast(Major, Minor, Subminor);
+ }
+ assert(Platform2 == PLATFORM_MACOS && "unexpected platform");
+ return __isOSVersionAtLeast(Major2, Minor2, Subminor2);
+ }
+ dyld_build_version_t Versions[] = {
+ {Platform, ConstructVersion(Major, Minor, Subminor)},
+ {Platform2, ConstructVersion(Major2, Minor2, Subminor2)}};
+ return AvailabilityVersionCheck(2, Versions);
+}
+
+#endif
+
#elif __ANDROID__
#include <pthread.h>
diff --git a/compiler-rt/test/builtins/TestCases/Darwin/platform_version_check_test.c b/compiler-rt/test/builtins/TestCases/Darwin/platform_version_check_test.c
index da0e366430a73..ebbeba1cd0014 100644
--- a/compiler-rt/test/builtins/TestCases/Darwin/platform_version_check_test.c
+++ b/compiler-rt/test/builtins/TestCases/Darwin/platform_version_check_test.c
@@ -7,11 +7,22 @@ typedef unsigned int uint32_t;
int32_t __isPlatformVersionAtLeast(uint32_t Platform, uint32_t Major,
uint32_t Minor, uint32_t Subminor);
+int32_t __isPlatformOrVariantPlatformVersionAtLeast(
+ uint32_t Platform, uint32_t Major, uint32_t Minor, uint32_t Subminor,
+ uint32_t Platform2, uint32_t Major2, uint32_t Minor2, uint32_t Subminor2);
+
+void exit(int status);
+
#define PLATFORM_MACOS 1
+#define PLATFORM_IOS 2
int32_t check(uint32_t Major, uint32_t Minor, uint32_t Subminor) {
int32_t Result =
__isPlatformVersionAtLeast(PLATFORM_MACOS, Major, Minor, Subminor);
+ int32_t ResultVariant = __isPlatformOrVariantPlatformVersionAtLeast(
+ PLATFORM_MACOS, Major, Minor, Subminor, PLATFORM_IOS, 13, 0, 0);
+ if (Result != ResultVariant)
+ exit(-1);
return Result;
}
More information about the llvm-commits
mailing list