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 16bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton#include "lldb/Breakpoint/BreakpointIDList.h" 17e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Core/Error.h" 18b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton#include "lldb/Core/Log.h" 1949ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/ModuleSpec.h" 20e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Core/PluginManager.h" 21e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Host/FileSpec.h" 22b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "lldb/Host/Host.h" 23b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton#include "lldb/Target/Process.h" 24e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Target/Target.h" 25e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 26e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonusing namespace lldb; 27e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonusing namespace lldb_private; 28e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 29e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// Use a singleton function for g_local_platform_sp to avoid init 30e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// constructors since LLDB is often part of a shared library 31e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonstatic PlatformSP& 32e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonGetDefaultPlatformSP () 33e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 34e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton static PlatformSP g_default_platform_sp; 35e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return g_default_platform_sp; 36e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 37e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 38e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonstatic Mutex & 39e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonGetConnectedPlatformListMutex () 40e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 41e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton static Mutex g_remote_connected_platforms_mutex (Mutex::eMutexTypeRecursive); 42e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return g_remote_connected_platforms_mutex; 43e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 44e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonstatic std::vector<PlatformSP> & 45e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonGetConnectedPlatformList () 46e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 47e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton static std::vector<PlatformSP> g_remote_connected_platforms; 48e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return g_remote_connected_platforms; 49e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 50e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 515e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton 525e342f50b42b265d8568e1c926328858e74b2c0aGreg Claytonconst char * 535e342f50b42b265d8568e1c926328858e74b2c0aGreg ClaytonPlatform::GetHostPlatformName () 545e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton{ 555e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton return "host"; 565e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton} 575e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton 58e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------ 59e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// Get the native host platform plug-in. 60e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// 61e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// There should only be one of these for each host that LLDB runs 62e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// upon that should be statically compiled in and registered using 63e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// preprocessor macros or other similar build mechanisms. 64e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// 65e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// This platform will be used as the default platform when launching 66e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// or attaching to processes unless another platform is specified. 67e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------ 68e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformSP 69e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::GetDefaultPlatform () 70e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 71e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return GetDefaultPlatformSP (); 72e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 73e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 74e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonvoid 75e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::SetDefaultPlatform (const lldb::PlatformSP &platform_sp) 76e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 77e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton // The native platform should use its static void Platform::Initialize() 78e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton // function to register itself as the native platform. 79e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton GetDefaultPlatformSP () = platform_sp; 80e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 81e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 82e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError 83cb8977d726be451df9978a74088435667fa37da2Greg ClaytonPlatform::GetFile (const FileSpec &platform_file, 84cb8977d726be451df9978a74088435667fa37da2Greg Clayton const UUID *uuid_ptr, 85cb8977d726be451df9978a74088435667fa37da2Greg Clayton FileSpec &local_file) 86e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 87e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton // Default to the local case 88e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton local_file = platform_file; 89e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return Error(); 90e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 91e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 92d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg ClaytonFileSpecList 93d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg ClaytonPlatform::LocateExecutableScriptingResources (Target *target, Module &module) 94146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata{ 95d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton return FileSpecList(); 96146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata} 97146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata 98e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason MolendaPlatform* 990e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonPlatform::FindPlugin (Process *process, const ConstString &plugin_name) 100e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda{ 101e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda PlatformCreateInstance create_callback = NULL; 102e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda if (plugin_name) 103e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda { 104e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda create_callback = PluginManager::GetPlatformCreateCallbackForPluginName (plugin_name); 105e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda if (create_callback) 106e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda { 107e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda ArchSpec arch; 108e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda if (process) 109e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda { 110e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda arch = process->GetTarget().GetArchitecture(); 111e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda } 112102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton std::unique_ptr<Platform> instance_ap(create_callback(process, &arch)); 113e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda if (instance_ap.get()) 114e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda return instance_ap.release(); 115e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda } 116e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda } 117e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda else 118e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda { 119e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda for (uint32_t idx = 0; (create_callback = PluginManager::GetPlatformCreateCallbackAtIndex(idx)) != NULL; ++idx) 120e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda { 121884288bcb6824452a3c64eb772c0976501acc47aMatt Kopec std::unique_ptr<Platform> instance_ap(create_callback(process, nullptr)); 122e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda if (instance_ap.get()) 123e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda return instance_ap.release(); 124e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda } 125e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda } 126e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda return NULL; 127e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda} 128e369aedc1ef2fc983ee97ad75a2537b9a8f820bdJason Molenda 12924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonError 130444fe998bf707bd076a70c3a779db8575533695eGreg ClaytonPlatform::GetSharedModule (const ModuleSpec &module_spec, 13124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton ModuleSP &module_sp, 1329ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton const FileSpecList *module_search_paths_ptr, 13324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton ModuleSP *old_module_sp_ptr, 13424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton bool *did_create_ptr) 13524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 13624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // Don't do any path remapping for the default implementation 13724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // of the platform GetSharedModule function, just call through 13824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // to our static ModuleList function. Platform subclasses that 13924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // implement remote debugging, might have a developer kits 14024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // installed that have cached versions of the files for the 14124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // remote target, or might implement a download and cache 14224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // locally implementation. 14324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const bool always_create = false; 144444fe998bf707bd076a70c3a779db8575533695eGreg Clayton return ModuleList::GetSharedModule (module_spec, 14524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton module_sp, 1469ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_search_paths_ptr, 14724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton old_module_sp_ptr, 14824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton did_create_ptr, 14924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton always_create); 15024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 15124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 152e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformSP 153b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::Create (const char *platform_name, Error &error) 154e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 155e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton PlatformCreateInstance create_callback = NULL; 156e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton lldb::PlatformSP platform_sp; 157b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (platform_name && platform_name[0]) 158e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 1590e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton ConstString const_platform_name (platform_name); 1600e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton create_callback = PluginManager::GetPlatformCreateCallbackForPluginName (const_platform_name); 161e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (create_callback) 162b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton platform_sp.reset(create_callback(true, NULL)); 163e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 164b1888f24fa181489840b9acf193e224d125d0776Greg Clayton error.SetErrorStringWithFormat ("unable to find a plug-in for the platform named \"%s\"", platform_name); 165e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 166e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 167b1888f24fa181489840b9acf193e224d125d0776Greg Clayton error.SetErrorString ("invalid platform name"); 168e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return platform_sp; 169e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 170e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 171b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 172b1db658333cdebca31a128be95e926d80c3c7796Greg ClaytonPlatformSP 173b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg ClaytonPlatform::Create (const ArchSpec &arch, ArchSpec *platform_arch_ptr, Error &error) 174b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton{ 175b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton lldb::PlatformSP platform_sp; 176b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton if (arch.IsValid()) 177b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton { 178b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton uint32_t idx; 179b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton PlatformCreateInstance create_callback; 180aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton // First try exact arch matches across all platform plug-ins 181aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton bool exact = true; 182b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton for (idx = 0; (create_callback = PluginManager::GetPlatformCreateCallbackAtIndex (idx)); ++idx) 183b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton { 184b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton if (create_callback) 185aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton { 186aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton platform_sp.reset(create_callback(false, &arch)); 187aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton if (platform_sp && platform_sp->IsCompatibleArchitecture(arch, exact, platform_arch_ptr)) 188aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton return platform_sp; 189aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton } 190aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton } 191aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton // Next try compatible arch matches across all platform plug-ins 192aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton exact = false; 193aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton for (idx = 0; (create_callback = PluginManager::GetPlatformCreateCallbackAtIndex (idx)); ++idx) 194aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton { 195aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton if (create_callback) 196aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton { 197b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton platform_sp.reset(create_callback(false, &arch)); 198aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton if (platform_sp && platform_sp->IsCompatibleArchitecture(arch, exact, platform_arch_ptr)) 199aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton return platform_sp; 200aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton } 201b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton } 202b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton } 203b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton else 204b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton error.SetErrorString ("invalid platform name"); 205b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (platform_arch_ptr) 206b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton platform_arch_ptr->Clear(); 207b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton platform_sp.reset(); 208b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton return platform_sp; 209b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton} 210b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 211e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonuint32_t 212e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::GetNumConnectedRemotePlatforms () 213e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 214e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton Mutex::Locker locker (GetConnectedPlatformListMutex ()); 215e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return GetConnectedPlatformList().size(); 216e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 217e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 218e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformSP 219e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::GetConnectedRemotePlatformAtIndex (uint32_t idx) 220e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 221e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton PlatformSP platform_sp; 222e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 223e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton Mutex::Locker locker (GetConnectedPlatformListMutex ()); 224e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (idx < GetConnectedPlatformList().size()) 225e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton platform_sp = GetConnectedPlatformList ()[idx]; 226e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 227e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return platform_sp; 228e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 229e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 230e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------ 231e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// Default Constructor 232e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------ 233b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::Platform (bool is_host) : 234b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_is_host (is_host), 235b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_os_version_set_while_connected (false), 236b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_system_arch_set_while_connected (false), 237604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton m_sdk_sysroot (), 238604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton m_sdk_build (), 239b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_remote_url (), 24058e26e0935138225477fd61283215ceff2068899Greg Clayton m_name (), 241b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_major_os_version (UINT32_MAX), 242b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_minor_os_version (UINT32_MAX), 24324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_update_os_version (UINT32_MAX), 24424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_system_arch(), 24524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_uid_map_mutex (Mutex::eMutexTypeNormal), 24624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_gid_map_mutex (Mutex::eMutexTypeNormal), 24724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_uid_map(), 24824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_gid_map(), 24924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_max_uid_name_len (0), 25024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_max_gid_name_len (0) 251e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 252952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 253b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (log) 254b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton log->Printf ("%p Platform::Platform()", this); 255e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 256e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 257e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------ 258e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// Destructor. 259e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// 260e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// The destructor is virtual since this class is designed to be 261e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// inherited from by the plug-in instance. 262e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------ 263e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::~Platform() 264e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 265952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 266b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (log) 267b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton log->Printf ("%p Platform::~Platform()", this); 268e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 269e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 27058e26e0935138225477fd61283215ceff2068899Greg Claytonvoid 27158e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetStatus (Stream &strm) 27258e26e0935138225477fd61283215ceff2068899Greg Clayton{ 27358e26e0935138225477fd61283215ceff2068899Greg Clayton uint32_t major = UINT32_MAX; 27458e26e0935138225477fd61283215ceff2068899Greg Clayton uint32_t minor = UINT32_MAX; 27558e26e0935138225477fd61283215ceff2068899Greg Clayton uint32_t update = UINT32_MAX; 27658e26e0935138225477fd61283215ceff2068899Greg Clayton std::string s; 2770e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton strm.Printf (" Platform: %s\n", GetPluginName().GetCString()); 27858e26e0935138225477fd61283215ceff2068899Greg Clayton 27958e26e0935138225477fd61283215ceff2068899Greg Clayton ArchSpec arch (GetSystemArchitecture()); 28058e26e0935138225477fd61283215ceff2068899Greg Clayton if (arch.IsValid()) 28158e26e0935138225477fd61283215ceff2068899Greg Clayton { 28258e26e0935138225477fd61283215ceff2068899Greg Clayton if (!arch.GetTriple().str().empty()) 28324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.Printf(" Triple: %s\n", arch.GetTriple().str().c_str()); 28458e26e0935138225477fd61283215ceff2068899Greg Clayton } 28558e26e0935138225477fd61283215ceff2068899Greg Clayton 28658e26e0935138225477fd61283215ceff2068899Greg Clayton if (GetOSVersion(major, minor, update)) 28758e26e0935138225477fd61283215ceff2068899Greg Clayton { 28824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.Printf("OS Version: %u", major); 28958e26e0935138225477fd61283215ceff2068899Greg Clayton if (minor != UINT32_MAX) 29058e26e0935138225477fd61283215ceff2068899Greg Clayton strm.Printf(".%u", minor); 29158e26e0935138225477fd61283215ceff2068899Greg Clayton if (update != UINT32_MAX) 29258e26e0935138225477fd61283215ceff2068899Greg Clayton strm.Printf(".%u", update); 29358e26e0935138225477fd61283215ceff2068899Greg Clayton 29458e26e0935138225477fd61283215ceff2068899Greg Clayton if (GetOSBuildString (s)) 29558e26e0935138225477fd61283215ceff2068899Greg Clayton strm.Printf(" (%s)", s.c_str()); 29658e26e0935138225477fd61283215ceff2068899Greg Clayton 29758e26e0935138225477fd61283215ceff2068899Greg Clayton strm.EOL(); 29858e26e0935138225477fd61283215ceff2068899Greg Clayton } 29958e26e0935138225477fd61283215ceff2068899Greg Clayton 30058e26e0935138225477fd61283215ceff2068899Greg Clayton if (GetOSKernelDescription (s)) 30124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.Printf(" Kernel: %s\n", s.c_str()); 30258e26e0935138225477fd61283215ceff2068899Greg Clayton 30358e26e0935138225477fd61283215ceff2068899Greg Clayton if (IsHost()) 30458e26e0935138225477fd61283215ceff2068899Greg Clayton { 30524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.Printf(" Hostname: %s\n", GetHostname()); 30658e26e0935138225477fd61283215ceff2068899Greg Clayton } 30758e26e0935138225477fd61283215ceff2068899Greg Clayton else 30858e26e0935138225477fd61283215ceff2068899Greg Clayton { 30924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const bool is_connected = IsConnected(); 31024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (is_connected) 31124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.Printf(" Hostname: %s\n", GetHostname()); 31224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.Printf(" Connected: %s\n", is_connected ? "yes" : "no"); 31358e26e0935138225477fd61283215ceff2068899Greg Clayton } 31458e26e0935138225477fd61283215ceff2068899Greg Clayton} 31558e26e0935138225477fd61283215ceff2068899Greg Clayton 316b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 317b1888f24fa181489840b9acf193e224d125d0776Greg Claytonbool 318b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::GetOSVersion (uint32_t &major, 319b1888f24fa181489840b9acf193e224d125d0776Greg Clayton uint32_t &minor, 320b1888f24fa181489840b9acf193e224d125d0776Greg Clayton uint32_t &update) 321b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 322b1888f24fa181489840b9acf193e224d125d0776Greg Clayton bool success = m_major_os_version != UINT32_MAX; 323b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (IsHost()) 324b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 325b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (!success) 326b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 327b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have a local host platform 328b1888f24fa181489840b9acf193e224d125d0776Greg Clayton success = Host::GetOSVersion (m_major_os_version, 329b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_minor_os_version, 330b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_update_os_version); 331b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_os_version_set_while_connected = success; 332b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 333b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 334b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 335b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 336b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have a remote platform. We can only fetch the remote 337b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // OS version if we are connected, and we don't want to do it 338b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // more than once. 339b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 340b1888f24fa181489840b9acf193e224d125d0776Greg Clayton const bool is_connected = IsConnected(); 341b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 34258e26e0935138225477fd61283215ceff2068899Greg Clayton bool fetch = false; 343b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (success) 344b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 345b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have valid OS version info, check to make sure it wasn't 346b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // manually set prior to connecting. If it was manually set prior 347b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // to connecting, then lets fetch the actual OS version info 348b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // if we are now connected. 349b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (is_connected && !m_os_version_set_while_connected) 35058e26e0935138225477fd61283215ceff2068899Greg Clayton fetch = true; 351b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 352b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 353b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 354b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We don't have valid OS version info, fetch it if we are connected 35558e26e0935138225477fd61283215ceff2068899Greg Clayton fetch = is_connected; 356b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 357b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 35858e26e0935138225477fd61283215ceff2068899Greg Clayton if (fetch) 359b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 36058e26e0935138225477fd61283215ceff2068899Greg Clayton success = GetRemoteOSVersion (); 361b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_os_version_set_while_connected = success; 362b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 363b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 364b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 365b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (success) 366b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 367b1888f24fa181489840b9acf193e224d125d0776Greg Clayton major = m_major_os_version; 368b1888f24fa181489840b9acf193e224d125d0776Greg Clayton minor = m_minor_os_version; 369b1888f24fa181489840b9acf193e224d125d0776Greg Clayton update = m_update_os_version; 370b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 371b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return success; 372b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 37358e26e0935138225477fd61283215ceff2068899Greg Clayton 37458e26e0935138225477fd61283215ceff2068899Greg Claytonbool 37558e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetOSBuildString (std::string &s) 37658e26e0935138225477fd61283215ceff2068899Greg Clayton{ 37758e26e0935138225477fd61283215ceff2068899Greg Clayton if (IsHost()) 37858e26e0935138225477fd61283215ceff2068899Greg Clayton return Host::GetOSBuildString (s); 37958e26e0935138225477fd61283215ceff2068899Greg Clayton else 38058e26e0935138225477fd61283215ceff2068899Greg Clayton return GetRemoteOSBuildString (s); 38158e26e0935138225477fd61283215ceff2068899Greg Clayton} 38258e26e0935138225477fd61283215ceff2068899Greg Clayton 38358e26e0935138225477fd61283215ceff2068899Greg Claytonbool 38458e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetOSKernelDescription (std::string &s) 38558e26e0935138225477fd61283215ceff2068899Greg Clayton{ 38658e26e0935138225477fd61283215ceff2068899Greg Clayton if (IsHost()) 38758e26e0935138225477fd61283215ceff2068899Greg Clayton return Host::GetOSKernelDescription (s); 38858e26e0935138225477fd61283215ceff2068899Greg Clayton else 38958e26e0935138225477fd61283215ceff2068899Greg Clayton return GetRemoteOSKernelDescription (s); 39058e26e0935138225477fd61283215ceff2068899Greg Clayton} 39158e26e0935138225477fd61283215ceff2068899Greg Clayton 3920e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonConstString 393b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::GetName () 394b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 395b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const char *name = GetHostname(); 396b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (name == NULL || name[0] == '\0') 3970e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton return GetPluginName(); 3980e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton return ConstString (name); 399b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 400b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 401b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonconst char * 40258e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetHostname () 40358e26e0935138225477fd61283215ceff2068899Greg Clayton{ 4045e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton if (IsHost()) 4055e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton return "localhost"; 40624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 40724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_name.empty()) 40824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return NULL; 40924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return m_name.c_str(); 41058e26e0935138225477fd61283215ceff2068899Greg Clayton} 41158e26e0935138225477fd61283215ceff2068899Greg Clayton 41224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonconst char * 41324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonPlatform::GetUserName (uint32_t uid) 41424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 41524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *user_name = GetCachedUserName(uid); 41624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (user_name) 41724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return user_name; 41824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsHost()) 41924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 42024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton std::string name; 42124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (Host::GetUserName(uid, name)) 42224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return SetCachedUserName (uid, name.c_str(), name.size()); 42324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 42424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return NULL; 42524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 42658e26e0935138225477fd61283215ceff2068899Greg Clayton 42724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonconst char * 42824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonPlatform::GetGroupName (uint32_t gid) 42924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 43024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *group_name = GetCachedGroupName(gid); 43124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (group_name) 43224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return group_name; 43324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsHost()) 43424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 43524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton std::string name; 43624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (Host::GetGroupName(gid, name)) 43724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return SetCachedGroupName (gid, name.c_str(), name.size()); 43824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 43924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return NULL; 44024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 44158e26e0935138225477fd61283215ceff2068899Greg Clayton 442b1888f24fa181489840b9acf193e224d125d0776Greg Claytonbool 443b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::SetOSVersion (uint32_t major, 444b1888f24fa181489840b9acf193e224d125d0776Greg Clayton uint32_t minor, 445b1888f24fa181489840b9acf193e224d125d0776Greg Clayton uint32_t update) 446b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 447b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (IsHost()) 448b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 449b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We don't need anyone setting the OS version for the host platform, 450b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // we should be able to figure it out by calling Host::GetOSVersion(...). 451b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return false; 452b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 453b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 454b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 455b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have a remote platform, allow setting the target OS version if 456b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // we aren't connected, since if we are connected, we should be able to 457b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // request the remote OS version from the connected platform. 458b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (IsConnected()) 459b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return false; 460b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 461b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 462b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We aren't connected and we might want to set the OS version 463b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // ahead of time before we connect so we can peruse files and 464b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // use a local SDK or PDK cache of support files to disassemble 465b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // or do other things. 466b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_major_os_version = major; 467b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_minor_os_version = minor; 468b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_update_os_version = update; 469b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return true; 470b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 471b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 472b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return false; 473b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 474b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 475b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 476e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError 477e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::ResolveExecutable (const FileSpec &exe_file, 478e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton const ArchSpec &exe_arch, 4799ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton lldb::ModuleSP &exe_module_sp, 4809ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton const FileSpecList *module_search_paths_ptr) 481e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 482e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton Error error; 483e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (exe_file.Exists()) 484e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 485444fe998bf707bd076a70c3a779db8575533695eGreg Clayton ModuleSpec module_spec (exe_file, exe_arch); 486444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (module_spec.GetArchitecture().IsValid()) 487e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 488444fe998bf707bd076a70c3a779db8575533695eGreg Clayton error = ModuleList::GetSharedModule (module_spec, 489e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton exe_module_sp, 4909ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_search_paths_ptr, 491e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton NULL, 492e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton NULL); 493e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 494e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 495e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 496e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton // No valid architecture was specified, ask the platform for 497e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton // the architectures that we should be using (in the correct order) 498e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton // and see if we can find a match that way 499444fe998bf707bd076a70c3a779db8575533695eGreg Clayton for (uint32_t idx = 0; GetSupportedArchitectureAtIndex (idx, module_spec.GetArchitecture()); ++idx) 500e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 501444fe998bf707bd076a70c3a779db8575533695eGreg Clayton error = ModuleList::GetSharedModule (module_spec, 502e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton exe_module_sp, 5039ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_search_paths_ptr, 504e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton NULL, 505e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton NULL); 506e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton // Did we find an executable using one of the 507e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (error.Success() && exe_module_sp) 508e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton break; 509e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 510e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 511e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 512e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 513e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 51497a19b21dacd9063bb5475812df7781777262198Greg Clayton error.SetErrorStringWithFormat ("'%s' does not exist", 51597a19b21dacd9063bb5475812df7781777262198Greg Clayton exe_file.GetPath().c_str()); 516e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 517e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return error; 518e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 519e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 52095b765e8000b44644d021e95bc58eac95028573bGreg ClaytonError 52195b765e8000b44644d021e95bc58eac95028573bGreg ClaytonPlatform::ResolveSymbolFile (Target &target, 52295b765e8000b44644d021e95bc58eac95028573bGreg Clayton const ModuleSpec &sym_spec, 52395b765e8000b44644d021e95bc58eac95028573bGreg Clayton FileSpec &sym_file) 52495b765e8000b44644d021e95bc58eac95028573bGreg Clayton{ 52595b765e8000b44644d021e95bc58eac95028573bGreg Clayton Error error; 52695b765e8000b44644d021e95bc58eac95028573bGreg Clayton if (sym_spec.GetSymbolFileSpec().Exists()) 52795b765e8000b44644d021e95bc58eac95028573bGreg Clayton sym_file = sym_spec.GetSymbolFileSpec(); 52895b765e8000b44644d021e95bc58eac95028573bGreg Clayton else 52995b765e8000b44644d021e95bc58eac95028573bGreg Clayton error.SetErrorString("unable to resolve symbol file"); 53095b765e8000b44644d021e95bc58eac95028573bGreg Clayton return error; 53195b765e8000b44644d021e95bc58eac95028573bGreg Clayton 53295b765e8000b44644d021e95bc58eac95028573bGreg Clayton} 53395b765e8000b44644d021e95bc58eac95028573bGreg Clayton 53495b765e8000b44644d021e95bc58eac95028573bGreg Clayton 53595b765e8000b44644d021e95bc58eac95028573bGreg Clayton 536f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Claytonbool 537f2bf870da5819415d52bc7da98c151cedf1e6dffGreg ClaytonPlatform::ResolveRemotePath (const FileSpec &platform_path, 538f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton FileSpec &resolved_platform_path) 539f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton{ 540f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton resolved_platform_path = platform_path; 541f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton return resolved_platform_path.ResolvePath(); 542f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton} 543f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton 544b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 545b1888f24fa181489840b9acf193e224d125d0776Greg Claytonconst ArchSpec & 546b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::GetSystemArchitecture() 547b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 548b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (IsHost()) 549b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 550b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (!m_system_arch.IsValid()) 551b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 552b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have a local host platform 553b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_system_arch = Host::GetArchitecture(); 554b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_system_arch_set_while_connected = m_system_arch.IsValid(); 555b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 556b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 557b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 558b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 559b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have a remote platform. We can only fetch the remote 560b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // system architecture if we are connected, and we don't want to do it 561b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // more than once. 562b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 563b1888f24fa181489840b9acf193e224d125d0776Greg Clayton const bool is_connected = IsConnected(); 564b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 565b1888f24fa181489840b9acf193e224d125d0776Greg Clayton bool fetch = false; 566b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (m_system_arch.IsValid()) 567b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 568b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have valid OS version info, check to make sure it wasn't 569b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // manually set prior to connecting. If it was manually set prior 570b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // to connecting, then lets fetch the actual OS version info 571b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // if we are now connected. 572b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (is_connected && !m_system_arch_set_while_connected) 573b1888f24fa181489840b9acf193e224d125d0776Greg Clayton fetch = true; 574b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 575b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 576b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 577b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We don't have valid OS version info, fetch it if we are connected 578b1888f24fa181489840b9acf193e224d125d0776Greg Clayton fetch = is_connected; 579b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 580b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 581b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (fetch) 582b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 58358e26e0935138225477fd61283215ceff2068899Greg Clayton m_system_arch = GetRemoteSystemArchitecture (); 584b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_system_arch_set_while_connected = m_system_arch.IsValid(); 585b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 586b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 587b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return m_system_arch; 588b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 589b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 590b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 591e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError 592cb8977d726be451df9978a74088435667fa37da2Greg ClaytonPlatform::ConnectRemote (Args& args) 593e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 594e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton Error error; 595cb8977d726be451df9978a74088435667fa37da2Greg Clayton if (IsHost()) 5960e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton error.SetErrorStringWithFormat ("The currently selected platform (%s) is the host platform and is always connected.", GetPluginName().GetCString()); 597cb8977d726be451df9978a74088435667fa37da2Greg Clayton else 5980e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton error.SetErrorStringWithFormat ("Platform::ConnectRemote() is not supported by %s", GetPluginName().GetCString()); 599e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return error; 600e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 601e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 602e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError 603cb8977d726be451df9978a74088435667fa37da2Greg ClaytonPlatform::DisconnectRemote () 604e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 605e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton Error error; 606cb8977d726be451df9978a74088435667fa37da2Greg Clayton if (IsHost()) 6070e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton error.SetErrorStringWithFormat ("The currently selected platform (%s) is the host platform and is always connected.", GetPluginName().GetCString()); 608cb8977d726be451df9978a74088435667fa37da2Greg Clayton else 6090e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton error.SetErrorStringWithFormat ("Platform::DisconnectRemote() is not supported by %s", GetPluginName().GetCString()); 610e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return error; 611e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 61224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 61324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonbool 614b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info) 61524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 61624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // Take care of the host case so that each subclass can just 617b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // call this function to get the host functionality. 61824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsHost()) 61924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return Host::GetProcessInfo (pid, process_info); 62024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 62124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 62224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 62324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonuint32_t 624b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::FindProcesses (const ProcessInstanceInfoMatch &match_info, 625b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessInstanceInfoList &process_infos) 62624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 627b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Take care of the host case so that each subclass can just 628b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // call this function to get the host functionality. 62924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton uint32_t match_count = 0; 63024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsHost()) 63124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton match_count = Host::FindProcesses (match_info, process_infos); 63224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return match_count; 63324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 634b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 635b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 636b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonError 637b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::LaunchProcess (ProcessLaunchInfo &launch_info) 638b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 639b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error error; 640b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Take care of the host case so that each subclass can just 641b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // call this function to get the host functionality. 642b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (IsHost()) 643dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton { 644dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton if (::getenv ("LLDB_LAUNCH_FLAG_LAUNCH_IN_TTY")) 645dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton launch_info.GetFlags().Set (eLaunchFlagLaunchInTTY); 646dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton 647dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton if (launch_info.GetFlags().Test (eLaunchFlagLaunchInShell)) 648dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton { 649dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const bool is_localhost = true; 65097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton const bool will_debug = launch_info.GetFlags().Test(eLaunchFlagDebug); 65197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton const bool first_arg_is_full_shell_command = false; 65297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton if (!launch_info.ConvertArgumentsForLaunchingInShell (error, 65397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton is_localhost, 65497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton will_debug, 65597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton first_arg_is_full_shell_command)) 656dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton return error; 657dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton } 658dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton 659b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error = Host::LaunchProcess (launch_info); 660dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton } 661b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 662b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("base lldb_private::Platform class can't launch remote processes"); 663b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return error; 664b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 665b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 666b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonlldb::ProcessSP 667b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::DebugProcess (ProcessLaunchInfo &launch_info, 668b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Debugger &debugger, 669b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Target *target, // Can be NULL, if NULL create a new target, else use existing one 670b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Listener &listener, 671b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error &error) 672b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 673b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessSP process_sp; 674b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Make sure we stop at the entry point 675b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.GetFlags ().Set (eLaunchFlagDebug); 676b7b2532bf23c852ea3e43d10f2377338be5b464fJim Ingham // We always launch the process we are going to debug in a separate process 677b7b2532bf23c852ea3e43d10f2377338be5b464fJim Ingham // group, since then we can handle ^C interrupts ourselves w/o having to worry 678b7b2532bf23c852ea3e43d10f2377338be5b464fJim Ingham // about the target getting them as well. 679b7b2532bf23c852ea3e43d10f2377338be5b464fJim Ingham launch_info.SetLaunchInSeparateProcessGroup(true); 680b7b2532bf23c852ea3e43d10f2377338be5b464fJim Ingham 681b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error = LaunchProcess (launch_info); 682b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (error.Success()) 683b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 684527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (launch_info.GetProcessID() != LLDB_INVALID_PROCESS_ID) 685b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 686527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton ProcessAttachInfo attach_info (launch_info); 687527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton process_sp = Attach (attach_info, debugger, target, listener, error); 688ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton if (process_sp) 689ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton { 690ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // Since we attached to the process, it will think it needs to detach 691ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // if the process object just goes away without an explicit call to 692ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // Process::Kill() or Process::Detach(), so let it know to kill the 693ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // process if this happens. 694ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton process_sp->SetShouldDetach (false); 695464c6161464694412b7472129e789248f1cf21b9Greg Clayton 696464c6161464694412b7472129e789248f1cf21b9Greg Clayton // If we didn't have any file actions, the pseudo terminal might 697464c6161464694412b7472129e789248f1cf21b9Greg Clayton // have been used where the slave side was given as the file to 698464c6161464694412b7472129e789248f1cf21b9Greg Clayton // open for stdin/out/err after we have already opened the master 699464c6161464694412b7472129e789248f1cf21b9Greg Clayton // so we can read/write stdin/out/err. 700464c6161464694412b7472129e789248f1cf21b9Greg Clayton int pty_fd = launch_info.GetPTY().ReleaseMasterFileDescriptor(); 701464c6161464694412b7472129e789248f1cf21b9Greg Clayton if (pty_fd != lldb_utility::PseudoTerminal::invalid_fd) 702464c6161464694412b7472129e789248f1cf21b9Greg Clayton { 703464c6161464694412b7472129e789248f1cf21b9Greg Clayton process_sp->SetSTDIOFileDescriptor(pty_fd); 704464c6161464694412b7472129e789248f1cf21b9Greg Clayton } 705ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton } 706b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 707b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 708b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return process_sp; 709b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 710b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 711b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 712b1db658333cdebca31a128be95e926d80c3c7796Greg Claytonlldb::PlatformSP 713b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg ClaytonPlatform::GetPlatformForArchitecture (const ArchSpec &arch, ArchSpec *platform_arch_ptr) 714b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton{ 715b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton lldb::PlatformSP platform_sp; 716b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton Error error; 717b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton if (arch.IsValid()) 718b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton platform_sp = Platform::Create (arch, platform_arch_ptr, error); 719b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton return platform_sp; 720b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton} 721b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 722b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 723b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton//------------------------------------------------------------------ 724b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton/// Lets a platform answer if it is compatible with a given 725b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton/// architecture and the target triple contained within. 726b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton//------------------------------------------------------------------ 727b1db658333cdebca31a128be95e926d80c3c7796Greg Claytonbool 728aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg ClaytonPlatform::IsCompatibleArchitecture (const ArchSpec &arch, bool exact_arch_match, ArchSpec *compatible_arch_ptr) 729b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton{ 730b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton // If the architecture is invalid, we must answer true... 731b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (arch.IsValid()) 732b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton { 733b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton ArchSpec platform_arch; 734aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton // Try for an exact architecture match first. 735aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton if (exact_arch_match) 736b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 737aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton for (uint32_t arch_idx=0; GetSupportedArchitectureAtIndex (arch_idx, platform_arch); ++arch_idx) 738b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 739aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton if (arch.IsExactMatch(platform_arch)) 740aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton { 741aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton if (compatible_arch_ptr) 742aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton *compatible_arch_ptr = platform_arch; 743aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton return true; 744aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton } 745aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton } 746aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton } 747aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton else 748aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton { 749aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton for (uint32_t arch_idx=0; GetSupportedArchitectureAtIndex (arch_idx, platform_arch); ++arch_idx) 750aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton { 751aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton if (arch.IsCompatibleMatch(platform_arch)) 752aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton { 753aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton if (compatible_arch_ptr) 754aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton *compatible_arch_ptr = platform_arch; 755aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton return true; 756aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton } 757b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 758b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 759b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton } 760b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (compatible_arch_ptr) 761b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton compatible_arch_ptr->Clear(); 762b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton return false; 763b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 764b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton} 765b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 766aad2b0f2e5da0ecbf22ab7fead4c06671f64c6c5Greg Clayton 767bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Claytonlldb::BreakpointSP 768bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg ClaytonPlatform::SetThreadCreationBreakpoint (lldb_private::Target &target) 769bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton{ 770bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton return lldb::BreakpointSP(); 771bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton} 772b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 77373844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonsize_t 77473844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonPlatform::GetEnvironment (StringList &environment) 77573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 77673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton environment.Clear(); 77773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return false; 77873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 77973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 780