Platform.cpp revision b170aee2daacc83e3d71c3e3acc9d56c89893a7b
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 ClaytonPlatformSP 114b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::Create (const char *platform_name, Error &error) 115e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 116e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton PlatformCreateInstance create_callback = NULL; 117e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton lldb::PlatformSP platform_sp; 118b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (platform_name && platform_name[0]) 119e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 120e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton create_callback = PluginManager::GetPlatformCreateCallbackForPluginName (platform_name); 121e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (create_callback) 122b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton platform_sp.reset(create_callback(true, NULL)); 123e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 124b1888f24fa181489840b9acf193e224d125d0776Greg Clayton error.SetErrorStringWithFormat ("unable to find a plug-in for the platform named \"%s\"", platform_name); 125e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 126e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 127b1888f24fa181489840b9acf193e224d125d0776Greg Clayton error.SetErrorString ("invalid platform name"); 128e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return platform_sp; 129e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 130e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 131b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 132b1db658333cdebca31a128be95e926d80c3c7796Greg ClaytonPlatformSP 133b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg ClaytonPlatform::Create (const ArchSpec &arch, ArchSpec *platform_arch_ptr, Error &error) 134b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton{ 135b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton lldb::PlatformSP platform_sp; 136b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton if (arch.IsValid()) 137b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton { 138b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton uint32_t idx; 139b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton PlatformCreateInstance create_callback; 140b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton for (idx = 0; (create_callback = PluginManager::GetPlatformCreateCallbackAtIndex (idx)); ++idx) 141b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton { 142b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton if (create_callback) 143b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton platform_sp.reset(create_callback(false, &arch)); 144b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (platform_sp && platform_sp->IsCompatibleArchitecture(arch, platform_arch_ptr)) 145b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return platform_sp; 146b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton } 147b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton } 148b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton else 149b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton error.SetErrorString ("invalid platform name"); 150b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (platform_arch_ptr) 151b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton platform_arch_ptr->Clear(); 152b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton platform_sp.reset(); 153b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton return platform_sp; 154b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton} 155b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 156e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonuint32_t 157e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::GetNumConnectedRemotePlatforms () 158e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 159e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton Mutex::Locker locker (GetConnectedPlatformListMutex ()); 160e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return GetConnectedPlatformList().size(); 161e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 162e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 163e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformSP 164e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::GetConnectedRemotePlatformAtIndex (uint32_t idx) 165e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 166e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton PlatformSP platform_sp; 167e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 168e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton Mutex::Locker locker (GetConnectedPlatformListMutex ()); 169e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (idx < GetConnectedPlatformList().size()) 170e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton platform_sp = GetConnectedPlatformList ()[idx]; 171e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 172e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return platform_sp; 173e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 174e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 175e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------ 176e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// Default Constructor 177e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------ 178b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::Platform (bool is_host) : 179b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_is_host (is_host), 180b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_os_version_set_while_connected (false), 181b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_system_arch_set_while_connected (false), 182604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton m_sdk_sysroot (), 183604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton m_sdk_build (), 184b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_remote_url (), 18558e26e0935138225477fd61283215ceff2068899Greg Clayton m_name (), 186b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_major_os_version (UINT32_MAX), 187b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_minor_os_version (UINT32_MAX), 18824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_update_os_version (UINT32_MAX), 18924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_system_arch(), 19024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_uid_map_mutex (Mutex::eMutexTypeNormal), 19124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_gid_map_mutex (Mutex::eMutexTypeNormal), 19224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_uid_map(), 19324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_gid_map(), 19424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_max_uid_name_len (0), 19524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_max_gid_name_len (0) 196e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 197b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 198b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (log) 199b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton log->Printf ("%p Platform::Platform()", this); 200e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 201e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 202e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------ 203e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// Destructor. 204e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// 205e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// The destructor is virtual since this class is designed to be 206e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// inherited from by the plug-in instance. 207e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------ 208e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::~Platform() 209e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 210b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 211b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (log) 212b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton log->Printf ("%p Platform::~Platform()", this); 213e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 214e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 21558e26e0935138225477fd61283215ceff2068899Greg Claytonvoid 21658e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetStatus (Stream &strm) 21758e26e0935138225477fd61283215ceff2068899Greg Clayton{ 21858e26e0935138225477fd61283215ceff2068899Greg Clayton uint32_t major = UINT32_MAX; 21958e26e0935138225477fd61283215ceff2068899Greg Clayton uint32_t minor = UINT32_MAX; 22058e26e0935138225477fd61283215ceff2068899Greg Clayton uint32_t update = UINT32_MAX; 22158e26e0935138225477fd61283215ceff2068899Greg Clayton std::string s; 22224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.Printf (" Platform: %s\n", GetShortPluginName()); 22358e26e0935138225477fd61283215ceff2068899Greg Clayton 22458e26e0935138225477fd61283215ceff2068899Greg Clayton ArchSpec arch (GetSystemArchitecture()); 22558e26e0935138225477fd61283215ceff2068899Greg Clayton if (arch.IsValid()) 22658e26e0935138225477fd61283215ceff2068899Greg Clayton { 22758e26e0935138225477fd61283215ceff2068899Greg Clayton if (!arch.GetTriple().str().empty()) 22824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.Printf(" Triple: %s\n", arch.GetTriple().str().c_str()); 22958e26e0935138225477fd61283215ceff2068899Greg Clayton } 23058e26e0935138225477fd61283215ceff2068899Greg Clayton 23158e26e0935138225477fd61283215ceff2068899Greg Clayton if (GetOSVersion(major, minor, update)) 23258e26e0935138225477fd61283215ceff2068899Greg Clayton { 23324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.Printf("OS Version: %u", major); 23458e26e0935138225477fd61283215ceff2068899Greg Clayton if (minor != UINT32_MAX) 23558e26e0935138225477fd61283215ceff2068899Greg Clayton strm.Printf(".%u", minor); 23658e26e0935138225477fd61283215ceff2068899Greg Clayton if (update != UINT32_MAX) 23758e26e0935138225477fd61283215ceff2068899Greg Clayton strm.Printf(".%u", update); 23858e26e0935138225477fd61283215ceff2068899Greg Clayton 23958e26e0935138225477fd61283215ceff2068899Greg Clayton if (GetOSBuildString (s)) 24058e26e0935138225477fd61283215ceff2068899Greg Clayton strm.Printf(" (%s)", s.c_str()); 24158e26e0935138225477fd61283215ceff2068899Greg Clayton 24258e26e0935138225477fd61283215ceff2068899Greg Clayton strm.EOL(); 24358e26e0935138225477fd61283215ceff2068899Greg Clayton } 24458e26e0935138225477fd61283215ceff2068899Greg Clayton 24558e26e0935138225477fd61283215ceff2068899Greg Clayton if (GetOSKernelDescription (s)) 24624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.Printf(" Kernel: %s\n", s.c_str()); 24758e26e0935138225477fd61283215ceff2068899Greg Clayton 24858e26e0935138225477fd61283215ceff2068899Greg Clayton if (IsHost()) 24958e26e0935138225477fd61283215ceff2068899Greg Clayton { 25024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.Printf(" Hostname: %s\n", GetHostname()); 25158e26e0935138225477fd61283215ceff2068899Greg Clayton } 25258e26e0935138225477fd61283215ceff2068899Greg Clayton else 25358e26e0935138225477fd61283215ceff2068899Greg Clayton { 25424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const bool is_connected = IsConnected(); 25524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (is_connected) 25624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.Printf(" Hostname: %s\n", GetHostname()); 25724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.Printf(" Connected: %s\n", is_connected ? "yes" : "no"); 25858e26e0935138225477fd61283215ceff2068899Greg Clayton } 25958e26e0935138225477fd61283215ceff2068899Greg Clayton} 26058e26e0935138225477fd61283215ceff2068899Greg Clayton 261b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 262b1888f24fa181489840b9acf193e224d125d0776Greg Claytonbool 263b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::GetOSVersion (uint32_t &major, 264b1888f24fa181489840b9acf193e224d125d0776Greg Clayton uint32_t &minor, 265b1888f24fa181489840b9acf193e224d125d0776Greg Clayton uint32_t &update) 266b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 267b1888f24fa181489840b9acf193e224d125d0776Greg Clayton bool success = m_major_os_version != UINT32_MAX; 268b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (IsHost()) 269b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 270b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (!success) 271b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 272b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have a local host platform 273b1888f24fa181489840b9acf193e224d125d0776Greg Clayton success = Host::GetOSVersion (m_major_os_version, 274b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_minor_os_version, 275b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_update_os_version); 276b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_os_version_set_while_connected = success; 277b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 278b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 279b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 280b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 281b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have a remote platform. We can only fetch the remote 282b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // OS version if we are connected, and we don't want to do it 283b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // more than once. 284b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 285b1888f24fa181489840b9acf193e224d125d0776Greg Clayton const bool is_connected = IsConnected(); 286b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 28758e26e0935138225477fd61283215ceff2068899Greg Clayton bool fetch = false; 288b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (success) 289b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 290b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have valid OS version info, check to make sure it wasn't 291b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // manually set prior to connecting. If it was manually set prior 292b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // to connecting, then lets fetch the actual OS version info 293b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // if we are now connected. 294b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (is_connected && !m_os_version_set_while_connected) 29558e26e0935138225477fd61283215ceff2068899Greg Clayton fetch = true; 296b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 297b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 298b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 299b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We don't have valid OS version info, fetch it if we are connected 30058e26e0935138225477fd61283215ceff2068899Greg Clayton fetch = is_connected; 301b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 302b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 30358e26e0935138225477fd61283215ceff2068899Greg Clayton if (fetch) 304b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 30558e26e0935138225477fd61283215ceff2068899Greg Clayton success = GetRemoteOSVersion (); 306b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_os_version_set_while_connected = success; 307b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 308b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 309b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 310b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (success) 311b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 312b1888f24fa181489840b9acf193e224d125d0776Greg Clayton major = m_major_os_version; 313b1888f24fa181489840b9acf193e224d125d0776Greg Clayton minor = m_minor_os_version; 314b1888f24fa181489840b9acf193e224d125d0776Greg Clayton update = m_update_os_version; 315b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 316b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return success; 317b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 31858e26e0935138225477fd61283215ceff2068899Greg Clayton 31958e26e0935138225477fd61283215ceff2068899Greg Claytonbool 32058e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetOSBuildString (std::string &s) 32158e26e0935138225477fd61283215ceff2068899Greg Clayton{ 32258e26e0935138225477fd61283215ceff2068899Greg Clayton if (IsHost()) 32358e26e0935138225477fd61283215ceff2068899Greg Clayton return Host::GetOSBuildString (s); 32458e26e0935138225477fd61283215ceff2068899Greg Clayton else 32558e26e0935138225477fd61283215ceff2068899Greg Clayton return GetRemoteOSBuildString (s); 32658e26e0935138225477fd61283215ceff2068899Greg Clayton} 32758e26e0935138225477fd61283215ceff2068899Greg Clayton 32858e26e0935138225477fd61283215ceff2068899Greg Claytonbool 32958e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetOSKernelDescription (std::string &s) 33058e26e0935138225477fd61283215ceff2068899Greg Clayton{ 33158e26e0935138225477fd61283215ceff2068899Greg Clayton if (IsHost()) 33258e26e0935138225477fd61283215ceff2068899Greg Clayton return Host::GetOSKernelDescription (s); 33358e26e0935138225477fd61283215ceff2068899Greg Clayton else 33458e26e0935138225477fd61283215ceff2068899Greg Clayton return GetRemoteOSKernelDescription (s); 33558e26e0935138225477fd61283215ceff2068899Greg Clayton} 33658e26e0935138225477fd61283215ceff2068899Greg Clayton 33758e26e0935138225477fd61283215ceff2068899Greg Claytonconst char * 338b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::GetName () 339b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 340b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const char *name = GetHostname(); 341b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (name == NULL || name[0] == '\0') 342b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton name = GetShortPluginName(); 343b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return name; 344b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 345b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 346b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonconst char * 34758e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetHostname () 34858e26e0935138225477fd61283215ceff2068899Greg Clayton{ 3495e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton if (IsHost()) 3505e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton return "localhost"; 35124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 35224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_name.empty()) 35324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return NULL; 35424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return m_name.c_str(); 35558e26e0935138225477fd61283215ceff2068899Greg Clayton} 35658e26e0935138225477fd61283215ceff2068899Greg Clayton 35724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonconst char * 35824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonPlatform::GetUserName (uint32_t uid) 35924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 36024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *user_name = GetCachedUserName(uid); 36124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (user_name) 36224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return user_name; 36324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsHost()) 36424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 36524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton std::string name; 36624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (Host::GetUserName(uid, name)) 36724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return SetCachedUserName (uid, name.c_str(), name.size()); 36824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 36924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return NULL; 37024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 37158e26e0935138225477fd61283215ceff2068899Greg Clayton 37224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonconst char * 37324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonPlatform::GetGroupName (uint32_t gid) 37424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 37524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *group_name = GetCachedGroupName(gid); 37624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (group_name) 37724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return group_name; 37824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsHost()) 37924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 38024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton std::string name; 38124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (Host::GetGroupName(gid, name)) 38224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return SetCachedGroupName (gid, name.c_str(), name.size()); 38324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 38424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return NULL; 38524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 38658e26e0935138225477fd61283215ceff2068899Greg Clayton 387b1888f24fa181489840b9acf193e224d125d0776Greg Claytonbool 388b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::SetOSVersion (uint32_t major, 389b1888f24fa181489840b9acf193e224d125d0776Greg Clayton uint32_t minor, 390b1888f24fa181489840b9acf193e224d125d0776Greg Clayton uint32_t update) 391b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 392b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (IsHost()) 393b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 394b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We don't need anyone setting the OS version for the host platform, 395b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // we should be able to figure it out by calling Host::GetOSVersion(...). 396b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return false; 397b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 398b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 399b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 400b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have a remote platform, allow setting the target OS version if 401b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // we aren't connected, since if we are connected, we should be able to 402b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // request the remote OS version from the connected platform. 403b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (IsConnected()) 404b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return false; 405b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 406b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 407b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We aren't connected and we might want to set the OS version 408b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // ahead of time before we connect so we can peruse files and 409b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // use a local SDK or PDK cache of support files to disassemble 410b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // or do other things. 411b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_major_os_version = major; 412b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_minor_os_version = minor; 413b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_update_os_version = update; 414b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return true; 415b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 416b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 417b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return false; 418b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 419b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 420b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 421e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError 422e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::ResolveExecutable (const FileSpec &exe_file, 423e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton const ArchSpec &exe_arch, 4249ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton lldb::ModuleSP &exe_module_sp, 4259ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton const FileSpecList *module_search_paths_ptr) 426e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 427e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton Error error; 428e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (exe_file.Exists()) 429e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 430444fe998bf707bd076a70c3a779db8575533695eGreg Clayton ModuleSpec module_spec (exe_file, exe_arch); 431444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (module_spec.GetArchitecture().IsValid()) 432e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 433444fe998bf707bd076a70c3a779db8575533695eGreg Clayton error = ModuleList::GetSharedModule (module_spec, 434e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton exe_module_sp, 4359ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_search_paths_ptr, 436e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton NULL, 437e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton NULL); 438e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 439e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 440e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 441e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton // No valid architecture was specified, ask the platform for 442e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton // the architectures that we should be using (in the correct order) 443e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton // and see if we can find a match that way 444444fe998bf707bd076a70c3a779db8575533695eGreg Clayton for (uint32_t idx = 0; GetSupportedArchitectureAtIndex (idx, module_spec.GetArchitecture()); ++idx) 445e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 446444fe998bf707bd076a70c3a779db8575533695eGreg Clayton error = ModuleList::GetSharedModule (module_spec, 447e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton exe_module_sp, 4489ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_search_paths_ptr, 449e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton NULL, 450e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton NULL); 451e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton // Did we find an executable using one of the 452e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (error.Success() && exe_module_sp) 453e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton break; 454e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 455e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 456e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 457e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 458e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 459e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton error.SetErrorStringWithFormat ("'%s%s%s' does not exist", 460e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton exe_file.GetDirectory().AsCString(""), 461e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton exe_file.GetDirectory() ? "/" : "", 462e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton exe_file.GetFilename().AsCString("")); 463e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 464e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return error; 465e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 466e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 467f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Claytonbool 468f2bf870da5819415d52bc7da98c151cedf1e6dffGreg ClaytonPlatform::ResolveRemotePath (const FileSpec &platform_path, 469f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton FileSpec &resolved_platform_path) 470f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton{ 471f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton resolved_platform_path = platform_path; 472f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton return resolved_platform_path.ResolvePath(); 473f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton} 474f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton 475b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 476b1888f24fa181489840b9acf193e224d125d0776Greg Claytonconst ArchSpec & 477b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::GetSystemArchitecture() 478b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 479b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (IsHost()) 480b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 481b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (!m_system_arch.IsValid()) 482b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 483b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have a local host platform 484b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_system_arch = Host::GetArchitecture(); 485b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_system_arch_set_while_connected = m_system_arch.IsValid(); 486b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 487b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 488b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 489b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 490b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have a remote platform. We can only fetch the remote 491b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // system architecture if we are connected, and we don't want to do it 492b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // more than once. 493b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 494b1888f24fa181489840b9acf193e224d125d0776Greg Clayton const bool is_connected = IsConnected(); 495b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 496b1888f24fa181489840b9acf193e224d125d0776Greg Clayton bool fetch = false; 497b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (m_system_arch.IsValid()) 498b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 499b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have valid OS version info, check to make sure it wasn't 500b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // manually set prior to connecting. If it was manually set prior 501b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // to connecting, then lets fetch the actual OS version info 502b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // if we are now connected. 503b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (is_connected && !m_system_arch_set_while_connected) 504b1888f24fa181489840b9acf193e224d125d0776Greg Clayton fetch = true; 505b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 506b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 507b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 508b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We don't have valid OS version info, fetch it if we are connected 509b1888f24fa181489840b9acf193e224d125d0776Greg Clayton fetch = is_connected; 510b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 511b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 512b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (fetch) 513b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 51458e26e0935138225477fd61283215ceff2068899Greg Clayton m_system_arch = GetRemoteSystemArchitecture (); 515b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_system_arch_set_while_connected = m_system_arch.IsValid(); 516b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 517b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 518b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return m_system_arch; 519b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 520b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 521b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 522e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError 523cb8977d726be451df9978a74088435667fa37da2Greg ClaytonPlatform::ConnectRemote (Args& args) 524e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 525e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton Error error; 526cb8977d726be451df9978a74088435667fa37da2Greg Clayton if (IsHost()) 527cb8977d726be451df9978a74088435667fa37da2Greg Clayton error.SetErrorStringWithFormat ("The currently selected platform (%s) is the host platform and is always connected.", GetShortPluginName()); 528cb8977d726be451df9978a74088435667fa37da2Greg Clayton else 529cb8977d726be451df9978a74088435667fa37da2Greg Clayton error.SetErrorStringWithFormat ("Platform::ConnectRemote() is not supported by %s", GetShortPluginName()); 530e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return error; 531e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 532e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 533e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError 534cb8977d726be451df9978a74088435667fa37da2Greg ClaytonPlatform::DisconnectRemote () 535e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 536e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton Error error; 537cb8977d726be451df9978a74088435667fa37da2Greg Clayton if (IsHost()) 538cb8977d726be451df9978a74088435667fa37da2Greg Clayton error.SetErrorStringWithFormat ("The currently selected platform (%s) is the host platform and is always connected.", GetShortPluginName()); 539cb8977d726be451df9978a74088435667fa37da2Greg Clayton else 540cb8977d726be451df9978a74088435667fa37da2Greg Clayton error.SetErrorStringWithFormat ("Platform::DisconnectRemote() is not supported by %s", GetShortPluginName()); 541e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return error; 542e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 54324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 54424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonbool 545b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info) 54624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 54724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // Take care of the host case so that each subclass can just 548b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // call this function to get the host functionality. 54924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsHost()) 55024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return Host::GetProcessInfo (pid, process_info); 55124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 55224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 55324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 55424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonuint32_t 555b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::FindProcesses (const ProcessInstanceInfoMatch &match_info, 556b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessInstanceInfoList &process_infos) 55724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 558b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Take care of the host case so that each subclass can just 559b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // call this function to get the host functionality. 56024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton uint32_t match_count = 0; 56124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsHost()) 56224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton match_count = Host::FindProcesses (match_info, process_infos); 56324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return match_count; 56424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 565b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 566b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 567b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonError 568b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::LaunchProcess (ProcessLaunchInfo &launch_info) 569b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 570b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error error; 571b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Take care of the host case so that each subclass can just 572b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // call this function to get the host functionality. 573b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (IsHost()) 574dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton { 575dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton if (::getenv ("LLDB_LAUNCH_FLAG_LAUNCH_IN_TTY")) 576dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton launch_info.GetFlags().Set (eLaunchFlagLaunchInTTY); 577dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton 578dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton if (launch_info.GetFlags().Test (eLaunchFlagLaunchInShell)) 579dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton { 580dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const bool is_localhost = true; 58197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton const bool will_debug = launch_info.GetFlags().Test(eLaunchFlagDebug); 58297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton const bool first_arg_is_full_shell_command = false; 58397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton if (!launch_info.ConvertArgumentsForLaunchingInShell (error, 58497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton is_localhost, 58597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton will_debug, 58697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton first_arg_is_full_shell_command)) 587dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton return error; 588dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton } 589dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton 590b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error = Host::LaunchProcess (launch_info); 591dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton } 592b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 593b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("base lldb_private::Platform class can't launch remote processes"); 594b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return error; 595b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 596b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 597b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonlldb::ProcessSP 598b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::DebugProcess (ProcessLaunchInfo &launch_info, 599b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Debugger &debugger, 600b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Target *target, // Can be NULL, if NULL create a new target, else use existing one 601b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Listener &listener, 602b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error &error) 603b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 604b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessSP process_sp; 605b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Make sure we stop at the entry point 606b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.GetFlags ().Set (eLaunchFlagDebug); 607b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error = LaunchProcess (launch_info); 608b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (error.Success()) 609b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 610527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (launch_info.GetProcessID() != LLDB_INVALID_PROCESS_ID) 611b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 612527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton ProcessAttachInfo attach_info (launch_info); 613527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton process_sp = Attach (attach_info, debugger, target, listener, error); 614ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton if (process_sp) 615ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton { 616ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // Since we attached to the process, it will think it needs to detach 617ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // if the process object just goes away without an explicit call to 618ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // Process::Kill() or Process::Detach(), so let it know to kill the 619ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // process if this happens. 620ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton process_sp->SetShouldDetach (false); 621464c6161464694412b7472129e789248f1cf21b9Greg Clayton 622464c6161464694412b7472129e789248f1cf21b9Greg Clayton // If we didn't have any file actions, the pseudo terminal might 623464c6161464694412b7472129e789248f1cf21b9Greg Clayton // have been used where the slave side was given as the file to 624464c6161464694412b7472129e789248f1cf21b9Greg Clayton // open for stdin/out/err after we have already opened the master 625464c6161464694412b7472129e789248f1cf21b9Greg Clayton // so we can read/write stdin/out/err. 626464c6161464694412b7472129e789248f1cf21b9Greg Clayton int pty_fd = launch_info.GetPTY().ReleaseMasterFileDescriptor(); 627464c6161464694412b7472129e789248f1cf21b9Greg Clayton if (pty_fd != lldb_utility::PseudoTerminal::invalid_fd) 628464c6161464694412b7472129e789248f1cf21b9Greg Clayton { 629464c6161464694412b7472129e789248f1cf21b9Greg Clayton process_sp->SetSTDIOFileDescriptor(pty_fd); 630464c6161464694412b7472129e789248f1cf21b9Greg Clayton } 631ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton } 632b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 633b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 634b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return process_sp; 635b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 636b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 637b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 638b1db658333cdebca31a128be95e926d80c3c7796Greg Claytonlldb::PlatformSP 639b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg ClaytonPlatform::GetPlatformForArchitecture (const ArchSpec &arch, ArchSpec *platform_arch_ptr) 640b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton{ 641b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton lldb::PlatformSP platform_sp; 642b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton Error error; 643b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton if (arch.IsValid()) 644b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton platform_sp = Platform::Create (arch, platform_arch_ptr, error); 645b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton return platform_sp; 646b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton} 647b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 648b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 649b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton//------------------------------------------------------------------ 650b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton/// Lets a platform answer if it is compatible with a given 651b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton/// architecture and the target triple contained within. 652b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton//------------------------------------------------------------------ 653b1db658333cdebca31a128be95e926d80c3c7796Greg Claytonbool 654b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg ClaytonPlatform::IsCompatibleArchitecture (const ArchSpec &arch, ArchSpec *compatible_arch_ptr) 655b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton{ 656b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton // If the architecture is invalid, we must answer true... 657b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (arch.IsValid()) 658b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton { 659b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton ArchSpec platform_arch; 660b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton for (uint32_t arch_idx=0; GetSupportedArchitectureAtIndex (arch_idx, platform_arch); ++arch_idx) 661b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 662b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (arch == platform_arch) 663b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 664b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (compatible_arch_ptr) 665b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton *compatible_arch_ptr = platform_arch; 666b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return true; 667b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 668b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 669b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton } 670b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (compatible_arch_ptr) 671b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton compatible_arch_ptr->Clear(); 672b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton return false; 673b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 674b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton} 675b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 676b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 677