Platform.cpp revision 95b765e8000b44644d021e95bc58eac95028573b
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 9224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonError 93444fe998bf707bd076a70c3a779db8575533695eGreg ClaytonPlatform::GetSharedModule (const ModuleSpec &module_spec, 9424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton ModuleSP &module_sp, 959ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton const FileSpecList *module_search_paths_ptr, 9624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton ModuleSP *old_module_sp_ptr, 9724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton bool *did_create_ptr) 9824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 9924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // Don't do any path remapping for the default implementation 10024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // of the platform GetSharedModule function, just call through 10124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // to our static ModuleList function. Platform subclasses that 10224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // implement remote debugging, might have a developer kits 10324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // installed that have cached versions of the files for the 10424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // remote target, or might implement a download and cache 10524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // locally implementation. 10624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const bool always_create = false; 107444fe998bf707bd076a70c3a779db8575533695eGreg Clayton return ModuleList::GetSharedModule (module_spec, 10824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton module_sp, 1099ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_search_paths_ptr, 11024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton old_module_sp_ptr, 11124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton did_create_ptr, 11224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton always_create); 11324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 11424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 115e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformSP 116b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::Create (const char *platform_name, Error &error) 117e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 118e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton PlatformCreateInstance create_callback = NULL; 119e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton lldb::PlatformSP platform_sp; 120b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (platform_name && platform_name[0]) 121e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 122e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton create_callback = PluginManager::GetPlatformCreateCallbackForPluginName (platform_name); 123e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (create_callback) 124b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton platform_sp.reset(create_callback(true, NULL)); 125e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 126b1888f24fa181489840b9acf193e224d125d0776Greg Clayton error.SetErrorStringWithFormat ("unable to find a plug-in for the platform named \"%s\"", platform_name); 127e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 128e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 129b1888f24fa181489840b9acf193e224d125d0776Greg Clayton error.SetErrorString ("invalid platform name"); 130e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return platform_sp; 131e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 132e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 133b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 134b1db658333cdebca31a128be95e926d80c3c7796Greg ClaytonPlatformSP 135b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg ClaytonPlatform::Create (const ArchSpec &arch, ArchSpec *platform_arch_ptr, Error &error) 136b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton{ 137b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton lldb::PlatformSP platform_sp; 138b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton if (arch.IsValid()) 139b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton { 140b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton uint32_t idx; 141b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton PlatformCreateInstance create_callback; 142b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton for (idx = 0; (create_callback = PluginManager::GetPlatformCreateCallbackAtIndex (idx)); ++idx) 143b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton { 144b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton if (create_callback) 145b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton platform_sp.reset(create_callback(false, &arch)); 146b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (platform_sp && platform_sp->IsCompatibleArchitecture(arch, platform_arch_ptr)) 147b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return platform_sp; 148b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton } 149b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton } 150b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton else 151b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton error.SetErrorString ("invalid platform name"); 152b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (platform_arch_ptr) 153b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton platform_arch_ptr->Clear(); 154b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton platform_sp.reset(); 155b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton return platform_sp; 156b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton} 157b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 158e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonuint32_t 159e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::GetNumConnectedRemotePlatforms () 160e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 161e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton Mutex::Locker locker (GetConnectedPlatformListMutex ()); 162e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return GetConnectedPlatformList().size(); 163e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 164e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 165e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformSP 166e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::GetConnectedRemotePlatformAtIndex (uint32_t idx) 167e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 168e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton PlatformSP platform_sp; 169e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 170e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton Mutex::Locker locker (GetConnectedPlatformListMutex ()); 171e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (idx < GetConnectedPlatformList().size()) 172e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton platform_sp = GetConnectedPlatformList ()[idx]; 173e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 174e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return platform_sp; 175e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 176e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 177e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------ 178e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// Default Constructor 179e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------ 180b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::Platform (bool is_host) : 181b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_is_host (is_host), 182b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_os_version_set_while_connected (false), 183b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_system_arch_set_while_connected (false), 184604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton m_sdk_sysroot (), 185604f0d336f0d9390a0405022ef660ae922ef29bfGreg Clayton m_sdk_build (), 186b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_remote_url (), 18758e26e0935138225477fd61283215ceff2068899Greg Clayton m_name (), 188b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_major_os_version (UINT32_MAX), 189b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_minor_os_version (UINT32_MAX), 19024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_update_os_version (UINT32_MAX), 19124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_system_arch(), 19224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_uid_map_mutex (Mutex::eMutexTypeNormal), 19324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_gid_map_mutex (Mutex::eMutexTypeNormal), 19424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_uid_map(), 19524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_gid_map(), 19624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_max_uid_name_len (0), 19724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton m_max_gid_name_len (0) 198e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 199b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 200b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (log) 201b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton log->Printf ("%p Platform::Platform()", this); 202e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 203e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 204e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------ 205e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// Destructor. 206e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// 207e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// The destructor is virtual since this class is designed to be 208e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// inherited from by the plug-in instance. 209e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------ 210e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::~Platform() 211e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 212b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 213b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (log) 214b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton log->Printf ("%p Platform::~Platform()", this); 215e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 216e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 21758e26e0935138225477fd61283215ceff2068899Greg Claytonvoid 21858e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetStatus (Stream &strm) 21958e26e0935138225477fd61283215ceff2068899Greg Clayton{ 22058e26e0935138225477fd61283215ceff2068899Greg Clayton uint32_t major = UINT32_MAX; 22158e26e0935138225477fd61283215ceff2068899Greg Clayton uint32_t minor = UINT32_MAX; 22258e26e0935138225477fd61283215ceff2068899Greg Clayton uint32_t update = UINT32_MAX; 22358e26e0935138225477fd61283215ceff2068899Greg Clayton std::string s; 22424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.Printf (" Platform: %s\n", GetShortPluginName()); 22558e26e0935138225477fd61283215ceff2068899Greg Clayton 22658e26e0935138225477fd61283215ceff2068899Greg Clayton ArchSpec arch (GetSystemArchitecture()); 22758e26e0935138225477fd61283215ceff2068899Greg Clayton if (arch.IsValid()) 22858e26e0935138225477fd61283215ceff2068899Greg Clayton { 22958e26e0935138225477fd61283215ceff2068899Greg Clayton if (!arch.GetTriple().str().empty()) 23024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.Printf(" Triple: %s\n", arch.GetTriple().str().c_str()); 23158e26e0935138225477fd61283215ceff2068899Greg Clayton } 23258e26e0935138225477fd61283215ceff2068899Greg Clayton 23358e26e0935138225477fd61283215ceff2068899Greg Clayton if (GetOSVersion(major, minor, update)) 23458e26e0935138225477fd61283215ceff2068899Greg Clayton { 23524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.Printf("OS Version: %u", major); 23658e26e0935138225477fd61283215ceff2068899Greg Clayton if (minor != UINT32_MAX) 23758e26e0935138225477fd61283215ceff2068899Greg Clayton strm.Printf(".%u", minor); 23858e26e0935138225477fd61283215ceff2068899Greg Clayton if (update != UINT32_MAX) 23958e26e0935138225477fd61283215ceff2068899Greg Clayton strm.Printf(".%u", update); 24058e26e0935138225477fd61283215ceff2068899Greg Clayton 24158e26e0935138225477fd61283215ceff2068899Greg Clayton if (GetOSBuildString (s)) 24258e26e0935138225477fd61283215ceff2068899Greg Clayton strm.Printf(" (%s)", s.c_str()); 24358e26e0935138225477fd61283215ceff2068899Greg Clayton 24458e26e0935138225477fd61283215ceff2068899Greg Clayton strm.EOL(); 24558e26e0935138225477fd61283215ceff2068899Greg Clayton } 24658e26e0935138225477fd61283215ceff2068899Greg Clayton 24758e26e0935138225477fd61283215ceff2068899Greg Clayton if (GetOSKernelDescription (s)) 24824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.Printf(" Kernel: %s\n", s.c_str()); 24958e26e0935138225477fd61283215ceff2068899Greg Clayton 25058e26e0935138225477fd61283215ceff2068899Greg Clayton if (IsHost()) 25158e26e0935138225477fd61283215ceff2068899Greg Clayton { 25224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.Printf(" Hostname: %s\n", GetHostname()); 25358e26e0935138225477fd61283215ceff2068899Greg Clayton } 25458e26e0935138225477fd61283215ceff2068899Greg Clayton else 25558e26e0935138225477fd61283215ceff2068899Greg Clayton { 25624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const bool is_connected = IsConnected(); 25724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (is_connected) 25824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.Printf(" Hostname: %s\n", GetHostname()); 25924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton strm.Printf(" Connected: %s\n", is_connected ? "yes" : "no"); 26058e26e0935138225477fd61283215ceff2068899Greg Clayton } 26158e26e0935138225477fd61283215ceff2068899Greg Clayton} 26258e26e0935138225477fd61283215ceff2068899Greg Clayton 263b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 264b1888f24fa181489840b9acf193e224d125d0776Greg Claytonbool 265b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::GetOSVersion (uint32_t &major, 266b1888f24fa181489840b9acf193e224d125d0776Greg Clayton uint32_t &minor, 267b1888f24fa181489840b9acf193e224d125d0776Greg Clayton uint32_t &update) 268b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 269b1888f24fa181489840b9acf193e224d125d0776Greg Clayton bool success = m_major_os_version != UINT32_MAX; 270b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (IsHost()) 271b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 272b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (!success) 273b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 274b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have a local host platform 275b1888f24fa181489840b9acf193e224d125d0776Greg Clayton success = Host::GetOSVersion (m_major_os_version, 276b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_minor_os_version, 277b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_update_os_version); 278b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_os_version_set_while_connected = success; 279b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 280b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 281b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 282b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 283b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have a remote platform. We can only fetch the remote 284b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // OS version if we are connected, and we don't want to do it 285b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // more than once. 286b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 287b1888f24fa181489840b9acf193e224d125d0776Greg Clayton const bool is_connected = IsConnected(); 288b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 28958e26e0935138225477fd61283215ceff2068899Greg Clayton bool fetch = false; 290b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (success) 291b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 292b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have valid OS version info, check to make sure it wasn't 293b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // manually set prior to connecting. If it was manually set prior 294b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // to connecting, then lets fetch the actual OS version info 295b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // if we are now connected. 296b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (is_connected && !m_os_version_set_while_connected) 29758e26e0935138225477fd61283215ceff2068899Greg Clayton fetch = true; 298b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 299b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 300b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 301b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We don't have valid OS version info, fetch it if we are connected 30258e26e0935138225477fd61283215ceff2068899Greg Clayton fetch = is_connected; 303b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 304b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 30558e26e0935138225477fd61283215ceff2068899Greg Clayton if (fetch) 306b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 30758e26e0935138225477fd61283215ceff2068899Greg Clayton success = GetRemoteOSVersion (); 308b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_os_version_set_while_connected = success; 309b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 310b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 311b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 312b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (success) 313b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 314b1888f24fa181489840b9acf193e224d125d0776Greg Clayton major = m_major_os_version; 315b1888f24fa181489840b9acf193e224d125d0776Greg Clayton minor = m_minor_os_version; 316b1888f24fa181489840b9acf193e224d125d0776Greg Clayton update = m_update_os_version; 317b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 318b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return success; 319b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 32058e26e0935138225477fd61283215ceff2068899Greg Clayton 32158e26e0935138225477fd61283215ceff2068899Greg Claytonbool 32258e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetOSBuildString (std::string &s) 32358e26e0935138225477fd61283215ceff2068899Greg Clayton{ 32458e26e0935138225477fd61283215ceff2068899Greg Clayton if (IsHost()) 32558e26e0935138225477fd61283215ceff2068899Greg Clayton return Host::GetOSBuildString (s); 32658e26e0935138225477fd61283215ceff2068899Greg Clayton else 32758e26e0935138225477fd61283215ceff2068899Greg Clayton return GetRemoteOSBuildString (s); 32858e26e0935138225477fd61283215ceff2068899Greg Clayton} 32958e26e0935138225477fd61283215ceff2068899Greg Clayton 33058e26e0935138225477fd61283215ceff2068899Greg Claytonbool 33158e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetOSKernelDescription (std::string &s) 33258e26e0935138225477fd61283215ceff2068899Greg Clayton{ 33358e26e0935138225477fd61283215ceff2068899Greg Clayton if (IsHost()) 33458e26e0935138225477fd61283215ceff2068899Greg Clayton return Host::GetOSKernelDescription (s); 33558e26e0935138225477fd61283215ceff2068899Greg Clayton else 33658e26e0935138225477fd61283215ceff2068899Greg Clayton return GetRemoteOSKernelDescription (s); 33758e26e0935138225477fd61283215ceff2068899Greg Clayton} 33858e26e0935138225477fd61283215ceff2068899Greg Clayton 33958e26e0935138225477fd61283215ceff2068899Greg Claytonconst char * 340b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::GetName () 341b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 342b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton const char *name = GetHostname(); 343b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (name == NULL || name[0] == '\0') 344b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton name = GetShortPluginName(); 345b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return name; 346b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 347b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 348b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonconst char * 34958e26e0935138225477fd61283215ceff2068899Greg ClaytonPlatform::GetHostname () 35058e26e0935138225477fd61283215ceff2068899Greg Clayton{ 3515e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton if (IsHost()) 3525e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton return "localhost"; 35324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 35424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (m_name.empty()) 35524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return NULL; 35624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return m_name.c_str(); 35758e26e0935138225477fd61283215ceff2068899Greg Clayton} 35858e26e0935138225477fd61283215ceff2068899Greg Clayton 35924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonconst char * 36024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonPlatform::GetUserName (uint32_t uid) 36124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 36224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *user_name = GetCachedUserName(uid); 36324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (user_name) 36424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return user_name; 36524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsHost()) 36624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 36724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton std::string name; 36824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (Host::GetUserName(uid, name)) 36924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return SetCachedUserName (uid, name.c_str(), name.size()); 37024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 37124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return NULL; 37224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 37358e26e0935138225477fd61283215ceff2068899Greg Clayton 37424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonconst char * 37524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonPlatform::GetGroupName (uint32_t gid) 37624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 37724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton const char *group_name = GetCachedGroupName(gid); 37824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (group_name) 37924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return group_name; 38024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsHost()) 38124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 38224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton std::string name; 38324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (Host::GetGroupName(gid, name)) 38424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return SetCachedGroupName (gid, name.c_str(), name.size()); 38524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 38624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return NULL; 38724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 38858e26e0935138225477fd61283215ceff2068899Greg Clayton 389b1888f24fa181489840b9acf193e224d125d0776Greg Claytonbool 390b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::SetOSVersion (uint32_t major, 391b1888f24fa181489840b9acf193e224d125d0776Greg Clayton uint32_t minor, 392b1888f24fa181489840b9acf193e224d125d0776Greg Clayton uint32_t update) 393b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 394b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (IsHost()) 395b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 396b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We don't need anyone setting the OS version for the host platform, 397b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // we should be able to figure it out by calling Host::GetOSVersion(...). 398b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return false; 399b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 400b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 401b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 402b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have a remote platform, allow setting the target OS version if 403b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // we aren't connected, since if we are connected, we should be able to 404b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // request the remote OS version from the connected platform. 405b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (IsConnected()) 406b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return false; 407b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 408b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 409b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We aren't connected and we might want to set the OS version 410b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // ahead of time before we connect so we can peruse files and 411b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // use a local SDK or PDK cache of support files to disassemble 412b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // or do other things. 413b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_major_os_version = major; 414b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_minor_os_version = minor; 415b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_update_os_version = update; 416b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return true; 417b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 418b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 419b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return false; 420b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 421b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 422b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 423e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError 424e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatform::ResolveExecutable (const FileSpec &exe_file, 425e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton const ArchSpec &exe_arch, 4269ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton lldb::ModuleSP &exe_module_sp, 4279ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton const FileSpecList *module_search_paths_ptr) 428e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 429e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton Error error; 430e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (exe_file.Exists()) 431e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 432444fe998bf707bd076a70c3a779db8575533695eGreg Clayton ModuleSpec module_spec (exe_file, exe_arch); 433444fe998bf707bd076a70c3a779db8575533695eGreg Clayton if (module_spec.GetArchitecture().IsValid()) 434e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 435444fe998bf707bd076a70c3a779db8575533695eGreg Clayton error = ModuleList::GetSharedModule (module_spec, 436e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton exe_module_sp, 4379ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_search_paths_ptr, 438e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton NULL, 439e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton NULL); 440e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 441e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 442e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 443e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton // No valid architecture was specified, ask the platform for 444e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton // the architectures that we should be using (in the correct order) 445e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton // and see if we can find a match that way 446444fe998bf707bd076a70c3a779db8575533695eGreg Clayton for (uint32_t idx = 0; GetSupportedArchitectureAtIndex (idx, module_spec.GetArchitecture()); ++idx) 447e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 448444fe998bf707bd076a70c3a779db8575533695eGreg Clayton error = ModuleList::GetSharedModule (module_spec, 449e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton exe_module_sp, 4509ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton module_search_paths_ptr, 451e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton NULL, 452e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton NULL); 453e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton // Did we find an executable using one of the 454e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (error.Success() && exe_module_sp) 455e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton break; 456e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 457e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 458e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 459e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 460e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 461e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton error.SetErrorStringWithFormat ("'%s%s%s' does not exist", 462e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton exe_file.GetDirectory().AsCString(""), 463e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton exe_file.GetDirectory() ? "/" : "", 464e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton exe_file.GetFilename().AsCString("")); 465e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 466e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return error; 467e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 468e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 46995b765e8000b44644d021e95bc58eac95028573bGreg ClaytonError 47095b765e8000b44644d021e95bc58eac95028573bGreg ClaytonPlatform::ResolveSymbolFile (Target &target, 47195b765e8000b44644d021e95bc58eac95028573bGreg Clayton const ModuleSpec &sym_spec, 47295b765e8000b44644d021e95bc58eac95028573bGreg Clayton FileSpec &sym_file) 47395b765e8000b44644d021e95bc58eac95028573bGreg Clayton{ 47495b765e8000b44644d021e95bc58eac95028573bGreg Clayton Error error; 47595b765e8000b44644d021e95bc58eac95028573bGreg Clayton if (sym_spec.GetSymbolFileSpec().Exists()) 47695b765e8000b44644d021e95bc58eac95028573bGreg Clayton sym_file = sym_spec.GetSymbolFileSpec(); 47795b765e8000b44644d021e95bc58eac95028573bGreg Clayton else 47895b765e8000b44644d021e95bc58eac95028573bGreg Clayton error.SetErrorString("unable to resolve symbol file"); 47995b765e8000b44644d021e95bc58eac95028573bGreg Clayton return error; 48095b765e8000b44644d021e95bc58eac95028573bGreg Clayton 48195b765e8000b44644d021e95bc58eac95028573bGreg Clayton} 48295b765e8000b44644d021e95bc58eac95028573bGreg Clayton 48395b765e8000b44644d021e95bc58eac95028573bGreg Clayton 48495b765e8000b44644d021e95bc58eac95028573bGreg Clayton 485f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Claytonbool 486f2bf870da5819415d52bc7da98c151cedf1e6dffGreg ClaytonPlatform::ResolveRemotePath (const FileSpec &platform_path, 487f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton FileSpec &resolved_platform_path) 488f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton{ 489f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton resolved_platform_path = platform_path; 490f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton return resolved_platform_path.ResolvePath(); 491f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton} 492f2bf870da5819415d52bc7da98c151cedf1e6dffGreg Clayton 493b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 494b1888f24fa181489840b9acf193e224d125d0776Greg Claytonconst ArchSpec & 495b1888f24fa181489840b9acf193e224d125d0776Greg ClaytonPlatform::GetSystemArchitecture() 496b1888f24fa181489840b9acf193e224d125d0776Greg Clayton{ 497b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (IsHost()) 498b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 499b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (!m_system_arch.IsValid()) 500b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 501b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have a local host platform 502b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_system_arch = Host::GetArchitecture(); 503b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_system_arch_set_while_connected = m_system_arch.IsValid(); 504b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 505b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 506b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 507b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 508b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have a remote platform. We can only fetch the remote 509b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // system architecture if we are connected, and we don't want to do it 510b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // more than once. 511b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 512b1888f24fa181489840b9acf193e224d125d0776Greg Clayton const bool is_connected = IsConnected(); 513b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 514b1888f24fa181489840b9acf193e224d125d0776Greg Clayton bool fetch = false; 515b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (m_system_arch.IsValid()) 516b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 517b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We have valid OS version info, check to make sure it wasn't 518b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // manually set prior to connecting. If it was manually set prior 519b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // to connecting, then lets fetch the actual OS version info 520b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // if we are now connected. 521b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (is_connected && !m_system_arch_set_while_connected) 522b1888f24fa181489840b9acf193e224d125d0776Greg Clayton fetch = true; 523b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 524b1888f24fa181489840b9acf193e224d125d0776Greg Clayton else 525b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 526b1888f24fa181489840b9acf193e224d125d0776Greg Clayton // We don't have valid OS version info, fetch it if we are connected 527b1888f24fa181489840b9acf193e224d125d0776Greg Clayton fetch = is_connected; 528b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 529b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 530b1888f24fa181489840b9acf193e224d125d0776Greg Clayton if (fetch) 531b1888f24fa181489840b9acf193e224d125d0776Greg Clayton { 53258e26e0935138225477fd61283215ceff2068899Greg Clayton m_system_arch = GetRemoteSystemArchitecture (); 533b1888f24fa181489840b9acf193e224d125d0776Greg Clayton m_system_arch_set_while_connected = m_system_arch.IsValid(); 534b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 535b1888f24fa181489840b9acf193e224d125d0776Greg Clayton } 536b1888f24fa181489840b9acf193e224d125d0776Greg Clayton return m_system_arch; 537b1888f24fa181489840b9acf193e224d125d0776Greg Clayton} 538b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 539b1888f24fa181489840b9acf193e224d125d0776Greg Clayton 540e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError 541cb8977d726be451df9978a74088435667fa37da2Greg ClaytonPlatform::ConnectRemote (Args& args) 542e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 543e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton Error error; 544cb8977d726be451df9978a74088435667fa37da2Greg Clayton if (IsHost()) 545cb8977d726be451df9978a74088435667fa37da2Greg Clayton error.SetErrorStringWithFormat ("The currently selected platform (%s) is the host platform and is always connected.", GetShortPluginName()); 546cb8977d726be451df9978a74088435667fa37da2Greg Clayton else 547cb8977d726be451df9978a74088435667fa37da2Greg Clayton error.SetErrorStringWithFormat ("Platform::ConnectRemote() is not supported by %s", GetShortPluginName()); 548e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return error; 549e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 550e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 551e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError 552cb8977d726be451df9978a74088435667fa37da2Greg ClaytonPlatform::DisconnectRemote () 553e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 554e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton Error error; 555cb8977d726be451df9978a74088435667fa37da2Greg Clayton if (IsHost()) 556cb8977d726be451df9978a74088435667fa37da2Greg Clayton error.SetErrorStringWithFormat ("The currently selected platform (%s) is the host platform and is always connected.", GetShortPluginName()); 557cb8977d726be451df9978a74088435667fa37da2Greg Clayton else 558cb8977d726be451df9978a74088435667fa37da2Greg Clayton error.SetErrorStringWithFormat ("Platform::DisconnectRemote() is not supported by %s", GetShortPluginName()); 559e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return error; 560e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 56124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 56224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonbool 563b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info) 56424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 56524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // Take care of the host case so that each subclass can just 566b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // call this function to get the host functionality. 56724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsHost()) 56824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return Host::GetProcessInfo (pid, process_info); 56924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return false; 57024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 57124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 57224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonuint32_t 573b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::FindProcesses (const ProcessInstanceInfoMatch &match_info, 574b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessInstanceInfoList &process_infos) 57524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 576b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Take care of the host case so that each subclass can just 577b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // call this function to get the host functionality. 57824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton uint32_t match_count = 0; 57924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (IsHost()) 58024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton match_count = Host::FindProcesses (match_info, process_infos); 58124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return match_count; 58224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 583b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 584b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 585b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonError 586b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::LaunchProcess (ProcessLaunchInfo &launch_info) 587b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 588b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error error; 589b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Take care of the host case so that each subclass can just 590b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // call this function to get the host functionality. 591b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (IsHost()) 592dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton { 593dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton if (::getenv ("LLDB_LAUNCH_FLAG_LAUNCH_IN_TTY")) 594dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton launch_info.GetFlags().Set (eLaunchFlagLaunchInTTY); 595dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton 596dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton if (launch_info.GetFlags().Test (eLaunchFlagLaunchInShell)) 597dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton { 598dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton const bool is_localhost = true; 59997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton const bool will_debug = launch_info.GetFlags().Test(eLaunchFlagDebug); 60097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton const bool first_arg_is_full_shell_command = false; 60197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton if (!launch_info.ConvertArgumentsForLaunchingInShell (error, 60297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton is_localhost, 60397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton will_debug, 60497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton first_arg_is_full_shell_command)) 605dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton return error; 606dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton } 607dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton 608b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error = Host::LaunchProcess (launch_info); 609dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton } 610b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 611b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error.SetErrorString ("base lldb_private::Platform class can't launch remote processes"); 612b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return error; 613b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 614b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 615b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonlldb::ProcessSP 616b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatform::DebugProcess (ProcessLaunchInfo &launch_info, 617b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Debugger &debugger, 618b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Target *target, // Can be NULL, if NULL create a new target, else use existing one 619b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Listener &listener, 620b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton Error &error) 621b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{ 622b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton ProcessSP process_sp; 623b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Make sure we stop at the entry point 624b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton launch_info.GetFlags ().Set (eLaunchFlagDebug); 625b7b2532bf23c852ea3e43d10f2377338be5b464fJim Ingham // We always launch the process we are going to debug in a separate process 626b7b2532bf23c852ea3e43d10f2377338be5b464fJim Ingham // group, since then we can handle ^C interrupts ourselves w/o having to worry 627b7b2532bf23c852ea3e43d10f2377338be5b464fJim Ingham // about the target getting them as well. 628b7b2532bf23c852ea3e43d10f2377338be5b464fJim Ingham launch_info.SetLaunchInSeparateProcessGroup(true); 629b7b2532bf23c852ea3e43d10f2377338be5b464fJim Ingham 630b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton error = LaunchProcess (launch_info); 631b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (error.Success()) 632b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 633527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton if (launch_info.GetProcessID() != LLDB_INVALID_PROCESS_ID) 634b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 635527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton ProcessAttachInfo attach_info (launch_info); 636527154d8e532f27f25af226c9e1dac607c48b5d1Greg Clayton process_sp = Attach (attach_info, debugger, target, listener, error); 637ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton if (process_sp) 638ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton { 639ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // Since we attached to the process, it will think it needs to detach 640ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // if the process object just goes away without an explicit call to 641ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // Process::Kill() or Process::Detach(), so let it know to kill the 642ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton // process if this happens. 643ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton process_sp->SetShouldDetach (false); 644464c6161464694412b7472129e789248f1cf21b9Greg Clayton 645464c6161464694412b7472129e789248f1cf21b9Greg Clayton // If we didn't have any file actions, the pseudo terminal might 646464c6161464694412b7472129e789248f1cf21b9Greg Clayton // have been used where the slave side was given as the file to 647464c6161464694412b7472129e789248f1cf21b9Greg Clayton // open for stdin/out/err after we have already opened the master 648464c6161464694412b7472129e789248f1cf21b9Greg Clayton // so we can read/write stdin/out/err. 649464c6161464694412b7472129e789248f1cf21b9Greg Clayton int pty_fd = launch_info.GetPTY().ReleaseMasterFileDescriptor(); 650464c6161464694412b7472129e789248f1cf21b9Greg Clayton if (pty_fd != lldb_utility::PseudoTerminal::invalid_fd) 651464c6161464694412b7472129e789248f1cf21b9Greg Clayton { 652464c6161464694412b7472129e789248f1cf21b9Greg Clayton process_sp->SetSTDIOFileDescriptor(pty_fd); 653464c6161464694412b7472129e789248f1cf21b9Greg Clayton } 654ffa43a6bc42bfcccae46eec9cf7bf73f17c328e9Greg Clayton } 655b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 656b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 657b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton return process_sp; 658b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton} 659b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 660b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 661b1db658333cdebca31a128be95e926d80c3c7796Greg Claytonlldb::PlatformSP 662b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg ClaytonPlatform::GetPlatformForArchitecture (const ArchSpec &arch, ArchSpec *platform_arch_ptr) 663b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton{ 664b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton lldb::PlatformSP platform_sp; 665b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton Error error; 666b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton if (arch.IsValid()) 667b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton platform_sp = Platform::Create (arch, platform_arch_ptr, error); 668b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton return platform_sp; 669b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton} 670b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 671b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 672b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton//------------------------------------------------------------------ 673b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton/// Lets a platform answer if it is compatible with a given 674b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton/// architecture and the target triple contained within. 675b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton//------------------------------------------------------------------ 676b1db658333cdebca31a128be95e926d80c3c7796Greg Claytonbool 677b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg ClaytonPlatform::IsCompatibleArchitecture (const ArchSpec &arch, ArchSpec *compatible_arch_ptr) 678b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton{ 679b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton // If the architecture is invalid, we must answer true... 680b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (arch.IsValid()) 681b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton { 682b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton ArchSpec platform_arch; 683b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton for (uint32_t arch_idx=0; GetSupportedArchitectureAtIndex (arch_idx, platform_arch); ++arch_idx) 684b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 685b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (arch == platform_arch) 686b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 687b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (compatible_arch_ptr) 688b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton *compatible_arch_ptr = platform_arch; 689b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton return true; 690b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 691b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 692b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton } 693b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (compatible_arch_ptr) 694b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton compatible_arch_ptr->Clear(); 695b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton return false; 696b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 697b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton} 698b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 699bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Claytonlldb::BreakpointSP 700bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg ClaytonPlatform::SetThreadCreationBreakpoint (lldb_private::Target &target) 701bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton{ 702bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton return lldb::BreakpointSP(); 703bd5c23ddf5bacc78548bbe348c8c5d98c372aedcGreg Clayton} 704b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 70573844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonsize_t 70673844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonPlatform::GetEnvironment (StringList &environment) 70773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{ 70873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton environment.Clear(); 70973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton return false; 71073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton} 71173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton 712