Platform.cpp revision b72d0f098e45936fa72e26b1a026c603e17e2d6c
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
49e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
50e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// Get the native host platform plug-in.
51e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton///
52e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// There should only be one of these for each host that LLDB runs
53e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// upon that should be statically compiled in and registered using
54e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// preprocessor macros or other similar build mechanisms.
55e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton///
56e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// This platform will be used as the default platform when launching
57e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// or attaching to processes unless another platform is specified.
58e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
59e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformSP
60e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::GetDefaultPlatform ()
61e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
62e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return GetDefaultPlatformSP ();
63e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
64e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
65e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonvoid
66e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::SetDefaultPlatform (const lldb::PlatformSP &platform_sp)
67e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
68e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    // The native platform should use its static void Platform::Initialize()
69e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    // function to register itself as the native platform.
70e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    GetDefaultPlatformSP () = platform_sp;
71e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
72e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
73e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError
74cb8977d726be451df9978a74088435667fa37da2Greg ClaytonPlatform::GetFile (const FileSpec &platform_file,
75cb8977d726be451df9978a74088435667fa37da2Greg Clayton                   const UUID *uuid_ptr,
76cb8977d726be451df9978a74088435667fa37da2Greg Clayton                   FileSpec &local_file)
77e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
78e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    // Default to the local case
79e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    local_file = platform_file;
80e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return Error();
81e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
82e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
8324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonError
8424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonPlatform::GetSharedModule (const FileSpec &platform_file,
8524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                           const ArchSpec &arch,
8624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                           const UUID *uuid_ptr,
8724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                           const ConstString *object_name_ptr,
8824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                           off_t object_offset,
8924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                           ModuleSP &module_sp,
9024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                           ModuleSP *old_module_sp_ptr,
9124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                           bool *did_create_ptr)
9224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
9324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // Don't do any path remapping for the default implementation
9424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // of the platform GetSharedModule function, just call through
9524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // to our static ModuleList function. Platform subclasses that
9624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // implement remote debugging, might have a developer kits
9724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // installed that have cached versions of the files for the
9824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // remote target, or might implement a download and cache
9924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // locally implementation.
10024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    const bool always_create = false;
10124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    return ModuleList::GetSharedModule (platform_file,
10224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                        arch,
10324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                        uuid_ptr,
10424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                        object_name_ptr,
10524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                        object_offset,
10624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                        module_sp,
10724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                        old_module_sp_ptr,
10824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                        did_create_ptr,
10924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                        always_create);
11024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
11124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
112e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
113e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformSP
114b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::Create (const char *platform_name, Error &error)
115e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
116e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    PlatformCreateInstance create_callback = NULL;
117e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    lldb::PlatformSP platform_sp;
118b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (platform_name && platform_name[0])
119e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    {
120e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        create_callback = PluginManager::GetPlatformCreateCallbackForPluginName (platform_name);
121e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        if (create_callback)
122e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            platform_sp.reset(create_callback());
123e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        else
124b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            error.SetErrorStringWithFormat ("unable to find a plug-in for the platform named \"%s\"", platform_name);
125e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    }
126e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    else
127b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        error.SetErrorString ("invalid platform name");
128e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return platform_sp;
129e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
130e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
131e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonuint32_t
132e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::GetNumConnectedRemotePlatforms ()
133e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
134e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    Mutex::Locker locker (GetConnectedPlatformListMutex ());
135e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return GetConnectedPlatformList().size();
136e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
137e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
138e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformSP
139e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::GetConnectedRemotePlatformAtIndex (uint32_t idx)
140e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
141e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    PlatformSP platform_sp;
142e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    {
143e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        Mutex::Locker locker (GetConnectedPlatformListMutex ());
144e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        if (idx < GetConnectedPlatformList().size())
145e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            platform_sp = GetConnectedPlatformList ()[idx];
146e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    }
147e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return platform_sp;
148e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
149e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
150e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
151e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// Default Constructor
152e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
153b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::Platform (bool is_host) :
154b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_is_host (is_host),
155b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_os_version_set_while_connected (false),
156b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_system_arch_set_while_connected (false),
157b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_remote_url (),
15858e26e0935138225477fd61283215ceff2068899Greg Clayton    m_name (),
159b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_major_os_version (UINT32_MAX),
160b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_minor_os_version (UINT32_MAX),
16124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_update_os_version (UINT32_MAX),
16224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_system_arch(),
16324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_uid_map_mutex (Mutex::eMutexTypeNormal),
16424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_gid_map_mutex (Mutex::eMutexTypeNormal),
16524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_uid_map(),
16624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_gid_map(),
16724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_max_uid_name_len (0),
16824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_max_gid_name_len (0)
169e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
170b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
171b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (log)
172b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        log->Printf ("%p Platform::Platform()", this);
173e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
174e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
175e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
176e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// Destructor.
177e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton///
178e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// The destructor is virtual since this class is designed to be
179e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// inherited from by the plug-in instance.
180e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------
181e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::~Platform()
182e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
183b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
184b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (log)
185b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        log->Printf ("%p Platform::~Platform()", this);
186e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
187e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
18858e26e0935138225477fd61283215ceff2068899Greg Claytonvoid
18958e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetStatus (Stream &strm)
19058e26e0935138225477fd61283215ceff2068899Greg Clayton{
19158e26e0935138225477fd61283215ceff2068899Greg Clayton    uint32_t major = UINT32_MAX;
19258e26e0935138225477fd61283215ceff2068899Greg Clayton    uint32_t minor = UINT32_MAX;
19358e26e0935138225477fd61283215ceff2068899Greg Clayton    uint32_t update = UINT32_MAX;
19458e26e0935138225477fd61283215ceff2068899Greg Clayton    std::string s;
19524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    strm.Printf ("  Platform: %s\n", GetShortPluginName());
19658e26e0935138225477fd61283215ceff2068899Greg Clayton
19758e26e0935138225477fd61283215ceff2068899Greg Clayton    ArchSpec arch (GetSystemArchitecture());
19858e26e0935138225477fd61283215ceff2068899Greg Clayton    if (arch.IsValid())
19958e26e0935138225477fd61283215ceff2068899Greg Clayton    {
20058e26e0935138225477fd61283215ceff2068899Greg Clayton        if (!arch.GetTriple().str().empty())
20124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        strm.Printf("    Triple: %s\n", arch.GetTriple().str().c_str());
20258e26e0935138225477fd61283215ceff2068899Greg Clayton    }
20358e26e0935138225477fd61283215ceff2068899Greg Clayton
20458e26e0935138225477fd61283215ceff2068899Greg Clayton    if (GetOSVersion(major, minor, update))
20558e26e0935138225477fd61283215ceff2068899Greg Clayton    {
20624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        strm.Printf("OS Version: %u", major);
20758e26e0935138225477fd61283215ceff2068899Greg Clayton        if (minor != UINT32_MAX)
20858e26e0935138225477fd61283215ceff2068899Greg Clayton            strm.Printf(".%u", minor);
20958e26e0935138225477fd61283215ceff2068899Greg Clayton        if (update != UINT32_MAX)
21058e26e0935138225477fd61283215ceff2068899Greg Clayton            strm.Printf(".%u", update);
21158e26e0935138225477fd61283215ceff2068899Greg Clayton
21258e26e0935138225477fd61283215ceff2068899Greg Clayton        if (GetOSBuildString (s))
21358e26e0935138225477fd61283215ceff2068899Greg Clayton            strm.Printf(" (%s)", s.c_str());
21458e26e0935138225477fd61283215ceff2068899Greg Clayton
21558e26e0935138225477fd61283215ceff2068899Greg Clayton        strm.EOL();
21658e26e0935138225477fd61283215ceff2068899Greg Clayton    }
21758e26e0935138225477fd61283215ceff2068899Greg Clayton
21858e26e0935138225477fd61283215ceff2068899Greg Clayton    if (GetOSKernelDescription (s))
21924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        strm.Printf("    Kernel: %s\n", s.c_str());
22058e26e0935138225477fd61283215ceff2068899Greg Clayton
22158e26e0935138225477fd61283215ceff2068899Greg Clayton    if (IsHost())
22258e26e0935138225477fd61283215ceff2068899Greg Clayton    {
22324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        strm.Printf("  Hostname: %s\n", GetHostname());
22458e26e0935138225477fd61283215ceff2068899Greg Clayton    }
22558e26e0935138225477fd61283215ceff2068899Greg Clayton    else
22658e26e0935138225477fd61283215ceff2068899Greg Clayton    {
22724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        const bool is_connected = IsConnected();
22824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        if (is_connected)
22924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            strm.Printf("  Hostname: %s\n", GetHostname());
23024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        strm.Printf(" Connected: %s\n", is_connected ? "yes" : "no");
23158e26e0935138225477fd61283215ceff2068899Greg Clayton    }
23258e26e0935138225477fd61283215ceff2068899Greg Clayton}
23358e26e0935138225477fd61283215ceff2068899Greg Clayton
234b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
235b1888f24fa181489840b9acf193e224d125d0776Greg Claytonbool
236b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::GetOSVersion (uint32_t &major,
237b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        uint32_t &minor,
238b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        uint32_t &update)
239b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
240b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    bool success = m_major_os_version != UINT32_MAX;
241b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (IsHost())
242b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
243b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (!success)
244b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
245b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // We have a local host platform
246b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            success = Host::GetOSVersion (m_major_os_version,
247b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                          m_minor_os_version,
248b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                          m_update_os_version);
249b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_os_version_set_while_connected = success;
250b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
251b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
252b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    else
253b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
254b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // We have a remote platform. We can only fetch the remote
255b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // OS version if we are connected, and we don't want to do it
256b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // more than once.
257b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
258b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        const bool is_connected = IsConnected();
259b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
26058e26e0935138225477fd61283215ceff2068899Greg Clayton        bool fetch = false;
261b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (success)
262b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
263b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // We have valid OS version info, check to make sure it wasn't
264b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // manually set prior to connecting. If it was manually set prior
265b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // to connecting, then lets fetch the actual OS version info
266b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // if we are now connected.
267b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (is_connected && !m_os_version_set_while_connected)
26858e26e0935138225477fd61283215ceff2068899Greg Clayton                fetch = true;
269b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
270b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        else
271b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
272b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // We don't have valid OS version info, fetch it if we are connected
27358e26e0935138225477fd61283215ceff2068899Greg Clayton            fetch = is_connected;
274b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
275b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
27658e26e0935138225477fd61283215ceff2068899Greg Clayton        if (fetch)
277b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
27858e26e0935138225477fd61283215ceff2068899Greg Clayton            success = GetRemoteOSVersion ();
279b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_os_version_set_while_connected = success;
280b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
281b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
282b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
283b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (success)
284b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
285b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        major = m_major_os_version;
286b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        minor = m_minor_os_version;
287b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        update = m_update_os_version;
288b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
289b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return success;
290b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
29158e26e0935138225477fd61283215ceff2068899Greg Clayton
29258e26e0935138225477fd61283215ceff2068899Greg Claytonbool
29358e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetOSBuildString (std::string &s)
29458e26e0935138225477fd61283215ceff2068899Greg Clayton{
29558e26e0935138225477fd61283215ceff2068899Greg Clayton    if (IsHost())
29658e26e0935138225477fd61283215ceff2068899Greg Clayton        return Host::GetOSBuildString (s);
29758e26e0935138225477fd61283215ceff2068899Greg Clayton    else
29858e26e0935138225477fd61283215ceff2068899Greg Clayton        return GetRemoteOSBuildString (s);
29958e26e0935138225477fd61283215ceff2068899Greg Clayton}
30058e26e0935138225477fd61283215ceff2068899Greg Clayton
30158e26e0935138225477fd61283215ceff2068899Greg Claytonbool
30258e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetOSKernelDescription (std::string &s)
30358e26e0935138225477fd61283215ceff2068899Greg Clayton{
30458e26e0935138225477fd61283215ceff2068899Greg Clayton    if (IsHost())
30558e26e0935138225477fd61283215ceff2068899Greg Clayton        return Host::GetOSKernelDescription (s);
30658e26e0935138225477fd61283215ceff2068899Greg Clayton    else
30758e26e0935138225477fd61283215ceff2068899Greg Clayton        return GetRemoteOSKernelDescription (s);
30858e26e0935138225477fd61283215ceff2068899Greg Clayton}
30958e26e0935138225477fd61283215ceff2068899Greg Clayton
31058e26e0935138225477fd61283215ceff2068899Greg Claytonconst char *
311b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::GetName ()
312b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{
313b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    const char *name = GetHostname();
314b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (name == NULL || name[0] == '\0')
315b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        name = GetShortPluginName();
316b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    return name;
317b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}
318b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
319b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonconst char *
32058e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetHostname ()
32158e26e0935138225477fd61283215ceff2068899Greg Clayton{
32224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (IsHost() && m_name.empty())
32358e26e0935138225477fd61283215ceff2068899Greg Clayton    {
32424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        if (!Host::GetHostname(m_name))
32524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            return "localhost";
32658e26e0935138225477fd61283215ceff2068899Greg Clayton    }
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,
400e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                             lldb::ModuleSP &exe_module_sp)
401e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
402e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    Error error;
403e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    if (exe_file.Exists())
404e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    {
405e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        if (exe_arch.IsValid())
406e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        {
407e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            error = ModuleList::GetSharedModule (exe_file,
408e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                 exe_arch,
409e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                 NULL,
410e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                 NULL,
411e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                 0,
412e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                 exe_module_sp,
413e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                 NULL,
414e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                 NULL);
415e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        }
416e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        else
417e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        {
418e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            // No valid architecture was specified, ask the platform for
419e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            // the architectures that we should be using (in the correct order)
420e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            // and see if we can find a match that way
421e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            ArchSpec platform_arch;
422e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            for (uint32_t idx = 0; GetSupportedArchitectureAtIndex (idx, platform_arch); ++idx)
423e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            {
424e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                error = ModuleList::GetSharedModule (exe_file,
425e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                     platform_arch,
426e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                     NULL,
427e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                     NULL,
428e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                     0,
429e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                     exe_module_sp,
430e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                     NULL,
431e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                                     NULL);
432e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                // Did we find an executable using one of the
433e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                if (error.Success() && exe_module_sp)
434e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                    break;
435e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            }
436e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        }
437e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    }
438e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    else
439e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    {
440e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        error.SetErrorStringWithFormat ("'%s%s%s' does not exist",
441e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                        exe_file.GetDirectory().AsCString(""),
442e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                        exe_file.GetDirectory() ? "/" : "",
443e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                                        exe_file.GetFilename().AsCString(""));
444e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    }
445e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return error;
446e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
447e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
448b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
449b1888f24fa181489840b9acf193e224d125d0776Greg Claytonconst ArchSpec &
450b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::GetSystemArchitecture()
451b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{
452b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    if (IsHost())
453b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
454b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (!m_system_arch.IsValid())
455b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
456b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // We have a local host platform
457b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_system_arch = Host::GetArchitecture();
458b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_system_arch_set_while_connected = m_system_arch.IsValid();
459b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
460b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
461b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    else
462b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    {
463b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // We have a remote platform. We can only fetch the remote
464b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // system architecture if we are connected, and we don't want to do it
465b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // more than once.
466b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
467b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        const bool is_connected = IsConnected();
468b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
469b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        bool fetch = false;
470b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (m_system_arch.IsValid())
471b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
472b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // We have valid OS version info, check to make sure it wasn't
473b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // manually set prior to connecting. If it was manually set prior
474b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // to connecting, then lets fetch the actual OS version info
475b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // if we are now connected.
476b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (is_connected && !m_system_arch_set_while_connected)
477b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                fetch = true;
478b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
479b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        else
480b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
481b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            // We don't have valid OS version info, fetch it if we are connected
482b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            fetch = is_connected;
483b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
484b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
485b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        if (fetch)
486b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
48758e26e0935138225477fd61283215ceff2068899Greg Clayton            m_system_arch = GetRemoteSystemArchitecture ();
488b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_system_arch_set_while_connected = m_system_arch.IsValid();
489b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
490b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    }
491b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    return m_system_arch;
492b1888f24fa181489840b9acf193e224d125d0776Greg Clayton}
493b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
494b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
495e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError
496cb8977d726be451df9978a74088435667fa37da2Greg ClaytonPlatform::ConnectRemote (Args& args)
497e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
498e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    Error error;
499cb8977d726be451df9978a74088435667fa37da2Greg Clayton    if (IsHost())
500cb8977d726be451df9978a74088435667fa37da2Greg Clayton        error.SetErrorStringWithFormat ("The currently selected platform (%s) is the host platform and is always connected.", GetShortPluginName());
501cb8977d726be451df9978a74088435667fa37da2Greg Clayton    else
502cb8977d726be451df9978a74088435667fa37da2Greg Clayton        error.SetErrorStringWithFormat ("Platform::ConnectRemote() is not supported by %s", GetShortPluginName());
503e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return error;
504e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
505e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
506e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError
507cb8977d726be451df9978a74088435667fa37da2Greg ClaytonPlatform::DisconnectRemote ()
508e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{
509e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    Error error;
510cb8977d726be451df9978a74088435667fa37da2Greg Clayton    if (IsHost())
511cb8977d726be451df9978a74088435667fa37da2Greg Clayton        error.SetErrorStringWithFormat ("The currently selected platform (%s) is the host platform and is always connected.", GetShortPluginName());
512cb8977d726be451df9978a74088435667fa37da2Greg Clayton    else
513cb8977d726be451df9978a74088435667fa37da2Greg Clayton        error.SetErrorStringWithFormat ("Platform::DisconnectRemote() is not supported by %s", GetShortPluginName());
514e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    return error;
515e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton}
51624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
51724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonbool
518b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info)
51924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
52024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // Take care of the host case so that each subclass can just
521b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // call this function to get the host functionality.
52224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (IsHost())
52324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        return Host::GetProcessInfo (pid, process_info);
52424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    return false;
52524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
52624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
52724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonuint32_t
528b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::FindProcesses (const ProcessInstanceInfoMatch &match_info,
529b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                         ProcessInstanceInfoList &process_infos)
53024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
531b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // Take care of the host case so that each subclass can just
532b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // call this function to get the host functionality.
53324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    uint32_t match_count = 0;
53424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (IsHost())
53524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        match_count = Host::FindProcesses (match_info, process_infos);
53624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    return match_count;
53724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
538b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
539b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
540b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonError
541b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::LaunchProcess (ProcessLaunchInfo &launch_info)
542b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{
543b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    Error error;
544b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // Take care of the host case so that each subclass can just
545b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // call this function to get the host functionality.
546b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (IsHost())
547b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        error = Host::LaunchProcess (launch_info);
548b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    else
549b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        error.SetErrorString ("base lldb_private::Platform class can't launch remote processes");
550b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    return error;
551b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}
552b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
553b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonlldb::ProcessSP
554b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::DebugProcess (ProcessLaunchInfo &launch_info,
555b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                        Debugger &debugger,
556b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                        Target *target,       // Can be NULL, if NULL create a new target, else use existing one
557b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                        Listener &listener,
558b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                        Error &error)
559b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{
560b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    ProcessSP process_sp;
561b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    // Make sure we stop at the entry point
562b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    launch_info.GetFlags ().Set (eLaunchFlagDebug);
563b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    error = LaunchProcess (launch_info);
564b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (error.Success())
565b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    {
566b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        lldb::pid_t pid = launch_info.GetProcessID();
567b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        if (pid != LLDB_INVALID_PROCESS_ID)
568b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        {
569b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            process_sp = Attach (pid, debugger, target, listener, error);
570b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
571b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton//            if (process_sp)
572b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton//            {
573b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton//                if (launch_info.GetFlags().IsClear (eLaunchFlagStopAtEntry))
574b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton//                    process_sp->Resume();
575b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton//            }
576b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        }
577b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    }
578b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    return process_sp;
579b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}
580b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
581