Skip to content

Commit 40d5eea

Browse files
committed
Revert "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."
This reverts commit 1e82864. llvm/test/Transforms/LoopStrengthReduce/X86/2009-11-10-LSRCrash.ll fails with assertion failure: llc: /home/nikic/llvm-project/llvm/include/llvm/ADT/Optional.h:196: T& llvm::optional_detail::OptionalStorage<T, true>::getValue() & [with T = unsigned int]: Assertion `hasVal' failed. ... #8 0x00005633843af5cb llvm::MCStreamer::emitVersionForTarget(llvm::Triple const&, llvm::VersionTuple const&) #9 0x0000563383b47f14 llvm::AsmPrinter::doInitialization(llvm::Module&)
1 parent a356dae commit 40d5eea

23 files changed

+377
-292
lines changed

clang/lib/ARCMigrate/ARCMT.cpp

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

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

168170
return false;

clang/lib/Basic/Targets/OSTargets.cpp

+36-36
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-
VersionTuple OsVersion;
51+
unsigned Maj, Min, Rev;
5252
if (Triple.isMacOSX()) {
53-
Triple.getMacOSXVersion(OsVersion);
53+
Triple.getMacOSXVersion(Maj, Min, Rev);
5454
PlatformName = "macos";
5555
} else {
56-
OsVersion = Triple.getOSVersion();
56+
Triple.getOSVersion(Maj, Min, Rev);
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 = OsVersion;
66+
PlatformMinVersion = VersionTuple(Maj, Min, Rev);
6767
return;
6868
}
6969

7070
// Set the appropriate OS version define.
7171
if (Triple.isiOS()) {
72-
assert(OsVersion < VersionTuple(100) && "Invalid version!");
72+
assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
7373
char Str[7];
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);
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);
8080
Str[5] = '\0';
8181
} else {
8282
// Handle versions >= 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);
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);
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(OsVersion < VersionTuple(10) && "Invalid version!");
98+
assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
9999
char Str[6];
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);
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);
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(OsVersion < VersionTuple(100) && "Invalid version!");
112+
assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
113113
char Str[7];
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);
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);
119119
Str[4] = '\0';
120120
} else {
121121
// Handle versions > 10.9.
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);
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);
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 = OsVersion;
137+
PlatformMinVersion = VersionTuple(Maj, Min, Rev);
138138
}
139139

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

clang/lib/Basic/Targets/OSTargets.h

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

151-
if (T.getOSVersion() < MinVersion)
151+
unsigned Major, Minor, Micro;
152+
T.getOSVersion(Major, Minor, Micro);
153+
if (llvm::VersionTuple(Major, Minor, Micro) < MinVersion)
152154
return 64;
153155
return OSTargetInfo<Target>::getExnObjectAlignment();
154156
}
@@ -292,7 +294,7 @@ class LLVM_LIBRARY_VISIBILITY HaikuTargetInfo : public OSTargetInfo<Target> {
292294
Builder.defineMacro("__HAIKU__");
293295
Builder.defineMacro("__ELF__");
294296
DefineStd(Builder, "unix", Opts);
295-
if (this->HasFloat128)
297+
if (this->HasFloat128)
296298
Builder.defineMacro("__FLOAT128__");
297299
}
298300

@@ -374,9 +376,10 @@ class LLVM_LIBRARY_VISIBILITY LinuxTargetInfo : public OSTargetInfo<Target> {
374376
Builder.defineMacro("__ELF__");
375377
if (Triple.isAndroid()) {
376378
Builder.defineMacro("__ANDROID__", "1");
379+
unsigned Maj, Min, Rev;
380+
Triple.getEnvironmentVersion(Maj, Min, Rev);
377381
this->PlatformName = "android";
378-
this->PlatformMinVersion = Triple.getEnvironmentVersion();
379-
const unsigned Maj = this->PlatformMinVersion.getMajor();
382+
this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
380383
if (Maj) {
381384
Builder.defineMacro("__ANDROID_MIN_SDK_VERSION__", Twine(Maj));
382385
// This historical but ambiguous name for the minSdkVersion macro. Keep
@@ -690,32 +693,23 @@ class AIXTargetInfo : public OSTargetInfo<Target> {
690693
if (Opts.EnableAIXExtendedAltivecABI)
691694
Builder.defineMacro("__EXTABI__");
692695

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

695699
// Define AIX OS-Version Macros.
696700
// Includes logic for legacy versions of AIX; no specific intent to support.
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");
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");
719713

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

clang/lib/Basic/Targets/X86.h

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

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

clang/lib/Driver/ToolChains/Darwin.cpp

+22-18
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-
VersionTuple SystemVersion;
1416-
SystemTriple.getMacOSXVersion(SystemVersion);
1415+
SystemTriple.getMacOSXVersion(Major, Minor, Micro);
1416+
VersionTuple SystemVersion(Major, Minor, Micro);
14171417
bool HadExtra;
14181418
if (!Driver::GetReleaseVersion(MacOSSDKVersion, Major, Minor, Micro,
14191419
HadExtra))
@@ -1554,10 +1554,12 @@ struct DarwinPlatform {
15541554
const Optional<DarwinSDKInfo> &SDKInfo) {
15551555
DarwinPlatform Result(TargetArg, getPlatformFromOS(TT.getOS()), OSVersion,
15561556
A);
1557-
VersionTuple OsVersion = TT.getOSVersion();
1558-
if (OsVersion.getMajor() == 0)
1557+
unsigned Major, Minor, Micro;
1558+
TT.getOSVersion(Major, Minor, Micro);
1559+
if (Major == 0)
15591560
Result.HasOSVersion = false;
1560-
Result.setEnvironment(TT.getEnvironment(), OsVersion, SDKInfo);
1561+
Result.setEnvironment(TT.getEnvironment(),
1562+
VersionTuple(Major, Minor, Micro), SDKInfo);
15611563
return Result;
15621564
}
15631565
static DarwinPlatform
@@ -1803,7 +1805,7 @@ inferDeploymentTargetFromSDK(DerivedArgList &Args,
18031805

18041806
std::string getOSVersion(llvm::Triple::OSType OS, const llvm::Triple &Triple,
18051807
const Driver &TheDriver) {
1806-
VersionTuple OsVersion;
1808+
unsigned Major, Minor, Micro;
18071809
llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
18081810
switch (OS) {
18091811
case llvm::Triple::Darwin:
@@ -1812,32 +1814,32 @@ std::string getOSVersion(llvm::Triple::OSType OS, const llvm::Triple &Triple,
18121814
// macos, use the host triple to infer OS version.
18131815
if (Triple.isMacOSX() && SystemTriple.isMacOSX() &&
18141816
!Triple.getOSMajorVersion())
1815-
SystemTriple.getMacOSXVersion(OsVersion);
1816-
else if (!Triple.getMacOSXVersion(OsVersion))
1817+
SystemTriple.getMacOSXVersion(Major, Minor, Micro);
1818+
else if (!Triple.getMacOSXVersion(Major, Minor, Micro))
18171819
TheDriver.Diag(diag::err_drv_invalid_darwin_version)
18181820
<< Triple.getOSName();
18191821
break;
18201822
case llvm::Triple::IOS:
18211823
if (Triple.isMacCatalystEnvironment() && !Triple.getOSMajorVersion()) {
1822-
OsVersion = VersionTuple(13, 1);
1824+
Major = 13;
1825+
Minor = 1;
1826+
Micro = 0;
18231827
} else
1824-
OsVersion = Triple.getiOSVersion();
1828+
Triple.getiOSVersion(Major, Minor, Micro);
18251829
break;
18261830
case llvm::Triple::TvOS:
1827-
OsVersion = Triple.getOSVersion();
1831+
Triple.getOSVersion(Major, Minor, Micro);
18281832
break;
18291833
case llvm::Triple::WatchOS:
1830-
OsVersion = Triple.getWatchOSVersion();
1834+
Triple.getWatchOSVersion(Major, Minor, Micro);
18311835
break;
18321836
default:
18331837
llvm_unreachable("Unexpected OS type");
18341838
break;
18351839
}
18361840

18371841
std::string OSVersion;
1838-
llvm::raw_string_ostream(OSVersion)
1839-
<< OsVersion.getMajor() << '.' << OsVersion.getMinor().getValueOr(0)
1840-
<< '.' << OsVersion.getSubminor().getValueOr(0);
1842+
llvm::raw_string_ostream(OSVersion) << Major << '.' << Minor << '.' << Micro;
18411843
return OSVersion;
18421844
}
18431845

@@ -1907,13 +1909,15 @@ getDeploymentTargetFromMTargetOSArg(DerivedArgList &Args,
19071909
return None;
19081910
}
19091911

1910-
VersionTuple Version = TT.getOSVersion();
1911-
if (!Version.getMajor()) {
1912+
unsigned Major, Minor, Micro;
1913+
TT.getOSVersion(Major, Minor, Micro);
1914+
if (!Major) {
19121915
TheDriver.Diag(diag::err_drv_invalid_version_number)
19131916
<< A->getAsString(Args);
19141917
return None;
19151918
}
1916-
return DarwinPlatform::createFromMTargetOS(TT.getOS(), Version,
1919+
return DarwinPlatform::createFromMTargetOS(TT.getOS(),
1920+
VersionTuple(Major, Minor, Micro),
19171921
TT.getEnvironment(), A, SDKInfo);
19181922
}
19191923

clang/lib/Driver/ToolChains/Linux.cpp

+8-5
Original file line numberDiff line numberDiff line change
@@ -277,11 +277,14 @@ 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-
addPathIfExists(
281-
D,
282-
SysRoot + "/usr/lib/" + MultiarchTriple + "/" +
283-
llvm::to_string(Triple.getEnvironmentVersion().getMajor()),
284-
Paths);
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);
285288
}
286289

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

clang/lib/Driver/ToolChains/MSVC.cpp

+9-1
Original file line numberDiff line numberDiff line change
@@ -1194,6 +1194,14 @@ 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+
11971205
static VersionTuple getMSVCVersionFromExe(const std::string &BinDir) {
11981206
VersionTuple Version;
11991207
#ifdef _WIN32
@@ -1366,7 +1374,7 @@ VersionTuple MSVCToolChain::computeMSVCVersion(const Driver *D,
13661374
bool IsWindowsMSVC = getTriple().isWindowsMSVCEnvironment();
13671375
VersionTuple MSVT = ToolChain::computeMSVCVersion(D, Args);
13681376
if (MSVT.empty())
1369-
MSVT = getTriple().getEnvironmentVersion();
1377+
MSVT = getMSVCVersionFromTriple(getTriple());
13701378
if (MSVT.empty() && IsWindowsMSVC)
13711379
MSVT = getMSVCVersionFromExe(getSubDirectoryPath(SubDirectoryType::Bin));
13721380
if (MSVT.empty() &&

0 commit comments

Comments
 (0)