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