Platform.cpp revision 146d9522c95c0c8c5409539813b55e08b99196ee
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 92146d9522c95c0c8c5409539813b55e08b99196eeEnrico GranataFileSpec 93146d9522c95c0c8c5409539813b55e08b99196eeEnrico GranataPlatform::LocateExecutableScriptingResource (const ModuleSpec &module_spec) 94146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata{ 95146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata return FileSpec(); 96146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata} 97146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata 9824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonError 99444fe998bf707bd076a70c3a779db8575533695eGreg ClaytonPlatform::GetSharedModule (const ModuleSpec &module_spec, 10024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton ModuleSP &module_sp, 1019ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton const FileSpecList *module_search_paths_ptr, 10224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton ModuleSP *old_module_sp_ptr, 10324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton bool *did_create_ptr) 10424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 10524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // Don't do any path remapping for the default implementation 10624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // of the platform GetSharedModule function, just call through 10724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // to our static ModuleList function. Platform subclasses that 10824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // implement remote debugging, might have a developer kits 10924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // installed that have cached versions of the files for the 11024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // remote target, or might implement a download and cache 11124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // locally implementation. 11224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const bool always_create = false; 113444fe998bf707bd076a70c3a779db8575533695eGreg Clayton return ModuleList::GetSharedModule (module_spec, 11424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton module_sp, 1159ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_search_paths_ptr, 11624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton old_module_sp_ptr, 11724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton did_create_ptr, 11824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton always_create); 11924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 12024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 121e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformSP 122b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::Create (const char *platform_name, Error &error) 123e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 124e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton PlatformCreateInstance create_callback = NULL; 125e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton lldb::PlatformSP platform_sp; 126b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (platform_name && platform_name[0]) 127e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 128e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton create_callback = PluginManager::GetPlatformCreateCallbackForPluginName (platform_name); 129e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (create_callback) 130b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton platform_sp.reset(create_callback(true, NULL)); 131e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 132b1888f24fa181489840b9acf193e224d125d0776Greg Clayton error.SetErrorStringWithFormat ("unable to find a plug-in for the platform named \"%s\"", platform_name); 133e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 134e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 135b1888f24fa181489840b9acf193e224d125d0776Greg Clayton error.SetErrorString ("invalid platform name"); 136e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return platform_sp; 137e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 138e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 139b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 140b1db658333cdebca31a128be95e926d80c3c7796Greg ClaytonPlatformSP 141b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg ClaytonPlatform::Create (const ArchSpec &arch, ArchSpec *platform_arch_ptr, Error &error) 142b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton{ 143b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton lldb::PlatformSP platform_sp; 144b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton if (arch.IsValid()) 145b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton { 146b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton uint32_t idx; 147b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton PlatformCreateInstance create_callback; 148b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton for (idx = 0; (create_callback = PluginManager::GetPlatformCreateCallbackAtIndex (idx)); ++idx) 149b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton { 150b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton if (create_callback) 151b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton platform_sp.reset(create_callback(false, &arch)); 152b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (platform_sp && platform_sp->IsCompatibleArchitecture(arch, platform_arch_ptr)) 153b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return platform_sp; 154b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton } 155b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton } 156b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton else 157b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton error.SetErrorString ("invalid platform name"); 158b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (platform_arch_ptr) 159b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton platform_arch_ptr->Clear(); 160b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton platform_sp.reset(); 161b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton return platform_sp; 162b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton} 163b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 164e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonuint32_t 165e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::GetNumConnectedRemotePlatforms () 166e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 167e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton Mutex::Locker locker (GetConnectedPlatformListMutex ()); 168e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return GetConnectedPlatformList().size(); 169e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 170e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 171e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformSP 172e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::GetConnectedRemotePlatformAtIndex (uint32_t idx) 173e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 174e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton PlatformSP platform_sp; 175e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 176e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton Mutex::Locker locker (GetConnectedPlatformListMutex ()); 177e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (idx < GetConnectedPlatformList().size()) 178e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton platform_sp = GetConnectedPlatformList ()[idx]; 179e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 180e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return platform_sp; 181e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 182e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 183e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------ 184e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// Default Constructor 185e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------ 186b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::Platform (bool is_host) : 187b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_is_host (is_host), 188b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_os_version_set_while_connected (false), 189b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_system_arch_set_while_connected (false), 190604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton m_sdk_sysroot (), 191604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton m_sdk_build (), 192b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_remote_url (), 19358e26e0935138225477fd61283215ceff2068899Greg Clayton m_name (), 194b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_major_os_version (UINT32_MAX), 195b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_minor_os_version (UINT32_MAX), 19624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_update_os_version (UINT32_MAX), 19724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_system_arch(), 19824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_uid_map_mutex (Mutex::eMutexTypeNormal), 19924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_gid_map_mutex (Mutex::eMutexTypeNormal), 20024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_uid_map(), 20124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_gid_map(), 20224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_max_uid_name_len (0), 20324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_max_gid_name_len (0) 204e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 205b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 206b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (log) 207b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton log->Printf ("%p Platform::Platform()", this); 208e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 209e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 210e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------ 211e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// Destructor. 212e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// 213e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// The destructor is virtual since this class is designed to be 214e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// inherited from by the plug-in instance. 215e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------ 216e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::~Platform() 217e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 218b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 219b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (log) 220b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton log->Printf ("%p Platform::~Platform()", this); 221e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 222e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 22358e26e0935138225477fd61283215ceff2068899Greg Claytonvoid 22458e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetStatus (Stream &strm) 22558e26e0935138225477fd61283215ceff2068899Greg Clayton{ 22658e26e0935138225477fd61283215ceff2068899Greg Clayton uint32_t major = UINT32_MAX; 22758e26e0935138225477fd61283215ceff2068899Greg Clayton uint32_t minor = UINT32_MAX; 22858e26e0935138225477fd61283215ceff2068899Greg Clayton uint32_t update = UINT32_MAX; 22958e26e0935138225477fd61283215ceff2068899Greg Clayton std::string s; 23024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.Printf (" Platform: %s\n", GetShortPluginName()); 23158e26e0935138225477fd61283215ceff2068899Greg Clayton 23258e26e0935138225477fd61283215ceff2068899Greg Clayton ArchSpec arch (GetSystemArchitecture()); 23358e26e0935138225477fd61283215ceff2068899Greg Clayton if (arch.IsValid()) 23458e26e0935138225477fd61283215ceff2068899Greg Clayton { 23558e26e0935138225477fd61283215ceff2068899Greg Clayton if (!arch.GetTriple().str().empty()) 23624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.Printf(" Triple: %s\n", arch.GetTriple().str().c_str()); 23758e26e0935138225477fd61283215ceff2068899Greg Clayton } 23858e26e0935138225477fd61283215ceff2068899Greg Clayton 23958e26e0935138225477fd61283215ceff2068899Greg Clayton if (GetOSVersion(major, minor, update)) 24058e26e0935138225477fd61283215ceff2068899Greg Clayton { 24124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.Printf("OS Version: %u", major); 24258e26e0935138225477fd61283215ceff2068899Greg Clayton if (minor != UINT32_MAX) 24358e26e0935138225477fd61283215ceff2068899Greg Clayton strm.Printf(".%u", minor); 24458e26e0935138225477fd61283215ceff2068899Greg Clayton if (update != UINT32_MAX) 24558e26e0935138225477fd61283215ceff2068899Greg Clayton strm.Printf(".%u", update); 24658e26e0935138225477fd61283215ceff2068899Greg Clayton 24758e26e0935138225477fd61283215ceff2068899Greg Clayton if (GetOSBuildString (s)) 24858e26e0935138225477fd61283215ceff2068899Greg Clayton strm.Printf(" (%s)", s.c_str()); 24958e26e0935138225477fd61283215ceff2068899Greg Clayton 25058e26e0935138225477fd61283215ceff2068899Greg Clayton strm.EOL(); 25158e26e0935138225477fd61283215ceff2068899Greg Clayton } 25258e26e0935138225477fd61283215ceff2068899Greg Clayton 25358e26e0935138225477fd61283215ceff2068899Greg Clayton if (GetOSKernelDescription (s)) 25424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.Printf(" Kernel: %s\n", s.c_str()); 25558e26e0935138225477fd61283215ceff2068899Greg Clayton 25658e26e0935138225477fd61283215ceff2068899Greg Clayton if (IsHost()) 25758e26e0935138225477fd61283215ceff2068899Greg Clayton { 25824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.Printf(" Hostname: %s\n", GetHostname()); 25958e26e0935138225477fd61283215ceff2068899Greg Clayton } 26058e26e0935138225477fd61283215ceff2068899Greg Clayton else 26158e26e0935138225477fd61283215ceff2068899Greg Clayton { 26224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const bool is_connected = IsConnected(); 26324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (is_connected) 26424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.Printf(" Hostname: %s\n", GetHostname()); 26524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.Printf(" Connected: %s\n", is_connected ? "yes" : "no"); 26658e26e0935138225477fd61283215ceff2068899Greg Clayton } 26758e26e0935138225477fd61283215ceff2068899Greg Clayton} 26858e26e0935138225477fd61283215ceff2068899Greg Clayton 269b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 270b1888f24fa181489840b9acf193e224d125d0776Greg Claytonbool 271b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::GetOSVersion (uint32_t &major, 272b1888f24fa181489840b9acf193e224d125d0776Greg Clayton uint32_t &minor, 273b1888f24fa181489840b9acf193e224d125d0776Greg Clayton uint32_t &update) 274b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 275b1888f24fa181489840b9acf193e224d125d0776Greg Clayton bool success = m_major_os_version != UINT32_MAX; 276b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (IsHost()) 277b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 278b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (!success) 279b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 280b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have a local host platform 281b1888f24fa181489840b9acf193e224d125d0776Greg Clayton success = Host::GetOSVersion (m_major_os_version, 282b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_minor_os_version, 283b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_update_os_version); 284b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_os_version_set_while_connected = success; 285b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 286b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 287b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 288b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 289b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have a remote platform. We can only fetch the remote 290b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // OS version if we are connected, and we don't want to do it 291b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // more than once. 292b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 293b1888f24fa181489840b9acf193e224d125d0776Greg Clayton const bool is_connected = IsConnected(); 294b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 29558e26e0935138225477fd61283215ceff2068899Greg Clayton bool fetch = false; 296b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (success) 297b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 298b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have valid OS version info, check to make sure it wasn't 299b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // manually set prior to connecting. If it was manually set prior 300b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // to connecting, then lets fetch the actual OS version info 301b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // if we are now connected. 302b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (is_connected && !m_os_version_set_while_connected) 30358e26e0935138225477fd61283215ceff2068899Greg Clayton fetch = true; 304b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 305b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 306b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 307b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We don't have valid OS version info, fetch it if we are connected 30858e26e0935138225477fd61283215ceff2068899Greg Clayton fetch = is_connected; 309b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 310b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 31158e26e0935138225477fd61283215ceff2068899Greg Clayton if (fetch) 312b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 31358e26e0935138225477fd61283215ceff2068899Greg Clayton success = GetRemoteOSVersion (); 314b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_os_version_set_while_connected = success; 315b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 316b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 317b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 318b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (success) 319b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 320b1888f24fa181489840b9acf193e224d125d0776Greg Clayton major = m_major_os_version; 321b1888f24fa181489840b9acf193e224d125d0776Greg Clayton minor = m_minor_os_version; 322b1888f24fa181489840b9acf193e224d125d0776Greg Clayton update = m_update_os_version; 323b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 324b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return success; 325b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 32658e26e0935138225477fd61283215ceff2068899Greg Clayton 32758e26e0935138225477fd61283215ceff2068899Greg Claytonbool 32858e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetOSBuildString (std::string &s) 32958e26e0935138225477fd61283215ceff2068899Greg Clayton{ 33058e26e0935138225477fd61283215ceff2068899Greg Clayton if (IsHost()) 33158e26e0935138225477fd61283215ceff2068899Greg Clayton return Host::GetOSBuildString (s); 33258e26e0935138225477fd61283215ceff2068899Greg Clayton else 33358e26e0935138225477fd61283215ceff2068899Greg Clayton return GetRemoteOSBuildString (s); 33458e26e0935138225477fd61283215ceff2068899Greg Clayton} 33558e26e0935138225477fd61283215ceff2068899Greg Clayton 33658e26e0935138225477fd61283215ceff2068899Greg Claytonbool 33758e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetOSKernelDescription (std::string &s) 33858e26e0935138225477fd61283215ceff2068899Greg Clayton{ 33958e26e0935138225477fd61283215ceff2068899Greg Clayton if (IsHost()) 34058e26e0935138225477fd61283215ceff2068899Greg Clayton return Host::GetOSKernelDescription (s); 34158e26e0935138225477fd61283215ceff2068899Greg Clayton else 34258e26e0935138225477fd61283215ceff2068899Greg Clayton return GetRemoteOSKernelDescription (s); 34358e26e0935138225477fd61283215ceff2068899Greg Clayton} 34458e26e0935138225477fd61283215ceff2068899Greg Clayton 34558e26e0935138225477fd61283215ceff2068899Greg Claytonconst char * 346b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::GetName () 347b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 348b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const char *name = GetHostname(); 349b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (name == NULL || name[0] == '\0') 350b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton name = GetShortPluginName(); 351b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return name; 352b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 353b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 354b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonconst char * 35558e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetHostname () 35658e26e0935138225477fd61283215ceff2068899Greg Clayton{ 3575e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton if (IsHost()) 3585e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton return "localhost"; 35924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 36024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_name.empty()) 36124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return NULL; 36224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return m_name.c_str(); 36358e26e0935138225477fd61283215ceff2068899Greg Clayton} 36458e26e0935138225477fd61283215ceff2068899Greg Clayton 36524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonconst char * 36624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonPlatform::GetUserName (uint32_t uid) 36724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 36824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *user_name = GetCachedUserName(uid); 36924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (user_name) 37024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return user_name; 37124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsHost()) 37224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 37324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton std::string name; 37424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (Host::GetUserName(uid, name)) 37524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return SetCachedUserName (uid, name.c_str(), name.size()); 37624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 37724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return NULL; 37824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 37958e26e0935138225477fd61283215ceff2068899Greg Clayton 38024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonconst char * 38124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonPlatform::GetGroupName (uint32_t gid) 38224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 38324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *group_name = GetCachedGroupName(gid); 38424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (group_name) 38524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return group_name; 38624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsHost()) 38724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 38824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton std::string name; 38924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (Host::GetGroupName(gid, name)) 39024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return SetCachedGroupName (gid, name.c_str(), name.size()); 39124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 39224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return NULL; 39324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 39458e26e0935138225477fd61283215ceff2068899Greg Clayton 395b1888f24fa181489840b9acf193e224d125d0776Greg Claytonbool 396b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::SetOSVersion (uint32_t major, 397b1888f24fa181489840b9acf193e224d125d0776Greg Clayton uint32_t minor, 398b1888f24fa181489840b9acf193e224d125d0776Greg Clayton uint32_t update) 399b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 400b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (IsHost()) 401b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 402b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We don't need anyone setting the OS version for the host platform, 403b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // we should be able to figure it out by calling Host::GetOSVersion(...). 404b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return false; 405b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 406b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 407b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 408b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have a remote platform, allow setting the target OS version if 409b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // we aren't connected, since if we are connected, we should be able to 410b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // request the remote OS version from the connected platform. 411b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (IsConnected()) 412b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return false; 413b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 414b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 415b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We aren't connected and we might want to set the OS version 416b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // ahead of time before we connect so we can peruse files and 417b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // use a local SDK or PDK cache of support files to disassemble 418b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // or do other things. 419b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_major_os_version = major; 420b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_minor_os_version = minor; 421b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_update_os_version = update; 422b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return true; 423b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 424b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 425b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return false; 426b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 427b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 428b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 429e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError 430e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::ResolveExecutable (const FileSpec &exe_file, 431e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton const ArchSpec &exe_arch, 4329ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton lldb::ModuleSP &exe_module_sp, 4339ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton const FileSpecList *module_search_paths_ptr) 434e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 435e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton Error error; 436e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (exe_file.Exists()) 437e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 438444fe998bf707bd076a70c3a779db8575533695eGreg Clayton ModuleSpec module_spec (exe_file, exe_arch); 439444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (module_spec.GetArchitecture().IsValid()) 440e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 441444fe998bf707bd076a70c3a779db8575533695eGreg Clayton error = ModuleList::GetSharedModule (module_spec, 442e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton exe_module_sp, 4439ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_search_paths_ptr, 444e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton NULL, 445e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton NULL); 446e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 447e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 448e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 449e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton // No valid architecture was specified, ask the platform for 450e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton // the architectures that we should be using (in the correct order) 451e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton // and see if we can find a match that way 452444fe998bf707bd076a70c3a779db8575533695eGreg Clayton for (uint32_t idx = 0; GetSupportedArchitectureAtIndex (idx, module_spec.GetArchitecture()); ++idx) 453e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 454444fe998bf707bd076a70c3a779db8575533695eGreg Clayton error = ModuleList::GetSharedModule (module_spec, 455e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton exe_module_sp, 4569ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_search_paths_ptr, 457e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton NULL, 458e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton NULL); 459e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton // Did we find an executable using one of the 460e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (error.Success() && exe_module_sp) 461e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton break; 462e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 463e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 464e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 465e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 466e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 467e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton error.SetErrorStringWithFormat ("'%s%s%s' does not exist", 468e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton exe_file.GetDirectory().AsCString(""), 469e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton exe_file.GetDirectory() ? "/" : "", 470e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton exe_file.GetFilename().AsCString("")); 471e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 472e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return error; 473e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 474e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 47595b765e8000b44644d021e95bc58eac95028573bGreg ClaytonError 47695b765e8000b44644d021e95bc58eac95028573bGreg ClaytonPlatform::ResolveSymbolFile (Target &target, 47795b765e8000b44644d021e95bc58eac95028573bGreg Clayton const ModuleSpec &sym_spec, 47895b765e8000b44644d021e95bc58eac95028573bGreg Clayton FileSpec &sym_file) 47995b765e8000b44644d021e95bc58eac95028573bGreg Clayton{ 48095b765e8000b44644d021e95bc58eac95028573bGreg Clayton Error error; 48195b765e8000b44644d021e95bc58eac95028573bGreg Clayton if (sym_spec.GetSymbolFileSpec().Exists()) 48295b765e8000b44644d021e95bc58eac95028573bGreg Clayton sym_file = sym_spec.GetSymbolFileSpec(); 48395b765e8000b44644d021e95bc58eac95028573bGreg Clayton else 48495b765e8000b44644d021e95bc58eac95028573bGreg Clayton error.SetErrorString("unable to resolve symbol file"); 48595b765e8000b44644d021e95bc58eac95028573bGreg Clayton return error; 48695b765e8000b44644d021e95bc58eac95028573bGreg Clayton 48795b765e8000b44644d021e95bc58eac95028573bGreg Clayton} 48895b765e8000b44644d021e95bc58eac95028573bGreg Clayton 48995b765e8000b44644d021e95bc58eac95028573bGreg Clayton 49095b765e8000b44644d021e95bc58eac95028573bGreg Clayton 491f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Claytonbool 492f2bf870da5819415d52bc7da98c151cedf1e6dffGreg ClaytonPlatform::ResolveRemotePath (const FileSpec &platform_path, 493f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton FileSpec &resolved_platform_path) 494f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton{ 495f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton resolved_platform_path = platform_path; 496f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton return resolved_platform_path.ResolvePath(); 497f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton} 498f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton 499b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 500b1888f24fa181489840b9acf193e224d125d0776Greg Claytonconst ArchSpec & 501b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::GetSystemArchitecture() 502b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 503b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (IsHost()) 504b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 505b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (!m_system_arch.IsValid()) 506b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 507b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have a local host platform 508b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_system_arch = Host::GetArchitecture(); 509b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_system_arch_set_while_connected = m_system_arch.IsValid(); 510b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 511b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 512b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 513b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 514b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have a remote platform. We can only fetch the remote 515b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // system architecture if we are connected, and we don't want to do it 516b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // more than once. 517b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 518b1888f24fa181489840b9acf193e224d125d0776Greg Clayton const bool is_connected = IsConnected(); 519b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 520b1888f24fa181489840b9acf193e224d125d0776Greg Clayton bool fetch = false; 521b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (m_system_arch.IsValid()) 522b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 523b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have valid OS version info, check to make sure it wasn't 524b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // manually set prior to connecting. If it was manually set prior 525b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // to connecting, then lets fetch the actual OS version info 526b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // if we are now connected. 527b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (is_connected && !m_system_arch_set_while_connected) 528b1888f24fa181489840b9acf193e224d125d0776Greg Clayton fetch = true; 529b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 530b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 531b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 532b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We don't have valid OS version info, fetch it if we are connected 533b1888f24fa181489840b9acf193e224d125d0776Greg Clayton fetch = is_connected; 534b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 535b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 536b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (fetch) 537b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 53858e26e0935138225477fd61283215ceff2068899Greg Clayton m_system_arch = GetRemoteSystemArchitecture (); 539b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_system_arch_set_while_connected = m_system_arch.IsValid(); 540b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 541b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 542b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return m_system_arch; 543b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 544b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 545b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 546e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError 547cb8977d726be451df9978a74088435667fa37da2Greg ClaytonPlatform::ConnectRemote (Args& args) 548e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 549e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton Error error; 550cb8977d726be451df9978a74088435667fa37da2Greg Clayton if (IsHost()) 551cb8977d726be451df9978a74088435667fa37da2Greg Clayton error.SetErrorStringWithFormat ("The currently selected platform (%s) is the host platform and is always connected.", GetShortPluginName()); 552cb8977d726be451df9978a74088435667fa37da2Greg Clayton else 553cb8977d726be451df9978a74088435667fa37da2Greg Clayton error.SetErrorStringWithFormat ("Platform::ConnectRemote() is not supported by %s", GetShortPluginName()); 554e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return error; 555e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 556e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 557e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError 558cb8977d726be451df9978a74088435667fa37da2Greg ClaytonPlatform::DisconnectRemote () 559e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 560e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton Error error; 561cb8977d726be451df9978a74088435667fa37da2Greg Clayton if (IsHost()) 562cb8977d726be451df9978a74088435667fa37da2Greg Clayton error.SetErrorStringWithFormat ("The currently selected platform (%s) is the host platform and is always connected.", GetShortPluginName()); 563cb8977d726be451df9978a74088435667fa37da2Greg Clayton else 564cb8977d726be451df9978a74088435667fa37da2Greg Clayton error.SetErrorStringWithFormat ("Platform::DisconnectRemote() is not supported by %s", GetShortPluginName()); 565e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return error; 566e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 56724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 56824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonbool 569b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info) 57024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 57124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // Take care of the host case so that each subclass can just 572b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // call this function to get the host functionality. 57324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsHost()) 57424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return Host::GetProcessInfo (pid, process_info); 57524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 57624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 57724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 57824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonuint32_t 579b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::FindProcesses (const ProcessInstanceInfoMatch &match_info, 580b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessInstanceInfoList &process_infos) 58124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 582b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Take care of the host case so that each subclass can just 583b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // call this function to get the host functionality. 58424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton uint32_t match_count = 0; 58524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsHost()) 58624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton match_count = Host::FindProcesses (match_info, process_infos); 58724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return match_count; 58824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 589b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 590b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 591b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonError 592b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::LaunchProcess (ProcessLaunchInfo &launch_info) 593b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 594b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error error; 595b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Take care of the host case so that each subclass can just 596b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // call this function to get the host functionality. 597b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (IsHost()) 598dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton { 599dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton if (::getenv ("LLDB_LAUNCH_FLAG_LAUNCH_IN_TTY")) 600dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton launch_info.GetFlags().Set (eLaunchFlagLaunchInTTY); 601dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton 602dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton if (launch_info.GetFlags().Test (eLaunchFlagLaunchInShell)) 603dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton { 604dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const bool is_localhost = true; 60597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton const bool will_debug = launch_info.GetFlags().Test(eLaunchFlagDebug); 60697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton const bool first_arg_is_full_shell_command = false; 60797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton if (!launch_info.ConvertArgumentsForLaunchingInShell (error, 60897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton is_localhost, 60997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton will_debug, 61097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton first_arg_is_full_shell_command)) 611dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton return error; 612dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton } 613dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton 614b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error = Host::LaunchProcess (launch_info); 615dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton } 616b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 617b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("base lldb_private::Platform class can't launch remote processes"); 618b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return error; 619b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 620b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 621b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonlldb::ProcessSP 622b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::DebugProcess (ProcessLaunchInfo &launch_info, 623b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Debugger &debugger, 624b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Target *target, // Can be NULL, if NULL create a new target, else use existing one 625b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Listener &listener, 626b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error &error) 627b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 628b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessSP process_sp; 629b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Make sure we stop at the entry point 630b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.GetFlags ().Set (eLaunchFlagDebug); 631b7b2532bf23c852ea3e43d10f2377338be5b464fJim Ingham // We always launch the process we are going to debug in a separate process 632b7b2532bf23c852ea3e43d10f2377338be5b464fJim Ingham // group, since then we can handle ^C interrupts ourselves w/o having to worry 633b7b2532bf23c852ea3e43d10f2377338be5b464fJim Ingham // about the target getting them as well. 634b7b2532bf23c852ea3e43d10f2377338be5b464fJim Ingham launch_info.SetLaunchInSeparateProcessGroup(true); 635b7b2532bf23c852ea3e43d10f2377338be5b464fJim Ingham 636b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error = LaunchProcess (launch_info); 637b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (error.Success()) 638b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 639527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (launch_info.GetProcessID() != LLDB_INVALID_PROCESS_ID) 640b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 641527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton ProcessAttachInfo attach_info (launch_info); 642527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton process_sp = Attach (attach_info, debugger, target, listener, error); 643ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton if (process_sp) 644ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton { 645ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // Since we attached to the process, it will think it needs to detach 646ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // if the process object just goes away without an explicit call to 647ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // Process::Kill() or Process::Detach(), so let it know to kill the 648ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // process if this happens. 649ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton process_sp->SetShouldDetach (false); 650464c6161464694412b7472129e789248f1cf21b9Greg Clayton 651464c6161464694412b7472129e789248f1cf21b9Greg Clayton // If we didn't have any file actions, the pseudo terminal might 652464c6161464694412b7472129e789248f1cf21b9Greg Clayton // have been used where the slave side was given as the file to 653464c6161464694412b7472129e789248f1cf21b9Greg Clayton // open for stdin/out/err after we have already opened the master 654464c6161464694412b7472129e789248f1cf21b9Greg Clayton // so we can read/write stdin/out/err. 655464c6161464694412b7472129e789248f1cf21b9Greg Clayton int pty_fd = launch_info.GetPTY().ReleaseMasterFileDescriptor(); 656464c6161464694412b7472129e789248f1cf21b9Greg Clayton if (pty_fd != lldb_utility::PseudoTerminal::invalid_fd) 657464c6161464694412b7472129e789248f1cf21b9Greg Clayton { 658464c6161464694412b7472129e789248f1cf21b9Greg Clayton process_sp->SetSTDIOFileDescriptor(pty_fd); 659464c6161464694412b7472129e789248f1cf21b9Greg Clayton } 660ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton } 661b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 662b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 663b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return process_sp; 664b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 665b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 666b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 667b1db658333cdebca31a128be95e926d80c3c7796Greg Claytonlldb::PlatformSP 668b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg ClaytonPlatform::GetPlatformForArchitecture (const ArchSpec &arch, ArchSpec *platform_arch_ptr) 669b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton{ 670b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton lldb::PlatformSP platform_sp; 671b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton Error error; 672b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton if (arch.IsValid()) 673b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton platform_sp = Platform::Create (arch, platform_arch_ptr, error); 674b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton return platform_sp; 675b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton} 676b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 677b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 678b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton//------------------------------------------------------------------ 679b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton/// Lets a platform answer if it is compatible with a given 680b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton/// architecture and the target triple contained within. 681b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton//------------------------------------------------------------------ 682b1db658333cdebca31a128be95e926d80c3c7796Greg Claytonbool 683b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg ClaytonPlatform::IsCompatibleArchitecture (const ArchSpec &arch, ArchSpec *compatible_arch_ptr) 684b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton{ 685b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton // If the architecture is invalid, we must answer true... 686b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (arch.IsValid()) 687b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton { 688b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton ArchSpec platform_arch; 689b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton for (uint32_t arch_idx=0; GetSupportedArchitectureAtIndex (arch_idx, platform_arch); ++arch_idx) 690b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 691b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (arch == platform_arch) 692b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 693b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (compatible_arch_ptr) 694b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton *compatible_arch_ptr = platform_arch; 695b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return true; 696b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 697b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 698b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton } 699b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (compatible_arch_ptr) 700b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton compatible_arch_ptr->Clear(); 701b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton return false; 702b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 703b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton} 704b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 705bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Claytonlldb::BreakpointSP 706bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg ClaytonPlatform::SetThreadCreationBreakpoint (lldb_private::Target &target) 707bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton{ 708bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton return lldb::BreakpointSP(); 709bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton} 710b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 71173844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonsize_t 71273844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonPlatform::GetEnvironment (StringList &environment) 71373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 71473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton environment.Clear(); 71573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return false; 71673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 71773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 718