Add an XcodeSDK::GetSDKTypeForTriple function

This is something used in swift-lldb, but of general usefulness.

Differential Revision: https://reviews.llvm.org/D79538

<rdar://problem/62684906>
This commit is contained in:
Adrian Prantl 2020-05-07 10:53:50 -07:00
parent 7143d79254
commit 6e95d51ecf
3 changed files with 71 additions and 1 deletions

View File

@ -14,6 +14,10 @@
#include "llvm/Support/VersionTuple.h"
#include <tuple>
namespace llvm {
class Triple;
}
namespace lldb_private {
/// An abstraction for Xcode-style SDKs that works like \ref ArchSpec.
@ -72,6 +76,8 @@ public:
static bool SDKSupportsModules(Type desired_type, const FileSpec &sdk_path);
/// Return the canonical SDK name, such as "macosx" for the macOS SDK.
static std::string GetCanonicalName(Info info);
/// Return the best-matching SDK type for a specific triple.
static XcodeSDK::Type GetSDKTypeForTriple(const llvm::Triple &triple);
};
} // namespace lldb_private

View File

@ -6,10 +6,13 @@
//
//===----------------------------------------------------------------------===//
#include "lldb/Utility/FileSpec.h"
#include "lldb/Utility/XcodeSDK.h"
#include "lldb/Utility/FileSpec.h"
#include "lldb/lldb-types.h"
#include "llvm/ADT/Triple.h"
#include <string>
using namespace lldb;
@ -190,3 +193,33 @@ bool XcodeSDK::SDKSupportsModules(XcodeSDK::Type desired_type,
return false;
return SDKSupportsModules(sdk.GetType(), sdk.GetVersion());
}
XcodeSDK::Type XcodeSDK::GetSDKTypeForTriple(const llvm::Triple &triple) {
using namespace llvm;
switch (triple.getOS()) {
case Triple::MacOSX:
case Triple::Darwin:
return XcodeSDK::MacOSX;
case Triple::IOS:
switch (triple.getEnvironment()) {
case Triple::MacABI:
return XcodeSDK::MacOSX;
case Triple::Simulator:
return XcodeSDK::iPhoneSimulator;
default:
return XcodeSDK::iPhoneOS;
}
case Triple::TvOS:
if (triple.getEnvironment() == Triple::Simulator)
return XcodeSDK::AppleTVSimulator;
return XcodeSDK::AppleTVOS;
case Triple::WatchOS:
if (triple.getEnvironment() == Triple::Simulator)
return XcodeSDK::WatchSimulator;
return XcodeSDK::watchOS;
case Triple::Linux:
return XcodeSDK::Linux;
default:
return XcodeSDK::unknown;
}
}

View File

@ -12,6 +12,7 @@
#include "lldb/Utility/XcodeSDK.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Triple.h"
#include <tuple>
@ -147,3 +148,33 @@ TEST(XcodeSDKTest, GetCanonicalName) {
info.version = llvm::VersionTuple(7, 0);
EXPECT_EQ("iphoneos7.0.internal", XcodeSDK::GetCanonicalName(info));
}
TEST(XcodeSDKTest, GetSDKTypeForTriple) {
EXPECT_EQ(
XcodeSDK::GetSDKTypeForTriple(llvm::Triple("x86_64-apple-macosx10.14")),
XcodeSDK::Type::MacOSX);
EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("x86_64-apple-darwin")),
XcodeSDK::Type::MacOSX);
EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(
llvm::Triple("x86_64-apple-ios13.4-simulator")),
XcodeSDK::Type::iPhoneSimulator);
EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("arm64-apple-ios13.4")),
XcodeSDK::Type::iPhoneOS);
EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(
llvm::Triple("x86_64-apple-ios13.4-macabi")),
XcodeSDK::Type::MacOSX);
EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(
llvm::Triple("x86_64-apple-tvos-simulator")),
XcodeSDK::Type::AppleTVSimulator);
EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("arm64-apple-tvos")),
XcodeSDK::Type::AppleTVOS);
EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(
llvm::Triple("x86_64-apple-watchos-simulator")),
XcodeSDK::Type::WatchSimulator);
EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("arm64-apple-watchos")),
XcodeSDK::Type::watchOS);
EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("x86_64-unknown-linux")),
XcodeSDK::Type::Linux);
EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("i386-unknown-netbsd")),
XcodeSDK::Type::unknown);
}