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
60b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton        static lldb::PlatformSP
61b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        GetPlatformForArchitecture (const ArchSpec &arch,
62b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                                    ArchSpec *platform_arch_ptr);
63b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton
645e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        static const char *
655e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        GetHostPlatformName ();
665e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton
67e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        static void
68e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        SetDefaultPlatform (const lldb::PlatformSP &platform_sp);
69e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
70e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        static lldb::PlatformSP
71b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        Create (const char *platform_name, Error &error);
72e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
73b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton        static lldb::PlatformSP
74b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton        Create (const ArchSpec &arch, ArchSpec *platform_arch_ptr, Error &error);
75b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton
76e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        static uint32_t
77e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        GetNumConnectedRemotePlatforms ();
78e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
79e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        static lldb::PlatformSP
80e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        GetConnectedRemotePlatformAtIndex (uint32_t idx);
81e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
82e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
83e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// Default Constructor
84e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
85b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        Platform (bool is_host_platform);
86e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
87e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
88e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// Destructor.
89e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
90e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// The destructor is virtual since this class is designed to be
91e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// inherited from by the plug-in instance.
92e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
93e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        virtual
94e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ~Platform();
95e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
96e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
97c1238839e67d2b4ee6abfc8972588cae2d8e265bJason Molenda        /// Find a platform plugin for a given process.
98c1238839e67d2b4ee6abfc8972588cae2d8e265bJason Molenda        ///
99c1238839e67d2b4ee6abfc8972588cae2d8e265bJason Molenda        /// Scans the installed Platform plug-ins and tries to find
100c1238839e67d2b4ee6abfc8972588cae2d8e265bJason Molenda        /// an instance that can be used for \a process
101c1238839e67d2b4ee6abfc8972588cae2d8e265bJason Molenda        ///
102c1238839e67d2b4ee6abfc8972588cae2d8e265bJason Molenda        /// @param[in] process
103c1238839e67d2b4ee6abfc8972588cae2d8e265bJason Molenda        ///     The process for which to try and locate a platform
104c1238839e67d2b4ee6abfc8972588cae2d8e265bJason Molenda        ///     plug-in instance.
105c1238839e67d2b4ee6abfc8972588cae2d8e265bJason Molenda        ///
106c1238839e67d2b4ee6abfc8972588cae2d8e265bJason Molenda        /// @param[in] plugin_name
107c1238839e67d2b4ee6abfc8972588cae2d8e265bJason Molenda        ///     An optional name of a specific platform plug-in that
108c1238839e67d2b4ee6abfc8972588cae2d8e265bJason Molenda        ///     should be used. If NULL, pick the best plug-in.
109c1238839e67d2b4ee6abfc8972588cae2d8e265bJason Molenda        //------------------------------------------------------------------
110c1238839e67d2b4ee6abfc8972588cae2d8e265bJason Molenda        static Platform*
1110e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        FindPlugin (Process *process, const ConstString &plugin_name);
112c1238839e67d2b4ee6abfc8972588cae2d8e265bJason Molenda
113c1238839e67d2b4ee6abfc8972588cae2d8e265bJason Molenda        //------------------------------------------------------------------
114e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// Set the target's executable based off of the existing
115e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// architecture information in \a target given a path to an
116e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// executable \a exe_file.
117e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
118e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// Each platform knows the architectures that it supports and can
119e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// select the correct architecture slice within \a exe_file by
120e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// inspecting the architecture in \a target. If the target had an
121e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// architecture specified, then in can try and obey that request
122e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// and optionally fail if the architecture doesn't match up.
123e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// If no architecture is specified, the platform should select the
124e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// default architecture from \a exe_file. Any application bundles
125e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// or executable wrappers can also be inspected for the actual
126e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// application binary within the bundle that should be used.
127e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
128e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// @return
129e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     Returns \b true if this Platform plug-in was able to find
130e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     a suitable executable, \b false otherwise.
131e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
132e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        virtual Error
133e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ResolveExecutable (const FileSpec &exe_file,
134e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                           const ArchSpec &arch,
1359ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                           lldb::ModuleSP &module_sp,
1369ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                           const FileSpecList *module_search_paths_ptr);
137e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
13895b765e8000b44644d021e95bc58eac95028573bGreg Clayton
13995b765e8000b44644d021e95bc58eac95028573bGreg Clayton        //------------------------------------------------------------------
14095b765e8000b44644d021e95bc58eac95028573bGreg Clayton        /// Find a symbol file given a symbol file module specification.
14195b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///
14295b765e8000b44644d021e95bc58eac95028573bGreg Clayton        /// Each platform might have tricks to find symbol files for an
14395b765e8000b44644d021e95bc58eac95028573bGreg Clayton        /// executable given information in a symbol file ModuleSpec. Some
14495b765e8000b44644d021e95bc58eac95028573bGreg Clayton        /// platforms might also support symbol files that are bundles and
14595b765e8000b44644d021e95bc58eac95028573bGreg Clayton        /// know how to extract the right symbol file given a bundle.
14695b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///
14795b765e8000b44644d021e95bc58eac95028573bGreg Clayton        /// @param[in] target
14895b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///     The target in which we are trying to resolve the symbol file.
14995b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///     The target has a list of modules that we might be able to
15095b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///     use in order to help find the right symbol file. If the
15195b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///     "m_file" or "m_platform_file" entries in the \a sym_spec
15295b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///     are filled in, then we might be able to locate a module in
15395b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///     the target, extract its UUID and locate a symbol file.
15495b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///     If just the "m_uuid" is specified, then we might be able
15595b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///     to find the module in the target that matches that UUID
15695b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///     and pair the symbol file along with it. If just "m_symbol_file"
15795b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///     is specified, we can use a variety of tricks to locate the
15895b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///     symbols in an SDK, PDK, or other development kit location.
15995b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///
16095b765e8000b44644d021e95bc58eac95028573bGreg Clayton        /// @param[in] sym_spec
16195b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///     A module spec that describes some information about the
16295b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///     symbol file we are trying to resolve. The ModuleSpec might
16395b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///     contain the following:
16495b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///     m_file - A full or partial path to an executable from the
16595b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///              target (might be empty).
16695b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///     m_platform_file - Another executable hint that contains
16795b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///                       the path to the file as known on the
16895b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///                       local/remote platform.
16995b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///     m_symbol_file - A full or partial path to a symbol file
17095b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///                     or symbol bundle that should be used when
17195b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///                     trying to resolve the symbol file.
17295b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///     m_arch - The architecture we are looking for when resolving
17395b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///              the symbol file.
17495b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///     m_uuid - The UUID of the executable and symbol file. This
17595b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///              can often be used to match up an exectuable with
17695b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///              a symbol file, or resolve an symbol file in a
17795b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///              symbol file bundle.
17895b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///
17995b765e8000b44644d021e95bc58eac95028573bGreg Clayton        /// @param[out] sym_file
18095b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///     The resolved symbol file spec if the returned error
18195b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///     indicates succes.
18295b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///
18395b765e8000b44644d021e95bc58eac95028573bGreg Clayton        /// @return
18495b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ///     Returns an error that describes success or failure.
18595b765e8000b44644d021e95bc58eac95028573bGreg Clayton        //------------------------------------------------------------------
18695b765e8000b44644d021e95bc58eac95028573bGreg Clayton        virtual Error
18795b765e8000b44644d021e95bc58eac95028573bGreg Clayton        ResolveSymbolFile (Target &target,
18895b765e8000b44644d021e95bc58eac95028573bGreg Clayton                           const ModuleSpec &sym_spec,
18995b765e8000b44644d021e95bc58eac95028573bGreg Clayton                           FileSpec &sym_file);
19095b765e8000b44644d021e95bc58eac95028573bGreg Clayton
191f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton        //------------------------------------------------------------------
192f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton        /// Resolves the FileSpec to a (possibly) remote path. Remote
193f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton        /// platforms must override this to resolve to a path on the remote
194f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton        /// side.
195f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton        //------------------------------------------------------------------
196f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton        virtual bool
197f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton        ResolveRemotePath (const FileSpec &platform_path,
198f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton                           FileSpec &resolved_platform_path);
199f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton
200b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        bool
201b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        GetOSVersion (uint32_t &major,
202b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                      uint32_t &minor,
203b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                      uint32_t &update);
204b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
205b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        bool
206b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        SetOSVersion (uint32_t major,
207b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                      uint32_t minor,
208b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                      uint32_t update);
209b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
21058e26e0935138225477fd61283215ceff2068899Greg Clayton        bool
21158e26e0935138225477fd61283215ceff2068899Greg Clayton        GetOSBuildString (std::string &s);
21258e26e0935138225477fd61283215ceff2068899Greg Clayton
21358e26e0935138225477fd61283215ceff2068899Greg Clayton        bool
21458e26e0935138225477fd61283215ceff2068899Greg Clayton        GetOSKernelDescription (std::string &s);
21558e26e0935138225477fd61283215ceff2068899Greg Clayton
216b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        // Returns the the hostname if we are connected, else the short plugin
217b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        // name.
2180e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        ConstString
219b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        GetName ();
220b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
22124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        virtual const char *
22258e26e0935138225477fd61283215ceff2068899Greg Clayton        GetHostname ();
223cb8977d726be451df9978a74088435667fa37da2Greg Clayton
224b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        virtual const char *
225b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        GetDescription () = 0;
226b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
227b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        //------------------------------------------------------------------
228b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        /// Report the current status for this platform.
229b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        ///
230b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        /// The returned string usually involves returning the OS version
231b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        /// (if available), and any SDK directory that might be being used
232b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        /// for local file caching, and if connected a quick blurb about
233b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        /// what this platform is connected to.
234b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        //------------------------------------------------------------------
235b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        virtual void
23658e26e0935138225477fd61283215ceff2068899Greg Clayton        GetStatus (Stream &strm);
237b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
238b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        //------------------------------------------------------------------
239b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // Subclasses must be able to fetch the current OS version
240b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        //
241b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // Remote classes must be connected for this to succeed. Local
242b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // subclasses don't need to override this function as it will just
243b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // call the Host::GetOSVersion().
244b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        //------------------------------------------------------------------
245b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        virtual bool
24658e26e0935138225477fd61283215ceff2068899Greg Clayton        GetRemoteOSVersion ()
24758e26e0935138225477fd61283215ceff2068899Greg Clayton        {
24858e26e0935138225477fd61283215ceff2068899Greg Clayton            return false;
24958e26e0935138225477fd61283215ceff2068899Greg Clayton        }
25058e26e0935138225477fd61283215ceff2068899Greg Clayton
25158e26e0935138225477fd61283215ceff2068899Greg Clayton        virtual bool
25258e26e0935138225477fd61283215ceff2068899Greg Clayton        GetRemoteOSBuildString (std::string &s)
253b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
25458e26e0935138225477fd61283215ceff2068899Greg Clayton            s.clear();
255b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            return false;
256b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
257b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
25858e26e0935138225477fd61283215ceff2068899Greg Clayton        virtual bool
25958e26e0935138225477fd61283215ceff2068899Greg Clayton        GetRemoteOSKernelDescription (std::string &s)
26058e26e0935138225477fd61283215ceff2068899Greg Clayton        {
26158e26e0935138225477fd61283215ceff2068899Greg Clayton            s.clear();
26258e26e0935138225477fd61283215ceff2068899Greg Clayton            return false;
26358e26e0935138225477fd61283215ceff2068899Greg Clayton        }
26458e26e0935138225477fd61283215ceff2068899Greg Clayton
26558e26e0935138225477fd61283215ceff2068899Greg Clayton        // Remote Platform subclasses need to override this function
26658e26e0935138225477fd61283215ceff2068899Greg Clayton        virtual ArchSpec
26758e26e0935138225477fd61283215ceff2068899Greg Clayton        GetRemoteSystemArchitecture ()
26858e26e0935138225477fd61283215ceff2068899Greg Clayton        {
26958e26e0935138225477fd61283215ceff2068899Greg Clayton            return ArchSpec(); // Return an invalid architecture
27058e26e0935138225477fd61283215ceff2068899Greg Clayton        }
27158e26e0935138225477fd61283215ceff2068899Greg Clayton
27258e26e0935138225477fd61283215ceff2068899Greg Clayton        virtual const char *
27324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        GetUserName (uint32_t uid);
27424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
27524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        virtual const char *
27624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        GetGroupName (uint32_t gid);
27758e26e0935138225477fd61283215ceff2068899Greg Clayton
278e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
279e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// Locate a file for a platform.
280e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
281e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// The default implementation of this function will return the same
282e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// file patch in \a local_file as was in \a platform_file.
283e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
284e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// @param[in] platform_file
285e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     The platform file path to locate and cache locally.
286e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
28724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        /// @param[in] uuid_ptr
28824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        ///     If we know the exact UUID of the file we are looking for, it
28924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        ///     can be specified. If it is not specified, we might now know
29024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        ///     the exact file. The UUID is usually some sort of MD5 checksum
29124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        ///     for the file and is sometimes known by dynamic linkers/loaders.
29224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        ///     If the UUID is known, it is best to supply it to platform
29324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        ///     file queries to ensure we are finding the correct file, not
29424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        ///     just a file at the correct path.
29524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        ///
296e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// @param[out] local_file
297e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     A locally cached version of the platform file. For platforms
298e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     that describe the current host computer, this will just be
299e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     the same file. For remote platforms, this file might come from
300e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     and SDK directory, or might need to be sync'ed over to the
301e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     current machine for efficient debugging access.
302e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
303e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// @return
304e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     An error object.
305e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
306e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        virtual Error
307cb8977d726be451df9978a74088435667fa37da2Greg Clayton        GetFile (const FileSpec &platform_file,
308cb8977d726be451df9978a74088435667fa37da2Greg Clayton                 const UUID *uuid_ptr,
309cb8977d726be451df9978a74088435667fa37da2Greg Clayton                 FileSpec &local_file);
310e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
311146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata        //----------------------------------------------------------------------
312146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata        // Locate the scripting resource given a module specification.
313146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata        //
314146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata        // Locating the file should happen only on the local computer or using
315146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata        // the current computers global settings.
316146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata        //----------------------------------------------------------------------
317d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton        virtual FileSpecList
318d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton        LocateExecutableScriptingResources (Target *target,
319d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                                            Module &module);
320146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata
321e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        virtual Error
322444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        GetSharedModule (const ModuleSpec &module_spec,
32324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                         lldb::ModuleSP &module_sp,
3249ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                         const FileSpecList *module_search_paths_ptr,
32524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                         lldb::ModuleSP *old_module_sp_ptr,
32624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                         bool *did_create_ptr);
32724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
32824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        virtual Error
329cb8977d726be451df9978a74088435667fa37da2Greg Clayton        ConnectRemote (Args& args);
330e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
331e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        virtual Error
332cb8977d726be451df9978a74088435667fa37da2Greg Clayton        DisconnectRemote ();
333cb8977d726be451df9978a74088435667fa37da2Greg Clayton
334e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
335e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// Get the platform's supported architectures in the order in which
336e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// they should be searched.
337e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
338e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// @param[in] idx
339e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     A zero based architecture index
340e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
341e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// @param[out] arch
342e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     A copy of the archgitecture at index if the return value is
343e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     \b true.
344e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
345e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// @return
346e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     \b true if \a arch was filled in and is valid, \b false
347e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     otherwise.
348e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
349e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        virtual bool
350e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        GetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch) = 0;
351e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
352b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        virtual size_t
353b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        GetSoftwareBreakpointTrapOpcode (Target &target,
354b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                                         BreakpointSite *bp_site) = 0;
355b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
356e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
357b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        /// Launch a new process on a platform, not necessarily for
358b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        /// debugging, it could be just for running the process.
359e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
360b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        virtual Error
361b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        LaunchProcess (ProcessLaunchInfo &launch_info);
362b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
363b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        //------------------------------------------------------------------
364b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton        /// Lets a platform answer if it is compatible with a given
365b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton        /// architecture and the target triple contained within.
366b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton        //------------------------------------------------------------------
367b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton        virtual bool
368aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton        IsCompatibleArchitecture (const ArchSpec &arch,
369aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton                                  bool exact_arch_match,
370aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton                                  ArchSpec *compatible_arch_ptr);
371b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton
372b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton        //------------------------------------------------------------------
37375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        /// Not all platforms will support debugging a process by spawning
37475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        /// somehow halted for a debugger (specified using the
37575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        /// "eLaunchFlagDebug" launch flag) and then attaching. If your
37675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        /// platform doesn't support this, override this function and return
37775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        /// false.
37875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        //------------------------------------------------------------------
37975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        virtual bool
38075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        CanDebugProcess ()
38175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        {
38275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton            return true;
38375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        }
38475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton
38575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        //------------------------------------------------------------------
386b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        /// Subclasses should NOT need to implement this function as it uses
387b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        /// the Platform::LaunchProcess() followed by Platform::Attach ()
388b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        //------------------------------------------------------------------
389b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        lldb::ProcessSP
390b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        DebugProcess (ProcessLaunchInfo &launch_info,
391b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                      Debugger &debugger,
392b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                      Target *target,       // Can be NULL, if NULL create a new target, else use existing one
393b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                      Listener &listener,
394b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                      Error &error);
395e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
396e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
397e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// Attach to an existing process using a process ID.
398e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
399b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        /// Each platform subclass needs to implement this function and
400b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        /// attempt to attach to the process with the process ID of \a pid.
401b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        /// The platform subclass should return an appropriate ProcessSP
402b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        /// subclass that is attached to the process, or an empty shared
403b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        /// pointer with an appriopriate error.
404e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
405e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// @param[in] pid
406e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     The process ID that we should attempt to attach to.
407e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
408e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// @return
409b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        ///     An appropriate ProcessSP containing a valid shared pointer
410b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        ///     to the default Process subclass for the platform that is
411b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        ///     attached to the process, or an empty shared pointer with an
412b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        ///     appriopriate error fill into the \a error object.
413e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
414b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        virtual lldb::ProcessSP
415527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton        Attach (ProcessAttachInfo &attach_info,
416b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                Debugger &debugger,
417b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                Target *target,       // Can be NULL, if NULL create a new target, else use existing one
418b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                Listener &listener,
419b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                Error &error) = 0;
420e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
421e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
422e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// Attach to an existing process by process name.
423e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
424e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// This function is not meant to be overridden by Process
425e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// subclasses. It will first call
426e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// Process::WillAttach (const char *) and if that returns \b
427e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// true, Process::DoAttach (const char *) will be called to
428e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// actually do the attach. If DoAttach returns \b true, then
429e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// Process::DidAttach() will be called.
430e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
431e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// @param[in] process_name
432e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     A process name to match against the current process list.
433e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///
434e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        /// @return
435e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     Returns \a pid if attaching was successful, or
436e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ///     LLDB_INVALID_PROCESS_ID if attaching fails.
437e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        //------------------------------------------------------------------
438e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//        virtual lldb::ProcessSP
439e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//        Attach (const char *process_name,
440e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//                bool wait_for_launch,
441e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//                Error &error) = 0;
442e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
44324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        //------------------------------------------------------------------
44424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        // The base class Platform will take care of the host platform.
44524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        // Subclasses will need to fill in the remote case.
44624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        //------------------------------------------------------------------
447e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        virtual uint32_t
448b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        FindProcesses (const ProcessInstanceInfoMatch &match_info,
449b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                       ProcessInstanceInfoList &proc_infos);
450e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
451e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        virtual bool
452b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &proc_info);
453bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton
454bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton        //------------------------------------------------------------------
455bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton        // Set a breakpoint on all functions that can end up creating a thread
456bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton        // for this platform. This is needed when running expressions and
457bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton        // also for process control.
458bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton        //------------------------------------------------------------------
459bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton        virtual lldb::BreakpointSP
460bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton        SetThreadCreationBreakpoint (Target &target);
461bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton
462e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
463e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        const std::string &
464e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        GetRemoteURL () const
465e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        {
466e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            return m_remote_url;
467e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        }
468e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
469b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        bool
470b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        IsHost () const
471b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
472b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            return m_is_host;    // Is this the default host platform?
473b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
474b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
475b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        bool
476b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        IsRemote () const
477b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
478b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            return !m_is_host;
479b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
480e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
48158e26e0935138225477fd61283215ceff2068899Greg Clayton        virtual bool
482b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        IsConnected () const
483b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
48458e26e0935138225477fd61283215ceff2068899Greg Clayton            // Remote subclasses should override this function
48558e26e0935138225477fd61283215ceff2068899Greg Clayton            return IsHost();
486b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
487e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
488b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        const ArchSpec &
489b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        GetSystemArchitecture();
490b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
491b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        void
492b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        SetSystemArchitecture (const ArchSpec &arch)
493b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
494b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            m_system_arch = arch;
495b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (IsHost())
496b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                m_os_version_set_while_connected = m_system_arch.IsValid();
497b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
498b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
49924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        // Used for column widths
50036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        size_t
50124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        GetMaxUserIDNameLength() const
50224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
50324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            return m_max_uid_name_len;
50424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
50524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        // Used for column widths
50636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        size_t
50724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        GetMaxGroupIDNameLength() const
50824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
50924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            return m_max_gid_name_len;
51024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
511604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton
512604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        const ConstString &
513604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        GetSDKRootDirectory () const
514604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        {
515604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton            return m_sdk_sysroot;
516604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        }
517604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton
518604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        void
519604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        SetSDKRootDirectory (const ConstString &dir)
520604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        {
521604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton            m_sdk_sysroot = dir;
522604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        }
523604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton
524604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        const ConstString &
525604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        GetSDKBuild () const
526604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        {
527604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton            return m_sdk_build;
528604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        }
529604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton
530604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        void
531604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        SetSDKBuild (const ConstString &sdk_build)
532604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        {
533604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton            m_sdk_build = sdk_build;
534604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        }
535604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton
5367089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham        // There may be modules that we don't want to find by default for operations like "setting breakpoint by name".
5377089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham        // The platform will return "true" from this call if the passed in module happens to be one of these.
5387089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham
5397089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham        virtual bool
5407089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham        ModuleIsExcludedForNonModuleSpecificSearches (Target &target, const lldb::ModuleSP &module_sp)
5417089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham        {
5427089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham            return false;
5437089d8a3ef19ea251210b3e9bf198da8fb55f279Jim Ingham        }
54473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
54573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        virtual size_t
54673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        GetEnvironment (StringList &environment);
54773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
548b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    protected:
549b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        bool m_is_host;
550b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // Set to true when we are able to actually set the OS version while
551b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // being connected. For remote platforms, we might set the version ahead
552b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // of time before we actually connect and this version might change when
553b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // we actually connect to a remote platform. For the host platform this
554b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        // will be set to the once we call Host::GetOSVersion().
555b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        bool m_os_version_set_while_connected;
556b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        bool m_system_arch_set_while_connected;
557604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        ConstString m_sdk_sysroot; // the root location of where the SDK files are all located
558604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton        ConstString m_sdk_build;
559b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        std::string m_remote_url;
56058e26e0935138225477fd61283215ceff2068899Greg Clayton        std::string m_name;
561b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        uint32_t m_major_os_version;
562b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        uint32_t m_minor_os_version;
563b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        uint32_t m_update_os_version;
564b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        ArchSpec m_system_arch; // The architecture of the kernel or the remote platform
56524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        typedef std::map<uint32_t, ConstString> IDToNameMap;
56624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        Mutex m_uid_map_mutex;
56724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        Mutex m_gid_map_mutex;
56824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        IDToNameMap m_uid_map;
56924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        IDToNameMap m_gid_map;
57036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        size_t m_max_uid_name_len;
57136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        size_t m_max_gid_name_len;
57224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
57324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        const char *
57424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        GetCachedUserName (uint32_t uid)
57524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
57624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            Mutex::Locker locker (m_uid_map_mutex);
57724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            IDToNameMap::iterator pos = m_uid_map.find (uid);
57824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            if (pos != m_uid_map.end())
57924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            {
58024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                // return the empty string if our string is NULL
58124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                // so we can tell when things were in the negative
58224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                // cached (didn't find a valid user name, don't keep
58324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                // trying)
58424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                return pos->second.AsCString("");
58524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            }
58624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            return NULL;
58724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
58824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
58924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        const char *
59024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        SetCachedUserName (uint32_t uid, const char *name, size_t name_len)
59124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
59224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            Mutex::Locker locker (m_uid_map_mutex);
59324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            ConstString const_name (name);
59424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            m_uid_map[uid] = const_name;
59524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            if (m_max_uid_name_len < name_len)
59624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                m_max_uid_name_len = name_len;
59724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            // Const strings lives forever in our const string pool, so we can return the const char *
59824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            return const_name.GetCString();
59924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
60024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
60124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        void
60224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        SetUserNameNotFound (uint32_t uid)
60324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
60424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            Mutex::Locker locker (m_uid_map_mutex);
60524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            m_uid_map[uid] = ConstString();
60624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
60724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
60824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
60924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        void
61024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        ClearCachedUserNames ()
61124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
61224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            Mutex::Locker locker (m_uid_map_mutex);
61324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            m_uid_map.clear();
61424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
61524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
61624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        const char *
61724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        GetCachedGroupName (uint32_t gid)
61824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
61924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            Mutex::Locker locker (m_gid_map_mutex);
62024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            IDToNameMap::iterator pos = m_gid_map.find (gid);
62124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            if (pos != m_gid_map.end())
62224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            {
62324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                // return the empty string if our string is NULL
62424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                // so we can tell when things were in the negative
62524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                // cached (didn't find a valid group name, don't keep
62624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                // trying)
62724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                return pos->second.AsCString("");
62824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            }
62924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            return NULL;
63024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
63124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
63224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        const char *
63324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        SetCachedGroupName (uint32_t gid, const char *name, size_t name_len)
63424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
63524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            Mutex::Locker locker (m_gid_map_mutex);
63624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            ConstString const_name (name);
63724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            m_gid_map[gid] = const_name;
63824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            if (m_max_gid_name_len < name_len)
63924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                m_max_gid_name_len = name_len;
64024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            // Const strings lives forever in our const string pool, so we can return the const char *
64124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            return const_name.GetCString();
64224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
64324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
64424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        void
64524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        SetGroupNameNotFound (uint32_t gid)
64624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
64724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            Mutex::Locker locker (m_gid_map_mutex);
64824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            m_gid_map[gid] = ConstString();
64924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
65024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
65124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        void
65224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        ClearCachedGroupNames ()
65324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
65424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            Mutex::Locker locker (m_gid_map_mutex);
65524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            m_gid_map.clear();
65624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
65724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
658e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    private:
659e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        DISALLOW_COPY_AND_ASSIGN (Platform);
660e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    };
661e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
662e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
663e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    class PlatformList
664e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    {
665e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    public:
666e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        PlatformList() :
667e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            m_mutex (Mutex::eMutexTypeRecursive),
668b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            m_platforms (),
669b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            m_selected_platform_sp()
670e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        {
671e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        }
672e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
673e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        ~PlatformList()
674e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        {
675e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        }
676e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
677e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        void
678b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        Append (const lldb::PlatformSP &platform_sp, bool set_selected)
679e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        {
680e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            Mutex::Locker locker (m_mutex);
681e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            m_platforms.push_back (platform_sp);
682b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (set_selected)
683b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                m_selected_platform_sp = m_platforms.back();
684e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        }
685e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
686e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        size_t
687e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        GetSize()
688e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        {
689e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            Mutex::Locker locker (m_mutex);
690e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            return m_platforms.size();
691e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        }
692e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
693e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        lldb::PlatformSP
694e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        GetAtIndex (uint32_t idx)
695e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        {
696e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            lldb::PlatformSP platform_sp;
697e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            {
698e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                Mutex::Locker locker (m_mutex);
699e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                if (idx < m_platforms.size())
700e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton                    platform_sp = m_platforms[idx];
701e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            }
702e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton            return platform_sp;
703e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        }
704e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
705b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        //------------------------------------------------------------------
706b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        /// Select the active platform.
707b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        ///
708b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        /// In order to debug remotely, other platform's can be remotely
709b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        /// connected to and set as the selected platform for any subsequent
710b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        /// debugging. This allows connection to remote targets and allows
711b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        /// the ability to discover process info, launch and attach to remote
712b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        /// processes.
713b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        //------------------------------------------------------------------
714b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        lldb::PlatformSP
715b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        GetSelectedPlatform ()
716b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
717b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            Mutex::Locker locker (m_mutex);
718b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (!m_selected_platform_sp && !m_platforms.empty())
719b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                m_selected_platform_sp = m_platforms.front();
720b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
721b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            return m_selected_platform_sp;
722b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
723b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
724b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        void
725b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        SetSelectedPlatform (const lldb::PlatformSP &platform_sp)
726b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        {
727b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            if (platform_sp)
728b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            {
729b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                Mutex::Locker locker (m_mutex);
730b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                const size_t num_platforms = m_platforms.size();
731b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                for (size_t idx=0; idx<num_platforms; ++idx)
732b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                {
733b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    if (m_platforms[idx].get() == platform_sp.get())
734b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    {
735b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        m_selected_platform_sp = m_platforms[idx];
736b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                        return;
737b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                    }
738b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                }
739b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                m_platforms.push_back (platform_sp);
740b1888f24fa181489840b9acf193e224d125d0776Greg Clayton                m_selected_platform_sp = m_platforms.back();
741b1888f24fa181489840b9acf193e224d125d0776Greg Clayton            }
742b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        }
743b1888f24fa181489840b9acf193e224d125d0776Greg Clayton
744e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    protected:
745e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        typedef std::vector<lldb::PlatformSP> collection;
746e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        mutable Mutex m_mutex;
747e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        collection m_platforms;
748b1888f24fa181489840b9acf193e224d125d0776Greg Clayton        lldb::PlatformSP m_selected_platform_sp;
749e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
750e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    private:
751e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton        DISALLOW_COPY_AND_ASSIGN (PlatformList);
752e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton    };
753e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} // namespace lldb_private
754e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton
755e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#endif  // liblldb_Platform_h_
756