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" 2149ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/ModuleSpec.h" 22b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Core/PluginManager.h" 23b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Core/StreamString.h" 24b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Host/FileSpec.h" 25b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Host/Host.h" 26b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Target/Process.h" 27b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Target/Target.h" 28b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 29b1888f24fa181489840b9acf193e224d125d0776Greg Claytonusing namespace lldb; 30b1888f24fa181489840b9acf193e224d125d0776Greg Claytonusing namespace lldb_private; 31cb8977d726be451df9978a74088435667fa37da2Greg Clayton 32fea31993c6d78e0fd1629c899f47f16e44736011Greg ClaytonPlatformRemoteiOS::SDKDirectoryInfo::SDKDirectoryInfo (const lldb_private::FileSpec &sdk_dir) : 33fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton directory(sdk_dir), 34fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton build(), 35fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton version_major(0), 36fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton version_minor(0), 37fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton version_update(0), 38fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton user_cached(false) 39b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton{ 40fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton const char *dirname_cstr = sdk_dir.GetFilename().GetCString(); 41b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton const char *pos = Args::StringToVersion (dirname_cstr, 42b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton version_major, 43b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton version_minor, 44b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton version_update); 45b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton 46b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton if (pos && pos[0] == ' ' && pos[1] == '(') 47b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton { 48b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton const char *build_start = pos + 2; 49b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton const char *end_paren = strchr (build_start, ')'); 50b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton if (end_paren && build_start < end_paren) 51b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton build.SetCStringWithLength(build_start, end_paren - build_start); 52b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton } 53b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton} 54b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton 5558e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 5658e26e0935138225477fd61283215ceff2068899Greg Clayton// Static Variables 5758e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 5858e26e0935138225477fd61283215ceff2068899Greg Claytonstatic uint32_t g_initialize_count = 0; 5958e26e0935138225477fd61283215ceff2068899Greg Clayton 6058e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 6158e26e0935138225477fd61283215ceff2068899Greg Clayton// Static Functions 6258e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 63b1888f24fa181489840b9acf193e224d125d0776Greg Claytonvoid 64b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::Initialize () 65b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 6658e26e0935138225477fd61283215ceff2068899Greg Clayton if (g_initialize_count++ == 0) 67b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 680e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton PluginManager::RegisterPlugin (PlatformRemoteiOS::GetPluginNameStatic(), 69cb8977d726be451df9978a74088435667fa37da2Greg Clayton PlatformRemoteiOS::GetDescriptionStatic(), 70cb8977d726be451df9978a74088435667fa37da2Greg Clayton PlatformRemoteiOS::CreateInstance); 71cb8977d726be451df9978a74088435667fa37da2Greg Clayton } 72cb8977d726be451df9978a74088435667fa37da2Greg Clayton} 73cb8977d726be451df9978a74088435667fa37da2Greg Clayton 74cb8977d726be451df9978a74088435667fa37da2Greg Claytonvoid 75cb8977d726be451df9978a74088435667fa37da2Greg ClaytonPlatformRemoteiOS::Terminate () 76cb8977d726be451df9978a74088435667fa37da2Greg Clayton{ 7758e26e0935138225477fd61283215ceff2068899Greg Clayton if (g_initialize_count > 0) 78cb8977d726be451df9978a74088435667fa37da2Greg Clayton { 7958e26e0935138225477fd61283215ceff2068899Greg Clayton if (--g_initialize_count == 0) 8058e26e0935138225477fd61283215ceff2068899Greg Clayton { 8158e26e0935138225477fd61283215ceff2068899Greg Clayton PluginManager::UnregisterPlugin (PlatformRemoteiOS::CreateInstance); 8258e26e0935138225477fd61283215ceff2068899Greg Clayton } 83b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 84b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 85b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 86b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform* 87b1db658333cdebca31a128be95e926d80c3c7796Greg ClaytonPlatformRemoteiOS::CreateInstance (bool force, const ArchSpec *arch) 88b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 89b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton bool create = force; 90b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton if (create == false && arch && arch->IsValid()) 91b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton { 92b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton switch (arch->GetMachine()) 93b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton { 94b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton case llvm::Triple::arm: 95b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton case llvm::Triple::thumb: 96b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton { 97b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton const llvm::Triple &triple = arch->GetTriple(); 98b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton llvm::Triple::VendorType vendor = triple.getVendor(); 99b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton switch (vendor) 100b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 101b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::Apple: 102b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton create = true; 1034a379b1194f3e6b308cd6e80b45d6ca5dd0aafd7Greg Clayton break; 104b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 1056c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton#if defined(__APPLE__) 1066c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton // Only accept "unknown" for the vendor if the host is Apple and 1076c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton // it "unknown" wasn't specified (it was just returned becasue it 1086c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton // was NOT specified) 109b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::UnknownArch: 110b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton create = !arch->TripleVendorWasSpecified(); 111b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 112b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 1137eb083121db9e5d3a9a863e77b4a183c466028a7Enrico Granata#endif 114b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: 115b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 116b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 117b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (create) 118b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 119b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton switch (triple.getOS()) 120b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 121b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::Darwin: // Deprecated, but still support Darwin for historical reasons 122b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::IOS: // This is the right triple value for iOS debugging 123b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 124b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 1256c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton#if defined(__APPLE__) 1266c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton // Only accept "unknown" for the OS if the host is Apple and 1276c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton // it "unknown" wasn't specified (it was just returned becasue it 1286c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton // was NOT specified) 129b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::UnknownOS: 130b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton create = !arch->TripleOSWasSpecified(); 131b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 1326c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton#endif 133b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: 134b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton create = false; 135b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 136b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 137b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 138b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton } 139b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton break; 140b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton default: 141b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton break; 142b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton } 143b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton } 144b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 145b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton if (create) 146b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton return new PlatformRemoteiOS (); 147b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton return NULL; 148b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 149b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 150b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 1510e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytonlldb_private::ConstString 152b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::GetPluginNameStatic () 153b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 1540e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton static ConstString g_name("remote-ios"); 1550e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton return g_name; 156b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 157b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 158b1888f24fa181489840b9acf193e224d125d0776Greg Claytonconst char * 159b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::GetDescriptionStatic() 160b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 161b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return "Remote iOS platform plug-in."; 162b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 163b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 164b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 16558e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 16658e26e0935138225477fd61283215ceff2068899Greg Clayton/// Default Constructor 16758e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 16858e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformRemoteiOS::PlatformRemoteiOS () : 16958e26e0935138225477fd61283215ceff2068899Greg Clayton PlatformDarwin (false), // This is a remote platform 17074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton m_sdk_directory_infos(), 17174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton m_device_support_directory(), 17274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton m_device_support_directory_for_os_version (), 17374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton m_build_update(), 17474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton m_last_module_sdk_idx(UINT32_MAX) 17558e26e0935138225477fd61283215ceff2068899Greg Clayton{ 17658e26e0935138225477fd61283215ceff2068899Greg Clayton} 17758e26e0935138225477fd61283215ceff2068899Greg Clayton 17858e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 17958e26e0935138225477fd61283215ceff2068899Greg Clayton/// Destructor. 18058e26e0935138225477fd61283215ceff2068899Greg Clayton/// 18158e26e0935138225477fd61283215ceff2068899Greg Clayton/// The destructor is virtual since this class is designed to be 18258e26e0935138225477fd61283215ceff2068899Greg Clayton/// inherited from by the plug-in instance. 18358e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 18458e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformRemoteiOS::~PlatformRemoteiOS() 18558e26e0935138225477fd61283215ceff2068899Greg Clayton{ 18658e26e0935138225477fd61283215ceff2068899Greg Clayton} 18758e26e0935138225477fd61283215ceff2068899Greg Clayton 18858e26e0935138225477fd61283215ceff2068899Greg Clayton 189b1888f24fa181489840b9acf193e224d125d0776Greg Claytonvoid 190b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::GetStatus (Stream &strm) 191b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 19258e26e0935138225477fd61283215ceff2068899Greg Clayton Platform::GetStatus (strm); 193b1888f24fa181489840b9acf193e224d125d0776Greg Clayton const char *sdk_directory = GetDeviceSupportDirectoryForOSVersion(); 194b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (sdk_directory) 195abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton strm.Printf (" SDK Path: \"%s\"\n", sdk_directory); 196b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 197abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton strm.PutCString (" SDK Path: error: unable to locate SDK\n"); 198fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton 19974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton const uint32_t num_sdk_infos = m_sdk_directory_infos.size(); 20074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton for (uint32_t i=0; i<num_sdk_infos; ++i) 20174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton { 20274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton const SDKDirectoryInfo &sdk_dir_info = m_sdk_directory_infos[i]; 20397a19b21dacd9063bb5475812df7781777262198Greg Clayton strm.Printf (" SDK Roots: [%2u] \"%s\"\n", 20474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton i, 20597a19b21dacd9063bb5475812df7781777262198Greg Clayton sdk_dir_info.directory.GetPath().c_str()); 20674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton } 207b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 208b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 209b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 210b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonError 211b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::ResolveExecutable (const FileSpec &exe_file, 212b1888f24fa181489840b9acf193e224d125d0776Greg Clayton const ArchSpec &exe_arch, 2139ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton lldb::ModuleSP &exe_module_sp, 2149ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton const FileSpecList *module_search_paths_ptr) 215b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 216b1888f24fa181489840b9acf193e224d125d0776Greg Clayton Error error; 217b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // Nothing special to do here, just use the actual file and architecture 218b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 219b1888f24fa181489840b9acf193e224d125d0776Greg Clayton FileSpec resolved_exe_file (exe_file); 220b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 221b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // If we have "ls" as the exe_file, resolve the executable loation based on 222b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // the current path variables 223b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // TODO: resolve bare executables in the Platform SDK 224b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// if (!resolved_exe_file.Exists()) 225b1888f24fa181489840b9acf193e224d125d0776Greg Clayton// resolved_exe_file.ResolveExecutableLocation (); 226b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 227b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // Resolve any executable within a bundle on MacOSX 228b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // TODO: verify that this handles shallow bundles, if not then implement one ourselves 229b1888f24fa181489840b9acf193e224d125d0776Greg Clayton Host::ResolveExecutableInBundle (resolved_exe_file); 230b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 231b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (resolved_exe_file.Exists()) 232b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 233b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (exe_arch.IsValid()) 234b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 235444fe998bf707bd076a70c3a779db8575533695eGreg Clayton ModuleSpec module_spec (resolved_exe_file, exe_arch); 236444fe998bf707bd076a70c3a779db8575533695eGreg Clayton error = ModuleList::GetSharedModule (module_spec, 237b1888f24fa181489840b9acf193e224d125d0776Greg Clayton exe_module_sp, 2389ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton NULL, 239b1888f24fa181489840b9acf193e224d125d0776Greg Clayton NULL, 240b1888f24fa181489840b9acf193e224d125d0776Greg Clayton NULL); 241b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 2421a8e65493b8049bc5877bcedfeb2e9731f7f2d8eHan Ming Ong if (exe_module_sp && exe_module_sp->GetObjectFile()) 24324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return error; 24424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton exe_module_sp.reset(); 245b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 24624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // No valid architecture was specified or the exact ARM slice wasn't 24724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // found so ask the platform for the architectures that we should be 24824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // using (in the correct order) and see if we can find a match that way 24924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton StreamString arch_names; 25024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton ArchSpec platform_arch; 25124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton for (uint32_t idx = 0; GetSupportedArchitectureAtIndex (idx, platform_arch); ++idx) 252b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 253444fe998bf707bd076a70c3a779db8575533695eGreg Clayton ModuleSpec module_spec (resolved_exe_file, platform_arch); 254444fe998bf707bd076a70c3a779db8575533695eGreg Clayton error = ModuleList::GetSharedModule (module_spec, 25524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton exe_module_sp, 2569ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton NULL, 25724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton NULL, 25824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton NULL); 25924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // Did we find an executable using one of the 26024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (error.Success()) 261b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 26224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (exe_module_sp && exe_module_sp->GetObjectFile()) 26324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton break; 26424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton else 26524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton error.SetErrorToGenericError(); 266b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 267b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 26824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (idx > 0) 26924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton arch_names.PutCString (", "); 27024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton arch_names.PutCString (platform_arch.GetArchitectureName()); 27124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 27224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 27324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (error.Fail() || !exe_module_sp) 27424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 27597a19b21dacd9063bb5475812df7781777262198Greg Clayton error.SetErrorStringWithFormat ("'%s' doesn't contain any '%s' platform architectures: %s", 27697a19b21dacd9063bb5475812df7781777262198Greg Clayton exe_file.GetPath().c_str(), 2770e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton GetPluginName().GetCString(), 27824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton arch_names.GetString().c_str()); 279b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 280b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 281b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 282b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 28397a19b21dacd9063bb5475812df7781777262198Greg Clayton error.SetErrorStringWithFormat ("'%s' does not exist", 28497a19b21dacd9063bb5475812df7781777262198Greg Clayton exe_file.GetPath().c_str()); 285b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 286b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 287b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return error; 288b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 289b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 290b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg ClaytonFileSpec::EnumerateDirectoryResult 291b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg ClaytonPlatformRemoteiOS::GetContainedFilesIntoVectorOfStringsCallback (void *baton, 292b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton FileSpec::FileType file_type, 293b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton const FileSpec &file_spec) 294b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 295fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton ((PlatformRemoteiOS::SDKDirectoryInfoCollection *)baton)->push_back(PlatformRemoteiOS::SDKDirectoryInfo(file_spec)); 296b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton return FileSpec::eEnumerateDirectoryResultNext; 297b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton} 298604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton 299b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Claytonbool 300b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg ClaytonPlatformRemoteiOS::UpdateSDKDirectoryInfosInNeeded() 301b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton{ 302b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton if (m_sdk_directory_infos.empty()) 303b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 304b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton const char *device_support_dir = GetDeviceSupportDirectory(); 305b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (device_support_dir) 306b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 307b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton const bool find_directories = true; 308b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton const bool find_files = false; 309b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton const bool find_other = false; 310b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton FileSpec::EnumerateDirectory (m_device_support_directory.c_str(), 311b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton find_directories, 312b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton find_files, 313b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton find_other, 314b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton GetContainedFilesIntoVectorOfStringsCallback, 315b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton &m_sdk_directory_infos); 316fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton 317fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton const uint32_t num_installed = m_sdk_directory_infos.size(); 318fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton FileSpec local_sdk_cache("~/Library/Developer/Xcode/iOS DeviceSupport", true); 319fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton if (local_sdk_cache.Exists()) 320fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton { 321fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton char path[PATH_MAX]; 322fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton if (local_sdk_cache.GetPath(path, sizeof(path))) 323fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton { 324fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton FileSpec::EnumerateDirectory (path, 325fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton find_directories, 326fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton find_files, 327fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton find_other, 328fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton GetContainedFilesIntoVectorOfStringsCallback, 329fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton &m_sdk_directory_infos); 330fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton const uint32_t num_sdk_infos = m_sdk_directory_infos.size(); 331fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton // First try for an exact match of major, minor and update 332fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton for (uint32_t i=num_installed; i<num_sdk_infos; ++i) 333fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton { 334fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton m_sdk_directory_infos[i].user_cached = true; 335fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton } 336fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton } 337fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton } 338b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton } 339b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton } 340b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton return !m_sdk_directory_infos.empty(); 341b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton} 342b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton 343b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Claytonconst PlatformRemoteiOS::SDKDirectoryInfo * 344b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg ClaytonPlatformRemoteiOS::GetSDKDirectoryForCurrentOSVersion () 345b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton{ 346fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton uint32_t i; 347fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton if (UpdateSDKDirectoryInfosInNeeded()) 348b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton { 349fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton const uint32_t num_sdk_infos = m_sdk_directory_infos.size(); 350fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton 351fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton // Check to see if the user specified a build string. If they did, then 352fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton // be sure to match it. 353fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton std::vector<bool> check_sdk_info(num_sdk_infos, true); 354fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton ConstString build(m_sdk_build); 355fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton if (build) 356b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton { 357b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton for (i=0; i<num_sdk_infos; ++i) 358fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton check_sdk_info[i] = m_sdk_directory_infos[i].build == build; 359fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton } 360fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton 361fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton // If we are connected we can find the version of the OS the platform 362fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton // us running on and select the right SDK 363fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton uint32_t major, minor, update; 364fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton if (GetOSVersion(major, minor, update)) 365fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton { 366fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton if (UpdateSDKDirectoryInfosInNeeded()) 367b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 368fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton // First try for an exact match of major, minor and update 369fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton for (i=0; i<num_sdk_infos; ++i) 370b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 371fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton if (check_sdk_info[i]) 372fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton { 373fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton if (m_sdk_directory_infos[i].version_major == major && 374fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton m_sdk_directory_infos[i].version_minor == minor && 375fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton m_sdk_directory_infos[i].version_update == update) 376fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton { 377fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton return &m_sdk_directory_infos[i]; 378fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton } 379fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton } 380b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 381fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton // First try for an exact match of major and minor 382fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton for (i=0; i<num_sdk_infos; ++i) 383b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 384fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton if (check_sdk_info[i]) 385fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton { 386fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton if (m_sdk_directory_infos[i].version_major == major && 387fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton m_sdk_directory_infos[i].version_minor == minor) 388fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton { 389fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton return &m_sdk_directory_infos[i]; 390fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton } 391fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton } 392b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 393fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton // Lastly try to match of major version only.. 394fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton for (i=0; i<num_sdk_infos; ++i) 395b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 396fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton if (check_sdk_info[i]) 397fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton { 398fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton if (m_sdk_directory_infos[i].version_major == major) 399fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton { 400fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton return &m_sdk_directory_infos[i]; 401fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton } 402fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton } 403b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton } 404b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton } 405b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton } 406fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton else if (build) 407fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton { 408fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton // No version, just a build number, search for the first one that matches 409fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton for (i=0; i<num_sdk_infos; ++i) 410fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton if (check_sdk_info[i]) 411fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton return &m_sdk_directory_infos[i]; 412fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton } 413b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton } 414b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton return NULL; 415b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton} 416b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 417b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Claytonconst PlatformRemoteiOS::SDKDirectoryInfo * 418b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg ClaytonPlatformRemoteiOS::GetSDKDirectoryForLatestOSVersion () 419b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton{ 420b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton const PlatformRemoteiOS::SDKDirectoryInfo *result = NULL; 421b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton if (UpdateSDKDirectoryInfosInNeeded()) 422b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton { 423b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton const uint32_t num_sdk_infos = m_sdk_directory_infos.size(); 424b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton // First try for an exact match of major, minor and update 425b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton for (uint32_t i=0; i<num_sdk_infos; ++i) 426b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton { 427b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton const SDKDirectoryInfo &sdk_dir_info = m_sdk_directory_infos[i]; 428b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton if (sdk_dir_info.version_major != UINT32_MAX) 429b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton { 430b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton if (result == NULL || sdk_dir_info.version_major > result->version_major) 431b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton { 432b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton result = &sdk_dir_info; 433b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton } 434b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton else if (sdk_dir_info.version_major == result->version_major) 435b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton { 436b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton if (sdk_dir_info.version_minor > result->version_minor) 437b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton { 438b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton result = &sdk_dir_info; 439b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton } 440b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton else if (sdk_dir_info.version_minor == result->version_minor) 441b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton { 442b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton if (sdk_dir_info.version_update > result->version_update) 443b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 444b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton result = &sdk_dir_info; 445b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 446b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 447b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 448b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 449b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 450b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton } 451b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton return result; 452b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton} 453b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton 454b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton 455b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton 456b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Claytonconst char * 457b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg ClaytonPlatformRemoteiOS::GetDeviceSupportDirectory() 458b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton{ 459b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton if (m_device_support_directory.empty()) 460b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton { 461b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton const char *device_support_dir = GetDeveloperDirectory(); 462b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton if (device_support_dir) 463b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton { 464b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton m_device_support_directory.assign (device_support_dir); 465b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton m_device_support_directory.append ("/Platforms/iPhoneOS.platform/DeviceSupport"); 466b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton } 467b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton else 468b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton { 469b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton // Assign a single NULL character so we know we tried to find the device 470b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton // support directory and we don't keep trying to find it over and over. 471b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton m_device_support_directory.assign (1, '\0'); 472b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton } 473b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton } 474b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton // We should have put a single NULL character into m_device_support_directory 475b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton // or it should have a valid path if the code gets here 476b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton assert (m_device_support_directory.empty() == false); 477b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton if (m_device_support_directory[0]) 478b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton return m_device_support_directory.c_str(); 479b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton return NULL; 480b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton} 481b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton 482b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton 483b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Claytonconst char * 484b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg ClaytonPlatformRemoteiOS::GetDeviceSupportDirectoryForOSVersion() 485b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton{ 486b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton if (m_sdk_sysroot) 487b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton return m_sdk_sysroot.GetCString(); 488b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton 489b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton if (m_device_support_directory_for_os_version.empty()) 490b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton { 491b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton const PlatformRemoteiOS::SDKDirectoryInfo *sdk_dir_info = GetSDKDirectoryForCurrentOSVersion (); 492b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton if (sdk_dir_info == NULL) 493b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton sdk_dir_info = GetSDKDirectoryForLatestOSVersion (); 494b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton if (sdk_dir_info) 495b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton { 496fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton char path[PATH_MAX]; 497fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton if (sdk_dir_info->directory.GetPath(path, sizeof(path))) 498fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton { 499fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton m_device_support_directory_for_os_version = path; 500fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton return m_device_support_directory_for_os_version.c_str(); 501fea31993c6d78e0fd1629c899f47f16e44736011Greg Clayton } 502b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton } 503b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton else 504b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton { 505b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton // Assign a single NULL character so we know we tried to find the device 506b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton // support directory and we don't keep trying to find it over and over. 507b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton m_device_support_directory_for_os_version.assign (1, '\0'); 508b58879acfd8deb5a263f69b9d8c950e04e8fbe9aGreg Clayton } 509b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 510b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We should have put a single NULL character into m_device_support_directory_for_os_version 511b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // or it should have a valid path if the code gets here 512b1888f24fa181489840b9acf193e224d125d0776Greg Clayton assert (m_device_support_directory_for_os_version.empty() == false); 513b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (m_device_support_directory_for_os_version[0]) 514b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return m_device_support_directory_for_os_version.c_str(); 515b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return NULL; 516b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 517b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 51874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Claytonuint32_t 51974821595bdf8b75ceea1949b5a9370a71fd96e61Greg ClaytonPlatformRemoteiOS::FindFileInAllSDKs (const char *platform_file_path, 52074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton FileSpecList &file_list) 52174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton{ 52274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton if (platform_file_path && platform_file_path[0] && UpdateSDKDirectoryInfosInNeeded()) 52374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton { 52474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton const uint32_t num_sdk_infos = m_sdk_directory_infos.size(); 52574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton lldb_private::FileSpec local_file; 52674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton // First try for an exact match of major, minor and update 52774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton for (uint32_t sdk_idx=0; sdk_idx<num_sdk_infos; ++sdk_idx) 52874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton { 52974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton if (GetFileInSDK (platform_file_path, 53074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton sdk_idx, 53174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton local_file)) 53274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton { 53374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton file_list.Append(local_file); 53474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton } 53574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton } 53674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton } 53774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton return file_list.GetSize(); 53874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton} 53974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton 54074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Claytonbool 54174821595bdf8b75ceea1949b5a9370a71fd96e61Greg ClaytonPlatformRemoteiOS::GetFileInSDK (const char *platform_file_path, 54274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton uint32_t sdk_idx, 54374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton lldb_private::FileSpec &local_file) 54474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton{ 54574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton if (sdk_idx < m_sdk_directory_infos.size()) 54674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton { 54774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton char sdkroot_path[PATH_MAX]; 54874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton const SDKDirectoryInfo &sdk_dir_info = m_sdk_directory_infos[sdk_idx]; 54974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton if (sdk_dir_info.directory.GetPath(sdkroot_path, sizeof(sdkroot_path))) 55074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton { 55174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton const bool symbols_dirs_only = true; 55274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton 55374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton return GetFileInSDKRoot (platform_file_path, 55474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton sdkroot_path, 55574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton symbols_dirs_only, 55674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton local_file); 55774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton } 55874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton } 55974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton return false; 56074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton} 56174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton 56274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton 56374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Claytonbool 56474821595bdf8b75ceea1949b5a9370a71fd96e61Greg ClaytonPlatformRemoteiOS::GetFileInSDKRoot (const char *platform_file_path, 56574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton const char *sdkroot_path, 56674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton bool symbols_dirs_only, 56774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton lldb_private::FileSpec &local_file) 56874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton{ 56974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton if (sdkroot_path && sdkroot_path[0] && platform_file_path && platform_file_path[0]) 57074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton { 57174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton char resolved_path[PATH_MAX]; 57274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton 57374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton if (!symbols_dirs_only) 57474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton { 57574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton ::snprintf (resolved_path, 57674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton sizeof(resolved_path), 57774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton "%s/%s", 57874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton sdkroot_path, 57974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton platform_file_path); 58074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton 58174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton local_file.SetFile(resolved_path, true); 58274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton if (local_file.Exists()) 58374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton return true; 58474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton } 58574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton 58674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton ::snprintf (resolved_path, 58774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton sizeof(resolved_path), 58874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton "%s/Symbols.Internal/%s", 58974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton sdkroot_path, 59074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton platform_file_path); 59174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton 59274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton local_file.SetFile(resolved_path, true); 59374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton if (local_file.Exists()) 59474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton return true; 59574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton ::snprintf (resolved_path, 59674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton sizeof(resolved_path), 59774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton "%s/Symbols/%s", 59874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton sdkroot_path, 59974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton platform_file_path); 60074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton 60174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton local_file.SetFile(resolved_path, true); 60274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton if (local_file.Exists()) 60374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton return true; 60474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton } 60574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton return false; 60674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton} 60774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton 60874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton 609b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonError 6100f485ead5447872a2a9f35c5670fc67cc58e1549Johnny ChenPlatformRemoteiOS::GetSymbolFile (const FileSpec &platform_file, 6110f485ead5447872a2a9f35c5670fc67cc58e1549Johnny Chen const UUID *uuid_ptr, 6120f485ead5447872a2a9f35c5670fc67cc58e1549Johnny Chen FileSpec &local_file) 613b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 614b1888f24fa181489840b9acf193e224d125d0776Greg Clayton Error error; 615b1888f24fa181489840b9acf193e224d125d0776Greg Clayton char platform_file_path[PATH_MAX]; 616b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (platform_file.GetPath(platform_file_path, sizeof(platform_file_path))) 617b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 618b1888f24fa181489840b9acf193e224d125d0776Greg Clayton char resolved_path[PATH_MAX]; 619b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 620b1888f24fa181489840b9acf193e224d125d0776Greg Clayton const char * os_version_dir = GetDeviceSupportDirectoryForOSVersion(); 621b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (os_version_dir) 622b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 623b1888f24fa181489840b9acf193e224d125d0776Greg Clayton ::snprintf (resolved_path, 624b1888f24fa181489840b9acf193e224d125d0776Greg Clayton sizeof(resolved_path), 625604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton "%s/%s", 626604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton os_version_dir, 627604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton platform_file_path); 628604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton 629604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton local_file.SetFile(resolved_path, true); 630604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton if (local_file.Exists()) 631604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton return error; 632604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton 633604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton ::snprintf (resolved_path, 634604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton sizeof(resolved_path), 635b1888f24fa181489840b9acf193e224d125d0776Greg Clayton "%s/Symbols.Internal/%s", 636b1888f24fa181489840b9acf193e224d125d0776Greg Clayton os_version_dir, 637b1888f24fa181489840b9acf193e224d125d0776Greg Clayton platform_file_path); 638b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 639b1888f24fa181489840b9acf193e224d125d0776Greg Clayton local_file.SetFile(resolved_path, true); 640b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (local_file.Exists()) 641b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return error; 642b1888f24fa181489840b9acf193e224d125d0776Greg Clayton ::snprintf (resolved_path, 643b1888f24fa181489840b9acf193e224d125d0776Greg Clayton sizeof(resolved_path), 644b1888f24fa181489840b9acf193e224d125d0776Greg Clayton "%s/Symbols/%s", 645b1888f24fa181489840b9acf193e224d125d0776Greg Clayton os_version_dir, 646b1888f24fa181489840b9acf193e224d125d0776Greg Clayton platform_file_path); 647b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 648b1888f24fa181489840b9acf193e224d125d0776Greg Clayton local_file.SetFile(resolved_path, true); 649b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (local_file.Exists()) 650b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return error; 651b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 652b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 653b1888f24fa181489840b9acf193e224d125d0776Greg Clayton local_file = platform_file; 654b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (local_file.Exists()) 655b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return error; 656b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 657b1888f24fa181489840b9acf193e224d125d0776Greg Clayton error.SetErrorStringWithFormat ("unable to locate a platform file for '%s' in platform '%s'", 658b1888f24fa181489840b9acf193e224d125d0776Greg Clayton platform_file_path, 6590e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton GetPluginName().GetCString()); 660b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 661b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 662b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 663b1888f24fa181489840b9acf193e224d125d0776Greg Clayton error.SetErrorString ("invalid platform file argument"); 664b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 665b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return error; 666b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 667b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 66824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonError 669444fe998bf707bd076a70c3a779db8575533695eGreg ClaytonPlatformRemoteiOS::GetSharedModule (const ModuleSpec &module_spec, 67024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton ModuleSP &module_sp, 6719ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton const FileSpecList *module_search_paths_ptr, 67224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton ModuleSP *old_module_sp_ptr, 67324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton bool *did_create_ptr) 67424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 67524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // For iOS, the SDK files are all cached locally on the host 67624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // system. So first we ask for the file in the cached SDK, 67724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // then we attempt to get a shared module for the right architecture 67824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // with the right UUID. 679444fe998bf707bd076a70c3a779db8575533695eGreg Clayton const FileSpec &platform_file = module_spec.GetFileSpec(); 680444fe998bf707bd076a70c3a779db8575533695eGreg Clayton 68124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton FileSpec local_file; 68274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton const UUID *module_uuid_ptr = module_spec.GetUUIDPtr(); 6830f485ead5447872a2a9f35c5670fc67cc58e1549Johnny Chen Error error (GetSymbolFile (platform_file, module_uuid_ptr, local_file)); 68424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (error.Success()) 68524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 68674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton error = ResolveExecutable (local_file, module_spec.GetArchitecture(), module_sp, NULL); 68774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton if (module_sp && ((module_uuid_ptr == NULL) || (module_sp->GetUUID() == *module_uuid_ptr))) 68874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton { 68974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton //printf ("found in user specified SDK\n"); 69074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton error.Clear(); 69174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton return error; 69274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton } 6938c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton 69474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton char platform_file_path[PATH_MAX]; 69574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton if (platform_file.GetPath(platform_file_path, sizeof(platform_file_path))) 69674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton { 69774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton FileSpec local_file; 69874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton const uint32_t num_sdk_infos = m_sdk_directory_infos.size(); 69974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton // Try the last SDK index if it is set as most files from an SDK 70074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton // will tend to be valid in that same SDK. 70174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton if (m_last_module_sdk_idx < num_sdk_infos) 70274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton { 70374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton if (GetFileInSDK (platform_file_path, m_last_module_sdk_idx, local_file)) 70474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton { 70597a19b21dacd9063bb5475812df7781777262198Greg Clayton //printf ("sdk[%u] last: '%s'\n", m_last_module_sdk_idx, local_file.GetPath().c_str()); 70674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton module_sp.reset(); 70774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton error = ResolveExecutable (local_file, 70874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton module_spec.GetArchitecture(), 70974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton module_sp, 71074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton NULL); 711233935b0d93a8a516864cd07c508b731ccef4fcdJim Ingham if (module_sp && ((module_uuid_ptr == NULL) || (module_sp->GetUUID() == *module_uuid_ptr))) 71274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton { 71374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton //printf ("sdk[%u] last found\n", m_last_module_sdk_idx); 71474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton error.Clear(); 71574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton return error; 71674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton } 71774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton } 71874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton } 71974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton 72074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton // First try for an exact match of major, minor and update 72174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton for (uint32_t sdk_idx=0; sdk_idx<num_sdk_infos; ++sdk_idx) 72274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton { 72374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton if (m_last_module_sdk_idx == sdk_idx) 72474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton { 72574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton // Skip the last module SDK index if we already searched 72674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton // it above 72774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton continue; 72874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton } 72974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton if (GetFileInSDK (platform_file_path, sdk_idx, local_file)) 73074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton { 73197a19b21dacd9063bb5475812df7781777262198Greg Clayton //printf ("sdk[%u]: '%s'\n", sdk_idx, local_file.GetPath().c_str()); 73274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton 73374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton error = ResolveExecutable (local_file, 73474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton module_spec.GetArchitecture(), 73574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton module_sp, 73674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton NULL); 737233935b0d93a8a516864cd07c508b731ccef4fcdJim Ingham if (module_sp && ((module_uuid_ptr == NULL) || (module_sp->GetUUID() == *module_uuid_ptr))) 73874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton { 73974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton // Remember the index of the last SDK that we found a file 74074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton // in in case the wrong SDK was selected. 74174821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton m_last_module_sdk_idx = sdk_idx; 74274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton //printf ("sdk[%u]: found (setting last to %u)\n", sdk_idx, m_last_module_sdk_idx); 74374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton error.Clear(); 74474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton return error; 74574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton } 74674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton } 74774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton } 74874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton } 74974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton // Not the module we are looking for... Nothing to see here... 75074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton module_sp.reset(); 75124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 75274821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton 75374821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton const bool always_create = false; 75474821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton error = ModuleList::GetSharedModule (module_spec, 75574821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton module_sp, 75674821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton module_search_paths_ptr, 75774821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton old_module_sp_ptr, 75874821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton did_create_ptr, 75974821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton always_create); 76074821595bdf8b75ceea1949b5a9370a71fd96e61Greg Clayton 76124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (module_sp) 76224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton module_sp->SetPlatformFileSpec(platform_file); 76324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 76424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return error; 76524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 76624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 76724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 768b1888f24fa181489840b9acf193e224d125d0776Greg Claytonuint32_t 769b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatformRemoteiOS::FindProcesses (const ProcessInstanceInfoMatch &match_info, 770b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessInstanceInfoList &process_infos) 771b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 772b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // TODO: if connected, send a packet to get the remote process infos by name 773b1888f24fa181489840b9acf193e224d125d0776Greg Clayton process_infos.Clear(); 774b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return 0; 775b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 776b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 777b1888f24fa181489840b9acf193e224d125d0776Greg Claytonbool 778b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatformRemoteiOS::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info) 779b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 780b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // TODO: if connected, send a packet to get the remote process info 781b1888f24fa181489840b9acf193e224d125d0776Greg Clayton process_info.Clear(); 782b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return false; 783b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 784b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 785b1888f24fa181489840b9acf193e224d125d0776Greg Claytonbool 786b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatformRemoteiOS::GetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch) 787b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 7889d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda return ARMGetSupportedArchitectureAtIndex (idx, arch); 789b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 790