friss created this revision. friss added a reviewer: aprantl. Herald added a subscriber: mgorny. Herald added a project: LLDB.
This commit is somewhat NFC-ish today as the environment of triples is not considered when comparing s if one of them is not set (I plan to change that). We have made simulator triples unambiguous these days, but the simulator platforms still advertise triples without the environment. This wasn't an issue when the sims ran only on a very different architecure than the real device, but this has changed with Apple Silicon. This patch simplifies the way GetSupportedArchitectureAtIndex is implemented for the sim platforms and adds the environment. It also trivially adds support for Apple Silicon to those platforms. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D84537 Files: lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h lldb/source/Plugins/Platform/MacOSX/PlatformAppleTVSimulator.cpp lldb/source/Plugins/Platform/MacOSX/PlatformAppleTVSimulator.h lldb/source/Plugins/Platform/MacOSX/PlatformAppleWatchSimulator.cpp lldb/source/Plugins/Platform/MacOSX/PlatformAppleWatchSimulator.h lldb/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.cpp lldb/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.h lldb/unittests/Platform/CMakeLists.txt lldb/unittests/Platform/PlatformAppleSimulatorTest.cpp
Index: lldb/unittests/Platform/PlatformAppleSimulatorTest.cpp =================================================================== --- /dev/null +++ lldb/unittests/Platform/PlatformAppleSimulatorTest.cpp @@ -0,0 +1,74 @@ +//===-- PlatformAppleSimulatorTest.cpp ------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "gtest/gtest.h" + +#include "Plugins/Platform/MacOSX/PlatformAppleTVSimulator.h" +#include "Plugins/Platform/MacOSX/PlatformAppleWatchSimulator.h" +#include "Plugins/Platform/MacOSX/PlatformiOSSimulator.h" +#include "TestingSupport/SubsystemRAII.h" +#include "lldb/Host/FileSystem.h" +#include "lldb/Host/HostInfo.h" +#include "lldb/Target/Platform.h" + +using namespace lldb; +using namespace lldb_private; + +class PlatformAppleSimulatorTest : public ::testing::Test { + SubsystemRAII<FileSystem, HostInfo, PlatformAppleTVSimulator, + PlatformiOSSimulator, PlatformAppleWatchSimulator> + subsystems; +}; + +#ifdef __APPLE__ + +static void testSimPlatformArchHasSimEnvironment(llvm::StringRef name) { + Status error; + auto platform_sp = Platform::Create(ConstString(name), error); + ASSERT_TRUE(platform_sp); + int num_arches = 0; + + while (true) { + ArchSpec arch; + if (!platform_sp->GetSupportedArchitectureAtIndex(num_arches, arch)) + break; + EXPECT_EQ(arch.GetTriple().getEnvironment(), llvm::Triple::Simulator); + num_arches++; + } + + EXPECT_GT(num_arches, 0); +} + +TEST_F(PlatformAppleSimulatorTest, TestSimHasSimEnvionament) { + testSimPlatformArchHasSimEnvironment("ios-simulator"); + testSimPlatformArchHasSimEnvironment("tvos-simulator"); + testSimPlatformArchHasSimEnvironment("watchos-simulator"); +} + +TEST_F(PlatformAppleSimulatorTest, TestHostPlatformToSim) { + static const ArchSpec platform_arch( + HostInfo::GetArchitecture(HostInfo::eArchKindDefault)); + + const llvm::Triple::OSType sim_platforms[] = { + llvm::Triple::IOS, + llvm::Triple::TvOS, + llvm::Triple::WatchOS, + }; + + for (auto sim : sim_platforms) { + ArchSpec arch = platform_arch; + arch.GetTriple().setOS(sim); + arch.GetTriple().setEnvironment(llvm::Triple::Simulator); + + Status error; + auto platform_sp = Platform::Create(arch, nullptr, error); + EXPECT_TRUE(platform_sp); + } +} + +#endif Index: lldb/unittests/Platform/CMakeLists.txt =================================================================== --- lldb/unittests/Platform/CMakeLists.txt +++ lldb/unittests/Platform/CMakeLists.txt @@ -1,4 +1,5 @@ add_lldb_unittest(LLDBPlatformTests + PlatformAppleSimulatorTest.cpp PlatformDarwinTest.cpp LINK_LIBS Index: lldb/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.h =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.h +++ lldb/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.h @@ -64,9 +64,6 @@ FindProcesses(const lldb_private::ProcessInstanceInfoMatch &match_info, lldb_private::ProcessInstanceInfoList &process_infos) override; - bool GetSupportedArchitectureAtIndex(uint32_t idx, - lldb_private::ArchSpec &arch) override; - void AddClangModuleCompilationOptions(lldb_private::Target *target, std::vector<std::string> &options) override { Index: lldb/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.cpp =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.cpp +++ lldb/source/Plugins/Platform/MacOSX/PlatformiOSSimulator.cpp @@ -76,6 +76,7 @@ bool create = force; if (!create && arch && arch->IsValid()) { switch (arch->GetMachine()) { + case llvm::Triple::aarch64: case llvm::Triple::x86_64: case llvm::Triple::x86: { const llvm::Triple &triple = arch->GetTriple(); @@ -148,7 +149,24 @@ /// Default Constructor PlatformiOSSimulator::PlatformiOSSimulator() : PlatformAppleSimulator( - CoreSimulatorSupport::DeviceType::ProductFamilyID::iPhone) {} + CoreSimulatorSupport::DeviceType::ProductFamilyID::iPhone, + llvm::Triple::IOS) { +#ifdef __APPLE__ +#if __arm64__ + static const llvm::StringRef supported_triples[] = { + "arm64-apple-ios-simulator", + "x86_64-apple-ios-simulator", + "x86_64h-apple-ios-simulator", + }; +#else + static const llvm::StringRef supported_triples[] = { + "x86_64-apple-ios-simulator", + "i386-apple-ios-simulator", + }; +#endif + m_supported_triples = supported_triples; +#endif +} /// Destructor. /// @@ -328,43 +346,3 @@ return process_infos.size(); } -bool PlatformiOSSimulator::GetSupportedArchitectureAtIndex(uint32_t idx, - ArchSpec &arch) { - static const ArchSpec platform_arch( - HostInfo::GetArchitecture(HostInfo::eArchKindDefault)); - static const ArchSpec platform_arch64( - HostInfo::GetArchitecture(HostInfo::eArchKind64)); - - if (idx == 0) { - arch = platform_arch; - if (arch.IsValid()) { - arch.GetTriple().setOS(llvm::Triple::IOS); - arch.GetTriple().setEnvironment(llvm::Triple::Simulator); - return true; - } - } else { - if (platform_arch.IsExactMatch(platform_arch64)) { - // This macosx platform supports both 32 and 64 bit. - if (idx == 1) { - // 32/64: return "x86_64-apple-macosx" for architecture 1 - arch = platform_arch64; - return true; - } else if (idx == 2 || idx == 3) { - arch = HostInfo::GetArchitecture(HostInfo::eArchKind32); - if (arch.IsValid()) { - if (idx == 2) - arch.GetTriple().setOS(llvm::Triple::IOS); - // 32/64: return "i386-apple-ios" for architecture 2 32/64: return - // "i386-apple-macosx" for architecture 3 - return true; - } - } - } else if (idx == 1) { - // This macosx platform supports only 32 bit, so return the *-apple- - // macosx version - arch = platform_arch; - return true; - } - } - return false; -} Index: lldb/source/Plugins/Platform/MacOSX/PlatformAppleWatchSimulator.h =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformAppleWatchSimulator.h +++ lldb/source/Plugins/Platform/MacOSX/PlatformAppleWatchSimulator.h @@ -62,9 +62,6 @@ FindProcesses(const lldb_private::ProcessInstanceInfoMatch &match_info, lldb_private::ProcessInstanceInfoList &process_infos) override; - bool GetSupportedArchitectureAtIndex(uint32_t idx, - lldb_private::ArchSpec &arch) override; - void AddClangModuleCompilationOptions(lldb_private::Target *target, std::vector<std::string> &options) override { Index: lldb/source/Plugins/Platform/MacOSX/PlatformAppleWatchSimulator.cpp =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformAppleWatchSimulator.cpp +++ lldb/source/Plugins/Platform/MacOSX/PlatformAppleWatchSimulator.cpp @@ -76,6 +76,7 @@ bool create = force; if (!create && arch && arch->IsValid()) { switch (arch->GetMachine()) { + case llvm::Triple::aarch64: case llvm::Triple::x86_64: case llvm::Triple::x86: { const llvm::Triple &triple = arch->GetTriple(); @@ -145,7 +146,22 @@ /// Default Constructor PlatformAppleWatchSimulator::PlatformAppleWatchSimulator() : PlatformAppleSimulator( - CoreSimulatorSupport::DeviceType::ProductFamilyID::appleWatch) {} + CoreSimulatorSupport::DeviceType::ProductFamilyID::appleWatch, + llvm::Triple::WatchOS) { +#ifdef __APPLE__ +#if __arm64__ + static const llvm::StringRef supported_triples[] = { + "arm64-apple-watchos-simulator", + }; +#else + static const llvm::StringRef supported_triples[] = { + "x86_64-apple-watchos-simulator", + "i386-apple-watchos-simulator", + }; +#endif + m_supported_triples = supported_triples; +#endif +} /// Destructor. /// @@ -325,24 +341,3 @@ return process_infos.size(); } -bool PlatformAppleWatchSimulator::GetSupportedArchitectureAtIndex( - uint32_t idx, ArchSpec &arch) { - if (idx == 0) { - arch = HostInfo::GetArchitecture(HostInfo::eArchKind32); - if (arch.IsValid()) { - arch.GetTriple().setOS(llvm::Triple::WatchOS); - arch.GetTriple().setEnvironment(llvm::Triple::Simulator); - return true; - } - } - - if (idx == 1) { - arch = HostInfo::GetArchitecture(HostInfo::eArchKind64); - if (arch.IsValid()) { - arch.GetTriple().setOS(llvm::Triple::WatchOS); - arch.GetTriple().setEnvironment(llvm::Triple::Simulator); - return true; - } - } - return false; -} Index: lldb/source/Plugins/Platform/MacOSX/PlatformAppleTVSimulator.h =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformAppleTVSimulator.h +++ lldb/source/Plugins/Platform/MacOSX/PlatformAppleTVSimulator.h @@ -62,9 +62,6 @@ FindProcesses(const lldb_private::ProcessInstanceInfoMatch &match_info, lldb_private::ProcessInstanceInfoList &process_infos) override; - bool GetSupportedArchitectureAtIndex(uint32_t idx, - lldb_private::ArchSpec &arch) override; - void AddClangModuleCompilationOptions(lldb_private::Target *target, std::vector<std::string> &options) override { Index: lldb/source/Plugins/Platform/MacOSX/PlatformAppleTVSimulator.cpp =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformAppleTVSimulator.cpp +++ lldb/source/Plugins/Platform/MacOSX/PlatformAppleTVSimulator.cpp @@ -77,6 +77,7 @@ bool create = force; if (!create && arch && arch->IsValid()) { switch (arch->GetMachine()) { + case llvm::Triple::aarch64: case llvm::Triple::x86_64: { const llvm::Triple &triple = arch->GetTriple(); switch (triple.getVendor()) { @@ -144,7 +145,23 @@ /// Default Constructor PlatformAppleTVSimulator::PlatformAppleTVSimulator() : PlatformAppleSimulator( - CoreSimulatorSupport::DeviceType::ProductFamilyID::appleTV) {} + CoreSimulatorSupport::DeviceType::ProductFamilyID::appleTV, + llvm::Triple::TvOS) { +#ifdef __APPLE__ +#if __arm64__ + static const llvm::StringRef supported_triples[] = { + "arm64-apple-tvos-simulator", + "x86_64-apple-tvos-simulator", + "x86_64h-apple-tvos-simulator", + }; +#else + static const llvm::StringRef supported_triples[] = { + "x86_64-apple-tvos-simulator", + }; +#endif + m_supported_triples = supported_triples; +#endif +} /// Destructor. /// @@ -322,19 +339,3 @@ } return process_infos.size(); } - -bool PlatformAppleTVSimulator::GetSupportedArchitectureAtIndex(uint32_t idx, - ArchSpec &arch) { - static const ArchSpec platform_arch( - HostInfo::GetArchitecture(HostInfo::eArchKind64)); - - if (idx == 0) { - arch = platform_arch; - if (arch.IsValid()) { - arch.GetTriple().setOS(llvm::Triple::TvOS); - arch.GetTriple().setEnvironment(llvm::Triple::Simulator); - return true; - } - } - return false; -} Index: lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h +++ lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.h @@ -25,8 +25,8 @@ static void Terminate(); // Class Methods - PlatformAppleSimulator( - CoreSimulatorSupport::DeviceType::ProductFamilyID kind); + PlatformAppleSimulator(CoreSimulatorSupport::DeviceType::ProductFamilyID kind, + llvm::Triple::OSType os_type); virtual ~PlatformAppleSimulator(); @@ -44,6 +44,9 @@ lldb_private::Target *target, lldb_private::Status &error) override; + bool GetSupportedArchitectureAtIndex(uint32_t idx, + lldb_private::ArchSpec &arch) override; + protected: std::mutex m_core_sim_path_mutex; llvm::Optional<lldb_private::FileSpec> m_core_simulator_framework_path; @@ -52,6 +55,9 @@ lldb_private::FileSpec GetCoreSimulatorPath(); + llvm::Triple::OSType m_os_type = llvm::Triple::UnknownOS; + llvm::ArrayRef<llvm::StringRef> m_supported_triples = {}; + void LoadCoreSimulator(); #if defined(__APPLE__) Index: lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp =================================================================== --- lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp +++ lldb/source/Plugins/Platform/MacOSX/PlatformAppleSimulator.cpp @@ -36,8 +36,9 @@ /// Default Constructor PlatformAppleSimulator::PlatformAppleSimulator( - CoreSimulatorSupport::DeviceType::ProductFamilyID kind) - : PlatformDarwin(true), m_kind(kind) {} + CoreSimulatorSupport::DeviceType::ProductFamilyID kind, + llvm::Triple::OSType os_type) + : PlatformDarwin(true), m_kind(kind), m_os_type(os_type) {} /// Destructor. /// @@ -253,3 +254,29 @@ return CoreSimulatorSupport::Device(); } #endif + +bool PlatformAppleSimulator::GetSupportedArchitectureAtIndex(uint32_t idx, + ArchSpec &arch) { + assert(m_os_type != llvm::Triple::UnknownOS); + + // Inject the real native host as the first element. If we are on a Haswell + // host this would be a x86_64h triple. Adding it to the array would be + // misleading. LLDB can run on non-haswell hosts, and those should not + // advertize supporting haswell binaries as they would not run. + // There is a chance this will result in the same triple being reported twice, + // which shouldn't matter. + if (idx == 0) { + static const ArchSpec platform_arch( + HostInfo::GetArchitecture(HostInfo::eArchKind64)); + arch = platform_arch; + arch.GetTriple().setOS(m_os_type); + arch.GetTriple().setEnvironment(llvm::Triple::Simulator); + return true; + } + + auto triple_array = llvm::makeArrayRef(m_supported_triples); + if (idx > triple_array.size()) + return false; + arch = ArchSpec(triple_array[idx - 1]); + return true; +}
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits