Platform.h revision 527154d8e532f27f25af226c9e1dac607c48b5d1
1e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//===-- Platform.h ----------------------------------------------*- 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#ifndef liblldb_Platform_h_
11e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#define liblldb_Platform_h_
12e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
13e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// C Includes
14e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// C++ Includes
1524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton#include <map>
16e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include <string>
17e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include <vector>
18e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
19e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// Other libraries and framework includes
20e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// Project includes
21b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton#include "lldb/lldb-public.h"
22e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Core/ArchSpec.h"
2324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton#include "lldb/Core/ConstString.h"
24e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Core/PluginInterface.h"
25e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Host/Mutex.h"
26e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
27e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonnamespace lldb_private {
28e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
29e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    //----------------------------------------------------------------------
30e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    /// @class Platform Platform.h "lldb/Target/Platform.h"
31e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    /// @brief A plug-in interface definition class for debug platform that
32e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    /// includes many platform abilities such as:
33e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    ///     @li getting platform information such as supported architectures,
34e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    ///         supported binary file formats and more
35e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    ///     @li launching new processes
36e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    ///     @li attaching to existing processes
37e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    ///     @li download/upload files
38e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    ///     @li execute shell commands
39e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    ///     @li listing and getting info for existing processes
40e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    ///     @li attaching and possibly debugging the platform's kernel
41e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    //----------------------------------------------------------------------
42e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    class Platform : public PluginInterface
43e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    {
44e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    public:
45e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
46e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
47e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// Get the native host platform plug-in.
48e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
49e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// There should only be one of these for each host that LLDB runs
50e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// upon that should be statically compiled in and registered using
51e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// preprocessor macros or other similar build mechanisms in a
52e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// PlatformSubclass::Initialize() function.
53e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
54e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// This platform will be used as the default platform when launching
55e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// or attaching to processes unless another platform is specified.
56e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
57e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        static lldb::PlatformSP
58e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        GetDefaultPlatform ();
59e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
605e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        static const char *
615e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        GetHostPlatformName ();
625e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton
63e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        static void
64e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        SetDefaultPlatform (const lldb::PlatformSP &platform_sp);
65e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
66e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        static lldb::PlatformSP
67b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        Create (const char *platform_name, Error &error);
68e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
69e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        static uint32_t
70e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        GetNumConnectedRemotePlatforms ();
71e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
72e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        static lldb::PlatformSP
73e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        GetConnectedRemotePlatformAtIndex (uint32_t idx);
74e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
75e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
76e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// Default Constructor
77e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
78b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        Platform (bool is_host_platform);
79e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
80e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
81e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// Destructor.
82e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
83e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// The destructor is virtual since this class is designed to be
84e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// inherited from by the plug-in instance.
85e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
86e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        virtual
87e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ~Platform();
88e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
89e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
90e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// Set the target's executable based off of the existing
91e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// architecture information in \a target given a path to an
92e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// executable \a exe_file.
93e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
94e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// Each platform knows the architectures that it supports and can
95e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// select the correct architecture slice within \a exe_file by
96e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// inspecting the architecture in \a target. If the target had an
97e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// architecture specified, then in can try and obey that request
98e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// and optionally fail if the architecture doesn't match up.
99e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// If no architecture is specified, the platform should select the
100e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// default architecture from \a exe_file. Any application bundles
101e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// or executable wrappers can also be inspected for the actual
102e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// application binary within the bundle that should be used.
103e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
104e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// @return
105e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     Returns \b true if this Platform plug-in was able to find
106e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     a suitable executable, \b false otherwise.
107e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
108e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        virtual Error
109e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ResolveExecutable (const FileSpec &exe_file,
110e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                           const ArchSpec &arch,
111e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                           lldb::ModuleSP &module_sp);
112e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
113f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton        //------------------------------------------------------------------
114f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton        /// Resolves the FileSpec to a (possibly) remote path. Remote
115f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton        /// platforms must override this to resolve to a path on the remote
116f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton        /// side.
117f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton        //------------------------------------------------------------------
118f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton        virtual bool
119f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton        ResolveRemotePath (const FileSpec &platform_path,
120f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton                           FileSpec &resolved_platform_path);
121f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton
122b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        bool
123b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        GetOSVersion (uint32_t &major,
124b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                      uint32_t &minor,
125b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                      uint32_t &update);
126b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
127b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        bool
128b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        SetOSVersion (uint32_t major,
129b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                      uint32_t minor,
130b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                      uint32_t update);
131b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
13258e26e0935138225477fd61283215ceff2068899Greg Clayton        bool
13358e26e0935138225477fd61283215ceff2068899Greg Clayton        GetOSBuildString (std::string &s);
13458e26e0935138225477fd61283215ceff2068899Greg Clayton
13558e26e0935138225477fd61283215ceff2068899Greg Clayton        bool
13658e26e0935138225477fd61283215ceff2068899Greg Clayton        GetOSKernelDescription (std::string &s);
13758e26e0935138225477fd61283215ceff2068899Greg Clayton
138b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        // Returns the the hostname if we are connected, else the short plugin
139b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        // name.
140b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        const char *
141b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        GetName ();
142b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
14324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        virtual const char *
14458e26e0935138225477fd61283215ceff2068899Greg Clayton        GetHostname ();
145cb8977d726be451df9978a74088435667fa37da2Greg Clayton
146b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        virtual const char *
147b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        GetDescription () = 0;
148b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
149b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        //------------------------------------------------------------------
150b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        /// Report the current status for this platform.
151b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        ///
152b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        /// The returned string usually involves returning the OS version
153b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        /// (if available), and any SDK directory that might be being used
154b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        /// for local file caching, and if connected a quick blurb about
155b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        /// what this platform is connected to.
156b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        //------------------------------------------------------------------
157b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        virtual void
15858e26e0935138225477fd61283215ceff2068899Greg Clayton        GetStatus (Stream &strm);
159b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
160b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        //------------------------------------------------------------------
161b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // Subclasses must be able to fetch the current OS version
162b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        //
163b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // Remote classes must be connected for this to succeed. Local
164b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // subclasses don't need to override this function as it will just
165b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // call the Host::GetOSVersion().
166b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        //------------------------------------------------------------------
167b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        virtual bool
16858e26e0935138225477fd61283215ceff2068899Greg Clayton        GetRemoteOSVersion ()
16958e26e0935138225477fd61283215ceff2068899Greg Clayton        {
17058e26e0935138225477fd61283215ceff2068899Greg Clayton            return false;
17158e26e0935138225477fd61283215ceff2068899Greg Clayton        }
17258e26e0935138225477fd61283215ceff2068899Greg Clayton
17358e26e0935138225477fd61283215ceff2068899Greg Clayton        virtual bool
17458e26e0935138225477fd61283215ceff2068899Greg Clayton        GetRemoteOSBuildString (std::string &s)
175b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
17658e26e0935138225477fd61283215ceff2068899Greg Clayton            s.clear();
177b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            return false;
178b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
179b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
18058e26e0935138225477fd61283215ceff2068899Greg Clayton        virtual bool
18158e26e0935138225477fd61283215ceff2068899Greg Clayton        GetRemoteOSKernelDescription (std::string &s)
18258e26e0935138225477fd61283215ceff2068899Greg Clayton        {
18358e26e0935138225477fd61283215ceff2068899Greg Clayton            s.clear();
18458e26e0935138225477fd61283215ceff2068899Greg Clayton            return false;
18558e26e0935138225477fd61283215ceff2068899Greg Clayton        }
18658e26e0935138225477fd61283215ceff2068899Greg Clayton
18758e26e0935138225477fd61283215ceff2068899Greg Clayton        // Remote Platform subclasses need to override this function
18858e26e0935138225477fd61283215ceff2068899Greg Clayton        virtual ArchSpec
18958e26e0935138225477fd61283215ceff2068899Greg Clayton        GetRemoteSystemArchitecture ()
19058e26e0935138225477fd61283215ceff2068899Greg Clayton        {
19158e26e0935138225477fd61283215ceff2068899Greg Clayton            return ArchSpec(); // Return an invalid architecture
19258e26e0935138225477fd61283215ceff2068899Greg Clayton        }
19358e26e0935138225477fd61283215ceff2068899Greg Clayton
19458e26e0935138225477fd61283215ceff2068899Greg Clayton        virtual const char *
19524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        GetUserName (uint32_t uid);
19624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
19724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        virtual const char *
19824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        GetGroupName (uint32_t gid);
19958e26e0935138225477fd61283215ceff2068899Greg Clayton
200e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
201e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// Locate a file for a platform.
202e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
203e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// The default implementation of this function will return the same
204e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// file patch in \a local_file as was in \a platform_file.
205e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
206e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// @param[in] platform_file
207e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     The platform file path to locate and cache locally.
208e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
20924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        /// @param[in] uuid_ptr
21024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        ///     If we know the exact UUID of the file we are looking for, it
21124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        ///     can be specified. If it is not specified, we might now know
21224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        ///     the exact file. The UUID is usually some sort of MD5 checksum
21324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        ///     for the file and is sometimes known by dynamic linkers/loaders.
21424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        ///     If the UUID is known, it is best to supply it to platform
21524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        ///     file queries to ensure we are finding the correct file, not
21624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        ///     just a file at the correct path.
21724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        ///
218e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// @param[out] local_file
219e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     A locally cached version of the platform file. For platforms
220e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     that describe the current host computer, this will just be
221e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     the same file. For remote platforms, this file might come from
222e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     and SDK directory, or might need to be sync'ed over to the
223e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     current machine for efficient debugging access.
224e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
225e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// @return
226e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     An error object.
227e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
228e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        virtual Error
229cb8977d726be451df9978a74088435667fa37da2Greg Clayton        GetFile (const FileSpec &platform_file,
230cb8977d726be451df9978a74088435667fa37da2Greg Clayton                 const UUID *uuid_ptr,
231cb8977d726be451df9978a74088435667fa37da2Greg Clayton                 FileSpec &local_file);
232e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
233e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        virtual Error
23424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        GetSharedModule (const FileSpec &platform_file,
23524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                         const ArchSpec &arch,
23624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                         const UUID *uuid_ptr,
23724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                         const ConstString *object_name_ptr,
23824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                         off_t object_offset,
23924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                         lldb::ModuleSP &module_sp,
24024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                         lldb::ModuleSP *old_module_sp_ptr,
24124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                         bool *did_create_ptr);
24224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
24324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        virtual Error
244cb8977d726be451df9978a74088435667fa37da2Greg Clayton        ConnectRemote (Args& args);
245e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
246e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        virtual Error
247cb8977d726be451df9978a74088435667fa37da2Greg Clayton        DisconnectRemote ();
248cb8977d726be451df9978a74088435667fa37da2Greg Clayton
249e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
250e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// Get the platform's supported architectures in the order in which
251e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// they should be searched.
252e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
253e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// @param[in] idx
254e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     A zero based architecture index
255e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
256e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// @param[out] arch
257e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     A copy of the archgitecture at index if the return value is
258e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     \b true.
259e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
260e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// @return
261e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     \b true if \a arch was filled in and is valid, \b false
262e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     otherwise.
263e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
264e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        virtual bool
265e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        GetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch) = 0;
266e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
267b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        virtual size_t
268b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        GetSoftwareBreakpointTrapOpcode (Target &target,
269b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                         BreakpointSite *bp_site) = 0;
270b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
271e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
272b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        /// Launch a new process on a platform, not necessarily for
273b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        /// debugging, it could be just for running the process.
274e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
275b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        virtual Error
276b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        LaunchProcess (ProcessLaunchInfo &launch_info);
277b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
278b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        //------------------------------------------------------------------
279b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        /// Subclasses should NOT need to implement this function as it uses
280b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        /// the Platform::LaunchProcess() followed by Platform::Attach ()
281b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        //------------------------------------------------------------------
282b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        lldb::ProcessSP
283b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        DebugProcess (ProcessLaunchInfo &launch_info,
284b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                      Debugger &debugger,
285b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                      Target *target,       // Can be NULL, if NULL create a new target, else use existing one
286b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                      Listener &listener,
287b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                      Error &error);
288e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
289e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
290e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// Attach to an existing process using a process ID.
291e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
292b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        /// Each platform subclass needs to implement this function and
293b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        /// attempt to attach to the process with the process ID of \a pid.
294b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        /// The platform subclass should return an appropriate ProcessSP
295b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        /// subclass that is attached to the process, or an empty shared
296b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        /// pointer with an appriopriate error.
297e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
298e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// @param[in] pid
299e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     The process ID that we should attempt to attach to.
300e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
301e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// @return
302b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        ///     An appropriate ProcessSP containing a valid shared pointer
303b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        ///     to the default Process subclass for the platform that is
304b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        ///     attached to the process, or an empty shared pointer with an
305b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        ///     appriopriate error fill into the \a error object.
306e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
307b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        virtual lldb::ProcessSP
308527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        Attach (ProcessAttachInfo &attach_info,
309b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                Debugger &debugger,
310b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                Target *target,       // Can be NULL, if NULL create a new target, else use existing one
311b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                Listener &listener,
312b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                Error &error) = 0;
313e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
314e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
315e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// Attach to an existing process by process name.
316e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
317e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// This function is not meant to be overridden by Process
318e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// subclasses. It will first call
319e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// Process::WillAttach (const char *) and if that returns \b
320e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// true, Process::DoAttach (const char *) will be called to
321e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// actually do the attach. If DoAttach returns \b true, then
322e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// Process::DidAttach() will be called.
323e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
324e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// @param[in] process_name
325e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     A process name to match against the current process list.
326e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
327e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// @return
328e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     Returns \a pid if attaching was successful, or
329e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     LLDB_INVALID_PROCESS_ID if attaching fails.
330e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
331e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//        virtual lldb::ProcessSP
332e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//        Attach (const char *process_name,
333e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//                bool wait_for_launch,
334e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//                Error &error) = 0;
335e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
33624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        //------------------------------------------------------------------
33724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        // The base class Platform will take care of the host platform.
33824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        // Subclasses will need to fill in the remote case.
33924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        //------------------------------------------------------------------
340e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        virtual uint32_t
341b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        FindProcesses (const ProcessInstanceInfoMatch &match_info,
342b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                       ProcessInstanceInfoList &proc_infos);
343e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
344e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        virtual bool
345b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &proc_info);
346e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
347e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        const std::string &
348e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        GetRemoteURL () const
349e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        {
350e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            return m_remote_url;
351e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        }
352e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
353b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        bool
354b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        IsHost () const
355b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
356b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            return m_is_host;    // Is this the default host platform?
357b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
358b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
359b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        bool
360b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        IsRemote () const
361b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
362b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            return !m_is_host;
363b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
364e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
36558e26e0935138225477fd61283215ceff2068899Greg Clayton        virtual bool
366b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        IsConnected () const
367b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
36858e26e0935138225477fd61283215ceff2068899Greg Clayton            // Remote subclasses should override this function
36958e26e0935138225477fd61283215ceff2068899Greg Clayton            return IsHost();
370b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
371e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
372b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        const ArchSpec &
373b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        GetSystemArchitecture();
374b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
375b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        void
376b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        SetSystemArchitecture (const ArchSpec &arch)
377b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
378b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_system_arch = arch;
379b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (IsHost())
380b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                m_os_version_set_while_connected = m_system_arch.IsValid();
381b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
382b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
38324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        // Used for column widths
38424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        uint32_t
38524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        GetMaxUserIDNameLength() const
38624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
38724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            return m_max_uid_name_len;
38824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
38924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        // Used for column widths
39024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        uint32_t
39124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        GetMaxGroupIDNameLength() const
39224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
39324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            return m_max_gid_name_len;
39424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
395604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton
396604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        const ConstString &
397604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        GetSDKRootDirectory () const
398604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        {
399604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton            return m_sdk_sysroot;
400604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        }
401604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton
402604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        void
403604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        SetSDKRootDirectory (const ConstString &dir)
404604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        {
405604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton            m_sdk_sysroot = dir;
406604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        }
407604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton
408604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        const ConstString &
409604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        GetSDKBuild () const
410604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        {
411604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton            return m_sdk_build;
412604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        }
413604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton
414604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        void
415604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        SetSDKBuild (const ConstString &sdk_build)
416604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        {
417604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton            m_sdk_build = sdk_build;
418604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        }
419604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton
4207089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham        // There may be modules that we don't want to find by default for operations like "setting breakpoint by name".
4217089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham        // The platform will return "true" from this call if the passed in module happens to be one of these.
4227089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham
4237089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham        virtual bool
4247089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham        ModuleIsExcludedForNonModuleSpecificSearches (Target &target, const lldb::ModuleSP &module_sp)
4257089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham        {
4267089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham            return false;
4277089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham        }
4287089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham
429b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    protected:
430b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        bool m_is_host;
431b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // Set to true when we are able to actually set the OS version while
432b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // being connected. For remote platforms, we might set the version ahead
433b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // of time before we actually connect and this version might change when
434b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // we actually connect to a remote platform. For the host platform this
435b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // will be set to the once we call Host::GetOSVersion().
436b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        bool m_os_version_set_while_connected;
437b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        bool m_system_arch_set_while_connected;
438604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        ConstString m_sdk_sysroot; // the root location of where the SDK files are all located
439604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        ConstString m_sdk_build;
440b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        std::string m_remote_url;
44158e26e0935138225477fd61283215ceff2068899Greg Clayton        std::string m_name;
442b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        uint32_t m_major_os_version;
443b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        uint32_t m_minor_os_version;
444b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        uint32_t m_update_os_version;
445b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        ArchSpec m_system_arch; // The architecture of the kernel or the remote platform
44624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        typedef std::map<uint32_t, ConstString> IDToNameMap;
44724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        Mutex m_uid_map_mutex;
44824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        Mutex m_gid_map_mutex;
44924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        IDToNameMap m_uid_map;
45024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        IDToNameMap m_gid_map;
45124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        uint32_t m_max_uid_name_len;
45224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        uint32_t m_max_gid_name_len;
45324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
45424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        const char *
45524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        GetCachedUserName (uint32_t uid)
45624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
45724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            Mutex::Locker locker (m_uid_map_mutex);
45824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            IDToNameMap::iterator pos = m_uid_map.find (uid);
45924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            if (pos != m_uid_map.end())
46024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            {
46124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                // return the empty string if our string is NULL
46224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                // so we can tell when things were in the negative
46324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                // cached (didn't find a valid user name, don't keep
46424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                // trying)
46524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                return pos->second.AsCString("");
46624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            }
46724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            return NULL;
46824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
46924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
47024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        const char *
47124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        SetCachedUserName (uint32_t uid, const char *name, size_t name_len)
47224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
47324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            Mutex::Locker locker (m_uid_map_mutex);
47424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            ConstString const_name (name);
47524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            m_uid_map[uid] = const_name;
47624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            if (m_max_uid_name_len < name_len)
47724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                m_max_uid_name_len = name_len;
47824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            // Const strings lives forever in our const string pool, so we can return the const char *
47924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            return const_name.GetCString();
48024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
48124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
48224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        void
48324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        SetUserNameNotFound (uint32_t uid)
48424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
48524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            Mutex::Locker locker (m_uid_map_mutex);
48624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            m_uid_map[uid] = ConstString();
48724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
48824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
48924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
49024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        void
49124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        ClearCachedUserNames ()
49224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
49324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            Mutex::Locker locker (m_uid_map_mutex);
49424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            m_uid_map.clear();
49524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
49624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
49724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        const char *
49824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        GetCachedGroupName (uint32_t gid)
49924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
50024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            Mutex::Locker locker (m_gid_map_mutex);
50124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            IDToNameMap::iterator pos = m_gid_map.find (gid);
50224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            if (pos != m_gid_map.end())
50324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            {
50424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                // return the empty string if our string is NULL
50524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                // so we can tell when things were in the negative
50624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                // cached (didn't find a valid group name, don't keep
50724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                // trying)
50824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                return pos->second.AsCString("");
50924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            }
51024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            return NULL;
51124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
51224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
51324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        const char *
51424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        SetCachedGroupName (uint32_t gid, const char *name, size_t name_len)
51524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
51624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            Mutex::Locker locker (m_gid_map_mutex);
51724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            ConstString const_name (name);
51824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            m_gid_map[gid] = const_name;
51924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            if (m_max_gid_name_len < name_len)
52024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                m_max_gid_name_len = name_len;
52124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            // Const strings lives forever in our const string pool, so we can return the const char *
52224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            return const_name.GetCString();
52324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
52424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
52524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        void
52624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        SetGroupNameNotFound (uint32_t gid)
52724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
52824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            Mutex::Locker locker (m_gid_map_mutex);
52924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            m_gid_map[gid] = ConstString();
53024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
53124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
53224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        void
53324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        ClearCachedGroupNames ()
53424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
53524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            Mutex::Locker locker (m_gid_map_mutex);
53624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            m_gid_map.clear();
53724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
53824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
539e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    private:
540e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        DISALLOW_COPY_AND_ASSIGN (Platform);
541e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    };
542e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
543e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
544e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    class PlatformList
545e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    {
546e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    public:
547e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        PlatformList() :
548e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            m_mutex (Mutex::eMutexTypeRecursive),
549b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            m_platforms (),
550b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            m_selected_platform_sp()
551e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        {
552e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        }
553e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
554e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ~PlatformList()
555e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        {
556e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        }
557e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
558e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        void
559b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        Append (const lldb::PlatformSP &platform_sp, bool set_selected)
560e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        {
561e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            Mutex::Locker locker (m_mutex);
562e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            m_platforms.push_back (platform_sp);
563b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (set_selected)
564b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                m_selected_platform_sp = m_platforms.back();
565e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        }
566e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
567e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        size_t
568e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        GetSize()
569e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        {
570e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            Mutex::Locker locker (m_mutex);
571e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            return m_platforms.size();
572e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        }
573e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
574e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        lldb::PlatformSP
575e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        GetAtIndex (uint32_t idx)
576e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        {
577e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            lldb::PlatformSP platform_sp;
578e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            {
579e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                Mutex::Locker locker (m_mutex);
580e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                if (idx < m_platforms.size())
581e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                    platform_sp = m_platforms[idx];
582e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            }
583e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            return platform_sp;
584e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        }
585e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
586b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        //------------------------------------------------------------------
587b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        /// Select the active platform.
588b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        ///
589b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        /// In order to debug remotely, other platform's can be remotely
590b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        /// connected to and set as the selected platform for any subsequent
591b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        /// debugging. This allows connection to remote targets and allows
592b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        /// the ability to discover process info, launch and attach to remote
593b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        /// processes.
594b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        //------------------------------------------------------------------
595b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        lldb::PlatformSP
596b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        GetSelectedPlatform ()
597b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
598b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            Mutex::Locker locker (m_mutex);
599b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (!m_selected_platform_sp && !m_platforms.empty())
600b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                m_selected_platform_sp = m_platforms.front();
601b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
602b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            return m_selected_platform_sp;
603b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
604b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
605b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        void
606b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        SetSelectedPlatform (const lldb::PlatformSP &platform_sp)
607b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
608b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (platform_sp)
609b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            {
610b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                Mutex::Locker locker (m_mutex);
611b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                const size_t num_platforms = m_platforms.size();
612b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                for (size_t idx=0; idx<num_platforms; ++idx)
613b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                {
614b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    if (m_platforms[idx].get() == platform_sp.get())
615b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    {
616b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        m_selected_platform_sp = m_platforms[idx];
617b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        return;
618b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    }
619b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                }
620b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                m_platforms.push_back (platform_sp);
621b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                m_selected_platform_sp = m_platforms.back();
622b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            }
623b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
624b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
625e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    protected:
626e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        typedef std::vector<lldb::PlatformSP> collection;
627e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        mutable Mutex m_mutex;
628e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        collection m_platforms;
629b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        lldb::PlatformSP m_selected_platform_sp;
630e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
631e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    private:
632e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        DISALLOW_COPY_AND_ASSIGN (PlatformList);
633e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    };
634e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} // namespace lldb_private
635e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
636e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#endif  // liblldb_Platform_h_
637