PlatformDarwin.cpp revision 49ce8969d3154e1560106cfe530444c09410f217
158e26e0935138225477fd61283215ceff2068899Greg Clayton//===-- PlatformDarwin.cpp --------------------------------------*- C++ -*-===// 258e26e0935138225477fd61283215ceff2068899Greg Clayton// 358e26e0935138225477fd61283215ceff2068899Greg Clayton// The LLVM Compiler Infrastructure 458e26e0935138225477fd61283215ceff2068899Greg Clayton// 558e26e0935138225477fd61283215ceff2068899Greg Clayton// This file is distributed under the University of Illinois Open Source 658e26e0935138225477fd61283215ceff2068899Greg Clayton// License. See LICENSE.TXT for details. 758e26e0935138225477fd61283215ceff2068899Greg Clayton// 858e26e0935138225477fd61283215ceff2068899Greg Clayton//===----------------------------------------------------------------------===// 958e26e0935138225477fd61283215ceff2068899Greg Clayton 1058e26e0935138225477fd61283215ceff2068899Greg Clayton#include "PlatformDarwin.h" 1158e26e0935138225477fd61283215ceff2068899Greg Clayton 1258e26e0935138225477fd61283215ceff2068899Greg Clayton// C Includes 1358e26e0935138225477fd61283215ceff2068899Greg Clayton// C++ Includes 1458e26e0935138225477fd61283215ceff2068899Greg Clayton// Other libraries and framework includes 1558e26e0935138225477fd61283215ceff2068899Greg Clayton// Project includes 1658e26e0935138225477fd61283215ceff2068899Greg Clayton#include "lldb/Breakpoint/BreakpointLocation.h" 17b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton#include "lldb/Core/Debugger.h" 1858e26e0935138225477fd61283215ceff2068899Greg Clayton#include "lldb/Core/Error.h" 1949ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Module.h" 2049ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/ModuleSpec.h" 2158e26e0935138225477fd61283215ceff2068899Greg Clayton#include "lldb/Host/Host.h" 2249ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/ObjectFile.h" 2358e26e0935138225477fd61283215ceff2068899Greg Clayton#include "lldb/Target/Target.h" 2458e26e0935138225477fd61283215ceff2068899Greg Clayton 2558e26e0935138225477fd61283215ceff2068899Greg Claytonusing namespace lldb; 2658e26e0935138225477fd61283215ceff2068899Greg Claytonusing namespace lldb_private; 2758e26e0935138225477fd61283215ceff2068899Greg Clayton 2858e26e0935138225477fd61283215ceff2068899Greg Clayton 2958e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 3058e26e0935138225477fd61283215ceff2068899Greg Clayton/// Default Constructor 3158e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 3258e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::PlatformDarwin (bool is_host) : 3358e26e0935138225477fd61283215ceff2068899Greg Clayton Platform(is_host), // This is the local host platform 34f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton m_remote_platform_sp (), 35f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton m_developer_directory () 3658e26e0935138225477fd61283215ceff2068899Greg Clayton{ 3758e26e0935138225477fd61283215ceff2068899Greg Clayton} 3858e26e0935138225477fd61283215ceff2068899Greg Clayton 3958e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 4058e26e0935138225477fd61283215ceff2068899Greg Clayton/// Destructor. 4158e26e0935138225477fd61283215ceff2068899Greg Clayton/// 4258e26e0935138225477fd61283215ceff2068899Greg Clayton/// The destructor is virtual since this class is designed to be 4358e26e0935138225477fd61283215ceff2068899Greg Clayton/// inherited from by the plug-in instance. 4458e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 4558e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::~PlatformDarwin() 4658e26e0935138225477fd61283215ceff2068899Greg Clayton{ 4758e26e0935138225477fd61283215ceff2068899Greg Clayton} 4858e26e0935138225477fd61283215ceff2068899Greg Clayton 4958e26e0935138225477fd61283215ceff2068899Greg Clayton 5058e26e0935138225477fd61283215ceff2068899Greg ClaytonError 5158e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::ResolveExecutable (const FileSpec &exe_file, 5258e26e0935138225477fd61283215ceff2068899Greg Clayton const ArchSpec &exe_arch, 539ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton lldb::ModuleSP &exe_module_sp, 549ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton const FileSpecList *module_search_paths_ptr) 5558e26e0935138225477fd61283215ceff2068899Greg Clayton{ 5658e26e0935138225477fd61283215ceff2068899Greg Clayton Error error; 5758e26e0935138225477fd61283215ceff2068899Greg Clayton // Nothing special to do here, just use the actual file and architecture 5858e26e0935138225477fd61283215ceff2068899Greg Clayton 59b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton char exe_path[PATH_MAX]; 6058e26e0935138225477fd61283215ceff2068899Greg Clayton FileSpec resolved_exe_file (exe_file); 6158e26e0935138225477fd61283215ceff2068899Greg Clayton 62b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (IsHost()) 63b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 64b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // If we have "ls" as the exe_file, resolve the executable loation based on 65b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // the current path variables 66b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (!resolved_exe_file.Exists()) 67b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 68b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton exe_file.GetPath (exe_path, sizeof(exe_path)); 69b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton resolved_exe_file.SetFile(exe_path, true); 70b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 7158e26e0935138225477fd61283215ceff2068899Greg Clayton 72b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (!resolved_exe_file.Exists()) 73b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton resolved_exe_file.ResolveExecutableLocation (); 7458e26e0935138225477fd61283215ceff2068899Greg Clayton 75b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Resolve any executable within a bundle on MacOSX 76b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Host::ResolveExecutableInBundle (resolved_exe_file); 77b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 78b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (resolved_exe_file.Exists()) 79b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.Clear(); 80b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 81b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 82b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton exe_file.GetPath (exe_path, sizeof(exe_path)); 83d8ff83518468f3c81f9e5115d0dcd0b249413cf1Jim Ingham error.SetErrorStringWithFormat ("unable to find executable for '%s'", exe_path); 84b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 85b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 86b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 87b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 88b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_remote_platform_sp) 89b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 90b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error = m_remote_platform_sp->ResolveExecutable (exe_file, 91b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton exe_arch, 929ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton exe_module_sp, 939ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_search_paths_ptr); 94b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 95b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 96f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen { 97f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen // We may connect to a process and use the provided executable (Don't use local $PATH). 98f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen 99f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen // Resolve any executable within a bundle on MacOSX 100f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen Host::ResolveExecutableInBundle (resolved_exe_file); 101f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen 102f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen if (resolved_exe_file.Exists()) 103f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen error.Clear(); 104f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen else 10595b7b4362ca7135be088e4fbf04c2bd15767a104Jason Molenda error.SetErrorStringWithFormat("the platform is not currently connected, and '%s' doesn't exist in the system root.", resolved_exe_file.GetFilename().AsCString("")); 106f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen } 107b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 108b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 109b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 110b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (error.Success()) 11158e26e0935138225477fd61283215ceff2068899Greg Clayton { 112444fe998bf707bd076a70c3a779db8575533695eGreg Clayton ModuleSpec module_spec (resolved_exe_file, exe_arch); 113444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (module_spec.GetArchitecture().IsValid()) 11458e26e0935138225477fd61283215ceff2068899Greg Clayton { 115444fe998bf707bd076a70c3a779db8575533695eGreg Clayton error = ModuleList::GetSharedModule (module_spec, 11658e26e0935138225477fd61283215ceff2068899Greg Clayton exe_module_sp, 1179ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_search_paths_ptr, 11858e26e0935138225477fd61283215ceff2068899Greg Clayton NULL, 11958e26e0935138225477fd61283215ceff2068899Greg Clayton NULL); 12058e26e0935138225477fd61283215ceff2068899Greg Clayton 121b6883ec4fc673b57d845565d54cf34828911db40Greg Clayton if (error.Fail() || exe_module_sp.get() == NULL || exe_module_sp->GetObjectFile() == NULL) 12258e26e0935138225477fd61283215ceff2068899Greg Clayton { 12358e26e0935138225477fd61283215ceff2068899Greg Clayton exe_module_sp.reset(); 12458e26e0935138225477fd61283215ceff2068899Greg Clayton error.SetErrorStringWithFormat ("'%s%s%s' doesn't contain the architecture %s", 12558e26e0935138225477fd61283215ceff2068899Greg Clayton exe_file.GetDirectory().AsCString(""), 12658e26e0935138225477fd61283215ceff2068899Greg Clayton exe_file.GetDirectory() ? "/" : "", 12758e26e0935138225477fd61283215ceff2068899Greg Clayton exe_file.GetFilename().AsCString(""), 12858e26e0935138225477fd61283215ceff2068899Greg Clayton exe_arch.GetArchitectureName()); 12958e26e0935138225477fd61283215ceff2068899Greg Clayton } 13058e26e0935138225477fd61283215ceff2068899Greg Clayton } 13158e26e0935138225477fd61283215ceff2068899Greg Clayton else 13258e26e0935138225477fd61283215ceff2068899Greg Clayton { 13358e26e0935138225477fd61283215ceff2068899Greg Clayton // No valid architecture was specified, ask the platform for 13458e26e0935138225477fd61283215ceff2068899Greg Clayton // the architectures that we should be using (in the correct order) 13558e26e0935138225477fd61283215ceff2068899Greg Clayton // and see if we can find a match that way 13658e26e0935138225477fd61283215ceff2068899Greg Clayton StreamString arch_names; 137444fe998bf707bd076a70c3a779db8575533695eGreg Clayton for (uint32_t idx = 0; GetSupportedArchitectureAtIndex (idx, module_spec.GetArchitecture()); ++idx) 13858e26e0935138225477fd61283215ceff2068899Greg Clayton { 139444fe998bf707bd076a70c3a779db8575533695eGreg Clayton error = ModuleList::GetSharedModule (module_spec, 14058e26e0935138225477fd61283215ceff2068899Greg Clayton exe_module_sp, 1419ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_search_paths_ptr, 14258e26e0935138225477fd61283215ceff2068899Greg Clayton NULL, 14358e26e0935138225477fd61283215ceff2068899Greg Clayton NULL); 14458e26e0935138225477fd61283215ceff2068899Greg Clayton // Did we find an executable using one of the 14558e26e0935138225477fd61283215ceff2068899Greg Clayton if (error.Success()) 14658e26e0935138225477fd61283215ceff2068899Greg Clayton { 14758e26e0935138225477fd61283215ceff2068899Greg Clayton if (exe_module_sp && exe_module_sp->GetObjectFile()) 14858e26e0935138225477fd61283215ceff2068899Greg Clayton break; 14958e26e0935138225477fd61283215ceff2068899Greg Clayton else 15058e26e0935138225477fd61283215ceff2068899Greg Clayton error.SetErrorToGenericError(); 15158e26e0935138225477fd61283215ceff2068899Greg Clayton } 15258e26e0935138225477fd61283215ceff2068899Greg Clayton 15358e26e0935138225477fd61283215ceff2068899Greg Clayton if (idx > 0) 15458e26e0935138225477fd61283215ceff2068899Greg Clayton arch_names.PutCString (", "); 155444fe998bf707bd076a70c3a779db8575533695eGreg Clayton arch_names.PutCString (module_spec.GetArchitecture().GetArchitectureName()); 15658e26e0935138225477fd61283215ceff2068899Greg Clayton } 15758e26e0935138225477fd61283215ceff2068899Greg Clayton 15858e26e0935138225477fd61283215ceff2068899Greg Clayton if (error.Fail() || !exe_module_sp) 15958e26e0935138225477fd61283215ceff2068899Greg Clayton { 16058e26e0935138225477fd61283215ceff2068899Greg Clayton error.SetErrorStringWithFormat ("'%s%s%s' doesn't contain any '%s' platform architectures: %s", 16158e26e0935138225477fd61283215ceff2068899Greg Clayton exe_file.GetDirectory().AsCString(""), 16258e26e0935138225477fd61283215ceff2068899Greg Clayton exe_file.GetDirectory() ? "/" : "", 16358e26e0935138225477fd61283215ceff2068899Greg Clayton exe_file.GetFilename().AsCString(""), 16458e26e0935138225477fd61283215ceff2068899Greg Clayton GetShortPluginName(), 16558e26e0935138225477fd61283215ceff2068899Greg Clayton arch_names.GetString().c_str()); 16658e26e0935138225477fd61283215ceff2068899Greg Clayton } 16758e26e0935138225477fd61283215ceff2068899Greg Clayton } 16858e26e0935138225477fd61283215ceff2068899Greg Clayton } 16958e26e0935138225477fd61283215ceff2068899Greg Clayton 17058e26e0935138225477fd61283215ceff2068899Greg Clayton return error; 17158e26e0935138225477fd61283215ceff2068899Greg Clayton} 17258e26e0935138225477fd61283215ceff2068899Greg Clayton 17358e26e0935138225477fd61283215ceff2068899Greg Clayton 1749ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 1759ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonError 176444fe998bf707bd076a70c3a779db8575533695eGreg ClaytonPlatformDarwin::GetSharedModule (const ModuleSpec &module_spec, 1779ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton ModuleSP &module_sp, 1789ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton const FileSpecList *module_search_paths_ptr, 1799ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton ModuleSP *old_module_sp_ptr, 1809ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton bool *did_create_ptr) 1819ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton{ 1829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton Error error; 1839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_sp.reset(); 1849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 1859ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (IsRemote()) 1869ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 1879ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // If we have a remote platform always, let it try and locate 1889ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // the shared module first. 1899ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (m_remote_platform_sp) 1909ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 191444fe998bf707bd076a70c3a779db8575533695eGreg Clayton error = m_remote_platform_sp->GetSharedModule (module_spec, 1929ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_sp, 1939ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_search_paths_ptr, 1949ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton old_module_sp_ptr, 1959ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton did_create_ptr); 1969ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 1979ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 1989ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 1999ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (!module_sp) 2009ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 2019ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // Fall back to the local platform and find the file locally 202444fe998bf707bd076a70c3a779db8575533695eGreg Clayton error = Platform::GetSharedModule (module_spec, 2039ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_sp, 2049ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_search_paths_ptr, 2059ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton old_module_sp_ptr, 2069ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton did_create_ptr); 2079ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 208444fe998bf707bd076a70c3a779db8575533695eGreg Clayton const FileSpec &platform_file = module_spec.GetFileSpec(); 2099ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (!module_sp && module_search_paths_ptr && platform_file) 2109ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 2119ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // We can try to pull off part of the file path up to the bundle 2129ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // directory level and try any module search paths... 2139ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton FileSpec bundle_directory; 2149ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (Host::GetBundleDirectory (platform_file, bundle_directory)) 2159ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 2169ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton char platform_path[PATH_MAX]; 2179ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton char bundle_dir[PATH_MAX]; 2189ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton platform_file.GetPath (platform_path, sizeof(platform_path)); 2199ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton const size_t bundle_directory_len = bundle_directory.GetPath (bundle_dir, sizeof(bundle_dir)); 2209ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton char new_path[PATH_MAX]; 2219ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton size_t num_module_search_paths = module_search_paths_ptr->GetSize(); 2229ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton for (size_t i=0; i<num_module_search_paths; ++i) 2239ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 2249ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton const size_t search_path_len = module_search_paths_ptr->GetFileSpecAtIndex(i).GetPath(new_path, sizeof(new_path)); 2259ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (search_path_len < sizeof(new_path)) 2269ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 2279ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton snprintf (new_path + search_path_len, sizeof(new_path) - search_path_len, "/%s", platform_path + bundle_directory_len); 2289ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton FileSpec new_file_spec (new_path, false); 2299ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (new_file_spec.Exists()) 2309ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 231444fe998bf707bd076a70c3a779db8575533695eGreg Clayton ModuleSpec new_module_spec (module_spec); 232444fe998bf707bd076a70c3a779db8575533695eGreg Clayton new_module_spec.GetFileSpec() = new_file_spec; 233444fe998bf707bd076a70c3a779db8575533695eGreg Clayton Error new_error (Platform::GetSharedModule (new_module_spec, 2349ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_sp, 2359ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton NULL, 2369ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton old_module_sp_ptr, 2379ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton did_create_ptr)); 2389ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 2399ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (module_sp) 2409ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 2419ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_sp->SetPlatformFileSpec(new_file_spec); 2429ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return new_error; 2439ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 2449ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 2459ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 2469ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 2479ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 2489ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 2499ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 2509ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (module_sp) 251444fe998bf707bd076a70c3a779db8575533695eGreg Clayton module_sp->SetPlatformFileSpec(module_spec.GetFileSpec()); 2529ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return error; 2539ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton} 2549ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 25558e26e0935138225477fd61283215ceff2068899Greg Claytonsize_t 25658e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::GetSoftwareBreakpointTrapOpcode (Target &target, BreakpointSite *bp_site) 25758e26e0935138225477fd61283215ceff2068899Greg Clayton{ 25858e26e0935138225477fd61283215ceff2068899Greg Clayton const uint8_t *trap_opcode = NULL; 25958e26e0935138225477fd61283215ceff2068899Greg Clayton uint32_t trap_opcode_size = 0; 260f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton bool bp_is_thumb = false; 26158e26e0935138225477fd61283215ceff2068899Greg Clayton 26258e26e0935138225477fd61283215ceff2068899Greg Clayton llvm::Triple::ArchType machine = target.GetArchitecture().GetMachine(); 26358e26e0935138225477fd61283215ceff2068899Greg Clayton switch (machine) 26458e26e0935138225477fd61283215ceff2068899Greg Clayton { 26558e26e0935138225477fd61283215ceff2068899Greg Clayton case llvm::Triple::x86: 26658e26e0935138225477fd61283215ceff2068899Greg Clayton case llvm::Triple::x86_64: 26758e26e0935138225477fd61283215ceff2068899Greg Clayton { 26858e26e0935138225477fd61283215ceff2068899Greg Clayton static const uint8_t g_i386_breakpoint_opcode[] = { 0xCC }; 26958e26e0935138225477fd61283215ceff2068899Greg Clayton trap_opcode = g_i386_breakpoint_opcode; 27058e26e0935138225477fd61283215ceff2068899Greg Clayton trap_opcode_size = sizeof(g_i386_breakpoint_opcode); 27158e26e0935138225477fd61283215ceff2068899Greg Clayton } 27258e26e0935138225477fd61283215ceff2068899Greg Clayton break; 273f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton 274f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton case llvm::Triple::thumb: 275f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton bp_is_thumb = true; // Fall through... 27658e26e0935138225477fd61283215ceff2068899Greg Clayton case llvm::Triple::arm: 27758e26e0935138225477fd61283215ceff2068899Greg Clayton { 27858e26e0935138225477fd61283215ceff2068899Greg Clayton static const uint8_t g_arm_breakpoint_opcode[] = { 0xFE, 0xDE, 0xFF, 0xE7 }; 27958e26e0935138225477fd61283215ceff2068899Greg Clayton static const uint8_t g_thumb_breakpooint_opcode[] = { 0xFE, 0xDE }; 28058e26e0935138225477fd61283215ceff2068899Greg Clayton 281f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton // Auto detect arm/thumb if it wasn't explicitly specified 282f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton if (!bp_is_thumb) 28358e26e0935138225477fd61283215ceff2068899Greg Clayton { 284f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton lldb::BreakpointLocationSP bp_loc_sp (bp_site->GetOwnerAtIndex (0)); 285f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton if (bp_loc_sp) 286f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton bp_is_thumb = bp_loc_sp->GetAddress().GetAddressClass () == eAddressClassCodeAlternateISA; 287f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton } 288f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton if (bp_is_thumb) 289f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton { 290f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton trap_opcode = g_thumb_breakpooint_opcode; 291f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton trap_opcode_size = sizeof(g_thumb_breakpooint_opcode); 292f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton break; 29358e26e0935138225477fd61283215ceff2068899Greg Clayton } 29458e26e0935138225477fd61283215ceff2068899Greg Clayton trap_opcode = g_arm_breakpoint_opcode; 29558e26e0935138225477fd61283215ceff2068899Greg Clayton trap_opcode_size = sizeof(g_arm_breakpoint_opcode); 29658e26e0935138225477fd61283215ceff2068899Greg Clayton } 29758e26e0935138225477fd61283215ceff2068899Greg Clayton break; 29858e26e0935138225477fd61283215ceff2068899Greg Clayton 29958e26e0935138225477fd61283215ceff2068899Greg Clayton case llvm::Triple::ppc: 30058e26e0935138225477fd61283215ceff2068899Greg Clayton case llvm::Triple::ppc64: 30158e26e0935138225477fd61283215ceff2068899Greg Clayton { 30258e26e0935138225477fd61283215ceff2068899Greg Clayton static const uint8_t g_ppc_breakpoint_opcode[] = { 0x7F, 0xC0, 0x00, 0x08 }; 30358e26e0935138225477fd61283215ceff2068899Greg Clayton trap_opcode = g_ppc_breakpoint_opcode; 30458e26e0935138225477fd61283215ceff2068899Greg Clayton trap_opcode_size = sizeof(g_ppc_breakpoint_opcode); 30558e26e0935138225477fd61283215ceff2068899Greg Clayton } 30658e26e0935138225477fd61283215ceff2068899Greg Clayton break; 30758e26e0935138225477fd61283215ceff2068899Greg Clayton 30858e26e0935138225477fd61283215ceff2068899Greg Clayton default: 309f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton assert(!"Unhandled architecture in PlatformDarwin::GetSoftwareBreakpointTrapOpcode()"); 31058e26e0935138225477fd61283215ceff2068899Greg Clayton break; 31158e26e0935138225477fd61283215ceff2068899Greg Clayton } 31258e26e0935138225477fd61283215ceff2068899Greg Clayton 31358e26e0935138225477fd61283215ceff2068899Greg Clayton if (trap_opcode && trap_opcode_size) 31458e26e0935138225477fd61283215ceff2068899Greg Clayton { 31558e26e0935138225477fd61283215ceff2068899Greg Clayton if (bp_site->SetTrapOpcode(trap_opcode, trap_opcode_size)) 31658e26e0935138225477fd61283215ceff2068899Greg Clayton return trap_opcode_size; 31758e26e0935138225477fd61283215ceff2068899Greg Clayton } 31858e26e0935138225477fd61283215ceff2068899Greg Clayton return 0; 31958e26e0935138225477fd61283215ceff2068899Greg Clayton 32058e26e0935138225477fd61283215ceff2068899Greg Clayton} 32158e26e0935138225477fd61283215ceff2068899Greg Clayton 32258e26e0935138225477fd61283215ceff2068899Greg Claytonbool 32358e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::GetRemoteOSVersion () 32458e26e0935138225477fd61283215ceff2068899Greg Clayton{ 32558e26e0935138225477fd61283215ceff2068899Greg Clayton if (m_remote_platform_sp) 32658e26e0935138225477fd61283215ceff2068899Greg Clayton return m_remote_platform_sp->GetOSVersion (m_major_os_version, 32758e26e0935138225477fd61283215ceff2068899Greg Clayton m_minor_os_version, 32858e26e0935138225477fd61283215ceff2068899Greg Clayton m_update_os_version); 32958e26e0935138225477fd61283215ceff2068899Greg Clayton return false; 33058e26e0935138225477fd61283215ceff2068899Greg Clayton} 33158e26e0935138225477fd61283215ceff2068899Greg Clayton 33258e26e0935138225477fd61283215ceff2068899Greg Claytonbool 33358e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::GetRemoteOSBuildString (std::string &s) 33458e26e0935138225477fd61283215ceff2068899Greg Clayton{ 33558e26e0935138225477fd61283215ceff2068899Greg Clayton if (m_remote_platform_sp) 33658e26e0935138225477fd61283215ceff2068899Greg Clayton return m_remote_platform_sp->GetRemoteOSBuildString (s); 33758e26e0935138225477fd61283215ceff2068899Greg Clayton s.clear(); 33858e26e0935138225477fd61283215ceff2068899Greg Clayton return false; 33958e26e0935138225477fd61283215ceff2068899Greg Clayton} 34058e26e0935138225477fd61283215ceff2068899Greg Clayton 34158e26e0935138225477fd61283215ceff2068899Greg Claytonbool 34258e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::GetRemoteOSKernelDescription (std::string &s) 34358e26e0935138225477fd61283215ceff2068899Greg Clayton{ 34458e26e0935138225477fd61283215ceff2068899Greg Clayton if (m_remote_platform_sp) 34558e26e0935138225477fd61283215ceff2068899Greg Clayton return m_remote_platform_sp->GetRemoteOSKernelDescription (s); 34658e26e0935138225477fd61283215ceff2068899Greg Clayton s.clear(); 34758e26e0935138225477fd61283215ceff2068899Greg Clayton return false; 34858e26e0935138225477fd61283215ceff2068899Greg Clayton} 34958e26e0935138225477fd61283215ceff2068899Greg Clayton 35058e26e0935138225477fd61283215ceff2068899Greg Clayton// Remote Platform subclasses need to override this function 35158e26e0935138225477fd61283215ceff2068899Greg ClaytonArchSpec 35258e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::GetRemoteSystemArchitecture () 35358e26e0935138225477fd61283215ceff2068899Greg Clayton{ 35458e26e0935138225477fd61283215ceff2068899Greg Clayton if (m_remote_platform_sp) 35558e26e0935138225477fd61283215ceff2068899Greg Clayton return m_remote_platform_sp->GetRemoteSystemArchitecture (); 35658e26e0935138225477fd61283215ceff2068899Greg Clayton return ArchSpec(); 35758e26e0935138225477fd61283215ceff2068899Greg Clayton} 35858e26e0935138225477fd61283215ceff2068899Greg Clayton 35958e26e0935138225477fd61283215ceff2068899Greg Clayton 36058e26e0935138225477fd61283215ceff2068899Greg Claytonconst char * 36124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonPlatformDarwin::GetHostname () 36258e26e0935138225477fd61283215ceff2068899Greg Clayton{ 36324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsHost()) 36424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return Platform::GetHostname(); 36524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 36658e26e0935138225477fd61283215ceff2068899Greg Clayton if (m_remote_platform_sp) 36758e26e0935138225477fd61283215ceff2068899Greg Clayton return m_remote_platform_sp->GetHostname (); 36858e26e0935138225477fd61283215ceff2068899Greg Clayton return NULL; 36958e26e0935138225477fd61283215ceff2068899Greg Clayton} 37058e26e0935138225477fd61283215ceff2068899Greg Clayton 37158e26e0935138225477fd61283215ceff2068899Greg Claytonbool 37258e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::IsConnected () const 37358e26e0935138225477fd61283215ceff2068899Greg Clayton{ 37458e26e0935138225477fd61283215ceff2068899Greg Clayton if (IsHost()) 37558e26e0935138225477fd61283215ceff2068899Greg Clayton return true; 37658e26e0935138225477fd61283215ceff2068899Greg Clayton else if (m_remote_platform_sp) 37758e26e0935138225477fd61283215ceff2068899Greg Clayton return m_remote_platform_sp->IsConnected(); 37858e26e0935138225477fd61283215ceff2068899Greg Clayton return false; 37958e26e0935138225477fd61283215ceff2068899Greg Clayton} 38058e26e0935138225477fd61283215ceff2068899Greg Clayton 38158e26e0935138225477fd61283215ceff2068899Greg ClaytonError 38258e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::ConnectRemote (Args& args) 38358e26e0935138225477fd61283215ceff2068899Greg Clayton{ 38458e26e0935138225477fd61283215ceff2068899Greg Clayton Error error; 38558e26e0935138225477fd61283215ceff2068899Greg Clayton if (IsHost()) 38658e26e0935138225477fd61283215ceff2068899Greg Clayton { 38758e26e0935138225477fd61283215ceff2068899Greg Clayton error.SetErrorStringWithFormat ("can't connect to the host platform '%s', always connected", GetShortPluginName()); 38858e26e0935138225477fd61283215ceff2068899Greg Clayton } 38958e26e0935138225477fd61283215ceff2068899Greg Clayton else 39058e26e0935138225477fd61283215ceff2068899Greg Clayton { 39158e26e0935138225477fd61283215ceff2068899Greg Clayton if (!m_remote_platform_sp) 39258e26e0935138225477fd61283215ceff2068899Greg Clayton m_remote_platform_sp = Platform::Create ("remote-gdb-server", error); 39358e26e0935138225477fd61283215ceff2068899Greg Clayton 39458e26e0935138225477fd61283215ceff2068899Greg Clayton if (m_remote_platform_sp) 39558e26e0935138225477fd61283215ceff2068899Greg Clayton { 39658e26e0935138225477fd61283215ceff2068899Greg Clayton if (error.Success()) 39758e26e0935138225477fd61283215ceff2068899Greg Clayton { 39858e26e0935138225477fd61283215ceff2068899Greg Clayton if (m_remote_platform_sp) 39958e26e0935138225477fd61283215ceff2068899Greg Clayton { 40058e26e0935138225477fd61283215ceff2068899Greg Clayton error = m_remote_platform_sp->ConnectRemote (args); 40158e26e0935138225477fd61283215ceff2068899Greg Clayton } 40258e26e0935138225477fd61283215ceff2068899Greg Clayton else 40358e26e0935138225477fd61283215ceff2068899Greg Clayton { 40458e26e0935138225477fd61283215ceff2068899Greg Clayton error.SetErrorString ("\"platform connect\" takes a single argument: <connect-url>"); 40558e26e0935138225477fd61283215ceff2068899Greg Clayton } 40658e26e0935138225477fd61283215ceff2068899Greg Clayton } 40758e26e0935138225477fd61283215ceff2068899Greg Clayton } 40858e26e0935138225477fd61283215ceff2068899Greg Clayton else 40958e26e0935138225477fd61283215ceff2068899Greg Clayton error.SetErrorString ("failed to create a 'remote-gdb-server' platform"); 41058e26e0935138225477fd61283215ceff2068899Greg Clayton 41158e26e0935138225477fd61283215ceff2068899Greg Clayton if (error.Fail()) 41258e26e0935138225477fd61283215ceff2068899Greg Clayton m_remote_platform_sp.reset(); 41358e26e0935138225477fd61283215ceff2068899Greg Clayton } 41458e26e0935138225477fd61283215ceff2068899Greg Clayton 41558e26e0935138225477fd61283215ceff2068899Greg Clayton return error; 41658e26e0935138225477fd61283215ceff2068899Greg Clayton} 41758e26e0935138225477fd61283215ceff2068899Greg Clayton 41858e26e0935138225477fd61283215ceff2068899Greg ClaytonError 41958e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::DisconnectRemote () 42058e26e0935138225477fd61283215ceff2068899Greg Clayton{ 42158e26e0935138225477fd61283215ceff2068899Greg Clayton Error error; 42258e26e0935138225477fd61283215ceff2068899Greg Clayton 42358e26e0935138225477fd61283215ceff2068899Greg Clayton if (IsHost()) 42458e26e0935138225477fd61283215ceff2068899Greg Clayton { 42558e26e0935138225477fd61283215ceff2068899Greg Clayton error.SetErrorStringWithFormat ("can't disconnect from the host platform '%s', always connected", GetShortPluginName()); 42658e26e0935138225477fd61283215ceff2068899Greg Clayton } 42758e26e0935138225477fd61283215ceff2068899Greg Clayton else 42858e26e0935138225477fd61283215ceff2068899Greg Clayton { 42958e26e0935138225477fd61283215ceff2068899Greg Clayton if (m_remote_platform_sp) 43058e26e0935138225477fd61283215ceff2068899Greg Clayton error = m_remote_platform_sp->DisconnectRemote (); 43158e26e0935138225477fd61283215ceff2068899Greg Clayton else 43258e26e0935138225477fd61283215ceff2068899Greg Clayton error.SetErrorString ("the platform is not currently connected"); 43358e26e0935138225477fd61283215ceff2068899Greg Clayton } 43458e26e0935138225477fd61283215ceff2068899Greg Clayton return error; 43558e26e0935138225477fd61283215ceff2068899Greg Clayton} 43658e26e0935138225477fd61283215ceff2068899Greg Clayton 43724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 43824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonbool 439b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatformDarwin::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info) 44024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 44124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton bool sucess = false; 44224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsHost()) 44324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 44424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton sucess = Platform::GetProcessInfo (pid, process_info); 44524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 44624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton else 44724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 44824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_remote_platform_sp) 44924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton sucess = m_remote_platform_sp->GetProcessInfo (pid, process_info); 45024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 45124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return sucess; 45224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 45324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 45424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 45524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 45624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonuint32_t 457b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatformDarwin::FindProcesses (const ProcessInstanceInfoMatch &match_info, 458b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessInstanceInfoList &process_infos) 45924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 46024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton uint32_t match_count = 0; 46124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsHost()) 46224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 46324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // Let the base class figure out the host details 46424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton match_count = Platform::FindProcesses (match_info, process_infos); 46524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 46624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton else 46724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 46824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // If we are remote, we can only return results if we are connected 46924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_remote_platform_sp) 47024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton match_count = m_remote_platform_sp->FindProcesses (match_info, process_infos); 47124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 47224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return match_count; 47324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 47424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 475b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonError 476b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatformDarwin::LaunchProcess (ProcessLaunchInfo &launch_info) 477b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 478b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error error; 479527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 480b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (IsHost()) 481b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 482b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error = Platform::LaunchProcess (launch_info); 483b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 484b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 485b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 486b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_remote_platform_sp) 487b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error = m_remote_platform_sp->LaunchProcess (launch_info); 488b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 489b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("the platform is not currently connected"); 490b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 491b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return error; 492b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 493b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 494b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonlldb::ProcessSP 495527154d8e532f27f25af226c9e1dac607c48b5d1Greg ClaytonPlatformDarwin::Attach (ProcessAttachInfo &attach_info, 496b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Debugger &debugger, 497b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Target *target, 498b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Listener &listener, 499b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error &error) 500b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 501b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton lldb::ProcessSP process_sp; 502527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 503b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (IsHost()) 504b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 505b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (target == NULL) 506b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 507b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton TargetSP new_target_sp; 508b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton FileSpec emptyFileSpec; 509b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 510b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error = debugger.GetTargetList().CreateTarget (debugger, 511b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton emptyFileSpec, 5123e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton NULL, 513b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton false, 5143e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton NULL, 515b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton new_target_sp); 516b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton target = new_target_sp.get(); 517b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 518b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 519b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.Clear(); 520b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 521b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (target && error.Success()) 522b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 523b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton debugger.GetTargetList().SetSelectedTarget(target); 524527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 52546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton process_sp = target->CreateProcess (listener, attach_info.GetProcessPluginName(), NULL); 526b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 527b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (process_sp) 528527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error = process_sp->Attach (attach_info); 529b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 530b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 531b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 532b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 533b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_remote_platform_sp) 534527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton process_sp = m_remote_platform_sp->Attach (attach_info, debugger, target, listener, error); 535b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 536b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("the platform is not currently connected"); 537b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 538b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return process_sp; 539b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 540b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 54124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonconst char * 54224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonPlatformDarwin::GetUserName (uint32_t uid) 54324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 54424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // Check the cache in Platform in case we have already looked this uid up 54524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *user_name = Platform::GetUserName(uid); 54624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (user_name) 54724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return user_name; 54824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 54924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsRemote() && m_remote_platform_sp) 55024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return m_remote_platform_sp->GetUserName(uid); 55124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return NULL; 55224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 55324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 55424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonconst char * 55524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonPlatformDarwin::GetGroupName (uint32_t gid) 55624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 55724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *group_name = Platform::GetGroupName(gid); 55824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (group_name) 55924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return group_name; 56024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 56124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsRemote() && m_remote_platform_sp) 56224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return m_remote_platform_sp->GetGroupName(gid); 56324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return NULL; 56424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 56524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 5667089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Inghambool 5677089d8a3ef19ea251210b3e9bf198da8fb55f279Jim InghamPlatformDarwin::ModuleIsExcludedForNonModuleSpecificSearches (lldb_private::Target &target, const lldb::ModuleSP &module_sp) 5687089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham{ 56949170d451ca06cccd67b486646b5345f85e69417Jim Ingham if (!module_sp) 57049170d451ca06cccd67b486646b5345f85e69417Jim Ingham return false; 57149170d451ca06cccd67b486646b5345f85e69417Jim Ingham 5727089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham ObjectFile *obj_file = module_sp->GetObjectFile(); 5737089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham if (!obj_file) 5747089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham return false; 5757089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham 5767089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham ObjectFile::Type obj_type = obj_file->GetType(); 5777089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham if (obj_type == ObjectFile::eTypeDynamicLinker) 5787089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham return true; 5797089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham else 5807089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham return false; 5817089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham} 5829d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 5839d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 584f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Claytonbool 585f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg ClaytonPlatformDarwin::x86GetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch) 586f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton{ 587f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (idx == 0) 588f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 589f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton arch = Host::GetArchitecture (Host::eSystemDefaultArchitecture); 590f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton return arch.IsValid(); 591f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 592f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton else if (idx == 1) 593f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 594f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton ArchSpec platform_arch (Host::GetArchitecture (Host::eSystemDefaultArchitecture)); 595f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton ArchSpec platform_arch64 (Host::GetArchitecture (Host::eSystemDefaultArchitecture64)); 596f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (platform_arch == platform_arch64) 597f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 598f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton // This macosx platform supports both 32 and 64 bit. Since we already 599f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton // returned the 64 bit arch for idx == 0, return the 32 bit arch 600f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton // for idx == 1 601f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton arch = Host::GetArchitecture (Host::eSystemDefaultArchitecture32); 602f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton return arch.IsValid(); 603f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 604f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 605f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton return false; 606f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton} 607f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton 6089d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda// The architecture selection rules for arm processors 6099d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda// These cpu subtypes have distinct names (e.g. armv7f) but armv7 binaries run fine on an armv7f processor. 6109d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 6119d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molendabool 6129d3c618680dd8bc8f250d700aac7f78eecbbf69bJason MolendaPlatformDarwin::ARMGetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch) 6139d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda{ 6149d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda ArchSpec system_arch (GetSystemArchitecture()); 6159d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda const ArchSpec::Core system_core = system_arch.GetCore(); 6169d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda switch (system_core) 6179d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda { 6189d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda default: 6199d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda switch (idx) 6209d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda { 621b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 0: arch.SetTriple ("armv7-apple-ios"); return true; 622b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 1: arch.SetTriple ("armv7f-apple-ios"); return true; 623b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 2: arch.SetTriple ("armv7k-apple-ios"); return true; 624b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 3: arch.SetTriple ("armv7s-apple-ios"); return true; 625b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 4: arch.SetTriple ("armv6-apple-ios"); return true; 626b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 5: arch.SetTriple ("armv5-apple-ios"); return true; 627b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 6: arch.SetTriple ("armv4-apple-ios"); return true; 628b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 7: arch.SetTriple ("arm-apple-ios"); return true; 629b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 8: arch.SetTriple ("thumbv7-apple-ios"); return true; 630b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 9: arch.SetTriple ("thumbv7f-apple-ios"); return true; 631b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 10: arch.SetTriple ("thumbv7k-apple-ios"); return true; 632b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 11: arch.SetTriple ("thumbv7s-apple-ios"); return true; 633b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 12: arch.SetTriple ("thumbv6-apple-ios"); return true; 634b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 13: arch.SetTriple ("thumbv5-apple-ios"); return true; 635b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 14: arch.SetTriple ("thumbv4t-apple-ios"); return true; 636b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 15: arch.SetTriple ("thumb-apple-ios"); return true; 6379d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda default: break; 6389d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda } 6399d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda break; 6409d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 6419d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda case ArchSpec::eCore_arm_armv7f: 6429d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda switch (idx) 6439d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda { 644b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 0: arch.SetTriple ("armv7f-apple-ios"); return true; 645b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 1: arch.SetTriple ("armv7-apple-ios"); return true; 646b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 2: arch.SetTriple ("armv6-apple-ios"); return true; 647b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 3: arch.SetTriple ("armv5-apple-ios"); return true; 648b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 4: arch.SetTriple ("armv4-apple-ios"); return true; 649b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 5: arch.SetTriple ("arm-apple-ios"); return true; 650b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 6: arch.SetTriple ("thumbv7f-apple-ios"); return true; 651b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 7: arch.SetTriple ("thumbv7-apple-ios"); return true; 652b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 8: arch.SetTriple ("thumbv6-apple-ios"); return true; 653b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 9: arch.SetTriple ("thumbv5-apple-ios"); return true; 654b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 10: arch.SetTriple ("thumbv4t-apple-ios"); return true; 655b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 11: arch.SetTriple ("thumb-apple-ios"); return true; 656b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: break; 6579d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda } 6589d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda break; 6599d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 6609d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda case ArchSpec::eCore_arm_armv7k: 6619d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda switch (idx) 6629d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda { 663b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 0: arch.SetTriple ("armv7k-apple-ios"); return true; 664b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 1: arch.SetTriple ("armv7-apple-ios"); return true; 665b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 2: arch.SetTriple ("armv6-apple-ios"); return true; 666b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 3: arch.SetTriple ("armv5-apple-ios"); return true; 667b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 4: arch.SetTriple ("armv4-apple-ios"); return true; 668b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 5: arch.SetTriple ("arm-apple-ios"); return true; 669b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 6: arch.SetTriple ("thumbv7k-apple-ios"); return true; 670b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 7: arch.SetTriple ("thumbv7-apple-ios"); return true; 671b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 8: arch.SetTriple ("thumbv6-apple-ios"); return true; 672b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 9: arch.SetTriple ("thumbv5-apple-ios"); return true; 673b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 10: arch.SetTriple ("thumbv4t-apple-ios"); return true; 674b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 11: arch.SetTriple ("thumb-apple-ios"); return true; 675b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: break; 6769d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda } 6779d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda break; 6789d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 6799d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda case ArchSpec::eCore_arm_armv7s: 6809d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda switch (idx) 6819d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda { 682b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 0: arch.SetTriple ("armv7s-apple-ios"); return true; 683b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 1: arch.SetTriple ("armv7-apple-ios"); return true; 684b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 2: arch.SetTriple ("armv6-apple-ios"); return true; 685b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 3: arch.SetTriple ("armv5-apple-ios"); return true; 686b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 4: arch.SetTriple ("armv4-apple-ios"); return true; 687b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 5: arch.SetTriple ("arm-apple-ios"); return true; 688b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 6: arch.SetTriple ("thumbv7s-apple-ios"); return true; 689b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 7: arch.SetTriple ("thumbv7-apple-ios"); return true; 690b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 8: arch.SetTriple ("thumbv6-apple-ios"); return true; 691b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 9: arch.SetTriple ("thumbv5-apple-ios"); return true; 692b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 10: arch.SetTriple ("thumbv4t-apple-ios"); return true; 693b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 11: arch.SetTriple ("thumb-apple-ios"); return true; 694b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: break; 6959d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda } 6969d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda break; 6979d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 6989d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda case ArchSpec::eCore_arm_armv7: 6999d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda switch (idx) 7009d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda { 701b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 0: arch.SetTriple ("armv7-apple-ios"); return true; 702b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 1: arch.SetTriple ("armv6-apple-ios"); return true; 703b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 2: arch.SetTriple ("armv5-apple-ios"); return true; 704b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 3: arch.SetTriple ("armv4-apple-ios"); return true; 705b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 4: arch.SetTriple ("arm-apple-ios"); return true; 706b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 5: arch.SetTriple ("thumbv7-apple-ios"); return true; 707b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 6: arch.SetTriple ("thumbv6-apple-ios"); return true; 708b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 7: arch.SetTriple ("thumbv5-apple-ios"); return true; 709b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 8: arch.SetTriple ("thumbv4t-apple-ios"); return true; 710b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 9: arch.SetTriple ("thumb-apple-ios"); return true; 711b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: break; 7129d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda } 7139d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda break; 7149d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 7159d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda case ArchSpec::eCore_arm_armv6: 7169d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda switch (idx) 7179d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda { 718b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 0: arch.SetTriple ("armv6-apple-ios"); return true; 719b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 1: arch.SetTriple ("armv5-apple-ios"); return true; 720b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 2: arch.SetTriple ("armv4-apple-ios"); return true; 721b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 3: arch.SetTriple ("arm-apple-ios"); return true; 722b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 4: arch.SetTriple ("thumbv6-apple-ios"); return true; 723b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 5: arch.SetTriple ("thumbv5-apple-ios"); return true; 724b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 6: arch.SetTriple ("thumbv4t-apple-ios"); return true; 725b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 7: arch.SetTriple ("thumb-apple-ios"); return true; 726b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: break; 7279d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda } 7289d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda break; 7299d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 7309d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda case ArchSpec::eCore_arm_armv5: 7319d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda switch (idx) 7329d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda { 733b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 0: arch.SetTriple ("armv5-apple-ios"); return true; 734b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 1: arch.SetTriple ("armv4-apple-ios"); return true; 735b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 2: arch.SetTriple ("arm-apple-ios"); return true; 736b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 3: arch.SetTriple ("thumbv5-apple-ios"); return true; 737b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 4: arch.SetTriple ("thumbv4t-apple-ios"); return true; 738b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 5: arch.SetTriple ("thumb-apple-ios"); return true; 739b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: break; 7409d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda } 7419d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda break; 7429d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 7439d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda case ArchSpec::eCore_arm_armv4: 7449d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda switch (idx) 7459d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda { 746b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 0: arch.SetTriple ("armv4-apple-ios"); return true; 747b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 1: arch.SetTriple ("arm-apple-ios"); return true; 748b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 2: arch.SetTriple ("thumbv4t-apple-ios"); return true; 749b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 3: arch.SetTriple ("thumb-apple-ios"); return true; 750b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: break; 7519d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda } 7529d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda break; 7539d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda } 7549d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda arch.Clear(); 7559d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda return false; 7569d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda} 757f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton 758f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton 759f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Claytonconst char * 760f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg ClaytonPlatformDarwin::GetDeveloperDirectory() 761f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton{ 762f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (m_developer_directory.empty()) 763f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 764f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton bool developer_dir_path_valid = false; 765f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton char developer_dir_path[PATH_MAX]; 766f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton FileSpec temp_file_spec; 767f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (Host::GetLLDBPath (ePathTypeLLDBShlibDir, temp_file_spec)) 768f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 769f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (temp_file_spec.GetPath (developer_dir_path, sizeof(developer_dir_path))) 770f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 771f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton char *shared_frameworks = strstr (developer_dir_path, "/SharedFrameworks/LLDB.framework"); 772f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (shared_frameworks) 773f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 774f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton ::snprintf (shared_frameworks, 775f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton sizeof(developer_dir_path) - (shared_frameworks - developer_dir_path), 776f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton "/Developer"); 777f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton developer_dir_path_valid = true; 778f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 779f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton else 780f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 781f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton char *lib_priv_frameworks = strstr (developer_dir_path, "/Library/PrivateFrameworks/LLDB.framework"); 782f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (lib_priv_frameworks) 783f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 784f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton *lib_priv_frameworks = '\0'; 785f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton developer_dir_path_valid = true; 786f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 787f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 788f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 789f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 790f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton 791f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (!developer_dir_path_valid) 792f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 793f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton std::string xcode_dir_path; 794f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton const char *xcode_select_prefix_dir = getenv ("XCODE_SELECT_PREFIX_DIR"); 795f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (xcode_select_prefix_dir) 796f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton xcode_dir_path.append (xcode_select_prefix_dir); 797f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton xcode_dir_path.append ("/usr/share/xcode-select/xcode_dir_path"); 798f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton temp_file_spec.SetFile(xcode_dir_path.c_str(), false); 799f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton size_t bytes_read = temp_file_spec.ReadFileContents(0, developer_dir_path, sizeof(developer_dir_path), NULL); 800f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (bytes_read > 0) 801f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 802f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton developer_dir_path[bytes_read] = '\0'; 803f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton while (developer_dir_path[bytes_read-1] == '\r' || 804f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton developer_dir_path[bytes_read-1] == '\n') 805f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton developer_dir_path[--bytes_read] = '\0'; 806f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton developer_dir_path_valid = true; 807f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 808f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 809f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton 810f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (developer_dir_path_valid) 811f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 812f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton temp_file_spec.SetFile (developer_dir_path, false); 813f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (temp_file_spec.Exists()) 814f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 815f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton m_developer_directory.assign (developer_dir_path); 816f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton return m_developer_directory.c_str(); 817f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 818f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 819f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton // Assign a single NULL character so we know we tried to find the device 820f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton // support directory and we don't keep trying to find it over and over. 821f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton m_developer_directory.assign (1, '\0'); 822f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 823f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton 824f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton // We should have put a single NULL character into m_developer_directory 825f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton // or it should have a valid path if the code gets here 826f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton assert (m_developer_directory.empty() == false); 827f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (m_developer_directory[0]) 828f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton return m_developer_directory.c_str(); 829f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton return NULL; 830f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton} 831f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton 832bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 833bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg ClaytonBreakpointSP 834bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg ClaytonPlatformDarwin::SetThreadCreationBreakpoint (Target &target) 835bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton{ 836bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton BreakpointSP bp_sp; 837bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton static const char *g_bp_names[] = 838bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton { 839bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton "start_wqthread", 840bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton "_pthread_wqthread", 841bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton "_pthread_start", 842bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton }; 843bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 844bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton static const char *g_bp_modules[] = 845bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton { 846bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton "libsystem_c.dylib", 847bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton "libSystem.B.dylib" 848bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton }; 849bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 850bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton FileSpecList bp_modules; 851bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton for (int i = 0; i < sizeof(g_bp_modules)/sizeof(const char *); i++) 852bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton { 853bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton const char *bp_module = g_bp_modules[i]; 854bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton bp_modules.Append(FileSpec(bp_module, false)); 855bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton } 856bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 8572cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham bool internal = true; 8582cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham LazyBool skip_prologue = eLazyBoolNo; 859bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton bp_sp = target.CreateBreakpoint (&bp_modules, 860bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton NULL, 861bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton g_bp_names, 862bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton sizeof(g_bp_names)/sizeof(const char *), 863bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton eFunctionNameTypeFull, 8642cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham skip_prologue, 8652cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham internal); 866bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 867bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton return bp_sp; 868bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton} 869bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 87073844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonsize_t 87173844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonPlatformDarwin::GetEnvironment (StringList &env) 87273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 87373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (IsRemote()) 87473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 87573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (m_remote_platform_sp) 87673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return m_remote_platform_sp->GetEnvironment(env); 87773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return 0; 87873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 87973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return Host::GetEnvironment(env); 88073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 881