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