1 //===-- PlatformRemoteiOS.cpp -----------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "PlatformRemoteiOS.h" 11 12 // C Includes 13 // C++ Includes 14 // Other libraries and framework includes 15 // Project includes 16 #include "lldb/Breakpoint/BreakpointLocation.h" 17 #include "lldb/Core/ArchSpec.h" 18 #include "lldb/Core/Error.h" 19 #include "lldb/Core/Module.h" 20 #include "lldb/Core/ModuleList.h" 21 #include "lldb/Core/ModuleSpec.h" 22 #include "lldb/Core/PluginManager.h" 23 #include "lldb/Core/StreamString.h" 24 #include "lldb/Host/FileSpec.h" 25 #include "lldb/Host/Host.h" 26 #include "lldb/Target/Process.h" 27 #include "lldb/Target/Target.h" 28 29 using namespace lldb; 30 using namespace lldb_private; 31 32 PlatformRemoteiOS::SDKDirectoryInfo::SDKDirectoryInfo (const lldb_private::FileSpec &sdk_dir) : 33 directory(sdk_dir), 34 build(), 35 version_major(0), 36 version_minor(0), 37 version_update(0), 38 user_cached(false) 39 { 40 const char *dirname_cstr = sdk_dir.GetFilename().GetCString(); 41 const char *pos = Args::StringToVersion (dirname_cstr, 42 version_major, 43 version_minor, 44 version_update); 45 46 if (pos && pos[0] == ' ' && pos[1] == '(') 47 { 48 const char *build_start = pos + 2; 49 const char *end_paren = strchr (build_start, ')'); 50 if (end_paren && build_start < end_paren) 51 build.SetCStringWithLength(build_start, end_paren - build_start); 52 } 53 } 54 55 //------------------------------------------------------------------ 56 // Static Variables 57 //------------------------------------------------------------------ 58 static uint32_t g_initialize_count = 0; 59 60 //------------------------------------------------------------------ 61 // Static Functions 62 //------------------------------------------------------------------ 63 void 64 PlatformRemoteiOS::Initialize () 65 { 66 if (g_initialize_count++ == 0) 67 { 68 PluginManager::RegisterPlugin (PlatformRemoteiOS::GetPluginNameStatic(), 69 PlatformRemoteiOS::GetDescriptionStatic(), 70 PlatformRemoteiOS::CreateInstance); 71 } 72 } 73 74 void 75 PlatformRemoteiOS::Terminate () 76 { 77 if (g_initialize_count > 0) 78 { 79 if (--g_initialize_count == 0) 80 { 81 PluginManager::UnregisterPlugin (PlatformRemoteiOS::CreateInstance); 82 } 83 } 84 } 85 86 Platform* 87 PlatformRemoteiOS::CreateInstance (bool force, const ArchSpec *arch) 88 { 89 bool create = force; 90 if (create == false && arch && arch->IsValid()) 91 { 92 switch (arch->GetMachine()) 93 { 94 case llvm::Triple::arm: 95 case llvm::Triple::thumb: 96 { 97 const llvm::Triple &triple = arch->GetTriple(); 98 llvm::Triple::VendorType vendor = triple.getVendor(); 99 switch (vendor) 100 { 101 case llvm::Triple::Apple: 102 create = true; 103 break; 104 105 #if defined(__APPLE__) 106 // Only accept "unknown" for the vendor if the host is Apple and 107 // it "unknown" wasn't specified (it was just returned becasue it 108 // was NOT specified) 109 case llvm::Triple::UnknownArch: 110 create = !arch->TripleVendorWasSpecified(); 111 break; 112 113 #endif 114 default: 115 break; 116 } 117 if (create) 118 { 119 switch (triple.getOS()) 120 { 121 case llvm::Triple::Darwin: // Deprecated, but still support Darwin for historical reasons 122 case llvm::Triple::IOS: // This is the right triple value for iOS debugging 123 break; 124 125 #if defined(__APPLE__) 126 // Only accept "unknown" for the OS if the host is Apple and 127 // it "unknown" wasn't specified (it was just returned becasue it 128 // was NOT specified) 129 case llvm::Triple::UnknownOS: 130 create = !arch->TripleOSWasSpecified(); 131 break; 132 #endif 133 default: 134 create = false; 135 break; 136 } 137 } 138 } 139 break; 140 default: 141 break; 142 } 143 } 144 145 if (create) 146 return new PlatformRemoteiOS (); 147 return NULL; 148 } 149 150 151 lldb_private::ConstString 152 PlatformRemoteiOS::GetPluginNameStatic () 153 { 154 static ConstString g_name("remote-ios"); 155 return g_name; 156 } 157 158 const char * 159 PlatformRemoteiOS::GetDescriptionStatic() 160 { 161 return "Remote iOS platform plug-in."; 162 } 163 164 165 //------------------------------------------------------------------ 166 /// Default Constructor 167 //------------------------------------------------------------------ 168 PlatformRemoteiOS::PlatformRemoteiOS () : 169 PlatformDarwin (false), // This is a remote platform 170 m_sdk_directory_infos(), 171 m_device_support_directory(), 172 m_device_support_directory_for_os_version (), 173 m_build_update(), 174 m_last_module_sdk_idx(UINT32_MAX) 175 { 176 } 177 178 //------------------------------------------------------------------ 179 /// Destructor. 180 /// 181 /// The destructor is virtual since this class is designed to be 182 /// inherited from by the plug-in instance. 183 //------------------------------------------------------------------ 184 PlatformRemoteiOS::~PlatformRemoteiOS() 185 { 186 } 187 188 189 void 190 PlatformRemoteiOS::GetStatus (Stream &strm) 191 { 192 Platform::GetStatus (strm); 193 const char *sdk_directory = GetDeviceSupportDirectoryForOSVersion(); 194 if (sdk_directory) 195 strm.Printf (" SDK Path: \"%s\"\n", sdk_directory); 196 else 197 strm.PutCString (" SDK Path: error: unable to locate SDK\n"); 198 199 const uint32_t num_sdk_infos = m_sdk_directory_infos.size(); 200 for (uint32_t i=0; i<num_sdk_infos; ++i) 201 { 202 const SDKDirectoryInfo &sdk_dir_info = m_sdk_directory_infos[i]; 203 strm.Printf (" SDK Roots: [%2u] \"%s\"\n", 204 i, 205 sdk_dir_info.directory.GetPath().c_str()); 206 } 207 } 208 209 210 Error 211 PlatformRemoteiOS::ResolveExecutable (const FileSpec &exe_file, 212 const ArchSpec &exe_arch, 213 lldb::ModuleSP &exe_module_sp, 214 const FileSpecList *module_search_paths_ptr) 215 { 216 Error error; 217 // Nothing special to do here, just use the actual file and architecture 218 219 FileSpec resolved_exe_file (exe_file); 220 221 // If we have "ls" as the exe_file, resolve the executable loation based on 222 // the current path variables 223 // TODO: resolve bare executables in the Platform SDK 224 // if (!resolved_exe_file.Exists()) 225 // resolved_exe_file.ResolveExecutableLocation (); 226 227 // Resolve any executable within a bundle on MacOSX 228 // TODO: verify that this handles shallow bundles, if not then implement one ourselves 229 Host::ResolveExecutableInBundle (resolved_exe_file); 230 231 if (resolved_exe_file.Exists()) 232 { 233 if (exe_arch.IsValid()) 234 { 235 ModuleSpec module_spec (resolved_exe_file, exe_arch); 236 error = ModuleList::GetSharedModule (module_spec, 237 exe_module_sp, 238 NULL, 239 NULL, 240 NULL); 241 242 if (exe_module_sp && exe_module_sp->GetObjectFile()) 243 return error; 244 exe_module_sp.reset(); 245 } 246 // No valid architecture was specified or the exact ARM slice wasn't 247 // found so ask the platform for the architectures that we should be 248 // using (in the correct order) and see if we can find a match that way 249 StreamString arch_names; 250 ArchSpec platform_arch; 251 for (uint32_t idx = 0; GetSupportedArchitectureAtIndex (idx, platform_arch); ++idx) 252 { 253 ModuleSpec module_spec (resolved_exe_file, platform_arch); 254 error = ModuleList::GetSharedModule (module_spec, 255 exe_module_sp, 256 NULL, 257 NULL, 258 NULL); 259 // Did we find an executable using one of the 260 if (error.Success()) 261 { 262 if (exe_module_sp && exe_module_sp->GetObjectFile()) 263 break; 264 else 265 error.SetErrorToGenericError(); 266 } 267 268 if (idx > 0) 269 arch_names.PutCString (", "); 270 arch_names.PutCString (platform_arch.GetArchitectureName()); 271 } 272 273 if (error.Fail() || !exe_module_sp) 274 { 275 error.SetErrorStringWithFormat ("'%s' doesn't contain any '%s' platform architectures: %s", 276 exe_file.GetPath().c_str(), 277 GetPluginName().GetCString(), 278 arch_names.GetString().c_str()); 279 } 280 } 281 else 282 { 283 error.SetErrorStringWithFormat ("'%s' does not exist", 284 exe_file.GetPath().c_str()); 285 } 286 287 return error; 288 } 289 290 FileSpec::EnumerateDirectoryResult 291 PlatformRemoteiOS::GetContainedFilesIntoVectorOfStringsCallback (void *baton, 292 FileSpec::FileType file_type, 293 const FileSpec &file_spec) 294 { 295 ((PlatformRemoteiOS::SDKDirectoryInfoCollection *)baton)->push_back(PlatformRemoteiOS::SDKDirectoryInfo(file_spec)); 296 return FileSpec::eEnumerateDirectoryResultNext; 297 } 298 299 bool 300 PlatformRemoteiOS::UpdateSDKDirectoryInfosInNeeded() 301 { 302 if (m_sdk_directory_infos.empty()) 303 { 304 const char *device_support_dir = GetDeviceSupportDirectory(); 305 if (device_support_dir) 306 { 307 const bool find_directories = true; 308 const bool find_files = false; 309 const bool find_other = false; 310 FileSpec::EnumerateDirectory (m_device_support_directory.c_str(), 311 find_directories, 312 find_files, 313 find_other, 314 GetContainedFilesIntoVectorOfStringsCallback, 315 &m_sdk_directory_infos); 316 317 const uint32_t num_installed = m_sdk_directory_infos.size(); 318 FileSpec local_sdk_cache("~/Library/Developer/Xcode/iOS DeviceSupport", true); 319 if (local_sdk_cache.Exists()) 320 { 321 char path[PATH_MAX]; 322 if (local_sdk_cache.GetPath(path, sizeof(path))) 323 { 324 FileSpec::EnumerateDirectory (path, 325 find_directories, 326 find_files, 327 find_other, 328 GetContainedFilesIntoVectorOfStringsCallback, 329 &m_sdk_directory_infos); 330 const uint32_t num_sdk_infos = m_sdk_directory_infos.size(); 331 // First try for an exact match of major, minor and update 332 for (uint32_t i=num_installed; i<num_sdk_infos; ++i) 333 { 334 m_sdk_directory_infos[i].user_cached = true; 335 } 336 } 337 } 338 } 339 } 340 return !m_sdk_directory_infos.empty(); 341 } 342 343 const PlatformRemoteiOS::SDKDirectoryInfo * 344 PlatformRemoteiOS::GetSDKDirectoryForCurrentOSVersion () 345 { 346 uint32_t i; 347 if (UpdateSDKDirectoryInfosInNeeded()) 348 { 349 const uint32_t num_sdk_infos = m_sdk_directory_infos.size(); 350 351 // Check to see if the user specified a build string. If they did, then 352 // be sure to match it. 353 std::vector<bool> check_sdk_info(num_sdk_infos, true); 354 ConstString build(m_sdk_build); 355 if (build) 356 { 357 for (i=0; i<num_sdk_infos; ++i) 358 check_sdk_info[i] = m_sdk_directory_infos[i].build == build; 359 } 360 361 // If we are connected we can find the version of the OS the platform 362 // us running on and select the right SDK 363 uint32_t major, minor, update; 364 if (GetOSVersion(major, minor, update)) 365 { 366 if (UpdateSDKDirectoryInfosInNeeded()) 367 { 368 // First try for an exact match of major, minor and update 369 for (i=0; i<num_sdk_infos; ++i) 370 { 371 if (check_sdk_info[i]) 372 { 373 if (m_sdk_directory_infos[i].version_major == major && 374 m_sdk_directory_infos[i].version_minor == minor && 375 m_sdk_directory_infos[i].version_update == update) 376 { 377 return &m_sdk_directory_infos[i]; 378 } 379 } 380 } 381 // First try for an exact match of major and minor 382 for (i=0; i<num_sdk_infos; ++i) 383 { 384 if (check_sdk_info[i]) 385 { 386 if (m_sdk_directory_infos[i].version_major == major && 387 m_sdk_directory_infos[i].version_minor == minor) 388 { 389 return &m_sdk_directory_infos[i]; 390 } 391 } 392 } 393 // Lastly try to match of major version only.. 394 for (i=0; i<num_sdk_infos; ++i) 395 { 396 if (check_sdk_info[i]) 397 { 398 if (m_sdk_directory_infos[i].version_major == major) 399 { 400 return &m_sdk_directory_infos[i]; 401 } 402 } 403 } 404 } 405 } 406 else if (build) 407 { 408 // No version, just a build number, search for the first one that matches 409 for (i=0; i<num_sdk_infos; ++i) 410 if (check_sdk_info[i]) 411 return &m_sdk_directory_infos[i]; 412 } 413 } 414 return NULL; 415 } 416 417 const PlatformRemoteiOS::SDKDirectoryInfo * 418 PlatformRemoteiOS::GetSDKDirectoryForLatestOSVersion () 419 { 420 const PlatformRemoteiOS::SDKDirectoryInfo *result = NULL; 421 if (UpdateSDKDirectoryInfosInNeeded()) 422 { 423 const uint32_t num_sdk_infos = m_sdk_directory_infos.size(); 424 // First try for an exact match of major, minor and update 425 for (uint32_t i=0; i<num_sdk_infos; ++i) 426 { 427 const SDKDirectoryInfo &sdk_dir_info = m_sdk_directory_infos[i]; 428 if (sdk_dir_info.version_major != UINT32_MAX) 429 { 430 if (result == NULL || sdk_dir_info.version_major > result->version_major) 431 { 432 result = &sdk_dir_info; 433 } 434 else if (sdk_dir_info.version_major == result->version_major) 435 { 436 if (sdk_dir_info.version_minor > result->version_minor) 437 { 438 result = &sdk_dir_info; 439 } 440 else if (sdk_dir_info.version_minor == result->version_minor) 441 { 442 if (sdk_dir_info.version_update > result->version_update) 443 { 444 result = &sdk_dir_info; 445 } 446 } 447 } 448 } 449 } 450 } 451 return result; 452 } 453 454 455 456 const char * 457 PlatformRemoteiOS::GetDeviceSupportDirectory() 458 { 459 if (m_device_support_directory.empty()) 460 { 461 const char *device_support_dir = GetDeveloperDirectory(); 462 if (device_support_dir) 463 { 464 m_device_support_directory.assign (device_support_dir); 465 m_device_support_directory.append ("/Platforms/iPhoneOS.platform/DeviceSupport"); 466 } 467 else 468 { 469 // Assign a single NULL character so we know we tried to find the device 470 // support directory and we don't keep trying to find it over and over. 471 m_device_support_directory.assign (1, '\0'); 472 } 473 } 474 // We should have put a single NULL character into m_device_support_directory 475 // or it should have a valid path if the code gets here 476 assert (m_device_support_directory.empty() == false); 477 if (m_device_support_directory[0]) 478 return m_device_support_directory.c_str(); 479 return NULL; 480 } 481 482 483 const char * 484 PlatformRemoteiOS::GetDeviceSupportDirectoryForOSVersion() 485 { 486 if (m_sdk_sysroot) 487 return m_sdk_sysroot.GetCString(); 488 489 if (m_device_support_directory_for_os_version.empty()) 490 { 491 const PlatformRemoteiOS::SDKDirectoryInfo *sdk_dir_info = GetSDKDirectoryForCurrentOSVersion (); 492 if (sdk_dir_info == NULL) 493 sdk_dir_info = GetSDKDirectoryForLatestOSVersion (); 494 if (sdk_dir_info) 495 { 496 char path[PATH_MAX]; 497 if (sdk_dir_info->directory.GetPath(path, sizeof(path))) 498 { 499 m_device_support_directory_for_os_version = path; 500 return m_device_support_directory_for_os_version.c_str(); 501 } 502 } 503 else 504 { 505 // Assign a single NULL character so we know we tried to find the device 506 // support directory and we don't keep trying to find it over and over. 507 m_device_support_directory_for_os_version.assign (1, '\0'); 508 } 509 } 510 // We should have put a single NULL character into m_device_support_directory_for_os_version 511 // or it should have a valid path if the code gets here 512 assert (m_device_support_directory_for_os_version.empty() == false); 513 if (m_device_support_directory_for_os_version[0]) 514 return m_device_support_directory_for_os_version.c_str(); 515 return NULL; 516 } 517 518 uint32_t 519 PlatformRemoteiOS::FindFileInAllSDKs (const char *platform_file_path, 520 FileSpecList &file_list) 521 { 522 if (platform_file_path && platform_file_path[0] && UpdateSDKDirectoryInfosInNeeded()) 523 { 524 const uint32_t num_sdk_infos = m_sdk_directory_infos.size(); 525 lldb_private::FileSpec local_file; 526 // First try for an exact match of major, minor and update 527 for (uint32_t sdk_idx=0; sdk_idx<num_sdk_infos; ++sdk_idx) 528 { 529 if (GetFileInSDK (platform_file_path, 530 sdk_idx, 531 local_file)) 532 { 533 file_list.Append(local_file); 534 } 535 } 536 } 537 return file_list.GetSize(); 538 } 539 540 bool 541 PlatformRemoteiOS::GetFileInSDK (const char *platform_file_path, 542 uint32_t sdk_idx, 543 lldb_private::FileSpec &local_file) 544 { 545 if (sdk_idx < m_sdk_directory_infos.size()) 546 { 547 char sdkroot_path[PATH_MAX]; 548 const SDKDirectoryInfo &sdk_dir_info = m_sdk_directory_infos[sdk_idx]; 549 if (sdk_dir_info.directory.GetPath(sdkroot_path, sizeof(sdkroot_path))) 550 { 551 const bool symbols_dirs_only = true; 552 553 return GetFileInSDKRoot (platform_file_path, 554 sdkroot_path, 555 symbols_dirs_only, 556 local_file); 557 } 558 } 559 return false; 560 } 561 562 563 bool 564 PlatformRemoteiOS::GetFileInSDKRoot (const char *platform_file_path, 565 const char *sdkroot_path, 566 bool symbols_dirs_only, 567 lldb_private::FileSpec &local_file) 568 { 569 if (sdkroot_path && sdkroot_path[0] && platform_file_path && platform_file_path[0]) 570 { 571 char resolved_path[PATH_MAX]; 572 573 if (!symbols_dirs_only) 574 { 575 ::snprintf (resolved_path, 576 sizeof(resolved_path), 577 "%s/%s", 578 sdkroot_path, 579 platform_file_path); 580 581 local_file.SetFile(resolved_path, true); 582 if (local_file.Exists()) 583 return true; 584 } 585 586 ::snprintf (resolved_path, 587 sizeof(resolved_path), 588 "%s/Symbols.Internal/%s", 589 sdkroot_path, 590 platform_file_path); 591 592 local_file.SetFile(resolved_path, true); 593 if (local_file.Exists()) 594 return true; 595 ::snprintf (resolved_path, 596 sizeof(resolved_path), 597 "%s/Symbols/%s", 598 sdkroot_path, 599 platform_file_path); 600 601 local_file.SetFile(resolved_path, true); 602 if (local_file.Exists()) 603 return true; 604 } 605 return false; 606 } 607 608 609 Error 610 PlatformRemoteiOS::GetSymbolFile (const FileSpec &platform_file, 611 const UUID *uuid_ptr, 612 FileSpec &local_file) 613 { 614 Error error; 615 char platform_file_path[PATH_MAX]; 616 if (platform_file.GetPath(platform_file_path, sizeof(platform_file_path))) 617 { 618 char resolved_path[PATH_MAX]; 619 620 const char * os_version_dir = GetDeviceSupportDirectoryForOSVersion(); 621 if (os_version_dir) 622 { 623 ::snprintf (resolved_path, 624 sizeof(resolved_path), 625 "%s/%s", 626 os_version_dir, 627 platform_file_path); 628 629 local_file.SetFile(resolved_path, true); 630 if (local_file.Exists()) 631 return error; 632 633 ::snprintf (resolved_path, 634 sizeof(resolved_path), 635 "%s/Symbols.Internal/%s", 636 os_version_dir, 637 platform_file_path); 638 639 local_file.SetFile(resolved_path, true); 640 if (local_file.Exists()) 641 return error; 642 ::snprintf (resolved_path, 643 sizeof(resolved_path), 644 "%s/Symbols/%s", 645 os_version_dir, 646 platform_file_path); 647 648 local_file.SetFile(resolved_path, true); 649 if (local_file.Exists()) 650 return error; 651 652 } 653 local_file = platform_file; 654 if (local_file.Exists()) 655 return error; 656 657 error.SetErrorStringWithFormat ("unable to locate a platform file for '%s' in platform '%s'", 658 platform_file_path, 659 GetPluginName().GetCString()); 660 } 661 else 662 { 663 error.SetErrorString ("invalid platform file argument"); 664 } 665 return error; 666 } 667 668 Error 669 PlatformRemoteiOS::GetSharedModule (const ModuleSpec &module_spec, 670 ModuleSP &module_sp, 671 const FileSpecList *module_search_paths_ptr, 672 ModuleSP *old_module_sp_ptr, 673 bool *did_create_ptr) 674 { 675 // For iOS, the SDK files are all cached locally on the host 676 // system. So first we ask for the file in the cached SDK, 677 // then we attempt to get a shared module for the right architecture 678 // with the right UUID. 679 const FileSpec &platform_file = module_spec.GetFileSpec(); 680 681 FileSpec local_file; 682 const UUID *module_uuid_ptr = module_spec.GetUUIDPtr(); 683 Error error (GetSymbolFile (platform_file, module_uuid_ptr, local_file)); 684 if (error.Success()) 685 { 686 error = ResolveExecutable (local_file, module_spec.GetArchitecture(), module_sp, NULL); 687 if (module_sp && ((module_uuid_ptr == NULL) || (module_sp->GetUUID() == *module_uuid_ptr))) 688 { 689 //printf ("found in user specified SDK\n"); 690 error.Clear(); 691 return error; 692 } 693 694 char platform_file_path[PATH_MAX]; 695 if (platform_file.GetPath(platform_file_path, sizeof(platform_file_path))) 696 { 697 FileSpec local_file; 698 const uint32_t num_sdk_infos = m_sdk_directory_infos.size(); 699 // Try the last SDK index if it is set as most files from an SDK 700 // will tend to be valid in that same SDK. 701 if (m_last_module_sdk_idx < num_sdk_infos) 702 { 703 if (GetFileInSDK (platform_file_path, m_last_module_sdk_idx, local_file)) 704 { 705 //printf ("sdk[%u] last: '%s'\n", m_last_module_sdk_idx, local_file.GetPath().c_str()); 706 module_sp.reset(); 707 error = ResolveExecutable (local_file, 708 module_spec.GetArchitecture(), 709 module_sp, 710 NULL); 711 if (module_sp && ((module_uuid_ptr == NULL) || (module_sp->GetUUID() == *module_uuid_ptr))) 712 { 713 //printf ("sdk[%u] last found\n", m_last_module_sdk_idx); 714 error.Clear(); 715 return error; 716 } 717 } 718 } 719 720 // First try for an exact match of major, minor and update 721 for (uint32_t sdk_idx=0; sdk_idx<num_sdk_infos; ++sdk_idx) 722 { 723 if (m_last_module_sdk_idx == sdk_idx) 724 { 725 // Skip the last module SDK index if we already searched 726 // it above 727 continue; 728 } 729 if (GetFileInSDK (platform_file_path, sdk_idx, local_file)) 730 { 731 //printf ("sdk[%u]: '%s'\n", sdk_idx, local_file.GetPath().c_str()); 732 733 error = ResolveExecutable (local_file, 734 module_spec.GetArchitecture(), 735 module_sp, 736 NULL); 737 if (module_sp && ((module_uuid_ptr == NULL) || (module_sp->GetUUID() == *module_uuid_ptr))) 738 { 739 // Remember the index of the last SDK that we found a file 740 // in in case the wrong SDK was selected. 741 m_last_module_sdk_idx = sdk_idx; 742 //printf ("sdk[%u]: found (setting last to %u)\n", sdk_idx, m_last_module_sdk_idx); 743 error.Clear(); 744 return error; 745 } 746 } 747 } 748 } 749 // Not the module we are looking for... Nothing to see here... 750 module_sp.reset(); 751 } 752 753 const bool always_create = false; 754 error = ModuleList::GetSharedModule (module_spec, 755 module_sp, 756 module_search_paths_ptr, 757 old_module_sp_ptr, 758 did_create_ptr, 759 always_create); 760 761 if (module_sp) 762 module_sp->SetPlatformFileSpec(platform_file); 763 764 return error; 765 } 766 767 768 uint32_t 769 PlatformRemoteiOS::FindProcesses (const ProcessInstanceInfoMatch &match_info, 770 ProcessInstanceInfoList &process_infos) 771 { 772 // TODO: if connected, send a packet to get the remote process infos by name 773 process_infos.Clear(); 774 return 0; 775 } 776 777 bool 778 PlatformRemoteiOS::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info) 779 { 780 // TODO: if connected, send a packet to get the remote process info 781 process_info.Clear(); 782 return false; 783 } 784 785 bool 786 PlatformRemoteiOS::GetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch) 787 { 788 return ARMGetSupportedArchitectureAtIndex (idx, arch); 789 } 790