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