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