You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.9 KiB
93 lines
2.9 KiB
//===- ObjCRuntime.cpp - Objective-C Runtime Handling -----------*- C++ -*-===// |
|
// |
|
// The LLVM Compiler Infrastructure |
|
// |
|
// This file is distributed under the University of Illinois Open Source |
|
// License. See LICENSE.TXT for details. |
|
// |
|
//===----------------------------------------------------------------------===// |
|
// |
|
// This file implements the ObjCRuntime class, which represents the |
|
// target Objective-C runtime. |
|
// |
|
//===----------------------------------------------------------------------===// |
|
#include "clang/Basic/ObjCRuntime.h" |
|
#include "llvm/Support/raw_ostream.h" |
|
|
|
using namespace clang; |
|
|
|
std::string ObjCRuntime::getAsString() const { |
|
std::string Result; |
|
{ |
|
llvm::raw_string_ostream Out(Result); |
|
Out << *this; |
|
} |
|
return Result; |
|
} |
|
|
|
raw_ostream &clang::operator<<(raw_ostream &out, const ObjCRuntime &value) { |
|
switch (value.getKind()) { |
|
case ObjCRuntime::MacOSX: out << "macosx"; break; |
|
case ObjCRuntime::FragileMacOSX: out << "macosx-fragile"; break; |
|
case ObjCRuntime::iOS: out << "ios"; break; |
|
case ObjCRuntime::WatchOS: out << "watchos"; break; |
|
case ObjCRuntime::GNUstep: out << "gnustep"; break; |
|
case ObjCRuntime::GCC: out << "gcc"; break; |
|
case ObjCRuntime::ObjFW: out << "objfw"; break; |
|
} |
|
if (value.getVersion() > VersionTuple(0)) { |
|
out << '-' << value.getVersion(); |
|
} |
|
return out; |
|
} |
|
|
|
bool ObjCRuntime::tryParse(StringRef input) { |
|
// Look for the last dash. |
|
std::size_t dash = input.rfind('-'); |
|
|
|
// We permit dashes in the runtime name, and we also permit the |
|
// version to be omitted, so if we see a dash not followed by a |
|
// digit then we need to ignore it. |
|
if (dash != StringRef::npos && dash + 1 != input.size() && |
|
(input[dash+1] < '0' || input[dash+1] > '9')) { |
|
dash = StringRef::npos; |
|
} |
|
|
|
// Everything prior to that must be a valid string name. |
|
Kind kind; |
|
StringRef runtimeName = input.substr(0, dash); |
|
Version = VersionTuple(0); |
|
if (runtimeName == "macosx") { |
|
kind = ObjCRuntime::MacOSX; |
|
} else if (runtimeName == "macosx-fragile") { |
|
kind = ObjCRuntime::FragileMacOSX; |
|
} else if (runtimeName == "ios") { |
|
kind = ObjCRuntime::iOS; |
|
} else if (runtimeName == "watchos") { |
|
kind = ObjCRuntime::WatchOS; |
|
} else if (runtimeName == "gnustep") { |
|
// If no version is specified then default to the most recent one that we |
|
// know about. |
|
Version = VersionTuple(1, 6); |
|
kind = ObjCRuntime::GNUstep; |
|
} else if (runtimeName == "gcc") { |
|
kind = ObjCRuntime::GCC; |
|
} else if (runtimeName == "objfw") { |
|
kind = ObjCRuntime::ObjFW; |
|
Version = VersionTuple(0, 8); |
|
} else { |
|
return true; |
|
} |
|
TheKind = kind; |
|
|
|
if (dash != StringRef::npos) { |
|
StringRef verString = input.substr(dash + 1); |
|
if (Version.tryParse(verString)) |
|
return true; |
|
} |
|
|
|
if (kind == ObjCRuntime::ObjFW && Version > VersionTuple(0, 8)) |
|
Version = VersionTuple(0, 8); |
|
|
|
return false; |
|
}
|
|
|