LLDB  mainline
PlatformAppleSimulator.cpp
Go to the documentation of this file.
1 //===-- PlatformAppleSimulator.cpp ----------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
10 
11 #if defined(__APPLE__)
12 #include <dlfcn.h>
13 #endif
14 
15 #include "lldb/Core/Module.h"
17 #include "lldb/Host/HostInfo.h"
19 #include "lldb/Target/Process.h"
21 #include "lldb/Utility/Log.h"
22 #include "lldb/Utility/Status.h"
24 
25 #include "llvm/Support/Threading.h"
26 
27 #include <mutex>
28 #include <thread>
29 
30 using namespace lldb;
31 using namespace lldb_private;
32 
33 #if !defined(__APPLE__)
34 #define UNSUPPORTED_ERROR ("Apple simulators aren't supported on this platform")
35 #endif
36 
37 /// Default Constructor
39  const char *class_name, const char *description, ConstString plugin_name,
40  llvm::Triple::OSType preferred_os,
41  llvm::SmallVector<llvm::StringRef, 4> supported_triples,
42  llvm::StringRef sdk, lldb_private::XcodeSDK::Type sdk_type,
44  : PlatformDarwin(true), m_class_name(class_name),
45  m_description(description), m_plugin_name(plugin_name), m_kind(kind),
46  m_os_type(preferred_os), m_supported_triples(supported_triples),
47  m_sdk(sdk), m_sdk_type(sdk_type) {}
48 
49 /// Destructor.
50 ///
51 /// The destructor is virtual since this class is designed to be
52 /// inherited from by the plug-in instance.
54 
56  lldb_private::ProcessLaunchInfo &launch_info) {
57 #if defined(__APPLE__)
59  CoreSimulatorSupport::Device device(GetSimulatorDevice());
60 
62  Status boot_err;
63  device.Boot(boot_err);
64  if (boot_err.Fail())
65  return boot_err;
66  }
67 
68  auto spawned = device.Spawn(launch_info);
69 
70  if (spawned) {
71  launch_info.SetProcessID(spawned.GetPID());
72  return Status();
73  } else
74  return spawned.GetError();
75 #else
76  Status err;
78  return err;
79 #endif
80 }
81 
83  Platform::GetStatus(strm);
84  if (!m_sdk.empty())
85  strm << " SDK Path: \"" << m_sdk << "\"\n";
86  else
87  strm << " SDK Path: error: unable to locate SDK\n";
88 
89 #if defined(__APPLE__)
90  // This will get called by subclasses, so just output status on the current
91  // simulator
93 
94  std::string developer_dir = HostInfo::GetXcodeDeveloperDirectory().GetPath();
97  developer_dir.c_str());
98  const size_t num_devices = devices.GetNumDevices();
99  if (num_devices) {
100  strm.Printf("Available devices:\n");
101  for (size_t i = 0; i < num_devices; ++i) {
103  strm << " " << device.GetUDID() << ": " << device.GetName() << "\n";
104  }
105 
106  if (m_device.hasValue() && m_device->operator bool()) {
107  strm << "Current device: " << m_device->GetUDID() << ": "
108  << m_device->GetName();
110  strm << " state = booted";
111  }
112  strm << "\nType \"platform connect <ARG>\" where <ARG> is a device "
113  "UDID or a device name to disconnect and connect to a "
114  "different device.\n";
115 
116  } else {
117  strm << "No current device is selected, \"platform connect <ARG>\" "
118  "where <ARG> is a device UDID or a device name to connect to "
119  "a specific device.\n";
120  }
121 
122  } else {
123  strm << "No devices are available.\n";
124  }
125 #else
126  strm << UNSUPPORTED_ERROR;
127 #endif
128 }
129 
131 #if defined(__APPLE__)
132  Status error;
133  if (args.GetArgumentCount() == 1) {
134  if (m_device)
137  const char *arg_cstr = args.GetArgumentAtIndex(0);
138  if (arg_cstr) {
139  std::string arg_str(arg_cstr);
140  std::string developer_dir = HostInfo::GetXcodeDeveloperDirectory().GetPath();
143  developer_dir.c_str());
144  devices.ForEach(
145  [this, &arg_str](const CoreSimulatorSupport::Device &device) -> bool {
146  if (arg_str == device.GetUDID() || arg_str == device.GetName()) {
147  m_device = device;
148  return false; // Stop iterating
149  } else {
150  return true; // Keep iterating
151  }
152  });
153  if (!m_device)
154  error.SetErrorStringWithFormat(
155  "no device with UDID or name '%s' was found", arg_cstr);
156  }
157  } else {
158  error.SetErrorString("this command take a single UDID argument of the "
159  "device you want to connect to.");
160  }
161  return error;
162 #else
163  Status err;
165  return err;
166 #endif
167 }
168 
170 #if defined(__APPLE__)
171  m_device.reset();
172  return Status();
173 #else
174  Status err;
176  return err;
177 #endif
178 }
179 
181  ProcessLaunchInfo &launch_info, Debugger &debugger,
182  Target *target, // Can be NULL, if NULL create a new target, else use
183  // existing one
184  Status &error) {
185 #if defined(__APPLE__)
186  ProcessSP process_sp;
187  // Make sure we stop at the entry point
188  launch_info.GetFlags().Set(eLaunchFlagDebug);
189  // We always launch the process we are going to debug in a separate process
190  // group, since then we can handle ^C interrupts ourselves w/o having to
191  // worry about the target getting them as well.
192  launch_info.SetLaunchInSeparateProcessGroup(true);
193 
194  error = LaunchProcess(launch_info);
195  if (error.Success()) {
196  if (launch_info.GetProcessID() != LLDB_INVALID_PROCESS_ID) {
197  ProcessAttachInfo attach_info(launch_info);
198  process_sp = Attach(attach_info, debugger, target, error);
199  if (process_sp) {
200  launch_info.SetHijackListener(attach_info.GetHijackListener());
201 
202  // Since we attached to the process, it will think it needs to detach
203  // if the process object just goes away without an explicit call to
204  // Process::Kill() or Process::Detach(), so let it know to kill the
205  // process if this happens.
206  process_sp->SetShouldDetach(false);
207 
208  // If we didn't have any file actions, the pseudo terminal might have
209  // been used where the secondary side was given as the file to open for
210  // stdin/out/err after we have already opened the primary so we can
211  // read/write stdin/out/err.
212  int pty_fd = launch_info.GetPTY().ReleasePrimaryFileDescriptor();
213  if (pty_fd != PseudoTerminal::invalid_fd) {
214  process_sp->SetSTDIOFileDescriptor(pty_fd);
215  }
216  }
217  }
218  }
219 
220  return process_sp;
221 #else
222  return ProcessSP();
223 #endif
224 }
225 
227 #if defined(__APPLE__)
228  std::lock_guard<std::mutex> guard(m_core_sim_path_mutex);
229  if (!m_core_simulator_framework_path.hasValue()) {
231  FileSpec("/Library/Developer/PrivateFrameworks/CoreSimulator.framework/"
232  "CoreSimulator");
233  FileSystem::Instance().Resolve(*m_core_simulator_framework_path);
234  }
235  return m_core_simulator_framework_path.getValue();
236 #else
237  return FileSpec();
238 #endif
239 }
240 
242 #if defined(__APPLE__)
243  static llvm::once_flag g_load_core_sim_flag;
244  llvm::call_once(g_load_core_sim_flag, [this] {
245  const std::string core_sim_path(GetCoreSimulatorPath().GetPath());
246  if (core_sim_path.size())
247  dlopen(core_sim_path.c_str(), RTLD_LAZY);
248  });
249 #endif
250 }
251 
252 #if defined(__APPLE__)
253 CoreSimulatorSupport::Device PlatformAppleSimulator::GetSimulatorDevice() {
254  if (!m_device.hasValue()) {
256  std::string developer_dir = HostInfo::GetXcodeDeveloperDirectory().GetPath();
258  developer_dir.c_str())
259  .GetFanciest(dev_id);
260  }
261 
262  if (m_device.hasValue())
263  return m_device.getValue();
264  else
266 }
267 #endif
268 
270  ArchSpec &arch) {
271  if (idx >= m_supported_triples.size())
272  return false;
273  arch = ArchSpec(m_supported_triples[idx]);
274  return true;
275 }
276 
278  const char *class_name, const char *description, ConstString plugin_name,
279  llvm::SmallVector<llvm::Triple::ArchType, 4> supported_arch,
280  llvm::Triple::OSType preferred_os,
281  llvm::SmallVector<llvm::Triple::OSType, 4> supported_os,
282  llvm::SmallVector<llvm::StringRef, 4> supported_triples,
283  llvm::StringRef sdk, lldb_private::XcodeSDK::Type sdk_type,
285  const ArchSpec *arch) {
287  if (log) {
288  const char *arch_name;
289  if (arch && arch->GetArchitectureName())
290  arch_name = arch->GetArchitectureName();
291  else
292  arch_name = "<null>";
293 
294  const char *triple_cstr =
295  arch ? arch->GetTriple().getTriple().c_str() : "<null>";
296 
297  LLDB_LOGF(log, "%s::%s(force=%s, arch={%s,%s})", class_name, __FUNCTION__,
298  force ? "true" : "false", arch_name, triple_cstr);
299  }
300 
301  bool create = force;
302  if (!create && arch && arch->IsValid()) {
303  if (std::count(supported_arch.begin(), supported_arch.end(),
304  arch->GetMachine())) {
305  const llvm::Triple &triple = arch->GetTriple();
306  switch (triple.getVendor()) {
307  case llvm::Triple::Apple:
308  create = true;
309  break;
310 
311 #if defined(__APPLE__)
312  // Only accept "unknown" for the vendor if the host is Apple and if
313  // "unknown" wasn't specified (it was just returned because it was NOT
314  // specified)
315  case llvm::Triple::UnknownVendor:
316  create = !arch->TripleVendorWasSpecified();
317  break;
318 #endif
319  default:
320  break;
321  }
322 
323  if (create) {
324  if (std::count(supported_os.begin(), supported_os.end(), triple.getOS()))
325  create = true;
326 #if defined(__APPLE__)
327  // Only accept "unknown" for the OS if the host is Apple and it
328  // "unknown" wasn't specified (it was just returned because it was NOT
329  // specified)
330  else if (triple.getOS() == llvm::Triple::UnknownOS)
331  create = !arch->TripleOSWasSpecified();
332 #endif
333  else
334  create = false;
335  }
336  }
337  }
338  if (create) {
339  LLDB_LOGF(log, "%s::%s() creating platform", class_name, __FUNCTION__);
340 
341  return PlatformSP(new PlatformAppleSimulator(
342  class_name, description, plugin_name, preferred_os, supported_triples,
343  sdk, sdk_type, kind));
344  }
345 
346  LLDB_LOGF(log, "%s::%s() aborting creation of platform", class_name,
347  __FUNCTION__);
348 
349  return PlatformSP();
350 }
351 
353  const ModuleSpec &module_spec, lldb::ModuleSP &exe_module_sp,
354  const FileSpecList *module_search_paths_ptr) {
355  Status error;
356  // Nothing special to do here, just use the actual file and architecture
357 
358  ModuleSpec resolved_module_spec(module_spec);
359 
360  // If we have "ls" as the exe_file, resolve the executable loation based on
361  // the current path variables
362  // TODO: resolve bare executables in the Platform SDK
363  // if (!resolved_exe_file.Exists())
364  // resolved_exe_file.ResolveExecutableLocation ();
365 
366  // Resolve any executable within a bundle on MacOSX
367  // TODO: verify that this handles shallow bundles, if not then implement one
368  // ourselves
369  Host::ResolveExecutableInBundle(resolved_module_spec.GetFileSpec());
370 
371  if (FileSystem::Instance().Exists(resolved_module_spec.GetFileSpec())) {
372  if (resolved_module_spec.GetArchitecture().IsValid()) {
373  error = ModuleList::GetSharedModule(resolved_module_spec, exe_module_sp,
374  NULL, NULL, NULL);
375 
376  if (exe_module_sp && exe_module_sp->GetObjectFile())
377  return error;
378  exe_module_sp.reset();
379  }
380  // No valid architecture was specified or the exact ARM slice wasn't found
381  // so ask the platform for the architectures that we should be using (in
382  // the correct order) and see if we can find a match that way
383  StreamString arch_names;
384  ArchSpec platform_arch;
386  idx, resolved_module_spec.GetArchitecture());
387  ++idx) {
388  // Only match x86 with x86 and x86_64 with x86_64...
389  if (!module_spec.GetArchitecture().IsValid() ||
390  module_spec.GetArchitecture().GetCore() ==
391  resolved_module_spec.GetArchitecture().GetCore()) {
392  error = ModuleList::GetSharedModule(resolved_module_spec, exe_module_sp,
393  NULL, NULL, NULL);
394  // Did we find an executable using one of the
395  if (error.Success()) {
396  if (exe_module_sp && exe_module_sp->GetObjectFile())
397  break;
398  else
399  error.SetErrorToGenericError();
400  }
401 
402  if (idx > 0)
403  arch_names.PutCString(", ");
404  arch_names.PutCString(platform_arch.GetArchitectureName());
405  }
406  }
407 
408  if (error.Fail() || !exe_module_sp) {
409  if (FileSystem::Instance().Readable(resolved_module_spec.GetFileSpec())) {
410  error.SetErrorStringWithFormat(
411  "'%s' doesn't contain any '%s' platform architectures: %s",
412  resolved_module_spec.GetFileSpec().GetPath().c_str(),
413  GetPluginName().GetCString(), arch_names.GetString().str().c_str());
414  } else {
415  error.SetErrorStringWithFormat(
416  "'%s' is not readable",
417  resolved_module_spec.GetFileSpec().GetPath().c_str());
418  }
419  }
420  } else {
421  error.SetErrorStringWithFormat("'%s' does not exist",
422  module_spec.GetFileSpec().GetPath().c_str());
423  }
424 
425  return error;
426 }
427 
429  const UUID *uuid_ptr,
430  FileSpec &local_file) {
431  Status error;
432  char platform_file_path[PATH_MAX];
433  if (platform_file.GetPath(platform_file_path, sizeof(platform_file_path))) {
434  char resolved_path[PATH_MAX];
435 
436  if (!m_sdk.empty()) {
437  ::snprintf(resolved_path, sizeof(resolved_path), "%s/%s",
438  m_sdk.str().c_str(), platform_file_path);
439 
440  // First try in the SDK and see if the file is in there
441  local_file.SetFile(resolved_path, FileSpec::Style::native);
442  FileSystem::Instance().Resolve(local_file);
443  if (FileSystem::Instance().Exists(local_file))
444  return error;
445 
446  // Else fall back to the actual path itself
447  local_file.SetFile(platform_file_path, FileSpec::Style::native);
448  FileSystem::Instance().Resolve(local_file);
449  if (FileSystem::Instance().Exists(local_file))
450  return error;
451  }
452  error.SetErrorStringWithFormat(
453  "unable to locate a platform file for '%s' in platform '%s'",
454  platform_file_path, GetPluginName().GetCString());
455  } else {
456  error.SetErrorString("invalid platform file argument");
457  }
458  return error;
459 }
460 
462  const ModuleSpec &module_spec, Process *process, ModuleSP &module_sp,
463  const FileSpecList *module_search_paths_ptr,
464  llvm::SmallVectorImpl<lldb::ModuleSP> *old_modules, bool *did_create_ptr) {
465  // For iOS/tvOS/watchOS, the SDK files are all cached locally on the
466  // host system. So first we ask for the file in the cached SDK, then
467  // we attempt to get a shared module for the right architecture with
468  // the right UUID.
469  Status error;
470  ModuleSpec platform_module_spec(module_spec);
471  const FileSpec &platform_file = module_spec.GetFileSpec();
472  error = GetSymbolFile(platform_file, module_spec.GetUUIDPtr(),
473  platform_module_spec.GetFileSpec());
474  if (error.Success()) {
475  error = ResolveExecutable(platform_module_spec, module_sp,
476  module_search_paths_ptr);
477  } else {
478  const bool always_create = false;
479  error = ModuleList::GetSharedModule(module_spec, module_sp,
480  module_search_paths_ptr, old_modules,
481  did_create_ptr, always_create);
482  }
483  if (module_sp)
484  module_sp->SetPlatformFileSpec(platform_file);
485 
486  return error;
487 }
488 
490  const ProcessInstanceInfoMatch &match_info,
491  ProcessInstanceInfoList &process_infos) {
492  ProcessInstanceInfoList all_osx_process_infos;
493  // First we get all OSX processes
494  const uint32_t n = Host::FindProcesses(match_info, all_osx_process_infos);
495 
496  // Now we filter them down to only the matching triples.
497  for (uint32_t i = 0; i < n; ++i) {
498  const ProcessInstanceInfo &proc_info = all_osx_process_infos[i];
499  const llvm::Triple &triple = proc_info.GetArchitecture().GetTriple();
500  if (triple.getOS() == m_os_type &&
501  triple.getEnvironment() == llvm::Triple::Simulator) {
502  process_infos.push_back(proc_info);
503  }
504  }
505  return process_infos.size();
506 }
507 
508 /// Whether to skip creating a simulator platform.
509 static bool shouldSkipSimulatorPlatform(bool force, const ArchSpec *arch) {
510  // If the arch is known not to specify a simulator environment, skip creating
511  // the simulator platform (we can create it later if there's a matching arch).
512  // This avoids very slow xcrun queries for non-simulator archs (the slowness
513  // is due to xcrun not caching negative queries (rdar://74882205)).
514  return !force && arch && arch->IsValid() &&
516 }
517 
518 static llvm::StringRef GetXcodeSDKDir(std::string preferred,
519  std::string secondary) {
520  llvm::StringRef sdk;
521  sdk = HostInfo::GetXcodeSDKPath(XcodeSDK(std::move(preferred)));
522  if (sdk.empty())
523  sdk = HostInfo::GetXcodeSDKPath(XcodeSDK(std::move(secondary)));
524  return sdk;
525 }
526 
527 static const char *g_ios_plugin_name = "ios-simulator";
528 static const char *g_ios_description = "iPhone simulator platform plug-in.";
529 
530 /// IPhone Simulator Plugin.
532  static void Initialize() {
533  PluginManager::RegisterPlugin(ConstString(g_ios_plugin_name),
536  }
537 
538  static void Terminate() {
539  PluginManager::UnregisterPlugin(PlatformiOSSimulator::CreateInstance);
540  }
541 
542  static PlatformSP CreateInstance(bool force, const ArchSpec *arch) {
543  if (shouldSkipSimulatorPlatform(force, arch))
544  return nullptr;
545  llvm::StringRef sdk;
546  sdk = HostInfo::GetXcodeSDKPath(XcodeSDK("iPhoneSimulator.Internal.sdk"));
547  if (sdk.empty())
548  sdk = HostInfo::GetXcodeSDKPath(XcodeSDK("iPhoneSimulator.sdk"));
549 
551  "PlatformiOSSimulator", g_ios_description,
553  {llvm::Triple::aarch64, llvm::Triple::x86_64, llvm::Triple::x86},
554  llvm::Triple::IOS,
555  {// Deprecated, but still support Darwin for historical reasons.
556  llvm::Triple::Darwin, llvm::Triple::MacOSX,
557  // IOS is not used for simulator triples, but accept it just in
558  // case.
559  llvm::Triple::IOS},
560  {
561 #ifdef __APPLE__
562 #if __arm64__
563  "arm64e-apple-ios-simulator", "arm64-apple-ios-simulator",
564  "x86_64-apple-ios-simulator", "x86_64h-apple-ios-simulator",
565 #else
566  "x86_64h-apple-ios-simulator", "x86_64-apple-ios-simulator",
567  "i386-apple-ios-simulator",
568 #endif
569 #endif
570  },
571  GetXcodeSDKDir("iPhoneSimulator.Internal.sdk", "iPhoneSimulator.sdk"),
572  XcodeSDK::Type::iPhoneSimulator,
574  }
575 };
576 
577 static const char *g_tvos_plugin_name = "tvos-simulator";
578 static const char *g_tvos_description = "tvOS simulator platform plug-in.";
579 
580 /// Apple TV Simulator Plugin.
582  static void Initialize() {
583  PluginManager::RegisterPlugin(ConstString(g_tvos_plugin_name),
586  }
587 
588  static void Terminate() {
589  PluginManager::UnregisterPlugin(PlatformAppleTVSimulator::CreateInstance);
590  }
591 
592  static PlatformSP CreateInstance(bool force, const ArchSpec *arch) {
593  if (shouldSkipSimulatorPlatform(force, arch))
594  return nullptr;
596  "PlatformAppleTVSimulator", g_tvos_description,
598  {llvm::Triple::aarch64, llvm::Triple::x86_64}, llvm::Triple::TvOS,
599  {llvm::Triple::TvOS},
600  {
601 #ifdef __APPLE__
602 #if __arm64__
603  "arm64e-apple-tvos-simulator", "arm64-apple-tvos-simulator",
604  "x86_64h-apple-tvos-simulator", "x86_64-apple-tvos-simulator",
605 #else
606  "x86_64h-apple-tvos-simulator", "x86_64-apple-tvos-simulator",
607 #endif
608 #endif
609  },
610  GetXcodeSDKDir("AppleTVSimulator.Internal.sdk", "AppleTVSimulator.sdk"),
611  XcodeSDK::Type::AppleTVSimulator,
613  arch);
614  }
615 };
616 
617 
618 static const char *g_watchos_plugin_name = "watchos-simulator";
619 static const char *g_watchos_description =
620  "Apple Watch simulator platform plug-in.";
621 
622 /// Apple Watch Simulator Plugin.
624  static void Initialize() {
625  PluginManager::RegisterPlugin(ConstString(g_watchos_plugin_name),
628  }
629 
630  static void Terminate() {
631  PluginManager::UnregisterPlugin(
633  }
634 
635  static PlatformSP CreateInstance(bool force, const ArchSpec *arch) {
636  if (shouldSkipSimulatorPlatform(force, arch))
637  return nullptr;
639  "PlatformAppleWatchSimulator", g_watchos_description,
641  {llvm::Triple::aarch64, llvm::Triple::x86_64, llvm::Triple::x86},
642  llvm::Triple::WatchOS, {llvm::Triple::WatchOS},
643  {
644 #ifdef __APPLE__
645 #if __arm64__
646  "arm64e-apple-watchos-simulator", "arm64-apple-watchos-simulator",
647 #else
648  "x86_64-apple-watchos-simulator", "x86_64h-apple-watchos-simulator",
649  "i386-apple-watchos-simulator",
650 #endif
651 #endif
652  },
653  GetXcodeSDKDir("WatchSimulator.Internal.sdk", "WatchSimulator.sdk"),
654  XcodeSDK::Type::WatchSimulator,
656  arch);
657  }
658 };
659 
660 
661 static unsigned g_initialize_count = 0;
662 
663 // Static Functions
665  if (g_initialize_count++ == 0) {
670  }
671 }
672 
674  if (g_initialize_count > 0)
675  if (--g_initialize_count == 0) {
680  }
681 }
682 
PlatformAppleSimulator::m_core_sim_path_mutex
std::mutex m_core_sim_path_mutex
Definition: PlatformAppleSimulator.h:96
lldb_private::ProcessInstanceInfo
Definition: ProcessInfo.h:108
lldb_private::UUID
Definition: UUID.h:23
PlatformAppleWatchSimulator::Initialize
static void Initialize()
Definition: PlatformAppleSimulator.cpp:624
CoreSimulatorSupport::Device::GetName
std::string GetName() const
Definition: PlatformiOSSimulatorCoreSimulatorSupport.mm:207
PlatformAppleSimulator::DebugProcess
lldb::ProcessSP DebugProcess(lldb_private::ProcessLaunchInfo &launch_info, lldb_private::Debugger &debugger, lldb_private::Target *target, lldb_private::Status &error) override
Subclasses do not need to implement this function as it uses the Platform::LaunchProcess() followed b...
Definition: PlatformAppleSimulator.cpp:180
lldb_private::ArchSpec
Definition: ArchSpec.h:33
lldb_private::ArchSpec::TripleVendorWasSpecified
bool TripleVendorWasSpecified() const
Definition: ArchSpec.h:347
lldb_private::ModuleSpec::GetUUIDPtr
UUID * GetUUIDPtr()
Definition: ModuleSpec.h:98
LLDB_INVALID_PROCESS_ID
#define LLDB_INVALID_PROCESS_ID
Definition: lldb-defines.h:93
lldb_private::ArchSpec::GetMachine
llvm::Triple::ArchType GetMachine() const
Returns a machine family for the current architecture.
Definition: ArchSpec.cpp:667
GetXcodeSDKDir
static llvm::StringRef GetXcodeSDKDir(std::string preferred, std::string secondary)
Definition: PlatformAppleSimulator.cpp:518
CoreSimulatorSupport::DeviceSet::ForEach
void ForEach(std::function< bool(const Device &)> f)
Definition: PlatformiOSSimulatorCoreSimulatorSupport.mm:590
UNSUPPORTED_ERROR
#define UNSUPPORTED_ERROR
Definition: PlatformAppleSimulator.cpp:34
PlatformiOSSimulator
IPhone Simulator Plugin.
Definition: PlatformAppleSimulator.cpp:531
PlatformAppleSimulator::GetStatus
void GetStatus(lldb_private::Stream &strm) override
Report the current status for this platform.
Definition: PlatformAppleSimulator.cpp:82
PlatformAppleSimulator::~PlatformAppleSimulator
virtual ~PlatformAppleSimulator()
Destructor.
lldb_private::ArchSpec::GetCore
Core GetCore() const
Definition: ArchSpec.h:423
CoreSimulatorSupport::Device::Spawn
Process Spawn(lldb_private::ProcessLaunchInfo &launch_info)
Definition: PlatformiOSSimulatorCoreSimulatorSupport.mm:448
g_tvos_description
static const char * g_tvos_description
Definition: PlatformAppleSimulator.cpp:578
PlatformiOSSimulator::CreateInstance
static PlatformSP CreateInstance(bool force, const ArchSpec *arch)
Definition: PlatformAppleSimulator.cpp:542
LLDB_LOGF
#define LLDB_LOGF(log,...)
Definition: Log.h:249
lldb_private::Process
Definition: Process.h:341
PlatformAppleSimulator::DisconnectRemote
lldb_private::Status DisconnectRemote() override
Definition: PlatformAppleSimulator.cpp:169
g_initialize_count
static unsigned g_initialize_count
Definition: PlatformAppleSimulator.cpp:661
Module.h
PlatformAppleTVSimulator::Terminate
static void Terminate()
Definition: PlatformAppleSimulator.cpp:588
lldb_private::XcodeSDK
An abstraction for Xcode-style SDKs that works like ArchSpec.
Definition: XcodeSDK.h:24
LIBLLDB_LOG_PLATFORM
#define LIBLLDB_LOG_PLATFORM
Definition: Logging.h:39
lldb_private::ProcessInstanceInfoMatch
Definition: ProcessInfo.h:163
g_ios_plugin_name
static const char * g_ios_plugin_name
Definition: PlatformAppleSimulator.cpp:527
PlatformAppleSimulator::Initialize
static void Initialize()
Definition: PlatformAppleSimulator.cpp:664
PlatformAppleSimulator::m_kind
CoreSimulatorSupport::DeviceType::ProductFamilyID m_kind
Definition: PlatformAppleSimulator.h:99
lldb_private::ProcessInfo::GetProcessID
lldb::pid_t GetProcessID() const
Definition: ProcessInfo.h:67
shouldSkipSimulatorPlatform
static bool shouldSkipSimulatorPlatform(bool force, const ArchSpec *arch)
Whether to skip creating a simulator platform.
Definition: PlatformAppleSimulator.cpp:509
lldb_private::ProcessLaunchInfo::GetFlags
Flags & GetFlags()
Definition: ProcessLaunchInfo.h:64
CoreSimulatorSupport::DeviceSet::GetNumDevices
size_t GetNumDevices()
Definition: PlatformiOSSimulatorCoreSimulatorSupport.mm:567
lldb_private::ProcessInfo::SetProcessID
void SetProcessID(lldb::pid_t pid)
Definition: ProcessInfo.h:69
PlatformAppleSimulator::GetSharedModule
lldb_private::Status GetSharedModule(const lldb_private::ModuleSpec &module_spec, lldb_private::Process *process, lldb::ModuleSP &module_sp, const lldb_private::FileSpecList *module_search_paths_ptr, llvm::SmallVectorImpl< lldb::ModuleSP > *old_modules, bool *did_create_ptr) override
Definition: PlatformAppleSimulator.cpp:461
lldb_private::Stream
Definition: Stream.h:28
lldb_private::Args
Definition: Args.h:33
lldb_private::ArchSpec::GetTriple
llvm::Triple & GetTriple()
Architecture triple accessor.
Definition: ArchSpec.h:444
PlatformAppleTVSimulator
Apple TV Simulator Plugin.
Definition: PlatformAppleSimulator.cpp:581
CoreSimulatorSupport::DeviceType::ProductFamilyID::appleWatch
@ appleWatch
lldb_private::Target
Definition: Target.h:445
lldb_private::ProcessLaunchInfo::SetHijackListener
void SetHijackListener(const lldb::ListenerSP &listener_sp)
Definition: ProcessLaunchInfo.h:136
lldb_private::StreamString::GetString
llvm::StringRef GetString() const
Definition: StreamString.cpp:51
PlatformDarwin
Definition: PlatformDarwin.h:25
Process.h
CoreSimulatorSupport::Device::GetState
State GetState()
Definition: PlatformiOSSimulatorCoreSimulatorSupport.mm:107
lldb_private::FileSpec
Definition: FileSpec.h:56
error
static llvm::raw_ostream & error(Stream &strm)
Definition: CommandReturnObject.cpp:17
PlatformAppleSimulator::CreateInstance
static lldb::PlatformSP CreateInstance(const char *class_name, const char *description, lldb_private::ConstString plugin_name, llvm::SmallVector< llvm::Triple::ArchType, 4 > supported_arch, llvm::Triple::OSType preferred_os, llvm::SmallVector< llvm::Triple::OSType, 4 > supported_os, llvm::SmallVector< llvm::StringRef, 4 > supported_triples, llvm::StringRef sdk, lldb_private::XcodeSDK::Type sdk_type, CoreSimulatorSupport::DeviceType::ProductFamilyID kind, bool force, const lldb_private::ArchSpec *arch)
Definition: PlatformAppleSimulator.cpp:277
CoreSimulatorSupport::DeviceType::ProductFamilyID::iPhone
@ iPhone
PlatformAppleSimulator::GetSupportedArchitectureAtIndex
bool GetSupportedArchitectureAtIndex(uint32_t idx, lldb_private::ArchSpec &arch) override
Get the platform's supported architectures in the order in which they should be searched.
Definition: PlatformAppleSimulator.cpp:269
LLDBAssert.h
CoreSimulatorSupport::DeviceSet::GetFanciest
Device GetFanciest(DeviceType::ProductFamilyID dev_id)
Definition: PlatformiOSSimulatorCoreSimulatorSupport.mm:613
lldb_private::ProcessLaunchInfo
Definition: ProcessLaunchInfo.h:31
Log.h
lldb_private::Status::Fail
bool Fail() const
Test for error condition.
Definition: Status.cpp:182
PlatformAppleTVSimulator::Initialize
static void Initialize()
Definition: PlatformAppleSimulator.cpp:582
StreamString.h
PlatformAppleSimulator::ConnectRemote
lldb_private::Status ConnectRemote(lldb_private::Args &args) override
Definition: PlatformAppleSimulator.cpp:130
lldb_private::ConstString
Definition: ConstString.h:40
CoreSimulatorSupport::DeviceSet::GetDeviceAtIndex
Device GetDeviceAtIndex(size_t idx)
Definition: PlatformiOSSimulatorCoreSimulatorSupport.mm:572
lldb_private::StreamString
Definition: StreamString.h:23
CoreSimulatorSupport::Device::GetUDID
std::string GetUDID() const
Definition: PlatformiOSSimulatorCoreSimulatorSupport.mm:214
lldb_private::Platform::Terminate
static void Terminate()
Definition: Platform.cpp:149
lldb_private::GetLogIfAllCategoriesSet
Log * GetLogIfAllCategoriesSet(uint32_t mask)
Definition: Logging.cpp:58
g_watchos_plugin_name
static const char * g_watchos_plugin_name
Definition: PlatformAppleSimulator.cpp:618
lldb_private::ArchSpec::TripleOSWasSpecified
bool TripleOSWasSpecified() const
Definition: ArchSpec.h:351
lldb_private::Debugger
Definition: Debugger.h:70
HostInfo.h
PlatformAppleSimulator::GetSymbolFile
lldb_private::Status GetSymbolFile(const lldb_private::FileSpec &platform_file, const lldb_private::UUID *uuid_ptr, lldb_private::FileSpec &local_file)
Definition: PlatformAppleSimulator.cpp:428
string
string(SUBSTRING ${p} 10 -1 pStripped) if($
Definition: Plugins/CMakeLists.txt:38
lldb_private::ArchSpec::IsValid
bool IsValid() const
Tests if this ArchSpec is valid.
Definition: ArchSpec.h:342
lldb_private::Platform::Initialize
static void Initialize()
Definition: Platform.cpp:147
lldb_private::ProcessLaunchInfo::SetLaunchInSeparateProcessGroup
void SetLaunchInSeparateProcessGroup(bool separate)
Definition: ProcessLaunchInfo.cpp:151
lldb_private::ProcessLaunchInfo::GetPTY
PseudoTerminal & GetPTY()
Definition: ProcessLaunchInfo.h:125
lldb_private::ArchSpec::TripleEnvironmentWasSpecified
bool TripleEnvironmentWasSpecified() const
Definition: ArchSpec.h:353
lldb_private::ProcessAttachInfo
Definition: Process.h:114
PlatformAppleSimulator::GetCoreSimulatorPath
lldb_private::FileSpec GetCoreSimulatorPath()
Definition: PlatformAppleSimulator.cpp:226
CoreSimulatorSupport::DeviceType::ProductFamilyID::appleTV
@ appleTV
PlatformAppleSimulator::PlatformAppleSimulator
PlatformAppleSimulator(const char *class_name, const char *description, lldb_private::ConstString plugin_name, llvm::Triple::OSType preferred_os, llvm::SmallVector< llvm::StringRef, 4 > supported_triples, llvm::StringRef sdk, lldb_private::XcodeSDK::Type sdk_type, CoreSimulatorSupport::DeviceType::ProductFamilyID kind)
Default Constructor.
Definition: PlatformAppleSimulator.cpp:38
PlatformAppleTVSimulator::CreateInstance
static PlatformSP CreateInstance(bool force, const ArchSpec *arch)
Definition: PlatformAppleSimulator.cpp:592
lldb_private::ModuleSpec::GetFileSpec
FileSpec & GetFileSpec()
Definition: ModuleSpec.h:58
lldb_private::ModuleSpec
Definition: ModuleSpec.h:26
lldb_private::Status
Definition: Status.h:44
lldb_private::PseudoTerminal::ReleasePrimaryFileDescriptor
int ReleasePrimaryFileDescriptor()
Release the primary file descriptor.
Definition: PseudoTerminal.cpp:184
lldb_private::Args::GetArgumentAtIndex
const char * GetArgumentAtIndex(size_t idx) const
Gets the NULL terminated C string argument pointer for the argument at index idx.
Definition: Args.cpp:259
lldb_private::ArchSpec::GetArchitectureName
const char * GetArchitectureName() const
Returns a static string representing the current architecture.
Definition: ArchSpec.cpp:538
PlatformAppleSimulator::ResolveExecutable
lldb_private::Status ResolveExecutable(const lldb_private::ModuleSpec &module_spec, lldb::ModuleSP &module_sp, const lldb_private::FileSpecList *module_search_paths_ptr) override
Definition: PlatformAppleSimulator.cpp:352
uint32_t
g_watchos_description
static const char * g_watchos_description
Definition: PlatformAppleSimulator.cpp:619
PlatformAppleSimulator.h
CoreSimulatorSupport::DeviceSet::GetAvailableDevices
static DeviceSet GetAvailableDevices(const char *developer_dir)
Definition: PlatformiOSSimulatorCoreSimulatorSupport.mm:559
lldb_private::XcodeSDK::Type
Type
Different types of Xcode SDKs.
Definition: XcodeSDK.h:29
CoreSimulatorSupport::DeviceType::ProductFamilyID
ProductFamilyID
Definition: PlatformiOSSimulatorCoreSimulatorSupport.h:72
CoreSimulatorSupport::Device::Boot
bool Boot(lldb_private::Status &err)
Definition: PlatformiOSSimulatorCoreSimulatorSupport.mm:344
PlatformAppleSimulator::LaunchProcess
lldb_private::Status LaunchProcess(lldb_private::ProcessLaunchInfo &launch_info) override
Launch a new process on a platform, not necessarily for debugging, it could be just for running the p...
Definition: PlatformAppleSimulator.cpp:55
CoreSimulatorSupport::Device
Definition: PlatformiOSSimulatorCoreSimulatorSupport.h:136
lldb_private::Status::SetErrorString
void SetErrorString(llvm::StringRef err_str)
Set the current error string to err_str.
Definition: Status.cpp:242
PlatformiOSSimulator::Terminate
static void Terminate()
Definition: PlatformAppleSimulator.cpp:538
CoreSimulatorSupport::Device::State::Booted
@ Booted
PlatformAppleSimulator::m_os_type
llvm::Triple::OSType m_os_type
Definition: PlatformAppleSimulator.h:103
PlatformAppleSimulator::m_core_simulator_framework_path
llvm::Optional< lldb_private::FileSpec > m_core_simulator_framework_path
Definition: PlatformAppleSimulator.h:97
PlatformAppleSimulator::Terminate
static void Terminate()
Definition: PlatformAppleSimulator.cpp:673
PseudoTerminal.h
PlatformAppleSimulator::GetPluginName
lldb_private::ConstString GetPluginName() override
Definition: PlatformAppleSimulator.h:49
PluginManager.h
lldb_private::ModuleSpec::GetArchitecture
ArchSpec & GetArchitecture()
Definition: ModuleSpec.h:94
lldb_private::Stream::Printf
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
Definition: Stream.cpp:107
Status.h
lldb_private::ProcessInfo::GetArchitecture
ArchSpec & GetArchitecture()
Definition: ProcessInfo.h:61
lldb_private
A class that represents a running process on the host machine.
Definition: SBCommandInterpreterRunOptions.h:16
PlatformAppleSimulator::m_supported_triples
llvm::SmallVector< llvm::StringRef, 4 > m_supported_triples
Definition: PlatformAppleSimulator.h:104
PlatformAppleSimulator::FindProcesses
uint32_t FindProcesses(const lldb_private::ProcessInstanceInfoMatch &match_info, lldb_private::ProcessInstanceInfoList &process_infos) override
Attach to an existing process by process name.
Definition: PlatformAppleSimulator.cpp:489
PlatformAppleSimulator::m_sdk
llvm::StringRef m_sdk
Definition: PlatformAppleSimulator.h:105
PlatformAppleWatchSimulator
Apple Watch Simulator Plugin.
Definition: PlatformAppleSimulator.cpp:623
lldb_private::Flags::Set
ValueType Set(ValueType mask)
Set one or more flags by logical OR'ing mask with the current flags.
Definition: Flags.h:73
PlatformAppleWatchSimulator::CreateInstance
static PlatformSP CreateInstance(bool force, const ArchSpec *arch)
Definition: PlatformAppleSimulator.cpp:635
g_ios_description
static const char * g_ios_description
Definition: PlatformAppleSimulator.cpp:528
lldb_private::Log
Definition: Log.h:49
lldb_private::Stream::PutCString
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
Definition: Stream.cpp:63
PlatformPOSIX::Attach
lldb::ProcessSP Attach(lldb_private::ProcessAttachInfo &attach_info, lldb_private::Debugger &debugger, lldb_private::Target *target, lldb_private::Status &error) override
Attach to an existing process using a process ID.
Definition: PlatformPOSIX.cpp:359
lldb_private::FileSpec::SetFile
void SetFile(llvm::StringRef path, Style style)
Change the file specified with a new path.
Definition: FileSpec.cpp:174
g_tvos_plugin_name
static const char * g_tvos_plugin_name
Definition: PlatformAppleSimulator.cpp:577
llvm::SmallVectorImpl
Definition: Disassembler.h:42
PATH_MAX
#define PATH_MAX
Definition: windows/PosixApi.h:25
lldb_private::FileSpec::GetPath
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
Definition: FileSpec.cpp:348
lldb_private::ProcessAttachInfo::GetHijackListener
lldb::ListenerSP GetHijackListener() const
Definition: Process.h:180
PlatformAppleSimulator::m_device
llvm::Optional< CoreSimulatorSupport::Device > m_device
Definition: PlatformAppleSimulator.h:98
lldb_private::Args::GetArgumentCount
size_t GetArgumentCount() const
Gets the number of arguments left in this command object.
Definition: Args.h:118
lldb_private::ProcessInstanceInfoList
std::vector< ProcessInstanceInfo > ProcessInstanceInfoList
Definition: Host.h:30
PlatformAppleWatchSimulator::Terminate
static void Terminate()
Definition: PlatformAppleSimulator.cpp:630
PlatformAppleSimulator::LoadCoreSimulator
void LoadCoreSimulator()
Definition: PlatformAppleSimulator.cpp:241
lldb
Definition: SBAddress.h:15
PlatformiOSSimulator::Initialize
static void Initialize()
Definition: PlatformAppleSimulator.cpp:532
CoreSimulatorSupport::DeviceSet
Definition: PlatformiOSSimulatorCoreSimulatorSupport.h:195