summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Support
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2015-06-01 23:38:09 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2015-06-01 23:38:09 +0000
commitaac4ea01236e74a54e5119cd06a72816540422e7 (patch)
treef278e43b95a7dc9071cd986dd8e06ead439c7085 /llvm/lib/Support
parente20dc1cd3ac696805b7e57402d5d8d7129873cde (diff)
downloadbcm5719-llvm-aac4ea01236e74a54e5119cd06a72816540422e7.tar.gz
bcm5719-llvm-aac4ea01236e74a54e5119cd06a72816540422e7.zip
[ADT] Add Triple::getEnvironmentVersion
This allows us to extract version numbers from the environment. getOSVersion is currently overloaded for that purpose, this allows us to clean it up. llvm-svn: 238796
Diffstat (limited to 'llvm/lib/Support')
-rw-r--r--llvm/lib/Support/Triple.cpp56
1 files changed, 40 insertions, 16 deletions
diff --git a/llvm/lib/Support/Triple.cpp b/llvm/lib/Support/Triple.cpp
index a1ee18809ca..6c6b87ea5fb 100644
--- a/llvm/lib/Support/Triple.cpp
+++ b/llvm/lib/Support/Triple.cpp
@@ -702,6 +702,16 @@ std::string Triple::normalize(StringRef Str) {
// Special case logic goes here. At this point Arch, Vendor and OS have the
// correct values for the computed components.
+ std::string NormalizedEnvironment;
+ if (Environment == Triple::Android && Components[3].startswith("androideabi")) {
+ StringRef AndroidVersion = Components[3].drop_front(strlen("androideabi"));
+ if (AndroidVersion.empty()) {
+ Components[3] = "android";
+ } else {
+ NormalizedEnvironment = Twine("android", AndroidVersion).str();
+ Components[3] = NormalizedEnvironment;
+ }
+ }
if (OS == Triple::Win32) {
Components.resize(4);
@@ -779,6 +789,35 @@ static unsigned EatNumber(StringRef &Str) {
return Result;
}
+static void parseVersionFromName(StringRef Name, unsigned &Major,
+ unsigned &Minor, unsigned &Micro) {
+ // Any unset version defaults to 0.
+ Major = Minor = Micro = 0;
+
+ // Parse up to three components.
+ unsigned *Components[3] = {&Major, &Minor, &Micro};
+ for (unsigned i = 0; i != 3; ++i) {
+ if (Name.empty() || Name[0] < '0' || Name[0] > '9')
+ break;
+
+ // Consume the leading number.
+ *Components[i] = EatNumber(Name);
+
+ // Consume the separator, if present.
+ if (Name.startswith("."))
+ Name = Name.substr(1);
+ }
+}
+
+void Triple::getEnvironmentVersion(unsigned &Major, unsigned &Minor,
+ unsigned &Micro) const {
+ StringRef EnvironmentName = getEnvironmentName();
+ StringRef EnvironmentTypeName = getEnvironmentTypeName(getEnvironment());
+ if (EnvironmentName.startswith(EnvironmentTypeName))
+ EnvironmentName = EnvironmentName.substr(EnvironmentTypeName.size());
+ parseVersionFromName(EnvironmentName, Major, Minor, Micro);
+}
+
void Triple::getOSVersion(unsigned &Major, unsigned &Minor,
unsigned &Micro) const {
StringRef OSName = getOSName();
@@ -796,22 +835,7 @@ void Triple::getOSVersion(unsigned &Major, unsigned &Minor,
if (OSName.startswith(OSTypeName))
OSName = OSName.substr(OSTypeName.size());
- // Any unset version defaults to 0.
- Major = Minor = Micro = 0;
-
- // Parse up to three components.
- unsigned *Components[3] = { &Major, &Minor, &Micro };
- for (unsigned i = 0; i != 3; ++i) {
- if (OSName.empty() || OSName[0] < '0' || OSName[0] > '9')
- break;
-
- // Consume the leading number.
- *Components[i] = EatNumber(OSName);
-
- // Consume the separator, if present.
- if (OSName.startswith("."))
- OSName = OSName.substr(1);
- }
+ parseVersionFromName(OSName, Major, Minor, Micro);
}
bool Triple::getMacOSXVersion(unsigned &Major, unsigned &Minor,
OpenPOWER on IntegriCloud