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 10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h" 11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea 1258e26e0935138225477fd61283215ceff2068899Greg Clayton#include "PlatformDarwin.h" 1358e26e0935138225477fd61283215ceff2068899Greg Clayton 1458e26e0935138225477fd61283215ceff2068899Greg Clayton// C Includes 1558e26e0935138225477fd61283215ceff2068899Greg Clayton// C++ Includes 1658e26e0935138225477fd61283215ceff2068899Greg Clayton// Other libraries and framework includes 1758e26e0935138225477fd61283215ceff2068899Greg Clayton// Project includes 1858e26e0935138225477fd61283215ceff2068899Greg Clayton#include "lldb/Breakpoint/BreakpointLocation.h" 19b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton#include "lldb/Core/Debugger.h" 2058e26e0935138225477fd61283215ceff2068899Greg Clayton#include "lldb/Core/Error.h" 2149ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Module.h" 2249ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/ModuleSpec.h" 23146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata#include "lldb/Core/Timer.h" 2458e26e0935138225477fd61283215ceff2068899Greg Clayton#include "lldb/Host/Host.h" 2595b765e8000b44644d021e95bc58eac95028573bGreg Clayton#include "lldb/Host/Symbols.h" 2649ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/ObjectFile.h" 27d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton#include "lldb/Symbol/SymbolFile.h" 28d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton#include "lldb/Symbol/SymbolVendor.h" 2958e26e0935138225477fd61283215ceff2068899Greg Clayton#include "lldb/Target/Target.h" 3058e26e0935138225477fd61283215ceff2068899Greg Clayton 3158e26e0935138225477fd61283215ceff2068899Greg Claytonusing namespace lldb; 3258e26e0935138225477fd61283215ceff2068899Greg Claytonusing namespace lldb_private; 3358e26e0935138225477fd61283215ceff2068899Greg Clayton 3458e26e0935138225477fd61283215ceff2068899Greg Clayton 3558e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 3658e26e0935138225477fd61283215ceff2068899Greg Clayton/// Default Constructor 3758e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 3858e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::PlatformDarwin (bool is_host) : 3958e26e0935138225477fd61283215ceff2068899Greg Clayton Platform(is_host), // This is the local host platform 40f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton m_remote_platform_sp (), 41f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton m_developer_directory () 4258e26e0935138225477fd61283215ceff2068899Greg Clayton{ 4358e26e0935138225477fd61283215ceff2068899Greg Clayton} 4458e26e0935138225477fd61283215ceff2068899Greg Clayton 4558e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 4658e26e0935138225477fd61283215ceff2068899Greg Clayton/// Destructor. 4758e26e0935138225477fd61283215ceff2068899Greg Clayton/// 4858e26e0935138225477fd61283215ceff2068899Greg Clayton/// The destructor is virtual since this class is designed to be 4958e26e0935138225477fd61283215ceff2068899Greg Clayton/// inherited from by the plug-in instance. 5058e26e0935138225477fd61283215ceff2068899Greg Clayton//------------------------------------------------------------------ 5158e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::~PlatformDarwin() 5258e26e0935138225477fd61283215ceff2068899Greg Clayton{ 5358e26e0935138225477fd61283215ceff2068899Greg Clayton} 5458e26e0935138225477fd61283215ceff2068899Greg Clayton 55d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg ClaytonFileSpecList 56d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg ClaytonPlatformDarwin::LocateExecutableScriptingResources (Target *target, 57d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton Module &module) 58146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata{ 59d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton FileSpecList file_list; 60d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton if (target && target->GetDebugger().GetScriptLanguage() == eScriptLanguagePython) 61146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata { 62d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton // NB some extensions might be meaningful and should not be stripped - "this.binary.file" 63d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton // should not lose ".file" but GetFileNameStrippingExtension() will do precisely that. 64d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton // Ideally, we should have a per-platform list of extensions (".exe", ".app", ".dSYM", ".framework") 65d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton // which should be stripped while leaving "this.binary.file" as-is. 668ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton FileSpec module_spec = module.GetFileSpec(); 67d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton 688ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton if (module_spec) 698ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton { 70d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton SymbolVendor *symbols = module.GetSymbolVendor (); 71d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton if (symbols) 72d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton { 73d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton SymbolFile *symfile = symbols->GetSymbolFile(); 74d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton if (symfile) 75d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton { 76d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton ObjectFile *objfile = symfile->GetObjectFile(); 77d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton if (objfile) 78d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton { 79d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton FileSpec symfile_spec (objfile->GetFileSpec()); 80d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton if (symfile_spec && symfile_spec.Exists()) 81d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton { 828ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton while (module_spec.GetFilename()) 838ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton { 848ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton std::string module_basename (module_spec.GetFilename().GetCString()); 858ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton 868ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton // FIXME: for Python, we cannot allow certain characters in module 878ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton // filenames we import. Theoretically, different scripting languages may 888ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton // have different sets of forbidden tokens in filenames, and that should 898ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton // be dealt with by each ScriptInterpreter. For now, we just replace dots 908ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton // with underscores, but if we ever support anything other than Python 918ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton // we will need to rework this 928ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton std::replace(module_basename.begin(), module_basename.end(), '.', '_'); 938ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton std::replace(module_basename.begin(), module_basename.end(), ' ', '_'); 948ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton std::replace(module_basename.begin(), module_basename.end(), '-', '_'); 958ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton 968ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton 978ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton StreamString path_string; 988ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton // for OSX we are going to be in .dSYM/Contents/Resources/DWARF/<basename> 998ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton // let us go to .dSYM/Contents/Resources/Python/<basename>.py and see if the file exists 1008ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton path_string.Printf("%s/../Python/%s.py",symfile_spec.GetDirectory().GetCString(), module_basename.c_str()); 1018ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton FileSpec script_fspec(path_string.GetData(), true); 1028ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton if (script_fspec.Exists()) 1038ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton { 1048ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton file_list.Append (script_fspec); 1058ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton break; 1068ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton } 1078ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton 1088ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton // If we didn't find the python file, then keep 1098ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton // stripping the extensions and try again 1108ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton ConstString filename_no_extension (module_spec.GetFileNameStrippingExtension()); 1118ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton if (module_spec.GetFilename() == filename_no_extension) 1128ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton break; 1138ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton 1148ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton module_spec.GetFilename() = filename_no_extension; 1158ff8128dfb483505e570418cb83940dfafc99a3bGreg Clayton } 116d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton } 117d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton } 118d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton } 119d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton } 1206f58bbd1473279158f10504ebbd0b5696cf953f9Enrico Granata } 1216f58bbd1473279158f10504ebbd0b5696cf953f9Enrico Granata } 122d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton return file_list; 123146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata} 12458e26e0935138225477fd61283215ceff2068899Greg Clayton 12558e26e0935138225477fd61283215ceff2068899Greg ClaytonError 12658e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::ResolveExecutable (const FileSpec &exe_file, 12758e26e0935138225477fd61283215ceff2068899Greg Clayton const ArchSpec &exe_arch, 1289ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton lldb::ModuleSP &exe_module_sp, 1299ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton const FileSpecList *module_search_paths_ptr) 13058e26e0935138225477fd61283215ceff2068899Greg Clayton{ 13158e26e0935138225477fd61283215ceff2068899Greg Clayton Error error; 13258e26e0935138225477fd61283215ceff2068899Greg Clayton // Nothing special to do here, just use the actual file and architecture 13358e26e0935138225477fd61283215ceff2068899Greg Clayton 134b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton char exe_path[PATH_MAX]; 13558e26e0935138225477fd61283215ceff2068899Greg Clayton FileSpec resolved_exe_file (exe_file); 13658e26e0935138225477fd61283215ceff2068899Greg Clayton 137b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (IsHost()) 138b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 139b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // If we have "ls" as the exe_file, resolve the executable loation based on 140b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // the current path variables 141b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (!resolved_exe_file.Exists()) 142b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 143b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton exe_file.GetPath (exe_path, sizeof(exe_path)); 144b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton resolved_exe_file.SetFile(exe_path, true); 145b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 14658e26e0935138225477fd61283215ceff2068899Greg Clayton 147b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (!resolved_exe_file.Exists()) 148b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton resolved_exe_file.ResolveExecutableLocation (); 14958e26e0935138225477fd61283215ceff2068899Greg Clayton 150b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Resolve any executable within a bundle on MacOSX 151b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Host::ResolveExecutableInBundle (resolved_exe_file); 152b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 153b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (resolved_exe_file.Exists()) 154b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.Clear(); 155b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 156b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 157c85713d839bc9dbd6a62cad619fa3d1973ca599fGreg Clayton exe_file.GetPath (exe_path, sizeof(exe_path)); 158c85713d839bc9dbd6a62cad619fa3d1973ca599fGreg Clayton error.SetErrorStringWithFormat ("unable to find executable for '%s'", exe_path); 159b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 160b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 161b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 162b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 163b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_remote_platform_sp) 164b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 165b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error = m_remote_platform_sp->ResolveExecutable (exe_file, 166b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton exe_arch, 1679ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton exe_module_sp, 1689ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_search_paths_ptr); 169b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 170b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 171f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen { 172f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen // We may connect to a process and use the provided executable (Don't use local $PATH). 173f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen 174f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen // Resolve any executable within a bundle on MacOSX 175f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen Host::ResolveExecutableInBundle (resolved_exe_file); 176f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen 177f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen if (resolved_exe_file.Exists()) 178f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen error.Clear(); 179f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen else 18095b7b4362ca7135be088e4fbf04c2bd15767a104Jason Molenda error.SetErrorStringWithFormat("the platform is not currently connected, and '%s' doesn't exist in the system root.", resolved_exe_file.GetFilename().AsCString("")); 181f7908e61cc2a1295c4caac2560abcf97cd7b0aa4Johnny Chen } 182b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 183b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 184b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 185b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (error.Success()) 18658e26e0935138225477fd61283215ceff2068899Greg Clayton { 187444fe998bf707bd076a70c3a779db8575533695eGreg Clayton ModuleSpec module_spec (resolved_exe_file, exe_arch); 188444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (module_spec.GetArchitecture().IsValid()) 18958e26e0935138225477fd61283215ceff2068899Greg Clayton { 190444fe998bf707bd076a70c3a779db8575533695eGreg Clayton error = ModuleList::GetSharedModule (module_spec, 19158e26e0935138225477fd61283215ceff2068899Greg Clayton exe_module_sp, 1929ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_search_paths_ptr, 19358e26e0935138225477fd61283215ceff2068899Greg Clayton NULL, 19458e26e0935138225477fd61283215ceff2068899Greg Clayton NULL); 19558e26e0935138225477fd61283215ceff2068899Greg Clayton 196b6883ec4fc673b57d845565d54cf34828911db40Greg Clayton if (error.Fail() || exe_module_sp.get() == NULL || exe_module_sp->GetObjectFile() == NULL) 19758e26e0935138225477fd61283215ceff2068899Greg Clayton { 19858e26e0935138225477fd61283215ceff2068899Greg Clayton exe_module_sp.reset(); 19997a19b21dacd9063bb5475812df7781777262198Greg Clayton error.SetErrorStringWithFormat ("'%s' doesn't contain the architecture %s", 20097a19b21dacd9063bb5475812df7781777262198Greg Clayton exe_file.GetPath().c_str(), 20158e26e0935138225477fd61283215ceff2068899Greg Clayton exe_arch.GetArchitectureName()); 20258e26e0935138225477fd61283215ceff2068899Greg Clayton } 20358e26e0935138225477fd61283215ceff2068899Greg Clayton } 20458e26e0935138225477fd61283215ceff2068899Greg Clayton else 20558e26e0935138225477fd61283215ceff2068899Greg Clayton { 20658e26e0935138225477fd61283215ceff2068899Greg Clayton // No valid architecture was specified, ask the platform for 20758e26e0935138225477fd61283215ceff2068899Greg Clayton // the architectures that we should be using (in the correct order) 20858e26e0935138225477fd61283215ceff2068899Greg Clayton // and see if we can find a match that way 20958e26e0935138225477fd61283215ceff2068899Greg Clayton StreamString arch_names; 210444fe998bf707bd076a70c3a779db8575533695eGreg Clayton for (uint32_t idx = 0; GetSupportedArchitectureAtIndex (idx, module_spec.GetArchitecture()); ++idx) 21158e26e0935138225477fd61283215ceff2068899Greg Clayton { 212444fe998bf707bd076a70c3a779db8575533695eGreg Clayton error = ModuleList::GetSharedModule (module_spec, 21358e26e0935138225477fd61283215ceff2068899Greg Clayton exe_module_sp, 2149ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_search_paths_ptr, 21558e26e0935138225477fd61283215ceff2068899Greg Clayton NULL, 21658e26e0935138225477fd61283215ceff2068899Greg Clayton NULL); 21758e26e0935138225477fd61283215ceff2068899Greg Clayton // Did we find an executable using one of the 21858e26e0935138225477fd61283215ceff2068899Greg Clayton if (error.Success()) 21958e26e0935138225477fd61283215ceff2068899Greg Clayton { 22058e26e0935138225477fd61283215ceff2068899Greg Clayton if (exe_module_sp && exe_module_sp->GetObjectFile()) 22158e26e0935138225477fd61283215ceff2068899Greg Clayton break; 22258e26e0935138225477fd61283215ceff2068899Greg Clayton else 22358e26e0935138225477fd61283215ceff2068899Greg Clayton error.SetErrorToGenericError(); 22458e26e0935138225477fd61283215ceff2068899Greg Clayton } 22558e26e0935138225477fd61283215ceff2068899Greg Clayton 22658e26e0935138225477fd61283215ceff2068899Greg Clayton if (idx > 0) 22758e26e0935138225477fd61283215ceff2068899Greg Clayton arch_names.PutCString (", "); 228444fe998bf707bd076a70c3a779db8575533695eGreg Clayton arch_names.PutCString (module_spec.GetArchitecture().GetArchitectureName()); 22958e26e0935138225477fd61283215ceff2068899Greg Clayton } 23058e26e0935138225477fd61283215ceff2068899Greg Clayton 23158e26e0935138225477fd61283215ceff2068899Greg Clayton if (error.Fail() || !exe_module_sp) 23258e26e0935138225477fd61283215ceff2068899Greg Clayton { 23397a19b21dacd9063bb5475812df7781777262198Greg Clayton error.SetErrorStringWithFormat ("'%s' doesn't contain any '%s' platform architectures: %s", 23497a19b21dacd9063bb5475812df7781777262198Greg Clayton exe_file.GetPath().c_str(), 2350e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton GetPluginName().GetCString(), 23658e26e0935138225477fd61283215ceff2068899Greg Clayton arch_names.GetString().c_str()); 23758e26e0935138225477fd61283215ceff2068899Greg Clayton } 23858e26e0935138225477fd61283215ceff2068899Greg Clayton } 23958e26e0935138225477fd61283215ceff2068899Greg Clayton } 24058e26e0935138225477fd61283215ceff2068899Greg Clayton 24158e26e0935138225477fd61283215ceff2068899Greg Clayton return error; 24258e26e0935138225477fd61283215ceff2068899Greg Clayton} 24358e26e0935138225477fd61283215ceff2068899Greg Clayton 24495b765e8000b44644d021e95bc58eac95028573bGreg ClaytonError 24595b765e8000b44644d021e95bc58eac95028573bGreg ClaytonPlatformDarwin::ResolveSymbolFile (Target &target, 24695b765e8000b44644d021e95bc58eac95028573bGreg Clayton const ModuleSpec &sym_spec, 24795b765e8000b44644d021e95bc58eac95028573bGreg Clayton FileSpec &sym_file) 24895b765e8000b44644d021e95bc58eac95028573bGreg Clayton{ 24995b765e8000b44644d021e95bc58eac95028573bGreg Clayton Error error; 25095b765e8000b44644d021e95bc58eac95028573bGreg Clayton sym_file = sym_spec.GetSymbolFileSpec(); 25195b765e8000b44644d021e95bc58eac95028573bGreg Clayton if (sym_file.Exists()) 25295b765e8000b44644d021e95bc58eac95028573bGreg Clayton { 25395b765e8000b44644d021e95bc58eac95028573bGreg Clayton if (sym_file.GetFileType() == FileSpec::eFileTypeDirectory) 25495b765e8000b44644d021e95bc58eac95028573bGreg Clayton { 25595b765e8000b44644d021e95bc58eac95028573bGreg Clayton sym_file = Symbols::FindSymbolFileInBundle (sym_file, 25695b765e8000b44644d021e95bc58eac95028573bGreg Clayton sym_spec.GetUUIDPtr(), 25795b765e8000b44644d021e95bc58eac95028573bGreg Clayton sym_spec.GetArchitecturePtr()); 25895b765e8000b44644d021e95bc58eac95028573bGreg Clayton } 25995b765e8000b44644d021e95bc58eac95028573bGreg Clayton } 26095b765e8000b44644d021e95bc58eac95028573bGreg Clayton else 26195b765e8000b44644d021e95bc58eac95028573bGreg Clayton { 26295b765e8000b44644d021e95bc58eac95028573bGreg Clayton if (sym_spec.GetUUID().IsValid()) 26395b765e8000b44644d021e95bc58eac95028573bGreg Clayton { 26495b765e8000b44644d021e95bc58eac95028573bGreg Clayton 26595b765e8000b44644d021e95bc58eac95028573bGreg Clayton } 26695b765e8000b44644d021e95bc58eac95028573bGreg Clayton } 26795b765e8000b44644d021e95bc58eac95028573bGreg Clayton return error; 26895b765e8000b44644d021e95bc58eac95028573bGreg Clayton 26995b765e8000b44644d021e95bc58eac95028573bGreg Clayton} 27095b765e8000b44644d021e95bc58eac95028573bGreg Clayton 27158e26e0935138225477fd61283215ceff2068899Greg Clayton 2729ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 2739ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonError 274444fe998bf707bd076a70c3a779db8575533695eGreg ClaytonPlatformDarwin::GetSharedModule (const ModuleSpec &module_spec, 2759ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton ModuleSP &module_sp, 2769ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton const FileSpecList *module_search_paths_ptr, 2779ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton ModuleSP *old_module_sp_ptr, 2789ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton bool *did_create_ptr) 2799ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton{ 2809ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton Error error; 2819ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_sp.reset(); 2829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 2839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (IsRemote()) 2849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 2859ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // If we have a remote platform always, let it try and locate 2869ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // the shared module first. 2879ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (m_remote_platform_sp) 2889ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 289444fe998bf707bd076a70c3a779db8575533695eGreg Clayton error = m_remote_platform_sp->GetSharedModule (module_spec, 2909ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_sp, 2919ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_search_paths_ptr, 2929ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton old_module_sp_ptr, 2939ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton did_create_ptr); 2949ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 2959ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 2969ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 2979ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (!module_sp) 2989ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 2999ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // Fall back to the local platform and find the file locally 300444fe998bf707bd076a70c3a779db8575533695eGreg Clayton error = Platform::GetSharedModule (module_spec, 3019ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_sp, 3029ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_search_paths_ptr, 3039ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton old_module_sp_ptr, 3049ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton did_create_ptr); 3059ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 306444fe998bf707bd076a70c3a779db8575533695eGreg Clayton const FileSpec &platform_file = module_spec.GetFileSpec(); 3079ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (!module_sp && module_search_paths_ptr && platform_file) 3089ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 3099ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // We can try to pull off part of the file path up to the bundle 3109ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // directory level and try any module search paths... 3119ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton FileSpec bundle_directory; 3129ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (Host::GetBundleDirectory (platform_file, bundle_directory)) 3139ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 3148e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton if (platform_file == bundle_directory) 3159ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 3168e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton ModuleSpec new_module_spec (module_spec); 3178e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton new_module_spec.GetFileSpec() = bundle_directory; 3188e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton if (Host::ResolveExecutableInBundle (new_module_spec.GetFileSpec())) 3199ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 3208e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton Error new_error (Platform::GetSharedModule (new_module_spec, 3218e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton module_sp, 3228e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton NULL, 3238e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton old_module_sp_ptr, 3248e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton did_create_ptr)); 3258e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton 3268e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton if (module_sp) 3278e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton return new_error; 3288e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton } 3298e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton } 3308e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton else 3318e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton { 3328e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton char platform_path[PATH_MAX]; 3338e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton char bundle_dir[PATH_MAX]; 3348e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton platform_file.GetPath (platform_path, sizeof(platform_path)); 3358e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton const size_t bundle_directory_len = bundle_directory.GetPath (bundle_dir, sizeof(bundle_dir)); 3368e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton char new_path[PATH_MAX]; 3378e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton size_t num_module_search_paths = module_search_paths_ptr->GetSize(); 3388e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton for (size_t i=0; i<num_module_search_paths; ++i) 3398e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton { 3408e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton const size_t search_path_len = module_search_paths_ptr->GetFileSpecAtIndex(i).GetPath(new_path, sizeof(new_path)); 3418e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton if (search_path_len < sizeof(new_path)) 3429ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 3438e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton snprintf (new_path + search_path_len, sizeof(new_path) - search_path_len, "/%s", platform_path + bundle_directory_len); 3448e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton FileSpec new_file_spec (new_path, false); 3458e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton if (new_file_spec.Exists()) 3469ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 3478e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton ModuleSpec new_module_spec (module_spec); 3488e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton new_module_spec.GetFileSpec() = new_file_spec; 3498e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton Error new_error (Platform::GetSharedModule (new_module_spec, 3508e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton module_sp, 3518e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton NULL, 3528e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton old_module_sp_ptr, 3538e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton did_create_ptr)); 3548e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton 3558e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton if (module_sp) 3568e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton { 3578e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton module_sp->SetPlatformFileSpec(new_file_spec); 3588e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton return new_error; 3598e55f85c46e74f9840f64a2e465aa6bfe6129fbbGreg Clayton } 3609ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 3619ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 3629ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 3639ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 3649ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 3659ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 3669ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 3679ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (module_sp) 368444fe998bf707bd076a70c3a779db8575533695eGreg Clayton module_sp->SetPlatformFileSpec(module_spec.GetFileSpec()); 3699ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return error; 3709ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton} 3719ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 37258e26e0935138225477fd61283215ceff2068899Greg Claytonsize_t 37358e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::GetSoftwareBreakpointTrapOpcode (Target &target, BreakpointSite *bp_site) 37458e26e0935138225477fd61283215ceff2068899Greg Clayton{ 37558e26e0935138225477fd61283215ceff2068899Greg Clayton const uint8_t *trap_opcode = NULL; 37658e26e0935138225477fd61283215ceff2068899Greg Clayton uint32_t trap_opcode_size = 0; 377f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton bool bp_is_thumb = false; 37858e26e0935138225477fd61283215ceff2068899Greg Clayton 37958e26e0935138225477fd61283215ceff2068899Greg Clayton llvm::Triple::ArchType machine = target.GetArchitecture().GetMachine(); 38058e26e0935138225477fd61283215ceff2068899Greg Clayton switch (machine) 38158e26e0935138225477fd61283215ceff2068899Greg Clayton { 38258e26e0935138225477fd61283215ceff2068899Greg Clayton case llvm::Triple::x86: 38358e26e0935138225477fd61283215ceff2068899Greg Clayton case llvm::Triple::x86_64: 38458e26e0935138225477fd61283215ceff2068899Greg Clayton { 38558e26e0935138225477fd61283215ceff2068899Greg Clayton static const uint8_t g_i386_breakpoint_opcode[] = { 0xCC }; 38658e26e0935138225477fd61283215ceff2068899Greg Clayton trap_opcode = g_i386_breakpoint_opcode; 38758e26e0935138225477fd61283215ceff2068899Greg Clayton trap_opcode_size = sizeof(g_i386_breakpoint_opcode); 38858e26e0935138225477fd61283215ceff2068899Greg Clayton } 38958e26e0935138225477fd61283215ceff2068899Greg Clayton break; 390f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton 391f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton case llvm::Triple::thumb: 392f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton bp_is_thumb = true; // Fall through... 39358e26e0935138225477fd61283215ceff2068899Greg Clayton case llvm::Triple::arm: 39458e26e0935138225477fd61283215ceff2068899Greg Clayton { 39558e26e0935138225477fd61283215ceff2068899Greg Clayton static const uint8_t g_arm_breakpoint_opcode[] = { 0xFE, 0xDE, 0xFF, 0xE7 }; 39658e26e0935138225477fd61283215ceff2068899Greg Clayton static const uint8_t g_thumb_breakpooint_opcode[] = { 0xFE, 0xDE }; 39758e26e0935138225477fd61283215ceff2068899Greg Clayton 398f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton // Auto detect arm/thumb if it wasn't explicitly specified 399f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton if (!bp_is_thumb) 40058e26e0935138225477fd61283215ceff2068899Greg Clayton { 401f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton lldb::BreakpointLocationSP bp_loc_sp (bp_site->GetOwnerAtIndex (0)); 402f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton if (bp_loc_sp) 403f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton bp_is_thumb = bp_loc_sp->GetAddress().GetAddressClass () == eAddressClassCodeAlternateISA; 404f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton } 405f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton if (bp_is_thumb) 406f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton { 407f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton trap_opcode = g_thumb_breakpooint_opcode; 408f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton trap_opcode_size = sizeof(g_thumb_breakpooint_opcode); 409f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton break; 41058e26e0935138225477fd61283215ceff2068899Greg Clayton } 41158e26e0935138225477fd61283215ceff2068899Greg Clayton trap_opcode = g_arm_breakpoint_opcode; 41258e26e0935138225477fd61283215ceff2068899Greg Clayton trap_opcode_size = sizeof(g_arm_breakpoint_opcode); 41358e26e0935138225477fd61283215ceff2068899Greg Clayton } 41458e26e0935138225477fd61283215ceff2068899Greg Clayton break; 41558e26e0935138225477fd61283215ceff2068899Greg Clayton 41658e26e0935138225477fd61283215ceff2068899Greg Clayton case llvm::Triple::ppc: 41758e26e0935138225477fd61283215ceff2068899Greg Clayton case llvm::Triple::ppc64: 41858e26e0935138225477fd61283215ceff2068899Greg Clayton { 41958e26e0935138225477fd61283215ceff2068899Greg Clayton static const uint8_t g_ppc_breakpoint_opcode[] = { 0x7F, 0xC0, 0x00, 0x08 }; 42058e26e0935138225477fd61283215ceff2068899Greg Clayton trap_opcode = g_ppc_breakpoint_opcode; 42158e26e0935138225477fd61283215ceff2068899Greg Clayton trap_opcode_size = sizeof(g_ppc_breakpoint_opcode); 42258e26e0935138225477fd61283215ceff2068899Greg Clayton } 42358e26e0935138225477fd61283215ceff2068899Greg Clayton break; 42458e26e0935138225477fd61283215ceff2068899Greg Clayton 42558e26e0935138225477fd61283215ceff2068899Greg Clayton default: 426f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton assert(!"Unhandled architecture in PlatformDarwin::GetSoftwareBreakpointTrapOpcode()"); 42758e26e0935138225477fd61283215ceff2068899Greg Clayton break; 42858e26e0935138225477fd61283215ceff2068899Greg Clayton } 42958e26e0935138225477fd61283215ceff2068899Greg Clayton 43058e26e0935138225477fd61283215ceff2068899Greg Clayton if (trap_opcode && trap_opcode_size) 43158e26e0935138225477fd61283215ceff2068899Greg Clayton { 43258e26e0935138225477fd61283215ceff2068899Greg Clayton if (bp_site->SetTrapOpcode(trap_opcode, trap_opcode_size)) 43358e26e0935138225477fd61283215ceff2068899Greg Clayton return trap_opcode_size; 43458e26e0935138225477fd61283215ceff2068899Greg Clayton } 43558e26e0935138225477fd61283215ceff2068899Greg Clayton return 0; 43658e26e0935138225477fd61283215ceff2068899Greg Clayton 43758e26e0935138225477fd61283215ceff2068899Greg Clayton} 43858e26e0935138225477fd61283215ceff2068899Greg Clayton 43958e26e0935138225477fd61283215ceff2068899Greg Claytonbool 44058e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::GetRemoteOSVersion () 44158e26e0935138225477fd61283215ceff2068899Greg Clayton{ 44258e26e0935138225477fd61283215ceff2068899Greg Clayton if (m_remote_platform_sp) 44358e26e0935138225477fd61283215ceff2068899Greg Clayton return m_remote_platform_sp->GetOSVersion (m_major_os_version, 44458e26e0935138225477fd61283215ceff2068899Greg Clayton m_minor_os_version, 44558e26e0935138225477fd61283215ceff2068899Greg Clayton m_update_os_version); 44658e26e0935138225477fd61283215ceff2068899Greg Clayton return false; 44758e26e0935138225477fd61283215ceff2068899Greg Clayton} 44858e26e0935138225477fd61283215ceff2068899Greg Clayton 44958e26e0935138225477fd61283215ceff2068899Greg Claytonbool 45058e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::GetRemoteOSBuildString (std::string &s) 45158e26e0935138225477fd61283215ceff2068899Greg Clayton{ 45258e26e0935138225477fd61283215ceff2068899Greg Clayton if (m_remote_platform_sp) 45358e26e0935138225477fd61283215ceff2068899Greg Clayton return m_remote_platform_sp->GetRemoteOSBuildString (s); 45458e26e0935138225477fd61283215ceff2068899Greg Clayton s.clear(); 45558e26e0935138225477fd61283215ceff2068899Greg Clayton return false; 45658e26e0935138225477fd61283215ceff2068899Greg Clayton} 45758e26e0935138225477fd61283215ceff2068899Greg Clayton 45858e26e0935138225477fd61283215ceff2068899Greg Claytonbool 45958e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::GetRemoteOSKernelDescription (std::string &s) 46058e26e0935138225477fd61283215ceff2068899Greg Clayton{ 46158e26e0935138225477fd61283215ceff2068899Greg Clayton if (m_remote_platform_sp) 46258e26e0935138225477fd61283215ceff2068899Greg Clayton return m_remote_platform_sp->GetRemoteOSKernelDescription (s); 46358e26e0935138225477fd61283215ceff2068899Greg Clayton s.clear(); 46458e26e0935138225477fd61283215ceff2068899Greg Clayton return false; 46558e26e0935138225477fd61283215ceff2068899Greg Clayton} 46658e26e0935138225477fd61283215ceff2068899Greg Clayton 46758e26e0935138225477fd61283215ceff2068899Greg Clayton// Remote Platform subclasses need to override this function 46858e26e0935138225477fd61283215ceff2068899Greg ClaytonArchSpec 46958e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::GetRemoteSystemArchitecture () 47058e26e0935138225477fd61283215ceff2068899Greg Clayton{ 47158e26e0935138225477fd61283215ceff2068899Greg Clayton if (m_remote_platform_sp) 47258e26e0935138225477fd61283215ceff2068899Greg Clayton return m_remote_platform_sp->GetRemoteSystemArchitecture (); 47358e26e0935138225477fd61283215ceff2068899Greg Clayton return ArchSpec(); 47458e26e0935138225477fd61283215ceff2068899Greg Clayton} 47558e26e0935138225477fd61283215ceff2068899Greg Clayton 47658e26e0935138225477fd61283215ceff2068899Greg Clayton 47758e26e0935138225477fd61283215ceff2068899Greg Claytonconst char * 47824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonPlatformDarwin::GetHostname () 47958e26e0935138225477fd61283215ceff2068899Greg Clayton{ 48024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsHost()) 48124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return Platform::GetHostname(); 48224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 48358e26e0935138225477fd61283215ceff2068899Greg Clayton if (m_remote_platform_sp) 48458e26e0935138225477fd61283215ceff2068899Greg Clayton return m_remote_platform_sp->GetHostname (); 48558e26e0935138225477fd61283215ceff2068899Greg Clayton return NULL; 48658e26e0935138225477fd61283215ceff2068899Greg Clayton} 48758e26e0935138225477fd61283215ceff2068899Greg Clayton 48858e26e0935138225477fd61283215ceff2068899Greg Claytonbool 48958e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::IsConnected () const 49058e26e0935138225477fd61283215ceff2068899Greg Clayton{ 49158e26e0935138225477fd61283215ceff2068899Greg Clayton if (IsHost()) 49258e26e0935138225477fd61283215ceff2068899Greg Clayton return true; 49358e26e0935138225477fd61283215ceff2068899Greg Clayton else if (m_remote_platform_sp) 49458e26e0935138225477fd61283215ceff2068899Greg Clayton return m_remote_platform_sp->IsConnected(); 49558e26e0935138225477fd61283215ceff2068899Greg Clayton return false; 49658e26e0935138225477fd61283215ceff2068899Greg Clayton} 49758e26e0935138225477fd61283215ceff2068899Greg Clayton 49858e26e0935138225477fd61283215ceff2068899Greg ClaytonError 49958e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::ConnectRemote (Args& args) 50058e26e0935138225477fd61283215ceff2068899Greg Clayton{ 50158e26e0935138225477fd61283215ceff2068899Greg Clayton Error error; 50258e26e0935138225477fd61283215ceff2068899Greg Clayton if (IsHost()) 50358e26e0935138225477fd61283215ceff2068899Greg Clayton { 5040e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton error.SetErrorStringWithFormat ("can't connect to the host platform '%s', always connected", GetPluginName().GetCString()); 50558e26e0935138225477fd61283215ceff2068899Greg Clayton } 50658e26e0935138225477fd61283215ceff2068899Greg Clayton else 50758e26e0935138225477fd61283215ceff2068899Greg Clayton { 50858e26e0935138225477fd61283215ceff2068899Greg Clayton if (!m_remote_platform_sp) 50958e26e0935138225477fd61283215ceff2068899Greg Clayton m_remote_platform_sp = Platform::Create ("remote-gdb-server", error); 51058e26e0935138225477fd61283215ceff2068899Greg Clayton 51158e26e0935138225477fd61283215ceff2068899Greg Clayton if (m_remote_platform_sp) 51258e26e0935138225477fd61283215ceff2068899Greg Clayton { 51358e26e0935138225477fd61283215ceff2068899Greg Clayton if (error.Success()) 51458e26e0935138225477fd61283215ceff2068899Greg Clayton { 51558e26e0935138225477fd61283215ceff2068899Greg Clayton if (m_remote_platform_sp) 51658e26e0935138225477fd61283215ceff2068899Greg Clayton { 51758e26e0935138225477fd61283215ceff2068899Greg Clayton error = m_remote_platform_sp->ConnectRemote (args); 51858e26e0935138225477fd61283215ceff2068899Greg Clayton } 51958e26e0935138225477fd61283215ceff2068899Greg Clayton else 52058e26e0935138225477fd61283215ceff2068899Greg Clayton { 52158e26e0935138225477fd61283215ceff2068899Greg Clayton error.SetErrorString ("\"platform connect\" takes a single argument: <connect-url>"); 52258e26e0935138225477fd61283215ceff2068899Greg Clayton } 52358e26e0935138225477fd61283215ceff2068899Greg Clayton } 52458e26e0935138225477fd61283215ceff2068899Greg Clayton } 52558e26e0935138225477fd61283215ceff2068899Greg Clayton else 52658e26e0935138225477fd61283215ceff2068899Greg Clayton error.SetErrorString ("failed to create a 'remote-gdb-server' platform"); 52758e26e0935138225477fd61283215ceff2068899Greg Clayton 52858e26e0935138225477fd61283215ceff2068899Greg Clayton if (error.Fail()) 52958e26e0935138225477fd61283215ceff2068899Greg Clayton m_remote_platform_sp.reset(); 53058e26e0935138225477fd61283215ceff2068899Greg Clayton } 53158e26e0935138225477fd61283215ceff2068899Greg Clayton 53258e26e0935138225477fd61283215ceff2068899Greg Clayton return error; 53358e26e0935138225477fd61283215ceff2068899Greg Clayton} 53458e26e0935138225477fd61283215ceff2068899Greg Clayton 53558e26e0935138225477fd61283215ceff2068899Greg ClaytonError 53658e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatformDarwin::DisconnectRemote () 53758e26e0935138225477fd61283215ceff2068899Greg Clayton{ 53858e26e0935138225477fd61283215ceff2068899Greg Clayton Error error; 53958e26e0935138225477fd61283215ceff2068899Greg Clayton 54058e26e0935138225477fd61283215ceff2068899Greg Clayton if (IsHost()) 54158e26e0935138225477fd61283215ceff2068899Greg Clayton { 5420e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton error.SetErrorStringWithFormat ("can't disconnect from the host platform '%s', always connected", GetPluginName().GetCString()); 54358e26e0935138225477fd61283215ceff2068899Greg Clayton } 54458e26e0935138225477fd61283215ceff2068899Greg Clayton else 54558e26e0935138225477fd61283215ceff2068899Greg Clayton { 54658e26e0935138225477fd61283215ceff2068899Greg Clayton if (m_remote_platform_sp) 54758e26e0935138225477fd61283215ceff2068899Greg Clayton error = m_remote_platform_sp->DisconnectRemote (); 54858e26e0935138225477fd61283215ceff2068899Greg Clayton else 54958e26e0935138225477fd61283215ceff2068899Greg Clayton error.SetErrorString ("the platform is not currently connected"); 55058e26e0935138225477fd61283215ceff2068899Greg Clayton } 55158e26e0935138225477fd61283215ceff2068899Greg Clayton return error; 55258e26e0935138225477fd61283215ceff2068899Greg Clayton} 55358e26e0935138225477fd61283215ceff2068899Greg Clayton 55424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 55524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonbool 556b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatformDarwin::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info) 55724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 55824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton bool sucess = false; 55924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsHost()) 56024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 56124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton sucess = Platform::GetProcessInfo (pid, process_info); 56224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 56324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton else 56424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 56524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_remote_platform_sp) 56624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton sucess = m_remote_platform_sp->GetProcessInfo (pid, process_info); 56724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 56824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return sucess; 56924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 57024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 57124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 57224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 57324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonuint32_t 574b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatformDarwin::FindProcesses (const ProcessInstanceInfoMatch &match_info, 575b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessInstanceInfoList &process_infos) 57624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 57724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton uint32_t match_count = 0; 57824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsHost()) 57924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 58024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // Let the base class figure out the host details 58124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton match_count = Platform::FindProcesses (match_info, process_infos); 58224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 58324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton else 58424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 58524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // If we are remote, we can only return results if we are connected 58624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_remote_platform_sp) 58724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton match_count = m_remote_platform_sp->FindProcesses (match_info, process_infos); 58824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 58924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return match_count; 59024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 59124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 592b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonError 593b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatformDarwin::LaunchProcess (ProcessLaunchInfo &launch_info) 594b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 595b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error error; 596527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 597b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (IsHost()) 598b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 599b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error = Platform::LaunchProcess (launch_info); 600b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 601b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 602b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 603b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_remote_platform_sp) 604b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error = m_remote_platform_sp->LaunchProcess (launch_info); 605b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 606b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("the platform is not currently connected"); 607b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 608b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return error; 609b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 610b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 611b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonlldb::ProcessSP 612527154d8e532f27f25af226c9e1dac607c48b5d1Greg ClaytonPlatformDarwin::Attach (ProcessAttachInfo &attach_info, 613b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Debugger &debugger, 614b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Target *target, 615b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Listener &listener, 616b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error &error) 617b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 618b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton lldb::ProcessSP process_sp; 619527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 620b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (IsHost()) 621b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 622b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (target == NULL) 623b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 624b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton TargetSP new_target_sp; 625b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 626b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error = debugger.GetTargetList().CreateTarget (debugger, 627ed0a0fbd021e44727469d6fa20cc337c58bd04c3Greg Clayton NULL, 6283e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton NULL, 629b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton false, 6303e8c25f62f92145b6fb699b379cbfe72b1245d4aGreg Clayton NULL, 631b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton new_target_sp); 632b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton target = new_target_sp.get(); 633b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 634b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 635b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.Clear(); 636b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 637b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (target && error.Success()) 638b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 639b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton debugger.GetTargetList().SetSelectedTarget(target); 640527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton 64146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton process_sp = target->CreateProcess (listener, attach_info.GetProcessPluginName(), NULL); 642b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 643b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (process_sp) 644527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton error = process_sp->Attach (attach_info); 645b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 646b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 647b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 648b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 649b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (m_remote_platform_sp) 650527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton process_sp = m_remote_platform_sp->Attach (attach_info, debugger, target, listener, error); 651b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 652b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("the platform is not currently connected"); 653b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 654b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return process_sp; 655b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 656b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 65724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonconst char * 65824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonPlatformDarwin::GetUserName (uint32_t uid) 65924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 66024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // Check the cache in Platform in case we have already looked this uid up 66124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *user_name = Platform::GetUserName(uid); 66224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (user_name) 66324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return user_name; 66424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 66524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsRemote() && m_remote_platform_sp) 66624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return m_remote_platform_sp->GetUserName(uid); 66724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return NULL; 66824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 66924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 67024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonconst char * 67124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonPlatformDarwin::GetGroupName (uint32_t gid) 67224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 67324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *group_name = Platform::GetGroupName(gid); 67424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (group_name) 67524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return group_name; 67624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 67724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsRemote() && m_remote_platform_sp) 67824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return m_remote_platform_sp->GetGroupName(gid); 67924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return NULL; 68024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 68124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 6827089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Inghambool 6837089d8a3ef19ea251210b3e9bf198da8fb55f279Jim InghamPlatformDarwin::ModuleIsExcludedForNonModuleSpecificSearches (lldb_private::Target &target, const lldb::ModuleSP &module_sp) 6847089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham{ 68549170d451ca06cccd67b486646b5345f85e69417Jim Ingham if (!module_sp) 68649170d451ca06cccd67b486646b5345f85e69417Jim Ingham return false; 68749170d451ca06cccd67b486646b5345f85e69417Jim Ingham 6887089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham ObjectFile *obj_file = module_sp->GetObjectFile(); 6897089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham if (!obj_file) 6907089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham return false; 6917089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham 6927089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham ObjectFile::Type obj_type = obj_file->GetType(); 6937089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham if (obj_type == ObjectFile::eTypeDynamicLinker) 6947089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham return true; 6957089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham else 6967089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham return false; 6977089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham} 6989d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 6999d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 700f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Claytonbool 701f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg ClaytonPlatformDarwin::x86GetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch) 702f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton{ 703f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (idx == 0) 704f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 705f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton arch = Host::GetArchitecture (Host::eSystemDefaultArchitecture); 706f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton return arch.IsValid(); 707f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 708f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton else if (idx == 1) 709f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 710f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton ArchSpec platform_arch (Host::GetArchitecture (Host::eSystemDefaultArchitecture)); 711f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton ArchSpec platform_arch64 (Host::GetArchitecture (Host::eSystemDefaultArchitecture64)); 71240e278caddf5442776f9408f20d757cc85fe630aSean Callanan if (platform_arch.IsExactMatch(platform_arch64)) 713f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 714f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton // This macosx platform supports both 32 and 64 bit. Since we already 715f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton // returned the 64 bit arch for idx == 0, return the 32 bit arch 716f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton // for idx == 1 717f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton arch = Host::GetArchitecture (Host::eSystemDefaultArchitecture32); 718f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton return arch.IsValid(); 719f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 720f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 721f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton return false; 722f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton} 723f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton 7249d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda// The architecture selection rules for arm processors 7259d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda// These cpu subtypes have distinct names (e.g. armv7f) but armv7 binaries run fine on an armv7f processor. 7269d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 7279d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molendabool 7289d3c618680dd8bc8f250d700aac7f78eecbbf69bJason MolendaPlatformDarwin::ARMGetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch) 7299d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda{ 7309d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda ArchSpec system_arch (GetSystemArchitecture()); 7319d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda const ArchSpec::Core system_core = system_arch.GetCore(); 7329d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda switch (system_core) 7339d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda { 7349d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda default: 7359d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda switch (idx) 7369d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda { 737b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 0: arch.SetTriple ("armv7-apple-ios"); return true; 738b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 1: arch.SetTriple ("armv7f-apple-ios"); return true; 739b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 2: arch.SetTriple ("armv7k-apple-ios"); return true; 740b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 3: arch.SetTriple ("armv7s-apple-ios"); return true; 7419ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 4: arch.SetTriple ("armv7m-apple-ios"); return true; 7429ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 5: arch.SetTriple ("armv7em-apple-ios"); return true; 7439ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 6: arch.SetTriple ("armv6-apple-ios"); return true; 7449ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 7: arch.SetTriple ("armv5-apple-ios"); return true; 7459ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 8: arch.SetTriple ("armv4-apple-ios"); return true; 7469ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 9: arch.SetTriple ("arm-apple-ios"); return true; 7479ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 10: arch.SetTriple ("thumbv7-apple-ios"); return true; 7489ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 11: arch.SetTriple ("thumbv7f-apple-ios"); return true; 7499ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 12: arch.SetTriple ("thumbv7k-apple-ios"); return true; 7509ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 13: arch.SetTriple ("thumbv7s-apple-ios"); return true; 7519ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 14: arch.SetTriple ("thumbv7m-apple-ios"); return true; 7529ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 15: arch.SetTriple ("thumbv7em-apple-ios"); return true; 7539ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 16: arch.SetTriple ("thumbv6-apple-ios"); return true; 7549ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 17: arch.SetTriple ("thumbv5-apple-ios"); return true; 7559ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 18: arch.SetTriple ("thumbv4t-apple-ios"); return true; 7569ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 19: arch.SetTriple ("thumb-apple-ios"); return true; 7579d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda default: break; 7589d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda } 7599d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda break; 7609d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 7619d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda case ArchSpec::eCore_arm_armv7f: 7629d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda switch (idx) 7639d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda { 764b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 0: arch.SetTriple ("armv7f-apple-ios"); return true; 765b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 1: arch.SetTriple ("armv7-apple-ios"); return true; 766b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 2: arch.SetTriple ("armv6-apple-ios"); return true; 767b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 3: arch.SetTriple ("armv5-apple-ios"); return true; 768b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 4: arch.SetTriple ("armv4-apple-ios"); return true; 769b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 5: arch.SetTriple ("arm-apple-ios"); return true; 770b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 6: arch.SetTriple ("thumbv7f-apple-ios"); return true; 771b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 7: arch.SetTriple ("thumbv7-apple-ios"); return true; 772b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 8: arch.SetTriple ("thumbv6-apple-ios"); return true; 773b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 9: arch.SetTriple ("thumbv5-apple-ios"); return true; 774b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 10: arch.SetTriple ("thumbv4t-apple-ios"); return true; 775b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 11: arch.SetTriple ("thumb-apple-ios"); return true; 776b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: break; 7779d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda } 7789d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda break; 7799d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 7809d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda case ArchSpec::eCore_arm_armv7k: 7819d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda switch (idx) 7829d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda { 783b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 0: arch.SetTriple ("armv7k-apple-ios"); return true; 784b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 1: arch.SetTriple ("armv7-apple-ios"); return true; 785b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 2: arch.SetTriple ("armv6-apple-ios"); return true; 786b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 3: arch.SetTriple ("armv5-apple-ios"); return true; 787b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 4: arch.SetTriple ("armv4-apple-ios"); return true; 788b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 5: arch.SetTriple ("arm-apple-ios"); return true; 789b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 6: arch.SetTriple ("thumbv7k-apple-ios"); return true; 790b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 7: arch.SetTriple ("thumbv7-apple-ios"); return true; 791b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 8: arch.SetTriple ("thumbv6-apple-ios"); return true; 792b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 9: arch.SetTriple ("thumbv5-apple-ios"); return true; 793b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 10: arch.SetTriple ("thumbv4t-apple-ios"); return true; 794b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 11: arch.SetTriple ("thumb-apple-ios"); return true; 795b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: break; 7969d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda } 7979d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda break; 7989d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 7999d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda case ArchSpec::eCore_arm_armv7s: 8009d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda switch (idx) 8019d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda { 802b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 0: arch.SetTriple ("armv7s-apple-ios"); return true; 803b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 1: arch.SetTriple ("armv7-apple-ios"); return true; 804b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 2: arch.SetTriple ("armv6-apple-ios"); return true; 805b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 3: arch.SetTriple ("armv5-apple-ios"); return true; 806b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 4: arch.SetTriple ("armv4-apple-ios"); return true; 807b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 5: arch.SetTriple ("arm-apple-ios"); return true; 808b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 6: arch.SetTriple ("thumbv7s-apple-ios"); return true; 809b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 7: arch.SetTriple ("thumbv7-apple-ios"); return true; 810b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 8: arch.SetTriple ("thumbv6-apple-ios"); return true; 8119ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 9: arch.SetTriple ("thumbv5-apple-ios"); return true; 8129ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 10: arch.SetTriple ("thumbv4t-apple-ios"); return true; 8139ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 11: arch.SetTriple ("thumb-apple-ios"); return true; 8149ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda default: break; 8159ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda } 8169ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda break; 8179ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda 8189ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case ArchSpec::eCore_arm_armv7m: 8199ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda switch (idx) 8209ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda { 8219ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 0: arch.SetTriple ("armv7m-apple-ios"); return true; 8229ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 1: arch.SetTriple ("armv7-apple-ios"); return true; 8239ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 2: arch.SetTriple ("armv6-apple-ios"); return true; 8249ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 3: arch.SetTriple ("armv5-apple-ios"); return true; 8259ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 4: arch.SetTriple ("armv4-apple-ios"); return true; 8269ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 5: arch.SetTriple ("arm-apple-ios"); return true; 8279ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 6: arch.SetTriple ("thumbv7m-apple-ios"); return true; 8289ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 7: arch.SetTriple ("thumbv7-apple-ios"); return true; 8299ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 8: arch.SetTriple ("thumbv6-apple-ios"); return true; 8309ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 9: arch.SetTriple ("thumbv5-apple-ios"); return true; 8319ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 10: arch.SetTriple ("thumbv4t-apple-ios"); return true; 8329ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 11: arch.SetTriple ("thumb-apple-ios"); return true; 8339ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda default: break; 8349ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda } 8359ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda break; 8369ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda 8379ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case ArchSpec::eCore_arm_armv7em: 8389ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda switch (idx) 8399ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda { 8409ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 0: arch.SetTriple ("armv7em-apple-ios"); return true; 8419ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 1: arch.SetTriple ("armv7-apple-ios"); return true; 8429ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 2: arch.SetTriple ("armv6-apple-ios"); return true; 8439ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 3: arch.SetTriple ("armv5-apple-ios"); return true; 8449ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 4: arch.SetTriple ("armv4-apple-ios"); return true; 8459ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 5: arch.SetTriple ("arm-apple-ios"); return true; 8469ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 6: arch.SetTriple ("thumbv7em-apple-ios"); return true; 8479ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 7: arch.SetTriple ("thumbv7-apple-ios"); return true; 8489ab14e1ce51a8583bf74752540753a44ada10060Jason Molenda case 8: arch.SetTriple ("thumbv6-apple-ios"); return true; 849b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 9: arch.SetTriple ("thumbv5-apple-ios"); return true; 850b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 10: arch.SetTriple ("thumbv4t-apple-ios"); return true; 851b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 11: arch.SetTriple ("thumb-apple-ios"); return true; 852b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: break; 8539d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda } 8549d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda break; 8559d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 8569d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda case ArchSpec::eCore_arm_armv7: 8579d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda switch (idx) 8589d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda { 859b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 0: arch.SetTriple ("armv7-apple-ios"); return true; 860b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 1: arch.SetTriple ("armv6-apple-ios"); return true; 861b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 2: arch.SetTriple ("armv5-apple-ios"); return true; 862b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 3: arch.SetTriple ("armv4-apple-ios"); return true; 863b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 4: arch.SetTriple ("arm-apple-ios"); return true; 864b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 5: arch.SetTriple ("thumbv7-apple-ios"); return true; 865b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 6: arch.SetTriple ("thumbv6-apple-ios"); return true; 866b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 7: arch.SetTriple ("thumbv5-apple-ios"); return true; 867b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 8: arch.SetTriple ("thumbv4t-apple-ios"); return true; 868b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 9: arch.SetTriple ("thumb-apple-ios"); return true; 869b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: break; 8709d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda } 8719d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda break; 8729d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 8739d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda case ArchSpec::eCore_arm_armv6: 8749d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda switch (idx) 8759d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda { 876b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 0: arch.SetTriple ("armv6-apple-ios"); return true; 877b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 1: arch.SetTriple ("armv5-apple-ios"); return true; 878b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 2: arch.SetTriple ("armv4-apple-ios"); return true; 879b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 3: arch.SetTriple ("arm-apple-ios"); return true; 880b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 4: arch.SetTriple ("thumbv6-apple-ios"); return true; 881b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 5: arch.SetTriple ("thumbv5-apple-ios"); return true; 882b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 6: arch.SetTriple ("thumbv4t-apple-ios"); return true; 883b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 7: arch.SetTriple ("thumb-apple-ios"); return true; 884b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: break; 8859d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda } 8869d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda break; 8879d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 8889d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda case ArchSpec::eCore_arm_armv5: 8899d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda switch (idx) 8909d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda { 891b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 0: arch.SetTriple ("armv5-apple-ios"); return true; 892b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 1: arch.SetTriple ("armv4-apple-ios"); return true; 893b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 2: arch.SetTriple ("arm-apple-ios"); return true; 894b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 3: arch.SetTriple ("thumbv5-apple-ios"); return true; 895b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 4: arch.SetTriple ("thumbv4t-apple-ios"); return true; 896b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 5: arch.SetTriple ("thumb-apple-ios"); return true; 897b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: break; 8989d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda } 8999d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda break; 9009d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda 9019d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda case ArchSpec::eCore_arm_armv4: 9029d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda switch (idx) 9039d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda { 904b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 0: arch.SetTriple ("armv4-apple-ios"); return true; 905b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 1: arch.SetTriple ("arm-apple-ios"); return true; 906b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 2: arch.SetTriple ("thumbv4t-apple-ios"); return true; 907b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case 3: arch.SetTriple ("thumb-apple-ios"); return true; 908b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: break; 9099d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda } 9109d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda break; 9119d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda } 9129d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda arch.Clear(); 9139d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda return false; 9149d3c618680dd8bc8f250d700aac7f78eecbbf69bJason Molenda} 915f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton 916f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton 917f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Claytonconst char * 918f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg ClaytonPlatformDarwin::GetDeveloperDirectory() 919f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton{ 920f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (m_developer_directory.empty()) 921f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 922f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton bool developer_dir_path_valid = false; 923f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton char developer_dir_path[PATH_MAX]; 924f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton FileSpec temp_file_spec; 925f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (Host::GetLLDBPath (ePathTypeLLDBShlibDir, temp_file_spec)) 926f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 927f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (temp_file_spec.GetPath (developer_dir_path, sizeof(developer_dir_path))) 928f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 929f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton char *shared_frameworks = strstr (developer_dir_path, "/SharedFrameworks/LLDB.framework"); 930f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (shared_frameworks) 931f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 932f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton ::snprintf (shared_frameworks, 933f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton sizeof(developer_dir_path) - (shared_frameworks - developer_dir_path), 934f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton "/Developer"); 935f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton developer_dir_path_valid = true; 936f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 937f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton else 938f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 939f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton char *lib_priv_frameworks = strstr (developer_dir_path, "/Library/PrivateFrameworks/LLDB.framework"); 940f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (lib_priv_frameworks) 941f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 942f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton *lib_priv_frameworks = '\0'; 943f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton developer_dir_path_valid = true; 944f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 945f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 946f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 947f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 948f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton 949f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (!developer_dir_path_valid) 950f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 951f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton std::string xcode_dir_path; 952f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton const char *xcode_select_prefix_dir = getenv ("XCODE_SELECT_PREFIX_DIR"); 953f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (xcode_select_prefix_dir) 954f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton xcode_dir_path.append (xcode_select_prefix_dir); 955f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton xcode_dir_path.append ("/usr/share/xcode-select/xcode_dir_path"); 956f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton temp_file_spec.SetFile(xcode_dir_path.c_str(), false); 957f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton size_t bytes_read = temp_file_spec.ReadFileContents(0, developer_dir_path, sizeof(developer_dir_path), NULL); 958f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (bytes_read > 0) 959f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 960f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton developer_dir_path[bytes_read] = '\0'; 961f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton while (developer_dir_path[bytes_read-1] == '\r' || 962f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton developer_dir_path[bytes_read-1] == '\n') 963f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton developer_dir_path[--bytes_read] = '\0'; 964f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton developer_dir_path_valid = true; 965f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 966f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 967f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton 96818d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda if (!developer_dir_path_valid) 96918d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda { 97018d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda FileSpec xcode_select_cmd ("/usr/bin/xcode-select", false); 97118d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda if (xcode_select_cmd.Exists()) 97218d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda { 97318d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda int exit_status = -1; 97418d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda int signo = -1; 97518d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda std::string command_output; 97618d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda Error error = Host::RunShellCommand ("/usr/bin/xcode-select --print-path", 97718d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda NULL, // current working directory 97818d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda &exit_status, 97918d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda &signo, 98018d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda &command_output, 98118d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda 2, // short timeout 98218d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda NULL); // don't run in a shell 98318d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda if (error.Success() && exit_status == 0 && !command_output.empty()) 98418d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda { 98518d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda const char *cmd_output_ptr = command_output.c_str(); 98618d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda developer_dir_path[sizeof (developer_dir_path) - 1] = '\0'; 9873e11c7ec050648ba865f1d451f8cb46fd39072a8Andy Gibbs size_t i; 98818d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda for (i = 0; i < sizeof (developer_dir_path) - 1; i++) 98918d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda { 99018d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda if (cmd_output_ptr[i] == '\r' || cmd_output_ptr[i] == '\n' || cmd_output_ptr[i] == '\0') 99118d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda break; 99218d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda developer_dir_path[i] = cmd_output_ptr[i]; 99318d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda } 99418d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda developer_dir_path[i] = '\0'; 99518d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda 99618d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda FileSpec devel_dir (developer_dir_path, false); 99718d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda if (devel_dir.Exists() && devel_dir.IsDirectory()) 99818d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda { 99918d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda developer_dir_path_valid = true; 100018d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda } 100118d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda } 100218d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda } 100318d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda } 100418d5a27c36b7af88ac7507c80e66a9f0c4265815Jason Molenda 1005f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (developer_dir_path_valid) 1006f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 1007f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton temp_file_spec.SetFile (developer_dir_path, false); 1008f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (temp_file_spec.Exists()) 1009f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton { 1010f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton m_developer_directory.assign (developer_dir_path); 1011f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton return m_developer_directory.c_str(); 1012f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 1013f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 1014f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton // Assign a single NULL character so we know we tried to find the device 1015f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton // support directory and we don't keep trying to find it over and over. 1016f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton m_developer_directory.assign (1, '\0'); 1017f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton } 1018f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton 1019f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton // We should have put a single NULL character into m_developer_directory 1020f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton // or it should have a valid path if the code gets here 1021f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton assert (m_developer_directory.empty() == false); 1022f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton if (m_developer_directory[0]) 1023f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton return m_developer_directory.c_str(); 1024f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton return NULL; 1025f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton} 1026f96c883fde04b2ef8733812c16b0a07ad0cc7439Greg Clayton 1027bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 1028bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg ClaytonBreakpointSP 1029bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg ClaytonPlatformDarwin::SetThreadCreationBreakpoint (Target &target) 1030bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton{ 1031bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton BreakpointSP bp_sp; 1032bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton static const char *g_bp_names[] = 1033bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton { 1034bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton "start_wqthread", 1035bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton "_pthread_wqthread", 1036bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton "_pthread_start", 1037bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton }; 1038bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 1039bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton static const char *g_bp_modules[] = 1040bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton { 1041bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton "libsystem_c.dylib", 1042bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton "libSystem.B.dylib" 1043bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton }; 1044bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 1045bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton FileSpecList bp_modules; 10463e11c7ec050648ba865f1d451f8cb46fd39072a8Andy Gibbs for (size_t i = 0; i < sizeof(g_bp_modules)/sizeof(const char *); i++) 1047bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton { 1048bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton const char *bp_module = g_bp_modules[i]; 1049bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton bp_modules.Append(FileSpec(bp_module, false)); 1050bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton } 1051bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 10522cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham bool internal = true; 10532cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham LazyBool skip_prologue = eLazyBoolNo; 1054bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton bp_sp = target.CreateBreakpoint (&bp_modules, 1055bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton NULL, 1056bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton g_bp_names, 1057bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton sizeof(g_bp_names)/sizeof(const char *), 1058bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton eFunctionNameTypeFull, 10592cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham skip_prologue, 10602cf5ccbbbe3343a6c973d0d65ad5de178a414e30Jim Ingham internal); 1061090f83176695d86197b0e86b67dee4160ec5003dJim Ingham bp_sp->SetBreakpointKind("thread-creation"); 1062bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 1063bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton return bp_sp; 1064bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton} 1065bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton 106673844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonsize_t 106773844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonPlatformDarwin::GetEnvironment (StringList &env) 106873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 106973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (IsRemote()) 107073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton { 107173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton if (m_remote_platform_sp) 107273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return m_remote_platform_sp->GetEnvironment(env); 107373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return 0; 107473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton } 107573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return Host::GetEnvironment(env); 107673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 1077