1e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//===-- PlatformLinux.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 10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h" 11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea 12e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "PlatformLinux.h" 13e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 14e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// C Includes 153600d497832c398ffafcba1935389125e15683a3Stephen Wilson#include <stdio.h> 163600d497832c398ffafcba1935389125e15683a3Stephen Wilson#include <sys/utsname.h> 173600d497832c398ffafcba1935389125e15683a3Stephen Wilson 18e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// C++ Includes 19e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// Other libraries and framework includes 20e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton// Project includes 21e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Core/Error.h" 2248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton#include "lldb/Core/Debugger.h" 23e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Core/Module.h" 24e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Core/ModuleList.h" 2549ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/ModuleSpec.h" 263600d497832c398ffafcba1935389125e15683a3Stephen Wilson#include "lldb/Core/PluginManager.h" 27e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Core/StreamString.h" 28e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Host/FileSpec.h" 29e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Host/Host.h" 303600d497832c398ffafcba1935389125e15683a3Stephen Wilson#include "lldb/Target/Target.h" 31e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton#include "lldb/Target/Process.h" 32e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 33e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonusing namespace lldb; 34e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonusing namespace lldb_private; 353600d497832c398ffafcba1935389125e15683a3Stephen Wilson 3648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Claytonstatic uint32_t g_initialize_count = 0; 3748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton 383600d497832c398ffafcba1935389125e15683a3Stephen WilsonPlatform * 39b1db658333cdebca31a128be95e926d80c3c7796Greg ClaytonPlatformLinux::CreateInstance (bool force, const ArchSpec *arch) 403600d497832c398ffafcba1935389125e15683a3Stephen Wilson{ 41b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton bool create = force; 42b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton if (create == false && arch && arch->IsValid()) 43b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton { 44b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton const llvm::Triple &triple = arch->GetTriple(); 45b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton switch (triple.getVendor()) 46b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 47b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::PC: 48b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton create = true; 49b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 50b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 516c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton#if defined(__linux__) 526c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton // Only accept "unknown" for the vendor if the host is linux and 536c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton // it "unknown" wasn't specified (it was just returned becasue it 546c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton // was NOT specified_ 55b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::UnknownArch: 56b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton create = !arch->TripleVendorWasSpecified(); 57b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 586c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton#endif 59b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: 60b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 61b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 62b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 63b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (create) 64b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 65b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton switch (triple.getOS()) 66b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 67b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::Linux: 68b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 69b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 706c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton#if defined(__linux__) 716c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton // Only accept "unknown" for the OS if the host is linux and 726c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton // it "unknown" wasn't specified (it was just returned becasue it 736c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton // was NOT specified) 74b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::UnknownOS: 75b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton create = !arch->TripleOSWasSpecified(); 76b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 776c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton#endif 78b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: 79b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton create = false; 80b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 81b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 82b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 83b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton } 84b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton if (create) 85b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton return new PlatformLinux(true); 86b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton return NULL; 873600d497832c398ffafcba1935389125e15683a3Stephen Wilson} 883600d497832c398ffafcba1935389125e15683a3Stephen Wilson 893600d497832c398ffafcba1935389125e15683a3Stephen Wilson 900e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytonlldb_private::ConstString 910e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonPlatformLinux::GetPluginNameStatic (bool is_host) 9248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton{ 9348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton if (is_host) 940e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton { 950e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton static ConstString g_host_name(Platform::GetHostPlatformName ()); 960e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton return g_host_name; 970e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton } 9848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton else 990e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton { 1000e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton static ConstString g_remote_name("remote-linux"); 1010e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton return g_remote_name; 1020e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton } 10348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton} 10448a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton 10548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Claytonconst char * 10648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg ClaytonPlatformLinux::GetPluginDescriptionStatic (bool is_host) 1073600d497832c398ffafcba1935389125e15683a3Stephen Wilson{ 10848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton if (is_host) 10948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton return "Local Linux user platform plug-in."; 11048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton else 11148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton return "Remote Linux user platform plug-in."; 1123600d497832c398ffafcba1935389125e15683a3Stephen Wilson} 1133600d497832c398ffafcba1935389125e15683a3Stephen Wilson 1140e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytonlldb_private::ConstString 1150e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonPlatformLinux::GetPluginName() 1160e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton{ 1170e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton return GetPluginNameStatic(IsHost()); 1180e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton} 1190e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton 120e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonvoid 121e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformLinux::Initialize () 122e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 12348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton if (g_initialize_count++ == 0) 1243600d497832c398ffafcba1935389125e15683a3Stephen Wilson { 12548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton#if defined(__linux__) 12648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton PlatformSP default_platform_sp (new PlatformLinux(true)); 12748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton default_platform_sp->SetSystemArchitecture (Host::GetArchitecture()); 1283600d497832c398ffafcba1935389125e15683a3Stephen Wilson Platform::SetDefaultPlatform (default_platform_sp); 12948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton#endif 1300e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton PluginManager::RegisterPlugin(PlatformLinux::GetPluginNameStatic(false), 13148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton PlatformLinux::GetPluginDescriptionStatic(false), 13248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton PlatformLinux::CreateInstance); 1333600d497832c398ffafcba1935389125e15683a3Stephen Wilson } 134e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 135e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 136e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonvoid 137e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformLinux::Terminate () 138e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 13948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton if (g_initialize_count > 0) 14048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton { 14148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton if (--g_initialize_count == 0) 14248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton { 14348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton PluginManager::UnregisterPlugin (PlatformLinux::CreateInstance); 14448a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton } 14548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton } 146e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 147e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 148e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError 149e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformLinux::ResolveExecutable (const FileSpec &exe_file, 150e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton const ArchSpec &exe_arch, 151a605c64524e6bb1e43de4ca0ea95967a596f08ddGreg Clayton lldb::ModuleSP &exe_module_sp, 152a605c64524e6bb1e43de4ca0ea95967a596f08ddGreg Clayton const FileSpecList *module_search_paths_ptr) 153e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 154e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton Error error; 155e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton // Nothing special to do here, just use the actual file and architecture 156e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 15748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton char exe_path[PATH_MAX]; 158e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton FileSpec resolved_exe_file (exe_file); 159e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 16048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton if (IsHost()) 16148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton { 16248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton // If we have "ls" as the exe_file, resolve the executable location based on 16348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton // the current path variables 16448a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton if (!resolved_exe_file.Exists()) 16548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton { 16648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton exe_file.GetPath(exe_path, sizeof(exe_path)); 16748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton resolved_exe_file.SetFile(exe_path, true); 16848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton } 169e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 17048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton if (!resolved_exe_file.Exists()) 17148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton resolved_exe_file.ResolveExecutableLocation (); 172e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 17348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton if (resolved_exe_file.Exists()) 17448a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton error.Clear(); 17548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton else 17648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton { 17748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton exe_file.GetPath(exe_path, sizeof(exe_path)); 17848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton error.SetErrorStringWithFormat("unable to find executable for '%s'", exe_path); 17948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton } 18048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton } 18148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton else 18248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton { 18348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton if (m_remote_platform_sp) 18448a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton { 18548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton error = m_remote_platform_sp->ResolveExecutable (exe_file, 18648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton exe_arch, 187e5eaa30f62c697d649966c86acd4e3c52b39b355Greg Clayton exe_module_sp, 188e5eaa30f62c697d649966c86acd4e3c52b39b355Greg Clayton NULL); 18948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton } 19048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton else 19148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton { 19248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton // We may connect to a process and use the provided executable (Don't use local $PATH). 19348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton 19448a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton if (resolved_exe_file.Exists()) 19548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton error.Clear(); 19648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton else 19748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton error.SetErrorStringWithFormat("the platform is not currently connected, and '%s' doesn't exist in the system root.", exe_path); 19848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton } 19948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton } 20048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton 20148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton if (error.Success()) 202e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 203a605c64524e6bb1e43de4ca0ea95967a596f08ddGreg Clayton ModuleSpec module_spec (resolved_exe_file, exe_arch); 204e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (exe_arch.IsValid()) 205e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 206a605c64524e6bb1e43de4ca0ea95967a596f08ddGreg Clayton error = ModuleList::GetSharedModule (module_spec, 207e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton exe_module_sp, 208e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton NULL, 209e5eaa30f62c697d649966c86acd4e3c52b39b355Greg Clayton NULL, 210e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton NULL); 211535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain if (error.Fail()) 212535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain { 213535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain // If we failed, it may be because the vendor and os aren't known. If that is the 214535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain // case, try setting them to the host architecture and give it another try. 215535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain llvm::Triple &module_triple = module_spec.GetArchitecture().GetTriple(); 216535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain bool is_vendor_specified = (module_triple.getVendor() != llvm::Triple::UnknownVendor); 217535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain bool is_os_specified = (module_triple.getOS() != llvm::Triple::UnknownOS); 218535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain if (!is_vendor_specified || !is_os_specified) 219535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain { 220535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain const llvm::Triple &host_triple = Host::GetArchitecture (Host::eSystemDefaultArchitecture).GetTriple(); 221535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain 222535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain if (!is_vendor_specified) 223535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain module_triple.setVendorName (host_triple.getVendorName()); 224535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain if (!is_os_specified) 225535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain module_triple.setOSName (host_triple.getOSName()); 226535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain 227535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain error = ModuleList::GetSharedModule (module_spec, 228535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain exe_module_sp, 229535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain NULL, 230535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain NULL, 231535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain NULL); 232535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain } 233535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain } 234e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 235df7f13b67edcb3111b66315b0fb73342a89626a4Sean Callanan // TODO find out why exe_module_sp might be NULL 236df7f13b67edcb3111b66315b0fb73342a89626a4Sean Callanan if (!exe_module_sp || exe_module_sp->GetObjectFile() == NULL) 237e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 238e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton exe_module_sp.reset(); 23997a19b21dacd9063bb5475812df7781777262198Greg Clayton error.SetErrorStringWithFormat ("'%s' doesn't contain the architecture %s", 24097a19b21dacd9063bb5475812df7781777262198Greg Clayton exe_file.GetPath().c_str(), 241e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton exe_arch.GetArchitectureName()); 242e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 243e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 244e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 245e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 246e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton // No valid architecture was specified, ask the platform for 247e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton // the architectures that we should be using (in the correct order) 248e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton // and see if we can find a match that way 249e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton StreamString arch_names; 250a605c64524e6bb1e43de4ca0ea95967a596f08ddGreg Clayton for (uint32_t idx = 0; GetSupportedArchitectureAtIndex (idx, module_spec.GetArchitecture()); ++idx) 251e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 252a605c64524e6bb1e43de4ca0ea95967a596f08ddGreg Clayton error = ModuleList::GetSharedModule (module_spec, 253e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton exe_module_sp, 254e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton NULL, 255e5eaa30f62c697d649966c86acd4e3c52b39b355Greg Clayton NULL, 256e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton NULL); 257e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton // Did we find an executable using one of the 258e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (error.Success()) 259e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 260e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (exe_module_sp && exe_module_sp->GetObjectFile()) 261e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton break; 262e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton else 263e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton error.SetErrorToGenericError(); 264e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 265e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 266e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (idx > 0) 267e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton arch_names.PutCString (", "); 268a605c64524e6bb1e43de4ca0ea95967a596f08ddGreg Clayton arch_names.PutCString (module_spec.GetArchitecture().GetArchitectureName()); 269e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 270e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 271e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (error.Fail() || !exe_module_sp) 272e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 27397a19b21dacd9063bb5475812df7781777262198Greg Clayton error.SetErrorStringWithFormat ("'%s' doesn't contain any '%s' platform architectures: %s", 27497a19b21dacd9063bb5475812df7781777262198Greg Clayton exe_file.GetPath().c_str(), 2750e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton GetPluginName().GetCString(), 276e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton arch_names.GetString().c_str()); 277e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 278e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 279e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 280e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 281e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return error; 282e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 283e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 284e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonError 285f4aad907d1d186d6410575bb5d99fb76910c1fe9Stephen WilsonPlatformLinux::GetFile (const FileSpec &platform_file, 28648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton const UUID *uuid_ptr, FileSpec &local_file) 287e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 28848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton if (IsRemote()) 28948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton { 29048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton if (m_remote_platform_sp) 29148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton return m_remote_platform_sp->GetFile (platform_file, uuid_ptr, local_file); 29248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton } 29348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton 294e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton // Default to the local case 295e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton local_file = platform_file; 296e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return Error(); 297e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 298e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 299e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 300e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------ 301e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// Default Constructor 302e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------ 30348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg ClaytonPlatformLinux::PlatformLinux (bool is_host) : 30448a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton Platform(is_host), // This is the local host platform 30548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton m_remote_platform_sp () 306e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 307e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 308e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 309e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------ 310e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// Destructor. 311e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// 312e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// The destructor is virtual since this class is designed to be 313e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton/// inherited from by the plug-in instance. 314e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton//------------------------------------------------------------------ 315e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformLinux::~PlatformLinux() 316e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 317e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 318e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 319e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonbool 3200b0e3fc7fc077a79293f6780fc63afa4ab787e83Johnny ChenPlatformLinux::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info) 321e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 32248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton bool success = false; 32348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton if (IsHost()) 32448a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton { 32548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton success = Platform::GetProcessInfo (pid, process_info); 32648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton } 32748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton else 32848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton { 32948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton if (m_remote_platform_sp) 33048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton success = m_remote_platform_sp->GetProcessInfo (pid, process_info); 33148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton } 33248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton return success; 333e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 334e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton 335e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonbool 336e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg ClaytonPlatformLinux::GetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch) 337e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 338e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton if (idx == 0) 339e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton { 340e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton arch = Host::GetArchitecture (Host::eSystemDefaultArchitecture); 341e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return arch.IsValid(); 342e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton } 3431a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton else if (idx == 1) 3441a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton { 3451a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton // If the default host architecture is 64-bit, look for a 32-bit variant 3461a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton ArchSpec hostArch 3471a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton = Host::GetArchitecture(Host::eSystemDefaultArchitecture); 3481a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton if (hostArch.IsValid() && hostArch.GetTriple().isArch64Bit()) 3491a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton { 3501a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton arch = Host::GetArchitecture (Host::eSystemDefaultArchitecture32); 3511a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton return arch.IsValid(); 3521a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton } 3531a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton } 354e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return false; 355e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton} 3563600d497832c398ffafcba1935389125e15683a3Stephen Wilson 3573600d497832c398ffafcba1935389125e15683a3Stephen Wilsonvoid 3583600d497832c398ffafcba1935389125e15683a3Stephen WilsonPlatformLinux::GetStatus (Stream &strm) 3593600d497832c398ffafcba1935389125e15683a3Stephen Wilson{ 3603600d497832c398ffafcba1935389125e15683a3Stephen Wilson struct utsname un; 3613600d497832c398ffafcba1935389125e15683a3Stephen Wilson 36288b7778e2332be09af5a56a04c274b4132c142c5Daniel Malea Platform::GetStatus(strm); 36388b7778e2332be09af5a56a04c274b4132c142c5Daniel Malea 36488b7778e2332be09af5a56a04c274b4132c142c5Daniel Malea if (uname(&un)) 3653600d497832c398ffafcba1935389125e15683a3Stephen Wilson return; 3663600d497832c398ffafcba1935389125e15683a3Stephen Wilson 36788b7778e2332be09af5a56a04c274b4132c142c5Daniel Malea strm.Printf (" Kernel: %s\n", un.sysname); 36888b7778e2332be09af5a56a04c274b4132c142c5Daniel Malea strm.Printf (" Release: %s\n", un.release); 36988b7778e2332be09af5a56a04c274b4132c142c5Daniel Malea strm.Printf (" Version: %s\n", un.version); 3703600d497832c398ffafcba1935389125e15683a3Stephen Wilson} 3713600d497832c398ffafcba1935389125e15683a3Stephen Wilson 3723600d497832c398ffafcba1935389125e15683a3Stephen Wilsonsize_t 3733600d497832c398ffafcba1935389125e15683a3Stephen WilsonPlatformLinux::GetSoftwareBreakpointTrapOpcode (Target &target, 3743600d497832c398ffafcba1935389125e15683a3Stephen Wilson BreakpointSite *bp_site) 3753600d497832c398ffafcba1935389125e15683a3Stephen Wilson{ 3763600d497832c398ffafcba1935389125e15683a3Stephen Wilson ArchSpec arch = target.GetArchitecture(); 37748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton const uint8_t *trap_opcode = NULL; 37848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton size_t trap_opcode_size = 0; 3793600d497832c398ffafcba1935389125e15683a3Stephen Wilson 3803600d497832c398ffafcba1935389125e15683a3Stephen Wilson switch (arch.GetCore()) 3813600d497832c398ffafcba1935389125e15683a3Stephen Wilson { 3823600d497832c398ffafcba1935389125e15683a3Stephen Wilson default: 3833600d497832c398ffafcba1935389125e15683a3Stephen Wilson assert(false && "CPU type not supported!"); 3843600d497832c398ffafcba1935389125e15683a3Stephen Wilson break; 3853600d497832c398ffafcba1935389125e15683a3Stephen Wilson 3863600d497832c398ffafcba1935389125e15683a3Stephen Wilson case ArchSpec::eCore_x86_32_i386: 3873600d497832c398ffafcba1935389125e15683a3Stephen Wilson case ArchSpec::eCore_x86_64_x86_64: 38848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton { 38948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton static const uint8_t g_i386_breakpoint_opcode[] = { 0xCC }; 39048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton trap_opcode = g_i386_breakpoint_opcode; 39148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton trap_opcode_size = sizeof(g_i386_breakpoint_opcode); 39248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton } 3933600d497832c398ffafcba1935389125e15683a3Stephen Wilson break; 3943600d497832c398ffafcba1935389125e15683a3Stephen Wilson } 3953600d497832c398ffafcba1935389125e15683a3Stephen Wilson 39648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton if (bp_site->SetTrapOpcode(trap_opcode, trap_opcode_size)) 39748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton return trap_opcode_size; 39848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton return 0; 39948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton} 40048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton 40148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg ClaytonError 40248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg ClaytonPlatformLinux::LaunchProcess (ProcessLaunchInfo &launch_info) 40348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton{ 40448a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton Error error; 40548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton 40648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton if (IsHost()) 40748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton { 40848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton if (launch_info.GetFlags().Test (eLaunchFlagLaunchInShell)) 40948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton { 41048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton const bool is_localhost = true; 41197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton const bool will_debug = launch_info.GetFlags().Test(eLaunchFlagDebug); 41297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton const bool first_arg_is_full_shell_command = false; 41397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton if (!launch_info.ConvertArgumentsForLaunchingInShell (error, 41497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton is_localhost, 41597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton will_debug, 41697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton first_arg_is_full_shell_command)) 41748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton return error; 41848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton } 41948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton error = Platform::LaunchProcess (launch_info); 42048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton } 42148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton else 42248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton { 42348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton error.SetErrorString ("the platform is not currently connected"); 42448a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton } 42548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton return error; 4263600d497832c398ffafcba1935389125e15683a3Stephen Wilson} 4270b0e3fc7fc077a79293f6780fc63afa4ab787e83Johnny Chen 4280b0e3fc7fc077a79293f6780fc63afa4ab787e83Johnny Chenlldb::ProcessSP 4290a66c059da5a4d91aa81c2bbe5512a96e0817c34Peter CollingbournePlatformLinux::Attach(ProcessAttachInfo &attach_info, 4300b0e3fc7fc077a79293f6780fc63afa4ab787e83Johnny Chen Debugger &debugger, 4310b0e3fc7fc077a79293f6780fc63afa4ab787e83Johnny Chen Target *target, 4320b0e3fc7fc077a79293f6780fc63afa4ab787e83Johnny Chen Listener &listener, 4330b0e3fc7fc077a79293f6780fc63afa4ab787e83Johnny Chen Error &error) 4340b0e3fc7fc077a79293f6780fc63afa4ab787e83Johnny Chen{ 43548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton lldb::ProcessSP process_sp; 43648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton if (IsHost()) 43748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton { 43848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton if (target == NULL) 43948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton { 44048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton TargetSP new_target_sp; 44148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton ArchSpec emptyArchSpec; 44248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton 44348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton error = debugger.GetTargetList().CreateTarget (debugger, 444ed0a0fbd021e44727469d6fa20cc337c58bd04c3Greg Clayton NULL, 44548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton emptyArchSpec, 44648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton false, 44748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton m_remote_platform_sp, 44848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton new_target_sp); 44948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton target = new_target_sp.get(); 45048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton } 45148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton else 45248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton error.Clear(); 45348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton 45448a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton if (target && error.Success()) 45548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton { 45648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton debugger.GetTargetList().SetSelectedTarget(target); 45748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton 458e5eaa30f62c697d649966c86acd4e3c52b39b355Greg Clayton process_sp = target->CreateProcess (listener, 459e5eaa30f62c697d649966c86acd4e3c52b39b355Greg Clayton attach_info.GetProcessPluginName(), 460e5eaa30f62c697d649966c86acd4e3c52b39b355Greg Clayton NULL); 46148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton 46248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton if (process_sp) 46348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton error = process_sp->Attach (attach_info); 46448a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton } 46548a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton } 46648a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton else 46748a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton { 46848a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton if (m_remote_platform_sp) 46948a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton process_sp = m_remote_platform_sp->Attach (attach_info, debugger, target, listener, error); 47048a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton else 47148a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton error.SetErrorString ("the platform is not currently connected"); 47248a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton } 47348a202dd3ac1fb4ee6709074448dc4d221fa020cGreg Clayton return process_sp; 4740b0e3fc7fc077a79293f6780fc63afa4ab787e83Johnny Chen} 475