[compiler-rt][builtins] Upstream __isPlatformOrVariantPlatformVersionAtLeast() (#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.
This commit is contained in:
parent
89b67a6400
commit
9808f48453
@ -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>
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user