Platform.cpp revision 444fe998bf707bd076a70c3a779db8575533695e
1e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//===-- Platform.cpp --------------------------------------------*- C++ -*-===//
2e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//
3e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//                     The LLVM Compiler Infrastructure
4e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//
5e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// This file is distributed under the University of Illinois Open Source
6e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// License. See LICENSE.TXT for details.
7e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//
8e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//===----------------------------------------------------------------------===//
9e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
10e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Target/Platform.h"
11e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
12e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// C Includes
13e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// C++ Includes
14e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// Other libraries and framework includes
15e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// Project includes
16e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Core/Error.h"
17b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton#include "lldb/Core/Log.h"
18e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Core/PluginManager.h"
19e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Host/FileSpec.h"
20b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Host/Host.h"
21b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton#include "lldb/Target/Process.h"
22e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Target/Target.h"
23e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
24e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonusing namespace lldb;
25e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonusing namespace lldb_private;
26e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
27e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// Use a singleton function for g_local_platform_sp to avoid init
28e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// constructors since LLDB is often part of a shared library
29e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonstatic PlatformSP&
30e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonGetDefaultPlatformSP ()
31e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
32e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    static PlatformSP g_default_platform_sp;
33e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return g_default_platform_sp;
34e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
35e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
36e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonstatic Mutex &
37e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonGetConnectedPlatformListMutex ()
38e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
39e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    static Mutex g_remote_connected_platforms_mutex (Mutex::eMutexTypeRecursive);
40e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return g_remote_connected_platforms_mutex;
41e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
42e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonstatic std::vector<PlatformSP> &
43e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonGetConnectedPlatformList ()
44e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
45e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    static std::vector<PlatformSP> g_remote_connected_platforms;
46e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return g_remote_connected_platforms;
47e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
48e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
495e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton
505e342f50b42b265d8568e1c926328858e74b2c0aGreg Claytonconst char *
515e342f50b42b265d8568e1c926328858e74b2c0aGreg ClaytonPlatform::GetHostPlatformName ()
525e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton{
535e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton    return "host";
545e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton}
555e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton
56e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
57e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// Get the native host platform plug-in.
58e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton///
59e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// There should only be one of these for each host that LLDB runs
60e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// upon that should be statically compiled in and registered using
61e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// preprocessor macros or other similar build mechanisms.
62e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton///
63e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// This platform will be used as the default platform when launching
64e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// or attaching to processes unless another platform is specified.
65e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
66e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformSP
67e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::GetDefaultPlatform ()
68e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
69e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return GetDefaultPlatformSP ();
70e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
71e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
72e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonvoid
73e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::SetDefaultPlatform (const lldb::PlatformSP &platform_sp)
74e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
75e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    // The native platform should use its static void Platform::Initialize()
76e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    // function to register itself as the native platform.
77e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    GetDefaultPlatformSP () = platform_sp;
78e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
79e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
80e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError
81cb8977d726be451df9978a74088435667fa37da2Greg ClaytonPlatform::GetFile (const FileSpec &platform_file,
82cb8977d726be451df9978a74088435667fa37da2Greg Clayton                   const UUID *uuid_ptr,
83cb8977d726be451df9978a74088435667fa37da2Greg Clayton                   FileSpec &local_file)
84e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
85e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    // Default to the local case
86e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    local_file = platform_file;
87e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return Error();
88e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
89e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
9024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonError
91444fe998bf707bd076a70c3a779db8575533695eGreg ClaytonPlatform::GetSharedModule (const ModuleSpec &module_spec,
9224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                           ModuleSP &module_sp,
939ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                           const FileSpecList *module_search_paths_ptr,
9424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                           ModuleSP *old_module_sp_ptr,
9524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                           bool *did_create_ptr)
9624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
9724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // Don't do any path remapping for the default implementation
9824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // of the platform GetSharedModule function, just call through
9924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // to our static ModuleList function. Platform subclasses that
10024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // implement remote debugging, might have a developer kits
10124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // installed that have cached versions of the files for the
10224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // remote target, or might implement a download and cache
10324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // locally implementation.
10424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    const bool always_create = false;
105444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    return ModuleList::GetSharedModule (module_spec,
10624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                        module_sp,
1079ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                        module_search_paths_ptr,
10824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                        old_module_sp_ptr,
10924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                        did_create_ptr,
11024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                        always_create);
11124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
11224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
113e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
114e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformSP
115b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::Create (const char *platform_name, Error &error)
116e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
117e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    PlatformCreateInstance create_callback = NULL;
118e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    lldb::PlatformSP platform_sp;
119b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (platform_name && platform_name[0])
120e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    {
121e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        create_callback = PluginManager::GetPlatformCreateCallbackForPluginName (platform_name);
122e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        if (create_callback)
123e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            platform_sp.reset(create_callback());
124e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        else
125b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            error.SetErrorStringWithFormat ("unable to find a plug-in for the platform named \"%s\"", platform_name);
126e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    }
127e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    else
128b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        error.SetErrorString ("invalid platform name");
129e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return platform_sp;
130e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
131e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
132e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonuint32_t
133e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::GetNumConnectedRemotePlatforms ()
134e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
135e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    Mutex::Locker locker (GetConnectedPlatformListMutex ());
136e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return GetConnectedPlatformList().size();
137e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
138e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
139e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformSP
140e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::GetConnectedRemotePlatformAtIndex (uint32_t idx)
141e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
142e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    PlatformSP platform_sp;
143e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    {
144e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        Mutex::Locker locker (GetConnectedPlatformListMutex ());
145e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        if (idx < GetConnectedPlatformList().size())
146e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            platform_sp = GetConnectedPlatformList ()[idx];
147e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    }
148e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return platform_sp;
149e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
150e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
151e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
152e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// Default Constructor
153e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
154b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::Platform (bool is_host) :
155b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_is_host (is_host),
156b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_os_version_set_while_connected (false),
157b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_system_arch_set_while_connected (false),
158604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton    m_sdk_sysroot (),
159604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton    m_sdk_build (),
160b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_remote_url (),
16158e26e0935138225477fd61283215ceff2068899Greg Clayton    m_name (),
162b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_major_os_version (UINT32_MAX),
163b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_minor_os_version (UINT32_MAX),
16424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_update_os_version (UINT32_MAX),
16524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_system_arch(),
16624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_uid_map_mutex (Mutex::eMutexTypeNormal),
16724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_gid_map_mutex (Mutex::eMutexTypeNormal),
16824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_uid_map(),
16924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_gid_map(),
17024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_max_uid_name_len (0),
17124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_max_gid_name_len (0)
172e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
173b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
174b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (log)
175b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        log->Printf ("%p Platform::Platform()", this);
176e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
177e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
178e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
179e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// Destructor.
180e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton///
181e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// The destructor is virtual since this class is designed to be
182e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// inherited from by the plug-in instance.
183e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
184e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::~Platform()
185e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
186b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
187b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (log)
188b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        log->Printf ("%p Platform::~Platform()", this);
189e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
190e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
19158e26e0935138225477fd61283215ceff2068899Greg Claytonvoid
19258e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetStatus (Stream &strm)
19358e26e0935138225477fd61283215ceff2068899Greg Clayton{
19458e26e0935138225477fd61283215ceff2068899Greg Clayton    uint32_t major = UINT32_MAX;
19558e26e0935138225477fd61283215ceff2068899Greg Clayton    uint32_t minor = UINT32_MAX;
19658e26e0935138225477fd61283215ceff2068899Greg Clayton    uint32_t update = UINT32_MAX;
19758e26e0935138225477fd61283215ceff2068899Greg Clayton    std::string s;
19824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    strm.Printf ("  Platform: %s\n", GetShortPluginName());
19958e26e0935138225477fd61283215ceff2068899Greg Clayton
20058e26e0935138225477fd61283215ceff2068899Greg Clayton    ArchSpec arch (GetSystemArchitecture());
20158e26e0935138225477fd61283215ceff2068899Greg Clayton    if (arch.IsValid())
20258e26e0935138225477fd61283215ceff2068899Greg Clayton    {
20358e26e0935138225477fd61283215ceff2068899Greg Clayton        if (!arch.GetTriple().str().empty())
20424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        strm.Printf("    Triple: %s\n", arch.GetTriple().str().c_str());
20558e26e0935138225477fd61283215ceff2068899Greg Clayton    }
20658e26e0935138225477fd61283215ceff2068899Greg Clayton
20758e26e0935138225477fd61283215ceff2068899Greg Clayton    if (GetOSVersion(major, minor, update))
20858e26e0935138225477fd61283215ceff2068899Greg Clayton    {
20924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        strm.Printf("OS Version: %u", major);
21058e26e0935138225477fd61283215ceff2068899Greg Clayton        if (minor != UINT32_MAX)
21158e26e0935138225477fd61283215ceff2068899Greg Clayton            strm.Printf(".%u", minor);
21258e26e0935138225477fd61283215ceff2068899Greg Clayton        if (update != UINT32_MAX)
21358e26e0935138225477fd61283215ceff2068899Greg Clayton            strm.Printf(".%u", update);
21458e26e0935138225477fd61283215ceff2068899Greg Clayton
21558e26e0935138225477fd61283215ceff2068899Greg Clayton        if (GetOSBuildString (s))
21658e26e0935138225477fd61283215ceff2068899Greg Clayton            strm.Printf(" (%s)", s.c_str());
21758e26e0935138225477fd61283215ceff2068899Greg Clayton
21858e26e0935138225477fd61283215ceff2068899Greg Clayton        strm.EOL();
21958e26e0935138225477fd61283215ceff2068899Greg Clayton    }
22058e26e0935138225477fd61283215ceff2068899Greg Clayton
22158e26e0935138225477fd61283215ceff2068899Greg Clayton    if (GetOSKernelDescription (s))
22224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        strm.Printf("    Kernel: %s\n", s.c_str());
22358e26e0935138225477fd61283215ceff2068899Greg Clayton
22458e26e0935138225477fd61283215ceff2068899Greg Clayton    if (IsHost())
22558e26e0935138225477fd61283215ceff2068899Greg Clayton    {
22624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        strm.Printf("  Hostname: %s\n", GetHostname());
22758e26e0935138225477fd61283215ceff2068899Greg Clayton    }
22858e26e0935138225477fd61283215ceff2068899Greg Clayton    else
22958e26e0935138225477fd61283215ceff2068899Greg Clayton    {
23024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        const bool is_connected = IsConnected();
23124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        if (is_connected)
23224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            strm.Printf("  Hostname: %s\n", GetHostname());
23324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        strm.Printf(" Connected: %s\n", is_connected ? "yes" : "no");
23458e26e0935138225477fd61283215ceff2068899Greg Clayton    }
23558e26e0935138225477fd61283215ceff2068899Greg Clayton}
23658e26e0935138225477fd61283215ceff2068899Greg Clayton
237b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
238b1888f24fa181489840b9acf193e224d125d0776Greg Claytonbool
239b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::GetOSVersion (uint32_t &major,
240b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        uint32_t &minor,
241b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        uint32_t &update)
242b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
243b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    bool success = m_major_os_version != UINT32_MAX;
244b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (IsHost())
245b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
246b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (!success)
247b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
248b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // We have a local host platform
249b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            success = Host::GetOSVersion (m_major_os_version,
250b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                          m_minor_os_version,
251b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                          m_update_os_version);
252b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_os_version_set_while_connected = success;
253b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
254b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
255b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    else
256b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
257b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // We have a remote platform. We can only fetch the remote
258b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // OS version if we are connected, and we don't want to do it
259b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // more than once.
260b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
261b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        const bool is_connected = IsConnected();
262b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
26358e26e0935138225477fd61283215ceff2068899Greg Clayton        bool fetch = false;
264b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (success)
265b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
266b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // We have valid OS version info, check to make sure it wasn't
267b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // manually set prior to connecting. If it was manually set prior
268b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // to connecting, then lets fetch the actual OS version info
269b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // if we are now connected.
270b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (is_connected && !m_os_version_set_while_connected)
27158e26e0935138225477fd61283215ceff2068899Greg Clayton                fetch = true;
272b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
273b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        else
274b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
275b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // We don't have valid OS version info, fetch it if we are connected
27658e26e0935138225477fd61283215ceff2068899Greg Clayton            fetch = is_connected;
277b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
278b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
27958e26e0935138225477fd61283215ceff2068899Greg Clayton        if (fetch)
280b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
28158e26e0935138225477fd61283215ceff2068899Greg Clayton            success = GetRemoteOSVersion ();
282b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_os_version_set_while_connected = success;
283b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
284b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
285b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
286b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (success)
287b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
288b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        major = m_major_os_version;
289b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        minor = m_minor_os_version;
290b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        update = m_update_os_version;
291b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
292b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return success;
293b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
29458e26e0935138225477fd61283215ceff2068899Greg Clayton
29558e26e0935138225477fd61283215ceff2068899Greg Claytonbool
29658e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetOSBuildString (std::string &s)
29758e26e0935138225477fd61283215ceff2068899Greg Clayton{
29858e26e0935138225477fd61283215ceff2068899Greg Clayton    if (IsHost())
29958e26e0935138225477fd61283215ceff2068899Greg Clayton        return Host::GetOSBuildString (s);
30058e26e0935138225477fd61283215ceff2068899Greg Clayton    else
30158e26e0935138225477fd61283215ceff2068899Greg Clayton        return GetRemoteOSBuildString (s);
30258e26e0935138225477fd61283215ceff2068899Greg Clayton}
30358e26e0935138225477fd61283215ceff2068899Greg Clayton
30458e26e0935138225477fd61283215ceff2068899Greg Claytonbool
30558e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetOSKernelDescription (std::string &s)
30658e26e0935138225477fd61283215ceff2068899Greg Clayton{
30758e26e0935138225477fd61283215ceff2068899Greg Clayton    if (IsHost())
30858e26e0935138225477fd61283215ceff2068899Greg Clayton        return Host::GetOSKernelDescription (s);
30958e26e0935138225477fd61283215ceff2068899Greg Clayton    else
31058e26e0935138225477fd61283215ceff2068899Greg Clayton        return GetRemoteOSKernelDescription (s);
31158e26e0935138225477fd61283215ceff2068899Greg Clayton}
31258e26e0935138225477fd61283215ceff2068899Greg Clayton
31358e26e0935138225477fd61283215ceff2068899Greg Claytonconst char *
314b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::GetName ()
315b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{
316b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    const char *name = GetHostname();
317b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (name == NULL || name[0] == '\0')
318b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        name = GetShortPluginName();
319b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    return name;
320b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}
321b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
322b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonconst char *
32358e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetHostname ()
32458e26e0935138225477fd61283215ceff2068899Greg Clayton{
3255e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton    if (IsHost())
3265e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        return "localhost";
32724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
32824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (m_name.empty())
32924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return NULL;
33024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    return m_name.c_str();
33158e26e0935138225477fd61283215ceff2068899Greg Clayton}
33258e26e0935138225477fd61283215ceff2068899Greg Clayton
33324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonconst char *
33424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonPlatform::GetUserName (uint32_t uid)
33524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
33624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    const char *user_name = GetCachedUserName(uid);
33724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (user_name)
33824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return user_name;
33924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (IsHost())
34024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    {
34124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        std::string name;
34224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        if (Host::GetUserName(uid, name))
34324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            return SetCachedUserName (uid, name.c_str(), name.size());
34424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    }
34524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    return NULL;
34624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
34758e26e0935138225477fd61283215ceff2068899Greg Clayton
34824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonconst char *
34924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonPlatform::GetGroupName (uint32_t gid)
35024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
35124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    const char *group_name = GetCachedGroupName(gid);
35224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (group_name)
35324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return group_name;
35424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (IsHost())
35524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    {
35624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        std::string name;
35724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        if (Host::GetGroupName(gid, name))
35824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            return SetCachedGroupName (gid, name.c_str(), name.size());
35924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    }
36024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    return NULL;
36124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
36258e26e0935138225477fd61283215ceff2068899Greg Clayton
363b1888f24fa181489840b9acf193e224d125d0776Greg Claytonbool
364b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::SetOSVersion (uint32_t major,
365b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        uint32_t minor,
366b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        uint32_t update)
367b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
368b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (IsHost())
369b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
370b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // We don't need anyone setting the OS version for the host platform,
371b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // we should be able to figure it out by calling Host::GetOSVersion(...).
372b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        return false;
373b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
374b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    else
375b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
376b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // We have a remote platform, allow setting the target OS version if
377b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // we aren't connected, since if we are connected, we should be able to
378b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // request the remote OS version from the connected platform.
379b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (IsConnected())
380b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            return false;
381b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        else
382b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
383b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // We aren't connected and we might want to set the OS version
384b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // ahead of time before we connect so we can peruse files and
385b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // use a local SDK or PDK cache of support files to disassemble
386b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // or do other things.
387b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_major_os_version = major;
388b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_minor_os_version = minor;
389b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_update_os_version = update;
390b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            return true;
391b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
392b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
393b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return false;
394b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
395b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
396b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
397e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError
398e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::ResolveExecutable (const FileSpec &exe_file,
399e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                             const ArchSpec &exe_arch,
4009ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                             lldb::ModuleSP &exe_module_sp,
4019ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                             const FileSpecList *module_search_paths_ptr)
402e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
403e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    Error error;
404e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    if (exe_file.Exists())
405e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    {
406444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        ModuleSpec module_spec (exe_file, exe_arch);
407444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        if (module_spec.GetArchitecture().IsValid())
408e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        {
409444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            error = ModuleList::GetSharedModule (module_spec,
410e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                 exe_module_sp,
4119ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                                 module_search_paths_ptr,
412e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                 NULL,
413e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                 NULL);
414e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        }
415e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        else
416e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        {
417e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            // No valid architecture was specified, ask the platform for
418e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            // the architectures that we should be using (in the correct order)
419e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            // and see if we can find a match that way
420444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            for (uint32_t idx = 0; GetSupportedArchitectureAtIndex (idx, module_spec.GetArchitecture()); ++idx)
421e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            {
422444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                error = ModuleList::GetSharedModule (module_spec,
423e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                     exe_module_sp,
4249ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                                     module_search_paths_ptr,
425e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                     NULL,
426e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                     NULL);
427e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                // Did we find an executable using one of the
428e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                if (error.Success() && exe_module_sp)
429e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                    break;
430e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            }
431e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        }
432e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    }
433e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    else
434e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    {
435e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        error.SetErrorStringWithFormat ("'%s%s%s' does not exist",
436e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                        exe_file.GetDirectory().AsCString(""),
437e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                        exe_file.GetDirectory() ? "/" : "",
438e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                        exe_file.GetFilename().AsCString(""));
439e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    }
440e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return error;
441e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
442e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
443f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Claytonbool
444f2bf870da5819415d52bc7da98c151cedf1e6dffGreg ClaytonPlatform::ResolveRemotePath (const FileSpec &platform_path,
445f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton                             FileSpec &resolved_platform_path)
446f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton{
447f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton    resolved_platform_path = platform_path;
448f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton    return resolved_platform_path.ResolvePath();
449f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton}
450f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton
451b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
452b1888f24fa181489840b9acf193e224d125d0776Greg Claytonconst ArchSpec &
453b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::GetSystemArchitecture()
454b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
455b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (IsHost())
456b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
457b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (!m_system_arch.IsValid())
458b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
459b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // We have a local host platform
460b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_system_arch = Host::GetArchitecture();
461b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_system_arch_set_while_connected = m_system_arch.IsValid();
462b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
463b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
464b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    else
465b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
466b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // We have a remote platform. We can only fetch the remote
467b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // system architecture if we are connected, and we don't want to do it
468b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // more than once.
469b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
470b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        const bool is_connected = IsConnected();
471b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
472b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        bool fetch = false;
473b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (m_system_arch.IsValid())
474b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
475b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // We have valid OS version info, check to make sure it wasn't
476b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // manually set prior to connecting. If it was manually set prior
477b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // to connecting, then lets fetch the actual OS version info
478b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // if we are now connected.
479b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (is_connected && !m_system_arch_set_while_connected)
480b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                fetch = true;
481b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
482b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        else
483b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
484b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // We don't have valid OS version info, fetch it if we are connected
485b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            fetch = is_connected;
486b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
487b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
488b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (fetch)
489b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
49058e26e0935138225477fd61283215ceff2068899Greg Clayton            m_system_arch = GetRemoteSystemArchitecture ();
491b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_system_arch_set_while_connected = m_system_arch.IsValid();
492b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
493b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
494b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return m_system_arch;
495b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
496b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
497b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
498e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError
499cb8977d726be451df9978a74088435667fa37da2Greg ClaytonPlatform::ConnectRemote (Args& args)
500e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
501e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    Error error;
502cb8977d726be451df9978a74088435667fa37da2Greg Clayton    if (IsHost())
503cb8977d726be451df9978a74088435667fa37da2Greg Clayton        error.SetErrorStringWithFormat ("The currently selected platform (%s) is the host platform and is always connected.", GetShortPluginName());
504cb8977d726be451df9978a74088435667fa37da2Greg Clayton    else
505cb8977d726be451df9978a74088435667fa37da2Greg Clayton        error.SetErrorStringWithFormat ("Platform::ConnectRemote() is not supported by %s", GetShortPluginName());
506e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return error;
507e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
508e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
509e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError
510cb8977d726be451df9978a74088435667fa37da2Greg ClaytonPlatform::DisconnectRemote ()
511e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
512e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    Error error;
513cb8977d726be451df9978a74088435667fa37da2Greg Clayton    if (IsHost())
514cb8977d726be451df9978a74088435667fa37da2Greg Clayton        error.SetErrorStringWithFormat ("The currently selected platform (%s) is the host platform and is always connected.", GetShortPluginName());
515cb8977d726be451df9978a74088435667fa37da2Greg Clayton    else
516cb8977d726be451df9978a74088435667fa37da2Greg Clayton        error.SetErrorStringWithFormat ("Platform::DisconnectRemote() is not supported by %s", GetShortPluginName());
517e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return error;
518e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
51924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
52024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonbool
521b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info)
52224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
52324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // Take care of the host case so that each subclass can just
524b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // call this function to get the host functionality.
52524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (IsHost())
52624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return Host::GetProcessInfo (pid, process_info);
52724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    return false;
52824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
52924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
53024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonuint32_t
531b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::FindProcesses (const ProcessInstanceInfoMatch &match_info,
532b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                         ProcessInstanceInfoList &process_infos)
53324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
534b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // Take care of the host case so that each subclass can just
535b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // call this function to get the host functionality.
53624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    uint32_t match_count = 0;
53724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (IsHost())
53824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        match_count = Host::FindProcesses (match_info, process_infos);
53924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    return match_count;
54024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
541b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
542b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
543b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonError
544b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::LaunchProcess (ProcessLaunchInfo &launch_info)
545b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{
546b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    Error error;
547b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // Take care of the host case so that each subclass can just
548b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // call this function to get the host functionality.
549b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (IsHost())
550b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        error = Host::LaunchProcess (launch_info);
551b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    else
552b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        error.SetErrorString ("base lldb_private::Platform class can't launch remote processes");
553b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    return error;
554b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}
555b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
556b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonlldb::ProcessSP
557b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::DebugProcess (ProcessLaunchInfo &launch_info,
558b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                        Debugger &debugger,
559b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                        Target *target,       // Can be NULL, if NULL create a new target, else use existing one
560b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                        Listener &listener,
561b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                        Error &error)
562b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{
563b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    ProcessSP process_sp;
564b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // Make sure we stop at the entry point
565b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    launch_info.GetFlags ().Set (eLaunchFlagDebug);
566b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    error = LaunchProcess (launch_info);
567b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (error.Success())
568b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    {
569527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        if (launch_info.GetProcessID() != LLDB_INVALID_PROCESS_ID)
570b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        {
571527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            ProcessAttachInfo attach_info (launch_info);
572527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton            process_sp = Attach (attach_info, debugger, target, listener, error);
573ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton            if (process_sp)
574ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton            {
575ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton                // Since we attached to the process, it will think it needs to detach
576ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton                // if the process object just goes away without an explicit call to
577ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton                // Process::Kill() or Process::Detach(), so let it know to kill the
578ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton                // process if this happens.
579ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton                process_sp->SetShouldDetach (false);
580464c6161464694412b7472129e789248f1cf21b9Greg Clayton
581464c6161464694412b7472129e789248f1cf21b9Greg Clayton                // If we didn't have any file actions, the pseudo terminal might
582464c6161464694412b7472129e789248f1cf21b9Greg Clayton                // have been used where the slave side was given as the file to
583464c6161464694412b7472129e789248f1cf21b9Greg Clayton                // open for stdin/out/err after we have already opened the master
584464c6161464694412b7472129e789248f1cf21b9Greg Clayton                // so we can read/write stdin/out/err.
585464c6161464694412b7472129e789248f1cf21b9Greg Clayton                int pty_fd = launch_info.GetPTY().ReleaseMasterFileDescriptor();
586464c6161464694412b7472129e789248f1cf21b9Greg Clayton                if (pty_fd != lldb_utility::PseudoTerminal::invalid_fd)
587464c6161464694412b7472129e789248f1cf21b9Greg Clayton                {
588464c6161464694412b7472129e789248f1cf21b9Greg Clayton                    process_sp->SetSTDIOFileDescriptor(pty_fd);
589464c6161464694412b7472129e789248f1cf21b9Greg Clayton                }
590ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton            }
591b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        }
592b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    }
593b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    return process_sp;
594b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}
595