Skip to content

Commit a70f7a5

Browse files
authored
Merge pull request swiftlang#9007 from tshortli/upstream-is-platform-or-variant-platform-version-at-least-20230725
[darwin] Upstream __isPlatformOrVariantPlatformVersionAtLeast()
2 parents 65ce91c + f37c638 commit a70f7a5

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

compiler-rt/lib/builtins/os_version_check.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#ifdef __APPLE__
1515

1616
#include <TargetConditionals.h>
17+
#include <assert.h>
1718
#include <dispatch/dispatch.h>
1819
#include <dlfcn.h>
1920
#include <stdint.h>
@@ -270,6 +271,8 @@ static inline uint32_t ConstructVersion(uint32_t Major, uint32_t Minor,
270271
return ((Major & 0xffff) << 16) | ((Minor & 0xff) << 8) | (Subminor & 0xff);
271272
}
272273

274+
#define PLATFORM_MACOS 1
275+
273276
int32_t __isPlatformVersionAtLeast(uint32_t Platform, uint32_t Major,
274277
uint32_t Minor, uint32_t Subminor) {
275278
dispatch_once_f(&DispatchOnceCounter, NULL, initializeAvailabilityCheck);
@@ -282,6 +285,29 @@ int32_t __isPlatformVersionAtLeast(uint32_t Platform, uint32_t Major,
282285
return AvailabilityVersionCheck(1, Versions);
283286
}
284287

288+
#if TARGET_OS_OSX
289+
290+
int32_t __isPlatformOrVariantPlatformVersionAtLeast(
291+
uint32_t Platform, uint32_t Major, uint32_t Minor, uint32_t Subminor,
292+
uint32_t Platform2, uint32_t Major2, uint32_t Minor2, uint32_t Subminor2) {
293+
dispatch_once_f(&DispatchOnceCounter, NULL, initializeAvailabilityCheck);
294+
295+
if (!AvailabilityVersionCheck) {
296+
// Handle case of back-deployment for older macOS.
297+
if (Platform == PLATFORM_MACOS) {
298+
return __isOSVersionAtLeast(Major, Minor, Subminor);
299+
}
300+
assert(Platform2 == PLATFORM_MACOS && "unexpected platform");
301+
return __isOSVersionAtLeast(Major2, Minor2, Subminor2);
302+
}
303+
dyld_build_version_t Versions[] = {
304+
{Platform, ConstructVersion(Major, Minor, Subminor)},
305+
{Platform2, ConstructVersion(Major2, Minor2, Subminor2)}};
306+
return AvailabilityVersionCheck(2, Versions);
307+
}
308+
309+
#endif
310+
285311
#elif __ANDROID__
286312

287313
#include <pthread.h>

compiler-rt/test/builtins/TestCases/Darwin/platform_version_check_test.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,22 @@ typedef unsigned int uint32_t;
77
int32_t __isPlatformVersionAtLeast(uint32_t Platform, uint32_t Major,
88
uint32_t Minor, uint32_t Subminor);
99

10+
int32_t __isPlatformOrVariantPlatformVersionAtLeast(
11+
uint32_t Platform, uint32_t Major, uint32_t Minor, uint32_t Subminor,
12+
uint32_t Platform2, uint32_t Major2, uint32_t Minor2, uint32_t Subminor2);
13+
14+
void exit(int status);
15+
1016
#define PLATFORM_MACOS 1
17+
#define PLATFORM_IOS 2
1118

1219
int32_t check(uint32_t Major, uint32_t Minor, uint32_t Subminor) {
1320
int32_t Result =
1421
__isPlatformVersionAtLeast(PLATFORM_MACOS, Major, Minor, Subminor);
22+
int32_t ResultVariant = __isPlatformOrVariantPlatformVersionAtLeast(
23+
PLATFORM_MACOS, Major, Minor, Subminor, PLATFORM_IOS, 13, 0, 0);
24+
if (Result != ResultVariant)
25+
exit(-1);
1526
return Result;
1627
}
1728

0 commit comments

Comments
 (0)