Skip to content

Commit bed3e1a

Browse files
author
Julian Lettner
committed
[Sanitizer] Update macOS version checking
Support macOS 11 in our runtime version checking code and update `GetMacosAlignedVersionInternal()` accordingly. This follows the implementation of `Triple::getMacOSXVersion()` in the Clang driver. Reviewed By: delcypher Differential Revision: https://reviews.llvm.org/D82918
1 parent f721e05 commit bed3e1a

File tree

2 files changed

+20
-6
lines changed

2 files changed

+20
-6
lines changed

compiler-rt/lib/sanitizer_common/sanitizer_mac.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -606,12 +606,22 @@ HandleSignalMode GetHandleSignalMode(int signum) {
606606
return result;
607607
}
608608

609+
// This corresponds to Triple::getMacOSXVersion() in the Clang driver.
609610
static MacosVersion GetMacosAlignedVersionInternal() {
610611
u16 kernel_major = GetDarwinKernelVersion().major;
611-
const u16 version_offset = 4;
612-
CHECK_GE(kernel_major, version_offset);
613-
u16 macos_major = kernel_major - version_offset;
614-
return MacosVersion(10, macos_major);
612+
// Darwin 0-3 -> unsupported
613+
// Darwin 4-19 -> macOS 10.x
614+
// Darwin 20+ -> macOS 11+
615+
CHECK_GE(kernel_major, 4);
616+
u16 major, minor;
617+
if (kernel_major < 20) {
618+
major = 10;
619+
minor = kernel_major - 4;
620+
} else {
621+
major = 11 + kernel_major - 20;
622+
minor = 0;
623+
}
624+
return MacosVersion(major, minor);
615625
}
616626

617627
static_assert(sizeof(MacosVersion) == sizeof(atomic_uint32_t::Type),

compiler-rt/lib/sanitizer_common/tests/sanitizer_mac_test.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,12 @@ namespace __sanitizer {
2424

2525
TEST(SanitizerMac, GetMacosAlignedVersion) {
2626
MacosVersion vers = GetMacosAlignedVersion();
27-
EXPECT_EQ(vers.major, 10);
28-
EXPECT_EQ(vers.minor, GetDarwinKernelVersion().major - 4);
27+
u16 kernel_major = GetDarwinKernelVersion().major;
28+
bool macos_11 = (kernel_major >= 20);
29+
u16 expected_major = macos_11 ? (kernel_major - 9) : 10;
30+
u16 expected_minor = macos_11 ? 0 : (kernel_major - 4);
31+
EXPECT_EQ(vers.major, expected_major);
32+
EXPECT_EQ(vers.minor, expected_minor);
2933
}
3034

3135
void ParseVersion(const char *vers, u16 *major, u16 *minor);

0 commit comments

Comments
 (0)