[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:
Allan Shortlidge 2024-07-30 14:19:39 -07:00 committed by GitHub
parent 89b67a6400
commit 9808f48453
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 37 additions and 0 deletions

View File

@ -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>

View File

@ -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;
}