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