Skip to content

Commit 1e82864

Browse files
committed
Use VersionTuple for parsing versions in Triple. This makes it possible to distinguish between "16" and "16.0" after parsing, which previously was not possible.
See also android/ndk#1455. Differential Revision: https://reviews.llvm.org/D114163
1 parent c9ad356 commit 1e82864

23 files changed

+292
-377
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
@@ -1412,8 +1412,8 @@ static std::string getSystemOrSDKMacOSVersion(StringRef MacOSSDKVersion) {
14121412
llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
14131413
if (!SystemTriple.isMacOSX())
14141414
return std::string(MacOSSDKVersion);
1415-
SystemTriple.getMacOSXVersion(Major, Minor, Micro);
1416-
VersionTuple SystemVersion(Major, Minor, Micro);
1415+
VersionTuple SystemVersion;
1416+
SystemTriple.getMacOSXVersion(SystemVersion);
14171417
bool HadExtra;
14181418
if (!Driver::GetReleaseVersion(MacOSSDKVersion, Major, Minor, Micro,
14191419
HadExtra))
@@ -1554,12 +1554,10 @@ struct DarwinPlatform {
15541554
const Optional<DarwinSDKInfo> &SDKInfo) {
15551555
DarwinPlatform Result(TargetArg, getPlatformFromOS(TT.getOS()), OSVersion,
15561556
A);
1557-
unsigned Major, Minor, Micro;
1558-
TT.getOSVersion(Major, Minor, Micro);
1559-
if (Major == 0)
1557+
VersionTuple OsVersion = TT.getOSVersion();
1558+
if (OsVersion.getMajor() == 0)
15601559
Result.HasOSVersion = false;
1561-
Result.setEnvironment(TT.getEnvironment(),
1562-
VersionTuple(Major, Minor, Micro), SDKInfo);
1560+
Result.setEnvironment(TT.getEnvironment(), OsVersion, SDKInfo);
15631561
return Result;
15641562
}
15651563
static DarwinPlatform
@@ -1805,7 +1803,7 @@ inferDeploymentTargetFromSDK(DerivedArgList &Args,
18051803

18061804
std::string getOSVersion(llvm::Triple::OSType OS, const llvm::Triple &Triple,
18071805
const Driver &TheDriver) {
1808-
unsigned Major, Minor, Micro;
1806+
VersionTuple OsVersion;
18091807
llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
18101808
switch (OS) {
18111809
case llvm::Triple::Darwin:
@@ -1814,32 +1812,32 @@ std::string getOSVersion(llvm::Triple::OSType OS, const llvm::Triple &Triple,
18141812
// macos, use the host triple to infer OS version.
18151813
if (Triple.isMacOSX() && SystemTriple.isMacOSX() &&
18161814
!Triple.getOSMajorVersion())
1817-
SystemTriple.getMacOSXVersion(Major, Minor, Micro);
1818-
else if (!Triple.getMacOSXVersion(Major, Minor, Micro))
1815+
SystemTriple.getMacOSXVersion(OsVersion);
1816+
else if (!Triple.getMacOSXVersion(OsVersion))
18191817
TheDriver.Diag(diag::err_drv_invalid_darwin_version)
18201818
<< Triple.getOSName();
18211819
break;
18221820
case llvm::Triple::IOS:
18231821
if (Triple.isMacCatalystEnvironment() && !Triple.getOSMajorVersion()) {
1824-
Major = 13;
1825-
Minor = 1;
1826-
Micro = 0;
1822+
OsVersion = VersionTuple(13, 1);
18271823
} else
1828-
Triple.getiOSVersion(Major, Minor, Micro);
1824+
OsVersion = Triple.getiOSVersion();
18291825
break;
18301826
case llvm::Triple::TvOS:
1831-
Triple.getOSVersion(Major, Minor, Micro);
1827+
OsVersion = Triple.getOSVersion();
18321828
break;
18331829
case llvm::Triple::WatchOS:
1834-
Triple.getWatchOSVersion(Major, Minor, Micro);
1830+
OsVersion = Triple.getWatchOSVersion();
18351831
break;
18361832
default:
18371833
llvm_unreachable("Unexpected OS type");
18381834
break;
18391835
}
18401836

18411837
std::string OSVersion;
1842-
llvm::raw_string_ostream(OSVersion) << Major << '.' << Minor << '.' << Micro;
1838+
llvm::raw_string_ostream(OSVersion)
1839+
<< OsVersion.getMajor() << '.' << OsVersion.getMinor().getValueOr(0)
1840+
<< '.' << OsVersion.getSubminor().getValueOr(0);
18431841
return OSVersion;
18441842
}
18451843

@@ -1909,15 +1907,13 @@ getDeploymentTargetFromMTargetOSArg(DerivedArgList &Args,
19091907
return None;
19101908
}
19111909

1912-
unsigned Major, Minor, Micro;
1913-
TT.getOSVersion(Major, Minor, Micro);
1914-
if (!Major) {
1910+
VersionTuple Version = TT.getOSVersion();
1911+
if (!Version.getMajor()) {
19151912
TheDriver.Diag(diag::err_drv_invalid_version_number)
19161913
<< A->getAsString(Args);
19171914
return None;
19181915
}
1919-
return DarwinPlatform::createFromMTargetOS(TT.getOS(),
1920-
VersionTuple(Major, Minor, Micro),
1916+
return DarwinPlatform::createFromMTargetOS(TT.getOS(), Version,
19211917
TT.getEnvironment(), A, SDKInfo);
19221918
}
19231919

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)