PlatformDarwin.cpp revision ed0a0fbd021e44727469d6fa20cc337c58bd04c3
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" 2295b765e8000b44644d021e95bc58eac95028573bGreg Clayton#include "lldb/Host/Symbols.h" 2349ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/ObjectFile.h" 2458e26e0935138225477fd61283215ceff2068899Greg Clayton#include "lldb/Target/Target.h" 2558e26e0935138225477fd61283215ceff2068899Greg Clayton 2658e26e0935138225477fd61283215ceff2068899Greg Claytonusing namespace lldb; 2758e26e0935138225477fd61283215ceff2068899Greg Claytonusing namespace lldb_private; 2858e26e0935138225477fd61283215ceff2068899Greg Clayton 2958e26e0935138225477fd61283215ceff2068899Greg Clayton 3058e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 3158e26e0935138225477fd61283215ceff2068899Greg Clayton/// Default Constructor 3258e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 3358e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::PlatformDarwin (bool is_host) : 3458e26e0935138225477fd61283215ceff2068899Greg Clayton Platform(is_host), // This is the local host platform 35f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton m_remote_platform_sp (), 36f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton m_developer_directory () 3758e26e0935138225477fd61283215ceff2068899Greg Clayton{ 3858e26e0935138225477fd61283215ceff2068899Greg Clayton} 3958e26e0935138225477fd61283215ceff2068899Greg Clayton 4058e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 4158e26e0935138225477fd61283215ceff2068899Greg Clayton/// Destructor. 4258e26e0935138225477fd61283215ceff2068899Greg Clayton/// 4358e26e0935138225477fd61283215ceff2068899Greg Clayton/// The destructor is virtual since this class is designed to be 4458e26e0935138225477fd61283215ceff2068899Greg Clayton/// inherited from by the plug-in instance. 4558e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 4658e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::~PlatformDarwin() 4758e26e0935138225477fd61283215ceff2068899Greg Clayton{ 4858e26e0935138225477fd61283215ceff2068899Greg Clayton} 4958e26e0935138225477fd61283215ceff2068899Greg Clayton 5058e26e0935138225477fd61283215ceff2068899Greg Clayton 5158e26e0935138225477fd61283215ceff2068899Greg ClaytonError 5258e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::ResolveExecutable (const FileSpec &exe_file, 5358e26e0935138225477fd61283215ceff2068899Greg Clayton const ArchSpec &exe_arch, 549ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton lldb::ModuleSP &exe_module_sp, 559ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton const FileSpecList *module_search_paths_ptr) 5658e26e0935138225477fd61283215ceff2068899Greg Clayton{ 5758e26e0935138225477fd61283215ceff2068899Greg Clayton Error error; 5858e26e0935138225477fd61283215ceff2068899Greg Clayton // Nothing special to do here, just use the actual file and architecture 5958e26e0935138225477fd61283215ceff2068899Greg Clayton 60b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton char exe_path[PATH_MAX]; 6158e26e0935138225477fd61283215ceff2068899Greg Clayton FileSpec resolved_exe_file (exe_file); 6258e26e0935138225477fd61283215ceff2068899Greg Clayton 63b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (IsHost()) 64b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 65b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // If we have "ls" as the exe_file, resolve the executable loation based on 66b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // the current path variables 67b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (!resolved_exe_file.Exists()) 68b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 69b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton exe_file.GetPath (exe_path, sizeof(exe_path)); 70b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton resolved_exe_file.SetFile(exe_path, true); 71b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 7258e26e0935138225477fd61283215ceff2068899Greg Clayton 73b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (!resolved_exe_file.Exists()) 74b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton resolved_exe_file.ResolveExecutableLocation (); 7558e26e0935138225477fd61283215ceff2068899Greg Clayton 76b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Resolve any executable within a bundle on MacOSX 77b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Host::ResolveExecutableInBundle (resolved_exe_file); 78b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 79b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (resolved_exe_file.Exists()) 80b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.Clear(); 81b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 82b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 83b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton exe_file.GetPath (exe_path, sizeof(exe_path)); 84d8ff83518468f3c81f9e5115d0dcd0b249413cf1Jim Ingham error.SetErrorStringWithFormat ("unable to find executable for '%s'", exe_path); 85b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 86b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 87b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 88b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 89b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_remote_platform_sp) 90b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 91b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error = m_remote_platform_sp->ResolveExecutable (exe_file, 92b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton exe_arch, 939ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton exe_module_sp, 949ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_search_paths_ptr); 95b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 96b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 97f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen { 98f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen // We may connect to a process and use the provided executable (Don't use local $PATH). 99f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen 100f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen // Resolve any executable within a bundle on MacOSX 101f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen Host::ResolveExecutableInBundle (resolved_exe_file); 102f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen 103f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen if (resolved_exe_file.Exists()) 104f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen error.Clear(); 105f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen else 10695b7b4362ca7135be088e4fbf04c2bd15767a104Jason Molenda error.SetErrorStringWithFormat("the platform is not currently connected, and '%s' doesn't exist in the system root.", resolved_exe_file.GetFilename().AsCString("")); 107f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen } 108b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 109b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 110b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 111b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (error.Success()) 11258e26e0935138225477fd61283215ceff2068899Greg Clayton { 113444fe998bf707bd076a70c3a779db8575533695eGreg Clayton ModuleSpec module_spec (resolved_exe_file, exe_arch); 114444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (module_spec.GetArchitecture().IsValid()) 11558e26e0935138225477fd61283215ceff2068899Greg Clayton { 116444fe998bf707bd076a70c3a779db8575533695eGreg Clayton error = ModuleList::GetSharedModule (module_spec, 11758e26e0935138225477fd61283215ceff2068899Greg Clayton exe_module_sp, 1189ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_search_paths_ptr, 11958e26e0935138225477fd61283215ceff2068899Greg Clayton NULL, 12058e26e0935138225477fd61283215ceff2068899Greg Clayton NULL); 12158e26e0935138225477fd61283215ceff2068899Greg Clayton 122b6883ec4fc673b57d845565d54cf34828911db40Greg Clayton if (error.Fail() || exe_module_sp.get() == NULL || exe_module_sp->GetObjectFile() == NULL) 12358e26e0935138225477fd61283215ceff2068899Greg Clayton { 12458e26e0935138225477fd61283215ceff2068899Greg Clayton exe_module_sp.reset(); 12558e26e0935138225477fd61283215ceff2068899Greg Clayton error.SetErrorStringWithFormat ("'%s%s%s' doesn't contain the architecture %s", 12658e26e0935138225477fd61283215ceff2068899Greg Clayton exe_file.GetDirectory().AsCString(""), 12758e26e0935138225477fd61283215ceff2068899Greg Clayton exe_file.GetDirectory() ? "/" : "", 12858e26e0935138225477fd61283215ceff2068899Greg Clayton exe_file.GetFilename().AsCString(""), 12958e26e0935138225477fd61283215ceff2068899Greg Clayton exe_arch.GetArchitectureName()); 13058e26e0935138225477fd61283215ceff2068899Greg Clayton } 13158e26e0935138225477fd61283215ceff2068899Greg Clayton } 13258e26e0935138225477fd61283215ceff2068899Greg Clayton else 13358e26e0935138225477fd61283215ceff2068899Greg Clayton { 13458e26e0935138225477fd61283215ceff2068899Greg Clayton // No valid architecture was specified, ask the platform for 13558e26e0935138225477fd61283215ceff2068899Greg Clayton // the architectures that we should be using (in the correct order) 13658e26e0935138225477fd61283215ceff2068899Greg Clayton // and see if we can find a match that way 13758e26e0935138225477fd61283215ceff2068899Greg Clayton StreamString arch_names; 138444fe998bf707bd076a70c3a779db8575533695eGreg Clayton for (uint32_t idx = 0; GetSupportedArchitectureAtIndex (idx, module_spec.GetArchitecture()); ++idx) 13958e26e0935138225477fd61283215ceff2068899Greg Clayton { 140444fe998bf707bd076a70c3a779db8575533695eGreg Clayton error = ModuleList::GetSharedModule (module_spec, 14158e26e0935138225477fd61283215ceff2068899Greg Clayton exe_module_sp, 1429ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_search_paths_ptr, 14358e26e0935138225477fd61283215ceff2068899Greg Clayton NULL, 14458e26e0935138225477fd61283215ceff2068899Greg Clayton NULL); 14558e26e0935138225477fd61283215ceff2068899Greg Clayton // Did we find an executable using one of the 14658e26e0935138225477fd61283215ceff2068899Greg Clayton if (error.Success()) 14758e26e0935138225477fd61283215ceff2068899Greg Clayton { 14858e26e0935138225477fd61283215ceff2068899Greg Clayton if (exe_module_sp && exe_module_sp->GetObjectFile()) 14958e26e0935138225477fd61283215ceff2068899Greg Clayton break; 15058e26e0935138225477fd61283215ceff2068899Greg Clayton else 15158e26e0935138225477fd61283215ceff2068899Greg Clayton error.SetErrorToGenericError(); 15258e26e0935138225477fd61283215ceff2068899Greg Clayton } 15358e26e0935138225477fd61283215ceff2068899Greg Clayton 15458e26e0935138225477fd61283215ceff2068899Greg Clayton if (idx > 0) 15558e26e0935138225477fd61283215ceff2068899Greg Clayton arch_names.PutCString (", "); 156444fe998bf707bd076a70c3a779db8575533695eGreg Clayton arch_names.PutCString (module_spec.GetArchitecture().GetArchitectureName()); 15758e26e0935138225477fd61283215ceff2068899Greg Clayton } 15858e26e0935138225477fd61283215ceff2068899Greg Clayton 15958e26e0935138225477fd61283215ceff2068899Greg Clayton if (error.Fail() || !exe_module_sp) 16058e26e0935138225477fd61283215ceff2068899Greg Clayton { 16158e26e0935138225477fd61283215ceff2068899Greg Clayton error.SetErrorStringWithFormat ("'%s%s%s' doesn't contain any '%s' platform architectures: %s", 16258e26e0935138225477fd61283215ceff2068899Greg Clayton exe_file.GetDirectory().AsCString(""), 16358e26e0935138225477fd61283215ceff2068899Greg Clayton exe_file.GetDirectory() ? "/" : "", 16458e26e0935138225477fd61283215ceff2068899Greg Clayton exe_file.GetFilename().AsCString(""), 16558e26e0935138225477fd61283215ceff2068899Greg Clayton GetShortPluginName(), 16658e26e0935138225477fd61283215ceff2068899Greg Clayton arch_names.GetString().c_str()); 16758e26e0935138225477fd61283215ceff2068899Greg Clayton } 16858e26e0935138225477fd61283215ceff2068899Greg Clayton } 16958e26e0935138225477fd61283215ceff2068899Greg Clayton } 17058e26e0935138225477fd61283215ceff2068899Greg Clayton 17158e26e0935138225477fd61283215ceff2068899Greg Clayton return error; 17258e26e0935138225477fd61283215ceff2068899Greg Clayton} 17358e26e0935138225477fd61283215ceff2068899Greg Clayton 17495b765e8000b44644d021e95bc58eac95028573bGreg ClaytonError 17595b765e8000b44644d021e95bc58eac95028573bGreg ClaytonPlatformDarwin::ResolveSymbolFile (Target &target, 17695b765e8000b44644d021e95bc58eac95028573bGreg Clayton const ModuleSpec &sym_spec, 17795b765e8000b44644d021e95bc58eac95028573bGreg Clayton FileSpec &sym_file) 17895b765e8000b44644d021e95bc58eac95028573bGreg Clayton{ 17995b765e8000b44644d021e95bc58eac95028573bGreg Clayton Error error; 18095b765e8000b44644d021e95bc58eac95028573bGreg Clayton sym_file = sym_spec.GetSymbolFileSpec(); 18195b765e8000b44644d021e95bc58eac95028573bGreg Clayton if (sym_file.Exists()) 18295b765e8000b44644d021e95bc58eac95028573bGreg Clayton { 18395b765e8000b44644d021e95bc58eac95028573bGreg Clayton if (sym_file.GetFileType() == FileSpec::eFileTypeDirectory) 18495b765e8000b44644d021e95bc58eac95028573bGreg Clayton { 18595b765e8000b44644d021e95bc58eac95028573bGreg Clayton sym_file = Symbols::FindSymbolFileInBundle (sym_file, 18695b765e8000b44644d021e95bc58eac95028573bGreg Clayton sym_spec.GetUUIDPtr(), 18795b765e8000b44644d021e95bc58eac95028573bGreg Clayton sym_spec.GetArchitecturePtr()); 18895b765e8000b44644d021e95bc58eac95028573bGreg Clayton } 18995b765e8000b44644d021e95bc58eac95028573bGreg Clayton } 19095b765e8000b44644d021e95bc58eac95028573bGreg Clayton else 19195b765e8000b44644d021e95bc58eac95028573bGreg Clayton { 19295b765e8000b44644d021e95bc58eac95028573bGreg Clayton if (sym_spec.GetUUID().IsValid()) 19395b765e8000b44644d021e95bc58eac95028573bGreg Clayton { 19495b765e8000b44644d021e95bc58eac95028573bGreg Clayton 19595b765e8000b44644d021e95bc58eac95028573bGreg Clayton } 19695b765e8000b44644d021e95bc58eac95028573bGreg Clayton } 19795b765e8000b44644d021e95bc58eac95028573bGreg Clayton return error; 19895b765e8000b44644d021e95bc58eac95028573bGreg Clayton 19995b765e8000b44644d021e95bc58eac95028573bGreg Clayton} 20095b765e8000b44644d021e95bc58eac95028573bGreg Clayton 20158e26e0935138225477fd61283215ceff2068899Greg Clayton 2029ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 2039ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonError 204444fe998bf707bd076a70c3a779db8575533695eGreg ClaytonPlatformDarwin::GetSharedModule (const ModuleSpec &module_spec, 2059ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton ModuleSP &module_sp, 2069ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton const FileSpecList *module_search_paths_ptr, 2079ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton ModuleSP *old_module_sp_ptr, 2089ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton bool *did_create_ptr) 2099ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton{ 2109ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton Error error; 2119ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_sp.reset(); 2129ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 2139ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (IsRemote()) 2149ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 2159ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // If we have a remote platform always, let it try and locate 2169ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // the shared module first. 2179ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (m_remote_platform_sp) 2189ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 219444fe998bf707bd076a70c3a779db8575533695eGreg Clayton error = m_remote_platform_sp->GetSharedModule (module_spec, 2209ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_sp, 2219ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_search_paths_ptr, 2229ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton old_module_sp_ptr, 2239ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton did_create_ptr); 2249ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 2259ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 2269ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 2279ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (!module_sp) 2289ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 2299ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // Fall back to the local platform and find the file locally 230444fe998bf707bd076a70c3a779db8575533695eGreg Clayton error = Platform::GetSharedModule (module_spec, 2319ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_sp, 2329ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_search_paths_ptr, 2339ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton old_module_sp_ptr, 2349ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton did_create_ptr); 2359ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 236444fe998bf707bd076a70c3a779db8575533695eGreg Clayton const FileSpec &platform_file = module_spec.GetFileSpec(); 2379ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (!module_sp && module_search_paths_ptr && platform_file) 2389ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 2399ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // We can try to pull off part of the file path up to the bundle 2409ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // directory level and try any module search paths... 2419ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton FileSpec bundle_directory; 2429ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (Host::GetBundleDirectory (platform_file, bundle_directory)) 2439ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 2449ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton char platform_path[PATH_MAX]; 2459ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton char bundle_dir[PATH_MAX]; 2469ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton platform_file.GetPath (platform_path, sizeof(platform_path)); 2479ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton const size_t bundle_directory_len = bundle_directory.GetPath (bundle_dir, sizeof(bundle_dir)); 2489ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton char new_path[PATH_MAX]; 2499ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton size_t num_module_search_paths = module_search_paths_ptr->GetSize(); 2509ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton for (size_t i=0; i<num_module_search_paths; ++i) 2519ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 2529ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton const size_t search_path_len = module_search_paths_ptr->GetFileSpecAtIndex(i).GetPath(new_path, sizeof(new_path)); 2539ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (search_path_len < sizeof(new_path)) 2549ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 2559ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton snprintf (new_path + search_path_len, sizeof(new_path) - search_path_len, "/%s", platform_path + bundle_directory_len); 2569ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton FileSpec new_file_spec (new_path, false); 2579ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (new_file_spec.Exists()) 2589ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 259444fe998bf707bd076a70c3a779db8575533695eGreg Clayton ModuleSpec new_module_spec (module_spec); 260444fe998bf707bd076a70c3a779db8575533695eGreg Clayton new_module_spec.GetFileSpec() = new_file_spec; 261444fe998bf707bd076a70c3a779db8575533695eGreg Clayton Error new_error (Platform::GetSharedModule (new_module_spec, 2629ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_sp, 2639ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton NULL, 2649ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton old_module_sp_ptr, 2659ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton did_create_ptr)); 2669ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 2679ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (module_sp) 2689ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 2699ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_sp->SetPlatformFileSpec(new_file_spec); 2709ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return new_error; 2719ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 2729ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 2739ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 2749ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 2759ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 2769ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 2779ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 2789ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (module_sp) 279444fe998bf707bd076a70c3a779db8575533695eGreg Clayton module_sp->SetPlatformFileSpec(module_spec.GetFileSpec()); 2809ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return error; 2819ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton} 2829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 28358e26e0935138225477fd61283215ceff2068899Greg Claytonsize_t 28458e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::GetSoftwareBreakpointTrapOpcode (Target &target, BreakpointSite *bp_site) 28558e26e0935138225477fd61283215ceff2068899Greg Clayton{ 28658e26e0935138225477fd61283215ceff2068899Greg Clayton const uint8_t *trap_opcode = NULL; 28758e26e0935138225477fd61283215ceff2068899Greg Clayton uint32_t trap_opcode_size = 0; 288f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton bool bp_is_thumb = false; 28958e26e0935138225477fd61283215ceff2068899Greg Clayton 29058e26e0935138225477fd61283215ceff2068899Greg Clayton llvm::Triple::ArchType machine = target.GetArchitecture().GetMachine(); 29158e26e0935138225477fd61283215ceff2068899Greg Clayton switch (machine) 29258e26e0935138225477fd61283215ceff2068899Greg Clayton { 29358e26e0935138225477fd61283215ceff2068899Greg Clayton case llvm::Triple::x86: 29458e26e0935138225477fd61283215ceff2068899Greg Clayton case llvm::Triple::x86_64: 29558e26e0935138225477fd61283215ceff2068899Greg Clayton { 29658e26e0935138225477fd61283215ceff2068899Greg Clayton static const uint8_t g_i386_breakpoint_opcode[] = { 0xCC }; 29758e26e0935138225477fd61283215ceff2068899Greg Clayton trap_opcode = g_i386_breakpoint_opcode; 29858e26e0935138225477fd61283215ceff2068899Greg Clayton trap_opcode_size = sizeof(g_i386_breakpoint_opcode); 29958e26e0935138225477fd61283215ceff2068899Greg Clayton } 30058e26e0935138225477fd61283215ceff2068899Greg Clayton break; 301f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton 302f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton case llvm::Triple::thumb: 303f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton bp_is_thumb = true; // Fall through... 30458e26e0935138225477fd61283215ceff2068899Greg Clayton case llvm::Triple::arm: 30558e26e0935138225477fd61283215ceff2068899Greg Clayton { 30658e26e0935138225477fd61283215ceff2068899Greg Clayton static const uint8_t g_arm_breakpoint_opcode[] = { 0xFE, 0xDE, 0xFF, 0xE7 }; 30758e26e0935138225477fd61283215ceff2068899Greg Clayton static const uint8_t g_thumb_breakpooint_opcode[] = { 0xFE, 0xDE }; 30858e26e0935138225477fd61283215ceff2068899Greg Clayton 309f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton // Auto detect arm/thumb if it wasn't explicitly specified 310f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton if (!bp_is_thumb) 31158e26e0935138225477fd61283215ceff2068899Greg Clayton { 312f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton lldb::BreakpointLocationSP bp_loc_sp (bp_site->GetOwnerAtIndex (0)); 313f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton if (bp_loc_sp) 314f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton bp_is_thumb = bp_loc_sp->GetAddress().GetAddressClass () == eAddressClassCodeAlternateISA; 315f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton } 316f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton if (bp_is_thumb) 317f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton { 318f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton trap_opcode = g_thumb_breakpooint_opcode; 319f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton trap_opcode_size = sizeof(g_thumb_breakpooint_opcode); 320f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton break; 32158e26e0935138225477fd61283215ceff2068899Greg Clayton } 32258e26e0935138225477fd61283215ceff2068899Greg Clayton trap_opcode = g_arm_breakpoint_opcode; 32358e26e0935138225477fd61283215ceff2068899Greg Clayton trap_opcode_size = sizeof(g_arm_breakpoint_opcode); 32458e26e0935138225477fd61283215ceff2068899Greg Clayton } 32558e26e0935138225477fd61283215ceff2068899Greg Clayton break; 32658e26e0935138225477fd61283215ceff2068899Greg Clayton 32758e26e0935138225477fd61283215ceff2068899Greg Clayton case llvm::Triple::ppc: 32858e26e0935138225477fd61283215ceff2068899Greg Clayton case llvm::Triple::ppc64: 32958e26e0935138225477fd61283215ceff2068899Greg Clayton { 33058e26e0935138225477fd61283215ceff2068899Greg Clayton static const uint8_t g_ppc_breakpoint_opcode[] = { 0x7F, 0xC0, 0x00, 0x08 }; 33158e26e0935138225477fd61283215ceff2068899Greg Clayton trap_opcode = g_ppc_breakpoint_opcode; 33258e26e0935138225477fd61283215ceff2068899Greg Clayton trap_opcode_size = sizeof(g_ppc_breakpoint_opcode); 33358e26e0935138225477fd61283215ceff2068899Greg Clayton } 33458e26e0935138225477fd61283215ceff2068899Greg Clayton break; 33558e26e0935138225477fd61283215ceff2068899Greg Clayton 33658e26e0935138225477fd61283215ceff2068899Greg Clayton default: 337f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton assert(!"Unhandled architecture in PlatformDarwin::GetSoftwareBreakpointTrapOpcode()"); 33858e26e0935138225477fd61283215ceff2068899Greg Clayton break; 33958e26e0935138225477fd61283215ceff2068899Greg Clayton } 34058e26e0935138225477fd61283215ceff2068899Greg Clayton 34158e26e0935138225477fd61283215ceff2068899Greg Clayton if (trap_opcode && trap_opcode_size) 34258e26e0935138225477fd61283215ceff2068899Greg Clayton { 34358e26e0935138225477fd61283215ceff2068899Greg Clayton if (bp_site->SetTrapOpcode(trap_opcode, trap_opcode_size)) 34458e26e0935138225477fd61283215ceff2068899Greg Clayton return trap_opcode_size; 34558e26e0935138225477fd61283215ceff2068899Greg Clayton } 34658e26e0935138225477fd61283215ceff2068899Greg Clayton return 0; 34758e26e0935138225477fd61283215ceff2068899Greg Clayton 34858e26e0935138225477fd61283215ceff2068899Greg Clayton} 34958e26e0935138225477fd61283215ceff2068899Greg Clayton 35058e26e0935138225477fd61283215ceff2068899Greg Claytonbool 35158e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::GetRemoteOSVersion () 35258e26e0935138225477fd61283215ceff2068899Greg Clayton{ 35358e26e0935138225477fd61283215ceff2068899Greg Clayton if (m_remote_platform_sp) 35458e26e0935138225477fd61283215ceff2068899Greg Clayton return m_remote_platform_sp->GetOSVersion (m_major_os_version, 35558e26e0935138225477fd61283215ceff2068899Greg Clayton m_minor_os_version, 35658e26e0935138225477fd61283215ceff2068899Greg Clayton m_update_os_version); 35758e26e0935138225477fd61283215ceff2068899Greg Clayton return false; 35858e26e0935138225477fd61283215ceff2068899Greg Clayton} 35958e26e0935138225477fd61283215ceff2068899Greg Clayton 36058e26e0935138225477fd61283215ceff2068899Greg Claytonbool 36158e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::GetRemoteOSBuildString (std::string &s) 36258e26e0935138225477fd61283215ceff2068899Greg Clayton{ 36358e26e0935138225477fd61283215ceff2068899Greg Clayton if (m_remote_platform_sp) 36458e26e0935138225477fd61283215ceff2068899Greg Clayton return m_remote_platform_sp->GetRemoteOSBuildString (s); 36558e26e0935138225477fd61283215ceff2068899Greg Clayton s.clear(); 36658e26e0935138225477fd61283215ceff2068899Greg Clayton return false; 36758e26e0935138225477fd61283215ceff2068899Greg Clayton} 36858e26e0935138225477fd61283215ceff2068899Greg Clayton 36958e26e0935138225477fd61283215ceff2068899Greg Claytonbool 37058e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::GetRemoteOSKernelDescription (std::string &s) 37158e26e0935138225477fd61283215ceff2068899Greg Clayton{ 37258e26e0935138225477fd61283215ceff2068899Greg Clayton if (m_remote_platform_sp) 37358e26e0935138225477fd61283215ceff2068899Greg Clayton return m_remote_platform_sp->GetRemoteOSKernelDescription (s); 37458e26e0935138225477fd61283215ceff2068899Greg Clayton s.clear(); 37558e26e0935138225477fd61283215ceff2068899Greg Clayton return false; 37658e26e0935138225477fd61283215ceff2068899Greg Clayton} 37758e26e0935138225477fd61283215ceff2068899Greg Clayton 37858e26e0935138225477fd61283215ceff2068899Greg Clayton// Remote Platform subclasses need to override this function 37958e26e0935138225477fd61283215ceff2068899Greg ClaytonArchSpec 38058e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::GetRemoteSystemArchitecture () 38158e26e0935138225477fd61283215ceff2068899Greg Clayton{ 38258e26e0935138225477fd61283215ceff2068899Greg Clayton if (m_remote_platform_sp) 38358e26e0935138225477fd61283215ceff2068899Greg Clayton return m_remote_platform_sp->GetRemoteSystemArchitecture (); 38458e26e0935138225477fd61283215ceff2068899Greg Clayton return ArchSpec(); 38558e26e0935138225477fd61283215ceff2068899Greg Clayton} 38658e26e0935138225477fd61283215ceff2068899Greg Clayton 38758e26e0935138225477fd61283215ceff2068899Greg Clayton 38858e26e0935138225477fd61283215ceff2068899Greg Claytonconst char * 38924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonPlatformDarwin::GetHostname () 39058e26e0935138225477fd61283215ceff2068899Greg Clayton{ 39124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsHost()) 39224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return Platform::GetHostname(); 39324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 39458e26e0935138225477fd61283215ceff2068899Greg Clayton if (m_remote_platform_sp) 39558e26e0935138225477fd61283215ceff2068899Greg Clayton return m_remote_platform_sp->GetHostname (); 39658e26e0935138225477fd61283215ceff2068899Greg Clayton return NULL; 39758e26e0935138225477fd61283215ceff2068899Greg Clayton} 39858e26e0935138225477fd61283215ceff2068899Greg Clayton 39958e26e0935138225477fd61283215ceff2068899Greg Claytonbool 40058e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::IsConnected () const 40158e26e0935138225477fd61283215ceff2068899Greg Clayton{ 40258e26e0935138225477fd61283215ceff2068899Greg Clayton if (IsHost()) 40358e26e0935138225477fd61283215ceff2068899Greg Clayton return true; 40458e26e0935138225477fd61283215ceff2068899Greg Clayton else if (m_remote_platform_sp) 40558e26e0935138225477fd61283215ceff2068899Greg Clayton return m_remote_platform_sp->IsConnected(); 40658e26e0935138225477fd61283215ceff2068899Greg Clayton return false; 40758e26e0935138225477fd61283215ceff2068899Greg Clayton} 40858e26e0935138225477fd61283215ceff2068899Greg Clayton 40958e26e0935138225477fd61283215ceff2068899Greg ClaytonError 41058e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::ConnectRemote (Args& args) 41158e26e0935138225477fd61283215ceff2068899Greg Clayton{ 41258e26e0935138225477fd61283215ceff2068899Greg Clayton Error error; 41358e26e0935138225477fd61283215ceff2068899Greg Clayton if (IsHost()) 41458e26e0935138225477fd61283215ceff2068899Greg Clayton { 41558e26e0935138225477fd61283215ceff2068899Greg Clayton error.SetErrorStringWithFormat ("can't connect to the host platform '%s', always connected", GetShortPluginName()); 41658e26e0935138225477fd61283215ceff2068899Greg Clayton } 41758e26e0935138225477fd61283215ceff2068899Greg Clayton else 41858e26e0935138225477fd61283215ceff2068899Greg Clayton { 41958e26e0935138225477fd61283215ceff2068899Greg Clayton if (!m_remote_platform_sp) 42058e26e0935138225477fd61283215ceff2068899Greg Clayton m_remote_platform_sp = Platform::Create ("remote-gdb-server", error); 42158e26e0935138225477fd61283215ceff2068899Greg Clayton 42258e26e0935138225477fd61283215ceff2068899Greg Clayton if (m_remote_platform_sp) 42358e26e0935138225477fd61283215ceff2068899Greg Clayton { 42458e26e0935138225477fd61283215ceff2068899Greg Clayton if (error.Success()) 42558e26e0935138225477fd61283215ceff2068899Greg Clayton { 42658e26e0935138225477fd61283215ceff2068899Greg Clayton if (m_remote_platform_sp) 42758e26e0935138225477fd61283215ceff2068899Greg Clayton { 42858e26e0935138225477fd61283215ceff2068899Greg Clayton error = m_remote_platform_sp->ConnectRemote (args); 42958e26e0935138225477fd61283215ceff2068899Greg Clayton } 43058e26e0935138225477fd61283215ceff2068899Greg Clayton else 43158e26e0935138225477fd61283215ceff2068899Greg Clayton { 43258e26e0935138225477fd61283215ceff2068899Greg Clayton error.SetErrorString ("\"platform connect\" takes a single argument: <connect-url>"); 43358e26e0935138225477fd61283215ceff2068899Greg Clayton } 43458e26e0935138225477fd61283215ceff2068899Greg Clayton } 43558e26e0935138225477fd61283215ceff2068899Greg Clayton } 43658e26e0935138225477fd61283215ceff2068899Greg Clayton else 43758e26e0935138225477fd61283215ceff2068899Greg Clayton error.SetErrorString ("failed to create a 'remote-gdb-server' platform"); 43858e26e0935138225477fd61283215ceff2068899Greg Clayton 43958e26e0935138225477fd61283215ceff2068899Greg Clayton if (error.Fail()) 44058e26e0935138225477fd61283215ceff2068899Greg Clayton m_remote_platform_sp.reset(); 44158e26e0935138225477fd61283215ceff2068899Greg Clayton } 44258e26e0935138225477fd61283215ceff2068899Greg Clayton 44358e26e0935138225477fd61283215ceff2068899Greg Clayton return error; 44458e26e0935138225477fd61283215ceff2068899Greg Clayton} 44558e26e0935138225477fd61283215ceff2068899Greg Clayton 44658e26e0935138225477fd61283215ceff2068899Greg ClaytonError 44758e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::DisconnectRemote () 44858e26e0935138225477fd61283215ceff2068899Greg Clayton{ 44958e26e0935138225477fd61283215ceff2068899Greg Clayton Error error; 45058e26e0935138225477fd61283215ceff2068899Greg Clayton 45158e26e0935138225477fd61283215ceff2068899Greg Clayton if (IsHost()) 45258e26e0935138225477fd61283215ceff2068899Greg Clayton { 45358e26e0935138225477fd61283215ceff2068899Greg Clayton error.SetErrorStringWithFormat ("can't disconnect from the host platform '%s', always connected", GetShortPluginName()); 45458e26e0935138225477fd61283215ceff2068899Greg Clayton } 45558e26e0935138225477fd61283215ceff2068899Greg Clayton else 45658e26e0935138225477fd61283215ceff2068899Greg Clayton { 45758e26e0935138225477fd61283215ceff2068899Greg Clayton if (m_remote_platform_sp) 45858e26e0935138225477fd61283215ceff2068899Greg Clayton error = m_remote_platform_sp->DisconnectRemote (); 45958e26e0935138225477fd61283215ceff2068899Greg Clayton else 46058e26e0935138225477fd61283215ceff2068899Greg Clayton error.SetErrorString ("the platform is not currently connected"); 46158e26e0935138225477fd61283215ceff2068899Greg Clayton } 46258e26e0935138225477fd61283215ceff2068899Greg Clayton return error; 46358e26e0935138225477fd61283215ceff2068899Greg Clayton} 46458e26e0935138225477fd61283215ceff2068899Greg Clayton 46524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 46624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonbool 467b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatformDarwin::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info) 46824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 46924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton bool sucess = false; 47024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsHost()) 47124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 47224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton sucess = Platform::GetProcessInfo (pid, process_info); 47324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 47424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton else 47524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 47624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_remote_platform_sp) 47724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton sucess = m_remote_platform_sp->GetProcessInfo (pid, process_info); 47824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 47924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return sucess; 48024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 48124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 48224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 48324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 48424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonuint32_t 485b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatformDarwin::FindProcesses (const ProcessInstanceInfoMatch &match_info, 486b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessInstanceInfoList &process_infos) 48724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 48824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton uint32_t match_count = 0; 48924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsHost()) 49024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 49124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // Let the base class figure out the host details 49224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton match_count = Platform::FindProcesses (match_info, process_infos); 49324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 49424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton else 49524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 49624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // If we are remote, we can only return results if we are connected 49724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_remote_platform_sp) 49824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton match_count = m_remote_platform_sp->FindProcesses (match_info, process_infos); 49924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 50024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return match_count; 50124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 50224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 503b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonError 504b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatformDarwin::LaunchProcess (ProcessLaunchInfo &launch_info) 505b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 506b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error error; 507527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 508b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (IsHost()) 509b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 510b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error = Platform::LaunchProcess (launch_info); 511b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 512b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 513b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 514b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_remote_platform_sp) 515b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error = m_remote_platform_sp->LaunchProcess (launch_info); 516b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 517b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("the platform is not currently connected"); 518b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 519b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return error; 520b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 521b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 522b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonlldb::ProcessSP 523527154d8e532f27f25af226c9e1dac607c48b5d1Greg ClaytonPlatformDarwin::Attach (ProcessAttachInfo &attach_info, 524b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Debugger &debugger, 525b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Target *target, 526b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Listener &listener, 527b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error &error) 528b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 529b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton lldb::ProcessSP process_sp; 530527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 531b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (IsHost()) 532b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 533b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (target == NULL) 534b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 535b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton TargetSP new_target_sp; 536b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 537b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error = debugger.GetTargetList().CreateTarget (debugger, 538ed0a0fbd021e44727469d6fa20cc337c58bd04c3Greg Clayton NULL, 5393e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton NULL, 540b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton false, 5413e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton NULL, 542b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton new_target_sp); 543b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton target = new_target_sp.get(); 544b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 545b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 546b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.Clear(); 547b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 548b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (target && error.Success()) 549b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 550b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton debugger.GetTargetList().SetSelectedTarget(target); 551527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 55246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton process_sp = target->CreateProcess (listener, attach_info.GetProcessPluginName(), NULL); 553b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 554b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (process_sp) 555527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error = process_sp->Attach (attach_info); 556b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 557b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 558b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 559b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 560b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_remote_platform_sp) 561527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton process_sp = m_remote_platform_sp->Attach (attach_info, debugger, target, listener, error); 562b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 563b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("the platform is not currently connected"); 564b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 565b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return process_sp; 566b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 567b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 56824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonconst char * 56924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonPlatformDarwin::GetUserName (uint32_t uid) 57024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 57124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // Check the cache in Platform in case we have already looked this uid up 57224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *user_name = Platform::GetUserName(uid); 57324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (user_name) 57424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return user_name; 57524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 57624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsRemote() && m_remote_platform_sp) 57724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return m_remote_platform_sp->GetUserName(uid); 57824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return NULL; 57924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 58024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 58124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonconst char * 58224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonPlatformDarwin::GetGroupName (uint32_t gid) 58324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 58424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *group_name = Platform::GetGroupName(gid); 58524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (group_name) 58624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return group_name; 58724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 58824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsRemote() && m_remote_platform_sp) 58924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return m_remote_platform_sp->GetGroupName(gid); 59024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return NULL; 59124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 59224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 5937089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Inghambool 5947089d8a3ef19ea251210b3e9bf198da8fb55f279Jim InghamPlatformDarwin::ModuleIsExcludedForNonModuleSpecificSearches (lldb_private::Target &target, const lldb::ModuleSP &module_sp) 5957089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham{ 59649170d451ca06cccd67b486646b5345f85e69417Jim Ingham if (!module_sp) 59749170d451ca06cccd67b486646b5345f85e69417Jim Ingham return false; 59849170d451ca06cccd67b486646b5345f85e69417Jim Ingham 5997089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham ObjectFile *obj_file = module_sp->GetObjectFile(); 6007089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham if (!obj_file) 6017089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham return false; 6027089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham 6037089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham ObjectFile::Type obj_type = obj_file->GetType(); 6047089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham if (obj_type == ObjectFile::eTypeDynamicLinker) 6057089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham return true; 6067089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham else 6077089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham return false; 6087089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham} 6099d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 6109d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 611f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Claytonbool 612f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg ClaytonPlatformDarwin::x86GetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch) 613f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton{ 614f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (idx == 0) 615f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 616f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton arch = Host::GetArchitecture (Host::eSystemDefaultArchitecture); 617f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton return arch.IsValid(); 618f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 619f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton else if (idx == 1) 620f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 621f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton ArchSpec platform_arch (Host::GetArchitecture (Host::eSystemDefaultArchitecture)); 622f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton ArchSpec platform_arch64 (Host::GetArchitecture (Host::eSystemDefaultArchitecture64)); 623f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (platform_arch == platform_arch64) 624f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 625f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton // This macosx platform supports both 32 and 64 bit. Since we already 626f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton // returned the 64 bit arch for idx == 0, return the 32 bit arch 627f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton // for idx == 1 628f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton arch = Host::GetArchitecture (Host::eSystemDefaultArchitecture32); 629f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton return arch.IsValid(); 630f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 631f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 632f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton return false; 633f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton} 634f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton 6359d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda// The architecture selection rules for arm processors 6369d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda// These cpu subtypes have distinct names (e.g. armv7f) but armv7 binaries run fine on an armv7f processor. 6379d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 6389d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molendabool 6399d3c618680dd8bc8f250d700aac7f78eecbbf69bJason MolendaPlatformDarwin::ARMGetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch) 6409d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda{ 6419d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda ArchSpec system_arch (GetSystemArchitecture()); 6429d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda const ArchSpec::Core system_core = system_arch.GetCore(); 6439d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda switch (system_core) 6449d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda { 6459d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda default: 6469d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda switch (idx) 6479d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda { 648b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 0: arch.SetTriple ("armv7-apple-ios"); return true; 649b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 1: arch.SetTriple ("armv7f-apple-ios"); return true; 650b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 2: arch.SetTriple ("armv7k-apple-ios"); return true; 651b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 3: arch.SetTriple ("armv7s-apple-ios"); return true; 652b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 4: arch.SetTriple ("armv6-apple-ios"); return true; 653b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 5: arch.SetTriple ("armv5-apple-ios"); return true; 654b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 6: arch.SetTriple ("armv4-apple-ios"); return true; 655b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 7: arch.SetTriple ("arm-apple-ios"); return true; 656b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 8: arch.SetTriple ("thumbv7-apple-ios"); return true; 657b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 9: arch.SetTriple ("thumbv7f-apple-ios"); return true; 658b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 10: arch.SetTriple ("thumbv7k-apple-ios"); return true; 659b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 11: arch.SetTriple ("thumbv7s-apple-ios"); return true; 660b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 12: arch.SetTriple ("thumbv6-apple-ios"); return true; 661b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 13: arch.SetTriple ("thumbv5-apple-ios"); return true; 662b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 14: arch.SetTriple ("thumbv4t-apple-ios"); return true; 663b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 15: arch.SetTriple ("thumb-apple-ios"); return true; 6649d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda default: break; 6659d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda } 6669d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda break; 6679d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 6689d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda case ArchSpec::eCore_arm_armv7f: 6699d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda switch (idx) 6709d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda { 671b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 0: arch.SetTriple ("armv7f-apple-ios"); return true; 672b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 1: arch.SetTriple ("armv7-apple-ios"); return true; 673b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 2: arch.SetTriple ("armv6-apple-ios"); return true; 674b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 3: arch.SetTriple ("armv5-apple-ios"); return true; 675b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 4: arch.SetTriple ("armv4-apple-ios"); return true; 676b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 5: arch.SetTriple ("arm-apple-ios"); return true; 677b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 6: arch.SetTriple ("thumbv7f-apple-ios"); return true; 678b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 7: arch.SetTriple ("thumbv7-apple-ios"); return true; 679b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 8: arch.SetTriple ("thumbv6-apple-ios"); return true; 680b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 9: arch.SetTriple ("thumbv5-apple-ios"); return true; 681b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 10: arch.SetTriple ("thumbv4t-apple-ios"); return true; 682b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 11: arch.SetTriple ("thumb-apple-ios"); return true; 683b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: break; 6849d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda } 6859d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda break; 6869d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 6879d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda case ArchSpec::eCore_arm_armv7k: 6889d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda switch (idx) 6899d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda { 690b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 0: arch.SetTriple ("armv7k-apple-ios"); return true; 691b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 1: arch.SetTriple ("armv7-apple-ios"); return true; 692b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 2: arch.SetTriple ("armv6-apple-ios"); return true; 693b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 3: arch.SetTriple ("armv5-apple-ios"); return true; 694b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 4: arch.SetTriple ("armv4-apple-ios"); return true; 695b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 5: arch.SetTriple ("arm-apple-ios"); return true; 696b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 6: arch.SetTriple ("thumbv7k-apple-ios"); return true; 697b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 7: arch.SetTriple ("thumbv7-apple-ios"); return true; 698b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 8: arch.SetTriple ("thumbv6-apple-ios"); return true; 699b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 9: arch.SetTriple ("thumbv5-apple-ios"); return true; 700b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 10: arch.SetTriple ("thumbv4t-apple-ios"); return true; 701b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 11: arch.SetTriple ("thumb-apple-ios"); return true; 702b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: break; 7039d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda } 7049d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda break; 7059d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 7069d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda case ArchSpec::eCore_arm_armv7s: 7079d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda switch (idx) 7089d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda { 709b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 0: arch.SetTriple ("armv7s-apple-ios"); return true; 710b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 1: arch.SetTriple ("armv7-apple-ios"); return true; 711b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 2: arch.SetTriple ("armv6-apple-ios"); return true; 712b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 3: arch.SetTriple ("armv5-apple-ios"); return true; 713b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 4: arch.SetTriple ("armv4-apple-ios"); return true; 714b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 5: arch.SetTriple ("arm-apple-ios"); return true; 715b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 6: arch.SetTriple ("thumbv7s-apple-ios"); return true; 716b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 7: arch.SetTriple ("thumbv7-apple-ios"); return true; 717b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 8: arch.SetTriple ("thumbv6-apple-ios"); return true; 718b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 9: arch.SetTriple ("thumbv5-apple-ios"); return true; 719b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 10: arch.SetTriple ("thumbv4t-apple-ios"); return true; 720b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 11: arch.SetTriple ("thumb-apple-ios"); return true; 721b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: break; 7229d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda } 7239d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda break; 7249d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 7259d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda case ArchSpec::eCore_arm_armv7: 7269d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda switch (idx) 7279d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda { 728b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 0: arch.SetTriple ("armv7-apple-ios"); return true; 729b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 1: arch.SetTriple ("armv6-apple-ios"); return true; 730b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 2: arch.SetTriple ("armv5-apple-ios"); return true; 731b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 3: arch.SetTriple ("armv4-apple-ios"); return true; 732b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 4: arch.SetTriple ("arm-apple-ios"); return true; 733b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 5: arch.SetTriple ("thumbv7-apple-ios"); return true; 734b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 6: arch.SetTriple ("thumbv6-apple-ios"); return true; 735b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 7: arch.SetTriple ("thumbv5-apple-ios"); return true; 736b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 8: arch.SetTriple ("thumbv4t-apple-ios"); return true; 737b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 9: arch.SetTriple ("thumb-apple-ios"); return true; 738b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: break; 7399d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda } 7409d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda break; 7419d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 7429d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda case ArchSpec::eCore_arm_armv6: 7439d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda switch (idx) 7449d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda { 745b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 0: arch.SetTriple ("armv6-apple-ios"); return true; 746b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 1: arch.SetTriple ("armv5-apple-ios"); return true; 747b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 2: arch.SetTriple ("armv4-apple-ios"); return true; 748b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 3: arch.SetTriple ("arm-apple-ios"); return true; 749b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 4: arch.SetTriple ("thumbv6-apple-ios"); return true; 750b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 5: arch.SetTriple ("thumbv5-apple-ios"); return true; 751b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 6: arch.SetTriple ("thumbv4t-apple-ios"); return true; 752b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 7: arch.SetTriple ("thumb-apple-ios"); return true; 753b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: break; 7549d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda } 7559d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda break; 7569d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 7579d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda case ArchSpec::eCore_arm_armv5: 7589d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda switch (idx) 7599d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda { 760b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 0: arch.SetTriple ("armv5-apple-ios"); return true; 761b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 1: arch.SetTriple ("armv4-apple-ios"); return true; 762b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 2: arch.SetTriple ("arm-apple-ios"); return true; 763b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 3: arch.SetTriple ("thumbv5-apple-ios"); return true; 764b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 4: arch.SetTriple ("thumbv4t-apple-ios"); return true; 765b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 5: arch.SetTriple ("thumb-apple-ios"); return true; 766b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: break; 7679d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda } 7689d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda break; 7699d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 7709d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda case ArchSpec::eCore_arm_armv4: 7719d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda switch (idx) 7729d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda { 773b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 0: arch.SetTriple ("armv4-apple-ios"); return true; 774b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 1: arch.SetTriple ("arm-apple-ios"); return true; 775b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 2: arch.SetTriple ("thumbv4t-apple-ios"); return true; 776b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 3: arch.SetTriple ("thumb-apple-ios"); return true; 777b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: break; 7789d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda } 7799d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda break; 7809d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda } 7819d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda arch.Clear(); 7829d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda return false; 7839d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda} 784f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton 785f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton 786f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Claytonconst char * 787f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg ClaytonPlatformDarwin::GetDeveloperDirectory() 788f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton{ 789f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (m_developer_directory.empty()) 790f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 791f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton bool developer_dir_path_valid = false; 792f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton char developer_dir_path[PATH_MAX]; 793f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton FileSpec temp_file_spec; 794f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (Host::GetLLDBPath (ePathTypeLLDBShlibDir, temp_file_spec)) 795f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 796f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (temp_file_spec.GetPath (developer_dir_path, sizeof(developer_dir_path))) 797f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 798f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton char *shared_frameworks = strstr (developer_dir_path, "/SharedFrameworks/LLDB.framework"); 799f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (shared_frameworks) 800f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 801f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton ::snprintf (shared_frameworks, 802f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton sizeof(developer_dir_path) - (shared_frameworks - developer_dir_path), 803f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton "/Developer"); 804f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton developer_dir_path_valid = true; 805f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 806f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton else 807f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 808f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton char *lib_priv_frameworks = strstr (developer_dir_path, "/Library/PrivateFrameworks/LLDB.framework"); 809f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (lib_priv_frameworks) 810f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 811f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton *lib_priv_frameworks = '\0'; 812f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton developer_dir_path_valid = true; 813f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 814f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 815f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 816f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 817f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton 818f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (!developer_dir_path_valid) 819f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 820f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton std::string xcode_dir_path; 821f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton const char *xcode_select_prefix_dir = getenv ("XCODE_SELECT_PREFIX_DIR"); 822f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (xcode_select_prefix_dir) 823f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton xcode_dir_path.append (xcode_select_prefix_dir); 824f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton xcode_dir_path.append ("/usr/share/xcode-select/xcode_dir_path"); 825f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton temp_file_spec.SetFile(xcode_dir_path.c_str(), false); 826f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton size_t bytes_read = temp_file_spec.ReadFileContents(0, developer_dir_path, sizeof(developer_dir_path), NULL); 827f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (bytes_read > 0) 828f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 829f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton developer_dir_path[bytes_read] = '\0'; 830f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton while (developer_dir_path[bytes_read-1] == '\r' || 831f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton developer_dir_path[bytes_read-1] == '\n') 832f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton developer_dir_path[--bytes_read] = '\0'; 833f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton developer_dir_path_valid = true; 834f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 835f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 836f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton 837f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (developer_dir_path_valid) 838f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 839f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton temp_file_spec.SetFile (developer_dir_path, false); 840f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (temp_file_spec.Exists()) 841f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 842f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton m_developer_directory.assign (developer_dir_path); 843f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton return m_developer_directory.c_str(); 844f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 845f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 846f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton // Assign a single NULL character so we know we tried to find the device 847f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton // support directory and we don't keep trying to find it over and over. 848f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton m_developer_directory.assign (1, '\0'); 849f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 850f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton 851f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton // We should have put a single NULL character into m_developer_directory 852f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton // or it should have a valid path if the code gets here 853f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton assert (m_developer_directory.empty() == false); 854f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (m_developer_directory[0]) 855f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton return m_developer_directory.c_str(); 856f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton return NULL; 857f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton} 858f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton 859bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 860bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg ClaytonBreakpointSP 861bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg ClaytonPlatformDarwin::SetThreadCreationBreakpoint (Target &target) 862bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton{ 863bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton BreakpointSP bp_sp; 864bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton static const char *g_bp_names[] = 865bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton { 866bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton "start_wqthread", 867bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton "_pthread_wqthread", 868bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton "_pthread_start", 869bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton }; 870bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 871bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton static const char *g_bp_modules[] = 872bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton { 873bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton "libsystem_c.dylib", 874bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton "libSystem.B.dylib" 875bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton }; 876bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 877bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton FileSpecList bp_modules; 878bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton for (int i = 0; i < sizeof(g_bp_modules)/sizeof(const char *); i++) 879bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton { 880bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton const char *bp_module = g_bp_modules[i]; 881bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton bp_modules.Append(FileSpec(bp_module, false)); 882bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton } 883bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 8842cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham bool internal = true; 8852cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham LazyBool skip_prologue = eLazyBoolNo; 886bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton bp_sp = target.CreateBreakpoint (&bp_modules, 887bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton NULL, 888bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton g_bp_names, 889bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton sizeof(g_bp_names)/sizeof(const char *), 890bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton eFunctionNameTypeFull, 8912cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham skip_prologue, 8922cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham internal); 893bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 894bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton return bp_sp; 895bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton} 896bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 89773844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonsize_t 89873844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonPlatformDarwin::GetEnvironment (StringList &env) 89973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 90073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (IsRemote()) 90173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 90273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (m_remote_platform_sp) 90373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return m_remote_platform_sp->GetEnvironment(env); 90473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return 0; 90573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 90673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return Host::GetEnvironment(env); 90773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 908