PlatformRemoteiOS.cpp revision 1a8e65493b8049bc5877bcedfeb2e9731f7f2d8e
1cb8977d726be451df9978a74088435667fa37da2Greg Clayton//===-- PlatformRemoteiOS.cpp -----------------------------------*- C++ -*-===// 2b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// 3b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// The LLVM Compiler Infrastructure 4b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// 5b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// This file is distributed under the University of Illinois Open Source 6b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// License. See LICENSE.TXT for details. 7b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// 8b1888f24fa181489840b9acf193e224d125d0776Greg Clayton//===----------------------------------------------------------------------===// 9b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 10b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "PlatformRemoteiOS.h" 11b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 12b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// C Includes 13b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// C++ Includes 14b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// Other libraries and framework includes 15b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// Project includes 16b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Breakpoint/BreakpointLocation.h" 17b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Core/ArchSpec.h" 18b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Core/Error.h" 19b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Core/Module.h" 20b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Core/ModuleList.h" 21b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Core/PluginManager.h" 22b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Core/StreamString.h" 23b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Host/FileSpec.h" 24b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Host/Host.h" 25b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Target/Process.h" 26b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Target/Target.h" 27b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 28b1888f24fa181489840b9acf193e224d125d0776Greg Claytonusing namespace lldb; 29b1888f24fa181489840b9acf193e224d125d0776Greg Claytonusing namespace lldb_private; 30cb8977d726be451df9978a74088435667fa37da2Greg Clayton 3158e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 3258e26e0935138225477fd61283215ceff2068899Greg Clayton// Static Variables 3358e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 3458e26e0935138225477fd61283215ceff2068899Greg Claytonstatic uint32_t g_initialize_count = 0; 3558e26e0935138225477fd61283215ceff2068899Greg Clayton 3658e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 3758e26e0935138225477fd61283215ceff2068899Greg Clayton// Static Functions 3858e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 39b1888f24fa181489840b9acf193e224d125d0776Greg Claytonvoid 40b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::Initialize () 41b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 4258e26e0935138225477fd61283215ceff2068899Greg Clayton if (g_initialize_count++ == 0) 43b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 44cb8977d726be451df9978a74088435667fa37da2Greg Clayton PluginManager::RegisterPlugin (PlatformRemoteiOS::GetShortPluginNameStatic(), 45cb8977d726be451df9978a74088435667fa37da2Greg Clayton PlatformRemoteiOS::GetDescriptionStatic(), 46cb8977d726be451df9978a74088435667fa37da2Greg Clayton PlatformRemoteiOS::CreateInstance); 47cb8977d726be451df9978a74088435667fa37da2Greg Clayton } 48cb8977d726be451df9978a74088435667fa37da2Greg Clayton} 49cb8977d726be451df9978a74088435667fa37da2Greg Clayton 50cb8977d726be451df9978a74088435667fa37da2Greg Claytonvoid 51cb8977d726be451df9978a74088435667fa37da2Greg ClaytonPlatformRemoteiOS::Terminate () 52cb8977d726be451df9978a74088435667fa37da2Greg Clayton{ 5358e26e0935138225477fd61283215ceff2068899Greg Clayton if (g_initialize_count > 0) 54cb8977d726be451df9978a74088435667fa37da2Greg Clayton { 5558e26e0935138225477fd61283215ceff2068899Greg Clayton if (--g_initialize_count == 0) 5658e26e0935138225477fd61283215ceff2068899Greg Clayton { 5758e26e0935138225477fd61283215ceff2068899Greg Clayton PluginManager::UnregisterPlugin (PlatformRemoteiOS::CreateInstance); 5858e26e0935138225477fd61283215ceff2068899Greg Clayton } 59b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 60b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 61b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 62b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform* 63b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::CreateInstance () 64b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 65b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return new PlatformRemoteiOS (); 66b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 67b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 68b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 69b1888f24fa181489840b9acf193e224d125d0776Greg Claytonconst char * 70b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::GetPluginNameStatic () 71b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 72b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return "PlatformRemoteiOS"; 73b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 74b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 75b1888f24fa181489840b9acf193e224d125d0776Greg Claytonconst char * 76b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::GetShortPluginNameStatic() 77b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 78b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return "remote-ios"; 79b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 80b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 81b1888f24fa181489840b9acf193e224d125d0776Greg Claytonconst char * 82b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::GetDescriptionStatic() 83b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 84b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return "Remote iOS platform plug-in."; 85b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 86b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 87b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 8858e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 8958e26e0935138225477fd61283215ceff2068899Greg Clayton/// Default Constructor 9058e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 9158e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformRemoteiOS::PlatformRemoteiOS () : 9258e26e0935138225477fd61283215ceff2068899Greg Clayton PlatformDarwin (false), // This is a remote platform 9358e26e0935138225477fd61283215ceff2068899Greg Clayton m_device_support_directory_for_os_version () 9458e26e0935138225477fd61283215ceff2068899Greg Clayton{ 9558e26e0935138225477fd61283215ceff2068899Greg Clayton} 9658e26e0935138225477fd61283215ceff2068899Greg Clayton 9758e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 9858e26e0935138225477fd61283215ceff2068899Greg Clayton/// Destructor. 9958e26e0935138225477fd61283215ceff2068899Greg Clayton/// 10058e26e0935138225477fd61283215ceff2068899Greg Clayton/// The destructor is virtual since this class is designed to be 10158e26e0935138225477fd61283215ceff2068899Greg Clayton/// inherited from by the plug-in instance. 10258e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 10358e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformRemoteiOS::~PlatformRemoteiOS() 10458e26e0935138225477fd61283215ceff2068899Greg Clayton{ 10558e26e0935138225477fd61283215ceff2068899Greg Clayton} 10658e26e0935138225477fd61283215ceff2068899Greg Clayton 10758e26e0935138225477fd61283215ceff2068899Greg Clayton 108b1888f24fa181489840b9acf193e224d125d0776Greg Claytonvoid 109b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::GetStatus (Stream &strm) 110b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 11158e26e0935138225477fd61283215ceff2068899Greg Clayton Platform::GetStatus (strm); 112b1888f24fa181489840b9acf193e224d125d0776Greg Clayton const char *sdk_directory = GetDeviceSupportDirectoryForOSVersion(); 113b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (sdk_directory) 114abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton strm.Printf (" SDK Path: \"%s\"\n", sdk_directory); 115b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 116abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton strm.PutCString (" SDK Path: error: unable to locate SDK\n"); 117b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 118b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 119b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 120b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonError 121b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::ResolveExecutable (const FileSpec &exe_file, 122b1888f24fa181489840b9acf193e224d125d0776Greg Clayton const ArchSpec &exe_arch, 1239ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton lldb::ModuleSP &exe_module_sp, 1249ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton const FileSpecList *module_search_paths_ptr) 125b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 126b1888f24fa181489840b9acf193e224d125d0776Greg Clayton Error error; 127b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // Nothing special to do here, just use the actual file and architecture 128b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 129b1888f24fa181489840b9acf193e224d125d0776Greg Clayton FileSpec resolved_exe_file (exe_file); 130b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 131b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // If we have "ls" as the exe_file, resolve the executable loation based on 132b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // the current path variables 133b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // TODO: resolve bare executables in the Platform SDK 134b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// if (!resolved_exe_file.Exists()) 135b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// resolved_exe_file.ResolveExecutableLocation (); 136b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 137b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // Resolve any executable within a bundle on MacOSX 138b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // TODO: verify that this handles shallow bundles, if not then implement one ourselves 139b1888f24fa181489840b9acf193e224d125d0776Greg Clayton Host::ResolveExecutableInBundle (resolved_exe_file); 140b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 141b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (resolved_exe_file.Exists()) 142b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 143b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (exe_arch.IsValid()) 144b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 145444fe998bf707bd076a70c3a779db8575533695eGreg Clayton ModuleSpec module_spec (resolved_exe_file, exe_arch); 146444fe998bf707bd076a70c3a779db8575533695eGreg Clayton error = ModuleList::GetSharedModule (module_spec, 147b1888f24fa181489840b9acf193e224d125d0776Greg Clayton exe_module_sp, 1489ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton NULL, 149b1888f24fa181489840b9acf193e224d125d0776Greg Clayton NULL, 150b1888f24fa181489840b9acf193e224d125d0776Greg Clayton NULL); 151b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 1521a8e65493b8049bc5877bcedfeb2e9731f7f2d8eHan Ming Ong if (exe_module_sp && exe_module_sp->GetObjectFile()) 15324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return error; 15424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton exe_module_sp.reset(); 155b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 15624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // No valid architecture was specified or the exact ARM slice wasn't 15724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // found so ask the platform for the architectures that we should be 15824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // using (in the correct order) and see if we can find a match that way 15924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton StreamString arch_names; 16024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton ArchSpec platform_arch; 16124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton for (uint32_t idx = 0; GetSupportedArchitectureAtIndex (idx, platform_arch); ++idx) 162b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 163444fe998bf707bd076a70c3a779db8575533695eGreg Clayton ModuleSpec module_spec (resolved_exe_file, platform_arch); 164444fe998bf707bd076a70c3a779db8575533695eGreg Clayton error = ModuleList::GetSharedModule (module_spec, 16524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton exe_module_sp, 1669ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton NULL, 16724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton NULL, 16824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton NULL); 16924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // Did we find an executable using one of the 17024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (error.Success()) 171b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 17224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (exe_module_sp && exe_module_sp->GetObjectFile()) 17324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton break; 17424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton else 17524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton error.SetErrorToGenericError(); 176b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 177b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 17824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (idx > 0) 17924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton arch_names.PutCString (", "); 18024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton arch_names.PutCString (platform_arch.GetArchitectureName()); 18124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 18224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 18324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (error.Fail() || !exe_module_sp) 18424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 18524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton error.SetErrorStringWithFormat ("'%s%s%s' doesn't contain any '%s' platform architectures: %s", 18624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton exe_file.GetDirectory().AsCString(""), 18724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton exe_file.GetDirectory() ? "/" : "", 18824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton exe_file.GetFilename().AsCString(""), 18924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton GetShortPluginName(), 19024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton arch_names.GetString().c_str()); 191b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 192b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 193b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 194b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 195b1888f24fa181489840b9acf193e224d125d0776Greg Clayton error.SetErrorStringWithFormat ("'%s%s%s' does not exist", 196b1888f24fa181489840b9acf193e224d125d0776Greg Clayton exe_file.GetDirectory().AsCString(""), 197b1888f24fa181489840b9acf193e224d125d0776Greg Clayton exe_file.GetDirectory() ? "/" : "", 198b1888f24fa181489840b9acf193e224d125d0776Greg Clayton exe_file.GetFilename().AsCString("")); 199b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 200b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 201b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return error; 202b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 203b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 204b1888f24fa181489840b9acf193e224d125d0776Greg Claytonconst char * 205b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::GetDeviceSupportDirectoryForOSVersion() 206b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 207604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton if (m_sdk_sysroot) 208604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton return m_sdk_sysroot.GetCString(); 209604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton 210b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (m_device_support_directory_for_os_version.empty()) 211b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 212f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton const char *device_support_dir = GetDeveloperDirectory(); 213b1888f24fa181489840b9acf193e224d125d0776Greg Clayton const bool resolve_path = true; 214b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (device_support_dir) 215b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 216b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_device_support_directory_for_os_version.assign (device_support_dir); 217b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_device_support_directory_for_os_version.append ("/Platforms/iPhoneOS.platform/DeviceSupport"); 218b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 219b1888f24fa181489840b9acf193e224d125d0776Greg Clayton uint32_t major = 0; 220b1888f24fa181489840b9acf193e224d125d0776Greg Clayton uint32_t minor = 0; 221b1888f24fa181489840b9acf193e224d125d0776Greg Clayton uint32_t update = 0; 222b1888f24fa181489840b9acf193e224d125d0776Greg Clayton FileSpec file_spec; 223b1888f24fa181489840b9acf193e224d125d0776Greg Clayton char resolved_path[PATH_MAX]; 224b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (GetOSVersion(major, minor, update)) 225b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 226b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (major != UINT32_MAX && minor != UINT32_MAX && update != UINT32_MAX) 227b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 228b1888f24fa181489840b9acf193e224d125d0776Greg Clayton ::snprintf (resolved_path, 229b1888f24fa181489840b9acf193e224d125d0776Greg Clayton sizeof(resolved_path), 230b1888f24fa181489840b9acf193e224d125d0776Greg Clayton "%s/%i.%i.%i", 231b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_device_support_directory_for_os_version.c_str(), 232b1888f24fa181489840b9acf193e224d125d0776Greg Clayton major, 233b1888f24fa181489840b9acf193e224d125d0776Greg Clayton minor, 234b1888f24fa181489840b9acf193e224d125d0776Greg Clayton update); 235b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 236b1888f24fa181489840b9acf193e224d125d0776Greg Clayton file_spec.SetFile(resolved_path, resolve_path); 237b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (file_spec.Exists() && file_spec.GetPath(resolved_path, sizeof(resolved_path))) 238b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 239b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_device_support_directory_for_os_version.assign (resolved_path); 240b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return m_device_support_directory_for_os_version.c_str(); 241b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 242b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 243b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 244b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (major != UINT32_MAX && minor != UINT32_MAX) 245b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 246b1888f24fa181489840b9acf193e224d125d0776Greg Clayton ::snprintf (resolved_path, 247b1888f24fa181489840b9acf193e224d125d0776Greg Clayton sizeof(resolved_path), 248b1888f24fa181489840b9acf193e224d125d0776Greg Clayton "%s/%i.%i", 249b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_device_support_directory_for_os_version.c_str(), 250b1888f24fa181489840b9acf193e224d125d0776Greg Clayton major, 2514fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton minor); 252b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 253b1888f24fa181489840b9acf193e224d125d0776Greg Clayton file_spec.SetFile(resolved_path, resolve_path); 254b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (file_spec.Exists() && file_spec.GetPath(resolved_path, sizeof(resolved_path))) 255b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 256b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_device_support_directory_for_os_version.assign (resolved_path); 257b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return m_device_support_directory_for_os_version.c_str(); 258b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 259b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 260b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 261b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 262b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 263b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // Use the default as we have no OS version selected 264b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_device_support_directory_for_os_version.append ("/Latest"); 265b1888f24fa181489840b9acf193e224d125d0776Greg Clayton file_spec.SetFile(m_device_support_directory_for_os_version.c_str(), resolve_path); 266b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 267b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (file_spec.Exists() && file_spec.GetPath(resolved_path, sizeof(resolved_path))) 268b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 269b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (m_major_os_version == UINT32_MAX) 270b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 271b1888f24fa181489840b9acf193e224d125d0776Greg Clayton const char *resolved_latest_dirname = file_spec.GetFilename().GetCString(); 272b1888f24fa181489840b9acf193e224d125d0776Greg Clayton const char *pos = Args::StringToVersion (resolved_latest_dirname, 273b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_major_os_version, 274b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_minor_os_version, 275b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_update_os_version); 276b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 277b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (m_build_update.empty() && pos[0] == ' ' && pos[1] == '(') 278b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 279b1888f24fa181489840b9acf193e224d125d0776Greg Clayton const char *end_paren = strchr (pos + 2, ')'); 280b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_build_update.assign (pos + 2, end_paren); 281b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 282b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 283b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_device_support_directory_for_os_version.assign (resolved_path); 284b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return m_device_support_directory_for_os_version.c_str(); 285b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 286b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 287b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 288b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // Assign a single NULL character so we know we tried to find the device 289b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // support directory and we don't keep trying to find it over and over. 290b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_device_support_directory_for_os_version.assign (1, '\0'); 291b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 292b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We should have put a single NULL character into m_device_support_directory_for_os_version 293b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // or it should have a valid path if the code gets here 294b1888f24fa181489840b9acf193e224d125d0776Greg Clayton assert (m_device_support_directory_for_os_version.empty() == false); 295b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (m_device_support_directory_for_os_version[0]) 296b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return m_device_support_directory_for_os_version.c_str(); 297b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return NULL; 298b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 299b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 300b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonError 301b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::GetFile (const FileSpec &platform_file, 302cb8977d726be451df9978a74088435667fa37da2Greg Clayton const UUID *uuid_ptr, 303b1888f24fa181489840b9acf193e224d125d0776Greg Clayton FileSpec &local_file) 304b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 305b1888f24fa181489840b9acf193e224d125d0776Greg Clayton Error error; 306b1888f24fa181489840b9acf193e224d125d0776Greg Clayton char platform_file_path[PATH_MAX]; 307b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (platform_file.GetPath(platform_file_path, sizeof(platform_file_path))) 308b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 309b1888f24fa181489840b9acf193e224d125d0776Greg Clayton char resolved_path[PATH_MAX]; 310b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 311b1888f24fa181489840b9acf193e224d125d0776Greg Clayton const char * os_version_dir = GetDeviceSupportDirectoryForOSVersion(); 312b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (os_version_dir) 313b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 314b1888f24fa181489840b9acf193e224d125d0776Greg Clayton ::snprintf (resolved_path, 315b1888f24fa181489840b9acf193e224d125d0776Greg Clayton sizeof(resolved_path), 316604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton "%s/%s", 317604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton os_version_dir, 318604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton platform_file_path); 319604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton 320604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton local_file.SetFile(resolved_path, true); 321604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton if (local_file.Exists()) 322604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton return error; 323604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton 324604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton ::snprintf (resolved_path, 325604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton sizeof(resolved_path), 326b1888f24fa181489840b9acf193e224d125d0776Greg Clayton "%s/Symbols.Internal/%s", 327b1888f24fa181489840b9acf193e224d125d0776Greg Clayton os_version_dir, 328b1888f24fa181489840b9acf193e224d125d0776Greg Clayton platform_file_path); 329b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 330b1888f24fa181489840b9acf193e224d125d0776Greg Clayton local_file.SetFile(resolved_path, true); 331b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (local_file.Exists()) 332b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return error; 333b1888f24fa181489840b9acf193e224d125d0776Greg Clayton ::snprintf (resolved_path, 334b1888f24fa181489840b9acf193e224d125d0776Greg Clayton sizeof(resolved_path), 335b1888f24fa181489840b9acf193e224d125d0776Greg Clayton "%s/Symbols/%s", 336b1888f24fa181489840b9acf193e224d125d0776Greg Clayton os_version_dir, 337b1888f24fa181489840b9acf193e224d125d0776Greg Clayton platform_file_path); 338b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 339b1888f24fa181489840b9acf193e224d125d0776Greg Clayton local_file.SetFile(resolved_path, true); 340b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (local_file.Exists()) 341b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return error; 342b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 343b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 344b1888f24fa181489840b9acf193e224d125d0776Greg Clayton local_file = platform_file; 345b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (local_file.Exists()) 346b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return error; 347b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 348b1888f24fa181489840b9acf193e224d125d0776Greg Clayton error.SetErrorStringWithFormat ("unable to locate a platform file for '%s' in platform '%s'", 349b1888f24fa181489840b9acf193e224d125d0776Greg Clayton platform_file_path, 350b1888f24fa181489840b9acf193e224d125d0776Greg Clayton GetPluginName()); 351b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 352b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 353b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 354b1888f24fa181489840b9acf193e224d125d0776Greg Clayton error.SetErrorString ("invalid platform file argument"); 355b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 356b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return error; 357b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 358b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 35924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonError 360444fe998bf707bd076a70c3a779db8575533695eGreg ClaytonPlatformRemoteiOS::GetSharedModule (const ModuleSpec &module_spec, 36124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton ModuleSP &module_sp, 3629ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton const FileSpecList *module_search_paths_ptr, 36324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton ModuleSP *old_module_sp_ptr, 36424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton bool *did_create_ptr) 36524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 36624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // For iOS, the SDK files are all cached locally on the host 36724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // system. So first we ask for the file in the cached SDK, 36824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // then we attempt to get a shared module for the right architecture 36924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // with the right UUID. 370444fe998bf707bd076a70c3a779db8575533695eGreg Clayton const FileSpec &platform_file = module_spec.GetFileSpec(); 371444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 37224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton FileSpec local_file; 373444fe998bf707bd076a70c3a779db8575533695eGreg Clayton Error error (GetFile (platform_file, module_spec.GetUUIDPtr(), local_file)); 37424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (error.Success()) 37524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 376444fe998bf707bd076a70c3a779db8575533695eGreg Clayton error = ResolveExecutable (local_file, module_spec.GetArchitecture(), module_sp, module_search_paths_ptr); 3778c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton } 3788c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton else 3798c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton { 38024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const bool always_create = false; 381444fe998bf707bd076a70c3a779db8575533695eGreg Clayton error = ModuleList::GetSharedModule (module_spec, 38224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton module_sp, 3839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_search_paths_ptr, 38424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton old_module_sp_ptr, 38524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton did_create_ptr, 38624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton always_create); 3878c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton 38824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 38924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (module_sp) 39024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton module_sp->SetPlatformFileSpec(platform_file); 39124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 39224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return error; 39324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 39424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 39524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 396b1888f24fa181489840b9acf193e224d125d0776Greg Claytonuint32_t 397b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatformRemoteiOS::FindProcesses (const ProcessInstanceInfoMatch &match_info, 398b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessInstanceInfoList &process_infos) 399b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 400b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // TODO: if connected, send a packet to get the remote process infos by name 401b1888f24fa181489840b9acf193e224d125d0776Greg Clayton process_infos.Clear(); 402b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return 0; 403b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 404b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 405b1888f24fa181489840b9acf193e224d125d0776Greg Claytonbool 406b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatformRemoteiOS::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info) 407b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 408b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // TODO: if connected, send a packet to get the remote process info 409b1888f24fa181489840b9acf193e224d125d0776Greg Clayton process_info.Clear(); 410b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return false; 411b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 412b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 413b1888f24fa181489840b9acf193e224d125d0776Greg Claytonbool 414b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::GetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch) 415b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 4169d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda return ARMGetSupportedArchitectureAtIndex (idx, arch); 417b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 418