Skip to content

Commit 5032467

Browse files
committed
Use VersionTuple for parsing versions in Triple, fixing issues that caused the original change to be reverted. This makes it possible to distinguish between "16" and "16.0" after parsing, which previously was not possible.
This reverts commit 40d5eea. Differential Revision: https://reviews.llvm.org/D114885
1 parent 2ae5011 commit 5032467

24 files changed

+326
-415
lines changed

clang/lib/ARCMigrate/ARCMT.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,9 +162,7 @@ static bool HasARCRuntime(CompilerInvocation &origCI) {
162162
return triple.getOSMajorVersion() >= 11;
163163

164164
if (triple.getOS() == llvm::Triple::MacOSX) {
165-
unsigned Major, Minor, Micro;
166-
triple.getOSVersion(Major, Minor, Micro);
167-
return Major > 10 || (Major == 10 && Minor >= 7);
165+
return triple.getOSVersion() >= VersionTuple(10, 7);
168166
}
169167

170168
return false;

clang/lib/Basic/Targets/OSTargets.cpp

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,12 @@ void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
4848
Builder.defineMacro("_REENTRANT");
4949

5050
// Get the platform type and version number from the triple.
51-
unsigned Maj, Min, Rev;
51+
VersionTuple OsVersion;
5252
if (Triple.isMacOSX()) {
53-
Triple.getMacOSXVersion(Maj, Min, Rev);
53+
Triple.getMacOSXVersion(OsVersion);
5454
PlatformName = "macos";
5555
} else {
56-
Triple.getOSVersion(Maj, Min, Rev);
56+
OsVersion = Triple.getOSVersion();
5757
PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
5858
if (PlatformName == "ios" && Triple.isMacCatalystEnvironment())
5959
PlatformName = "maccatalyst";
@@ -63,29 +63,29 @@ void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
6363
// generating code for Win32 ABI. No need to emit
6464
// __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
6565
if (PlatformName == "win32") {
66-
PlatformMinVersion = VersionTuple(Maj, Min, Rev);
66+
PlatformMinVersion = OsVersion;
6767
return;
6868
}
6969

7070
// Set the appropriate OS version define.
7171
if (Triple.isiOS()) {
72-
assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
72+
assert(OsVersion < VersionTuple(100) && "Invalid version!");
7373
char Str[7];
74-
if (Maj < 10) {
75-
Str[0] = '0' + Maj;
76-
Str[1] = '0' + (Min / 10);
77-
Str[2] = '0' + (Min % 10);
78-
Str[3] = '0' + (Rev / 10);
79-
Str[4] = '0' + (Rev % 10);
74+
if (OsVersion.getMajor() < 10) {
75+
Str[0] = '0' + OsVersion.getMajor();
76+
Str[1] = '0' + (OsVersion.getMinor().getValueOr(0) / 10);
77+
Str[2] = '0' + (OsVersion.getMinor().getValueOr(0) % 10);
78+
Str[3] = '0' + (OsVersion.getSubminor().getValueOr(0) / 10);
79+
Str[4] = '0' + (OsVersion.getSubminor().getValueOr(0) % 10);
8080
Str[5] = '\0';
8181
} else {
8282
// Handle versions >= 10.
83-
Str[0] = '0' + (Maj / 10);
84-
Str[1] = '0' + (Maj % 10);
85-
Str[2] = '0' + (Min / 10);
86-
Str[3] = '0' + (Min % 10);
87-
Str[4] = '0' + (Rev / 10);
88-
Str[5] = '0' + (Rev % 10);
83+
Str[0] = '0' + (OsVersion.getMajor() / 10);
84+
Str[1] = '0' + (OsVersion.getMajor() % 10);
85+
Str[2] = '0' + (OsVersion.getMinor().getValueOr(0) / 10);
86+
Str[3] = '0' + (OsVersion.getMinor().getValueOr(0) % 10);
87+
Str[4] = '0' + (OsVersion.getSubminor().getValueOr(0) / 10);
88+
Str[5] = '0' + (OsVersion.getSubminor().getValueOr(0) % 10);
8989
Str[6] = '\0';
9090
}
9191
if (Triple.isTvOS())
@@ -95,36 +95,36 @@ void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
9595
Str);
9696

9797
} else if (Triple.isWatchOS()) {
98-
assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
98+
assert(OsVersion < VersionTuple(10) && "Invalid version!");
9999
char Str[6];
100-
Str[0] = '0' + Maj;
101-
Str[1] = '0' + (Min / 10);
102-
Str[2] = '0' + (Min % 10);
103-
Str[3] = '0' + (Rev / 10);
104-
Str[4] = '0' + (Rev % 10);
100+
Str[0] = '0' + OsVersion.getMajor();
101+
Str[1] = '0' + (OsVersion.getMinor().getValueOr(0) / 10);
102+
Str[2] = '0' + (OsVersion.getMinor().getValueOr(0) % 10);
103+
Str[3] = '0' + (OsVersion.getSubminor().getValueOr(0) / 10);
104+
Str[4] = '0' + (OsVersion.getSubminor().getValueOr(0) % 10);
105105
Str[5] = '\0';
106106
Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
107107
} else if (Triple.isMacOSX()) {
108108
// Note that the Driver allows versions which aren't representable in the
109109
// define (because we only get a single digit for the minor and micro
110110
// revision numbers). So, we limit them to the maximum representable
111111
// version.
112-
assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
112+
assert(OsVersion < VersionTuple(100) && "Invalid version!");
113113
char Str[7];
114-
if (Maj < 10 || (Maj == 10 && Min < 10)) {
115-
Str[0] = '0' + (Maj / 10);
116-
Str[1] = '0' + (Maj % 10);
117-
Str[2] = '0' + std::min(Min, 9U);
118-
Str[3] = '0' + std::min(Rev, 9U);
114+
if (OsVersion < VersionTuple(10, 10)) {
115+
Str[0] = '0' + (OsVersion.getMajor() / 10);
116+
Str[1] = '0' + (OsVersion.getMajor() % 10);
117+
Str[2] = '0' + std::min(OsVersion.getMinor().getValueOr(0), 9U);
118+
Str[3] = '0' + std::min(OsVersion.getSubminor().getValueOr(0), 9U);
119119
Str[4] = '\0';
120120
} else {
121121
// Handle versions > 10.9.
122-
Str[0] = '0' + (Maj / 10);
123-
Str[1] = '0' + (Maj % 10);
124-
Str[2] = '0' + (Min / 10);
125-
Str[3] = '0' + (Min % 10);
126-
Str[4] = '0' + (Rev / 10);
127-
Str[5] = '0' + (Rev % 10);
122+
Str[0] = '0' + (OsVersion.getMajor() / 10);
123+
Str[1] = '0' + (OsVersion.getMajor() % 10);
124+
Str[2] = '0' + (OsVersion.getMinor().getValueOr(0) / 10);
125+
Str[3] = '0' + (OsVersion.getMinor().getValueOr(0) % 10);
126+
Str[4] = '0' + (OsVersion.getSubminor().getValueOr(0) / 10);
127+
Str[5] = '0' + (OsVersion.getSubminor().getValueOr(0) % 10);
128128
Str[6] = '\0';
129129
}
130130
Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
@@ -134,7 +134,7 @@ void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
134134
if (Triple.isOSDarwin())
135135
Builder.defineMacro("__MACH__");
136136

137-
PlatformMinVersion = VersionTuple(Maj, Min, Rev);
137+
PlatformMinVersion = OsVersion;
138138
}
139139

140140
static void addMinGWDefines(const llvm::Triple &Triple, const LangOptions &Opts,

clang/lib/Basic/Targets/OSTargets.h

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,7 @@ class LLVM_LIBRARY_VISIBILITY DarwinTargetInfo : public OSTargetInfo<Target> {
148148
return 64;
149149
}
150150

151-
unsigned Major, Minor, Micro;
152-
T.getOSVersion(Major, Minor, Micro);
153-
if (llvm::VersionTuple(Major, Minor, Micro) < MinVersion)
151+
if (T.getOSVersion() < MinVersion)
154152
return 64;
155153
return OSTargetInfo<Target>::getExnObjectAlignment();
156154
}
@@ -294,7 +292,7 @@ class LLVM_LIBRARY_VISIBILITY HaikuTargetInfo : public OSTargetInfo<Target> {
294292
Builder.defineMacro("__HAIKU__");
295293
Builder.defineMacro("__ELF__");
296294
DefineStd(Builder, "unix", Opts);
297-
if (this->HasFloat128)
295+
if (this->HasFloat128)
298296
Builder.defineMacro("__FLOAT128__");
299297
}
300298

@@ -376,10 +374,9 @@ class LLVM_LIBRARY_VISIBILITY LinuxTargetInfo : public OSTargetInfo<Target> {
376374
Builder.defineMacro("__ELF__");
377375
if (Triple.isAndroid()) {
378376
Builder.defineMacro("__ANDROID__", "1");
379-
unsigned Maj, Min, Rev;
380-
Triple.getEnvironmentVersion(Maj, Min, Rev);
381377
this->PlatformName = "android";
382-
this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
378+
this->PlatformMinVersion = Triple.getEnvironmentVersion();
379+
const unsigned Maj = this->PlatformMinVersion.getMajor();
383380
if (Maj) {
384381
Builder.defineMacro("__ANDROID_MIN_SDK_VERSION__", Twine(Maj));
385382
// This historical but ambiguous name for the minSdkVersion macro. Keep
@@ -693,23 +690,32 @@ class AIXTargetInfo : public OSTargetInfo<Target> {
693690
if (Opts.EnableAIXExtendedAltivecABI)
694691
Builder.defineMacro("__EXTABI__");
695692

696-
unsigned Major, Minor, Micro;
697-
Triple.getOSVersion(Major, Minor, Micro);
693+
VersionTuple OsVersion = Triple.getOSVersion();
698694

699695
// Define AIX OS-Version Macros.
700696
// Includes logic for legacy versions of AIX; no specific intent to support.
701-
std::pair<int, int> OsVersion = {Major, Minor};
702-
if (OsVersion >= std::make_pair(3, 2)) Builder.defineMacro("_AIX32");
703-
if (OsVersion >= std::make_pair(4, 1)) Builder.defineMacro("_AIX41");
704-
if (OsVersion >= std::make_pair(4, 3)) Builder.defineMacro("_AIX43");
705-
if (OsVersion >= std::make_pair(5, 0)) Builder.defineMacro("_AIX50");
706-
if (OsVersion >= std::make_pair(5, 1)) Builder.defineMacro("_AIX51");
707-
if (OsVersion >= std::make_pair(5, 2)) Builder.defineMacro("_AIX52");
708-
if (OsVersion >= std::make_pair(5, 3)) Builder.defineMacro("_AIX53");
709-
if (OsVersion >= std::make_pair(6, 1)) Builder.defineMacro("_AIX61");
710-
if (OsVersion >= std::make_pair(7, 1)) Builder.defineMacro("_AIX71");
711-
if (OsVersion >= std::make_pair(7, 2)) Builder.defineMacro("_AIX72");
712-
if (OsVersion >= std::make_pair(7, 3)) Builder.defineMacro("_AIX73");
697+
if (OsVersion >= VersionTuple(3, 2))
698+
Builder.defineMacro("_AIX32");
699+
if (OsVersion >= VersionTuple(4, 1))
700+
Builder.defineMacro("_AIX41");
701+
if (OsVersion >= VersionTuple(4, 3))
702+
Builder.defineMacro("_AIX43");
703+
if (OsVersion >= VersionTuple(5, 0))
704+
Builder.defineMacro("_AIX50");
705+
if (OsVersion >= VersionTuple(5, 1))
706+
Builder.defineMacro("_AIX51");
707+
if (OsVersion >= VersionTuple(5, 2))
708+
Builder.defineMacro("_AIX52");
709+
if (OsVersion >= VersionTuple(5, 3))
710+
Builder.defineMacro("_AIX53");
711+
if (OsVersion >= VersionTuple(6, 1))
712+
Builder.defineMacro("_AIX61");
713+
if (OsVersion >= VersionTuple(7, 1))
714+
Builder.defineMacro("_AIX71");
715+
if (OsVersion >= VersionTuple(7, 2))
716+
Builder.defineMacro("_AIX72");
717+
if (OsVersion >= VersionTuple(7, 3))
718+
Builder.defineMacro("_AIX73");
713719

714720
// FIXME: Do not define _LONG_LONG when -fno-long-long is specified.
715721
Builder.defineMacro("_LONG_LONG");

clang/lib/Basic/Targets/X86.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -472,10 +472,9 @@ class LLVM_LIBRARY_VISIBILITY NetBSDI386TargetInfo
472472
: NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
473473

474474
unsigned getFloatEvalMethod() const override {
475-
unsigned Major, Minor, Micro;
476-
getTriple().getOSVersion(Major, Minor, Micro);
475+
VersionTuple OsVersion = getTriple().getOSVersion();
477476
// New NetBSD uses the default rounding mode.
478-
if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
477+
if (OsVersion >= VersionTuple(6, 99, 26) || OsVersion.getMajor() == 0)
479478
return X86_32TargetInfo::getFloatEvalMethod();
480479
// NetBSD before 6.99.26 defaults to "double" rounding.
481480
return 1;

clang/lib/Driver/ToolChains/Darwin.cpp

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1410,8 +1410,8 @@ static std::string getSystemOrSDKMacOSVersion(StringRef MacOSSDKVersion) {
14101410
llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
14111411
if (!SystemTriple.isMacOSX())
14121412
return std::string(MacOSSDKVersion);
1413-
SystemTriple.getMacOSXVersion(Major, Minor, Micro);
1414-
VersionTuple SystemVersion(Major, Minor, Micro);
1413+
VersionTuple SystemVersion;
1414+
SystemTriple.getMacOSXVersion(SystemVersion);
14151415
bool HadExtra;
14161416
if (!Driver::GetReleaseVersion(MacOSSDKVersion, Major, Minor, Micro,
14171417
HadExtra))
@@ -1552,12 +1552,10 @@ struct DarwinPlatform {
15521552
const Optional<DarwinSDKInfo> &SDKInfo) {
15531553
DarwinPlatform Result(TargetArg, getPlatformFromOS(TT.getOS()), OSVersion,
15541554
A);
1555-
unsigned Major, Minor, Micro;
1556-
TT.getOSVersion(Major, Minor, Micro);
1557-
if (Major == 0)
1555+
VersionTuple OsVersion = TT.getOSVersion();
1556+
if (OsVersion.getMajor() == 0)
15581557
Result.HasOSVersion = false;
1559-
Result.setEnvironment(TT.getEnvironment(),
1560-
VersionTuple(Major, Minor, Micro), SDKInfo);
1558+
Result.setEnvironment(TT.getEnvironment(), OsVersion, SDKInfo);
15611559
return Result;
15621560
}
15631561
static DarwinPlatform
@@ -1803,7 +1801,7 @@ inferDeploymentTargetFromSDK(DerivedArgList &Args,
18031801

18041802
std::string getOSVersion(llvm::Triple::OSType OS, const llvm::Triple &Triple,
18051803
const Driver &TheDriver) {
1806-
unsigned Major, Minor, Micro;
1804+
VersionTuple OsVersion;
18071805
llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
18081806
switch (OS) {
18091807
case llvm::Triple::Darwin:
@@ -1812,32 +1810,32 @@ std::string getOSVersion(llvm::Triple::OSType OS, const llvm::Triple &Triple,
18121810
// macos, use the host triple to infer OS version.
18131811
if (Triple.isMacOSX() && SystemTriple.isMacOSX() &&
18141812
!Triple.getOSMajorVersion())
1815-
SystemTriple.getMacOSXVersion(Major, Minor, Micro);
1816-
else if (!Triple.getMacOSXVersion(Major, Minor, Micro))
1813+
SystemTriple.getMacOSXVersion(OsVersion);
1814+
else if (!Triple.getMacOSXVersion(OsVersion))
18171815
TheDriver.Diag(diag::err_drv_invalid_darwin_version)
18181816
<< Triple.getOSName();
18191817
break;
18201818
case llvm::Triple::IOS:
18211819
if (Triple.isMacCatalystEnvironment() && !Triple.getOSMajorVersion()) {
1822-
Major = 13;
1823-
Minor = 1;
1824-
Micro = 0;
1820+
OsVersion = VersionTuple(13, 1);
18251821
} else
1826-
Triple.getiOSVersion(Major, Minor, Micro);
1822+
OsVersion = Triple.getiOSVersion();
18271823
break;
18281824
case llvm::Triple::TvOS:
1829-
Triple.getOSVersion(Major, Minor, Micro);
1825+
OsVersion = Triple.getOSVersion();
18301826
break;
18311827
case llvm::Triple::WatchOS:
1832-
Triple.getWatchOSVersion(Major, Minor, Micro);
1828+
OsVersion = Triple.getWatchOSVersion();
18331829
break;
18341830
default:
18351831
llvm_unreachable("Unexpected OS type");
18361832
break;
18371833
}
18381834

18391835
std::string OSVersion;
1840-
llvm::raw_string_ostream(OSVersion) << Major << '.' << Minor << '.' << Micro;
1836+
llvm::raw_string_ostream(OSVersion)
1837+
<< OsVersion.getMajor() << '.' << OsVersion.getMinor().getValueOr(0)
1838+
<< '.' << OsVersion.getSubminor().getValueOr(0);
18411839
return OSVersion;
18421840
}
18431841

@@ -1907,15 +1905,13 @@ getDeploymentTargetFromMTargetOSArg(DerivedArgList &Args,
19071905
return None;
19081906
}
19091907

1910-
unsigned Major, Minor, Micro;
1911-
TT.getOSVersion(Major, Minor, Micro);
1912-
if (!Major) {
1908+
VersionTuple Version = TT.getOSVersion();
1909+
if (!Version.getMajor()) {
19131910
TheDriver.Diag(diag::err_drv_invalid_version_number)
19141911
<< A->getAsString(Args);
19151912
return None;
19161913
}
1917-
return DarwinPlatform::createFromMTargetOS(TT.getOS(),
1918-
VersionTuple(Major, Minor, Micro),
1914+
return DarwinPlatform::createFromMTargetOS(TT.getOS(), Version,
19191915
TT.getEnvironment(), A, SDKInfo);
19201916
}
19211917

clang/lib/Driver/ToolChains/Linux.cpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -277,14 +277,11 @@ Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
277277
// Android sysroots contain a library directory for each supported OS
278278
// version as well as some unversioned libraries in the usual multiarch
279279
// directory.
280-
unsigned Major;
281-
unsigned Minor;
282-
unsigned Micro;
283-
Triple.getEnvironmentVersion(Major, Minor, Micro);
284-
addPathIfExists(D,
285-
SysRoot + "/usr/lib/" + MultiarchTriple + "/" +
286-
llvm::to_string(Major),
287-
Paths);
280+
addPathIfExists(
281+
D,
282+
SysRoot + "/usr/lib/" + MultiarchTriple + "/" +
283+
llvm::to_string(Triple.getEnvironmentVersion().getMajor()),
284+
Paths);
288285
}
289286

290287
addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths);

clang/lib/Driver/ToolChains/MSVC.cpp

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1194,14 +1194,6 @@ bool MSVCToolChain::getUniversalCRTLibraryPath(const ArgList &Args,
11941194
return true;
11951195
}
11961196

1197-
static VersionTuple getMSVCVersionFromTriple(const llvm::Triple &Triple) {
1198-
unsigned Major, Minor, Micro;
1199-
Triple.getEnvironmentVersion(Major, Minor, Micro);
1200-
if (Major || Minor || Micro)
1201-
return VersionTuple(Major, Minor, Micro);
1202-
return VersionTuple();
1203-
}
1204-
12051197
static VersionTuple getMSVCVersionFromExe(const std::string &BinDir) {
12061198
VersionTuple Version;
12071199
#ifdef _WIN32
@@ -1374,7 +1366,7 @@ VersionTuple MSVCToolChain::computeMSVCVersion(const Driver *D,
13741366
bool IsWindowsMSVC = getTriple().isWindowsMSVCEnvironment();
13751367
VersionTuple MSVT = ToolChain::computeMSVCVersion(D, Args);
13761368
if (MSVT.empty())
1377-
MSVT = getMSVCVersionFromTriple(getTriple());
1369+
MSVT = getTriple().getEnvironmentVersion();
13781370
if (MSVT.empty() && IsWindowsMSVC)
13791371
MSVT = getMSVCVersionFromExe(getSubDirectoryPath(SubDirectoryType::Bin));
13801372
if (MSVT.empty() &&

0 commit comments

Comments
 (0)