18f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton//===-- Host.cpp ------------------------------------------------*- C++ -*-===// 27c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman// 37c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman// The LLVM Compiler Infrastructure 47c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman// 57c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman// This file is distributed under the University of Illinois Open Source 67c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman// License. See LICENSE.TXT for details. 77c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman// 87c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman//===----------------------------------------------------------------------===// 97c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman 10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h" 11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea 12132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton// C includes 138f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton#include <dlfcn.h> 148f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton#include <errno.h> 1524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton#include <grp.h> 16ec2d9787bed36e9eda6eac1996c7bed76c8d3da4Stephen Wilson#include <limits.h> 1758e26e0935138225477fd61283215ceff2068899Greg Clayton#include <netdb.h> 1824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton#include <pwd.h> 1924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton#include <sys/types.h> 203f7faa8002b74d7264ad16616fc4294e07aa2b2fEd Maste#include <sys/sysctl.h> 21132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton#include <unistd.h> 228f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 238f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton#if defined (__APPLE__) 2414ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton 2549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton#include <dispatch/dispatch.h> 268f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton#include <libproc.h> 278f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton#include <mach-o/dyld.h> 28e93725bec81a4433756b2acfa3adc7223bc51a9aGreg Clayton#include <mach/mach_port.h> 2924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 30750fc7ffc57a863940087366520234581f27043bEd Maste#endif 3114ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton 32750fc7ffc57a863940087366520234581f27043bEd Maste#if defined (__linux__) || defined (__FreeBSD__) || defined (__FreeBSD_kernel__) 330f577c2ab79604f7300ac66afebcaa4a4b2dceefGreg Clayton#include <sys/wait.h> 347526625a76ca97a2637749b0cc4068bf0bd907fbMichael Sartain#include <sys/syscall.h> 35750fc7ffc57a863940087366520234581f27043bEd Maste#endif 3614ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton 37750fc7ffc57a863940087366520234581f27043bEd Maste#if defined (__FreeBSD__) 384b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen#include <pthread_np.h> 398f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton#endif 407c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman 41132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton#include "lldb/Host/Host.h" 42132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton#include "lldb/Core/ArchSpec.h" 43132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton#include "lldb/Core/ConstString.h" 44132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton#include "lldb/Core/Debugger.h" 45132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton#include "lldb/Core/Error.h" 46132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton#include "lldb/Core/Log.h" 47132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton#include "lldb/Core/StreamString.h" 48132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton#include "lldb/Core/ThreadSafeSTLMap.h" 49132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton#include "lldb/Host/Config.h" 50132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton#include "lldb/Host/Endian.h" 51132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton#include "lldb/Host/FileSpec.h" 52132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton#include "lldb/Host/Mutex.h" 53132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton#include "lldb/Target/Process.h" 54132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton#include "lldb/Target/TargetList.h" 55132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton 56a984aa968d40e16e6fe2d53bb0eb64a54964f439Daniel Malea#include "llvm/ADT/SmallString.h" 57132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton#include "llvm/Support/Host.h" 58132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton#include "llvm/Support/MachO.h" 59a984aa968d40e16e6fe2d53bb0eb64a54964f439Daniel Malea#include "llvm/Support/raw_ostream.h" 60132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton 61132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton 62132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton 63132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton 64132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton 657c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedmanusing namespace lldb; 667c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedmanusing namespace lldb_private; 677c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman 681c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton 69c518fe7609f40c3b00eaa29e5596e59aeac7d4baGreg Clayton#if !defined (__APPLE__) 708f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Claytonstruct MonitorInfo 718f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton{ 728f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton lldb::pid_t pid; // The process ID to monitor 738f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton Host::MonitorChildProcessCallback callback; // The callback function to call when "pid" exits or signals 748f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton void *callback_baton; // The callback baton for the callback function 758f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton bool monitor_signals; // If true, call the callback when "pid" gets signaled. 768f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton}; 778f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 788f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Claytonstatic void * 798f3b21daa0d509ac49b2b82f45aaed35f6874502Greg ClaytonMonitorChildProcessThreadFunction (void *arg); 808f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 818f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Claytonlldb::thread_t 828f3b21daa0d509ac49b2b82f45aaed35f6874502Greg ClaytonHost::StartMonitoringChildProcess 838f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton( 848f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton Host::MonitorChildProcessCallback callback, 858f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton void *callback_baton, 868f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton lldb::pid_t pid, 878f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton bool monitor_signals 888f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton) 898f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton{ 908f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton lldb::thread_t thread = LLDB_INVALID_HOST_THREAD; 911c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton MonitorInfo * info_ptr = new MonitorInfo(); 928f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 931c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton info_ptr->pid = pid; 941c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton info_ptr->callback = callback; 951c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton info_ptr->callback_baton = callback_baton; 961c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton info_ptr->monitor_signals = monitor_signals; 971c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton 981c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton char thread_name[256]; 995f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea ::snprintf (thread_name, sizeof(thread_name), "<lldb.host.wait4(pid=%" PRIu64 ")>", pid); 1001c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton thread = ThreadCreate (thread_name, 1011c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton MonitorChildProcessThreadFunction, 1021c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton info_ptr, 1031c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton NULL); 1041c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton 1058f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton return thread; 1068f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton} 1078f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 1087c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman//------------------------------------------------------------------ 1098f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton// Scoped class that will disable thread canceling when it is 1108f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton// constructed, and exception safely restore the previous value it 1118f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton// when it goes out of scope. 1127c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman//------------------------------------------------------------------ 1138f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Claytonclass ScopedPThreadCancelDisabler 1148f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton{ 1158f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Claytonpublic: 1168f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton ScopedPThreadCancelDisabler() 1178f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton { 1188f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton // Disable the ability for this thread to be cancelled 1198f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton int err = ::pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &m_old_state); 1208f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton if (err != 0) 1218f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton m_old_state = -1; 1228f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 1238f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton } 1248f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 1258f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton ~ScopedPThreadCancelDisabler() 1268f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton { 1278f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton // Restore the ability for this thread to be cancelled to what it 1288f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton // previously was. 1298f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton if (m_old_state != -1) 1308f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton ::pthread_setcancelstate (m_old_state, 0); 1318f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton } 1328f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Claytonprivate: 1338f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton int m_old_state; // Save the old cancelability state. 1348f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton}; 1358f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 1368f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Claytonstatic void * 1378f3b21daa0d509ac49b2b82f45aaed35f6874502Greg ClaytonMonitorChildProcessThreadFunction (void *arg) 1388f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton{ 139952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 1408f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton const char *function = __FUNCTION__; 1418f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton if (log) 1428f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton log->Printf ("%s (arg = %p) thread starting...", function, arg); 1438f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 1448f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton MonitorInfo *info = (MonitorInfo *)arg; 1458f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 1468f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton const Host::MonitorChildProcessCallback callback = info->callback; 1478f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton void * const callback_baton = info->callback_baton; 1488f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton const lldb::pid_t pid = info->pid; 1498f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton const bool monitor_signals = info->monitor_signals; 1508f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 1518f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton delete info; 1528f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 1538f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton int status = -1; 154fa2cd91f47a7782b9c040058aed369e022e332d3Sylvestre Ledru#if defined (__FreeBSD__) || defined (__FreeBSD_kernel__) 15532657deb2327a78d8d924a48260106bfa74b6b52Ashok Thirumurthi #define __WALL 0 15632657deb2327a78d8d924a48260106bfa74b6b52Ashok Thirumurthi#endif 157f1fda3748c39c92d2e79aeba0715baffabd3286bMatt Kopec const int options = __WALL; 158f1fda3748c39c92d2e79aeba0715baffabd3286bMatt Kopec 1598f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton while (1) 1608f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton { 161926060e198137f8a64face70455324a8cd4362a5Caroline Tice log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS); 1628f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton if (log) 1635f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf("%s ::wait_pid (pid = %" PRIu64 ", &status, options = %i)...", function, pid, options); 1648f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 1658f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton // Wait for all child processes 1668f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton ::pthread_testcancel (); 167f1fda3748c39c92d2e79aeba0715baffabd3286bMatt Kopec // Get signals from all children with same process group of pid 168f1fda3748c39c92d2e79aeba0715baffabd3286bMatt Kopec const lldb::pid_t wait_pid = ::waitpid (-1*pid, &status, options); 1698f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton ::pthread_testcancel (); 1708f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 1718f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton if (wait_pid == -1) 1728f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton { 1738f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton if (errno == EINTR) 1748f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton continue; 1758f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton else 1763bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor { 1773bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor if (log) 1783bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor log->Printf ("%s (arg = %p) thread exiting because waitpid failed (%s)...", __FUNCTION__, arg, strerror(errno)); 1798f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton break; 1803bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor } 1818f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton } 182f1fda3748c39c92d2e79aeba0715baffabd3286bMatt Kopec else if (wait_pid > 0) 1838f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton { 1848f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton bool exited = false; 1858f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton int signal = 0; 1868f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton int exit_status = 0; 1878f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton const char *status_cstr = NULL; 1888f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton if (WIFSTOPPED(status)) 1898f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton { 1908f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton signal = WSTOPSIG(status); 1918f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton status_cstr = "STOPPED"; 1928f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton } 1938f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton else if (WIFEXITED(status)) 1948f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton { 1958f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton exit_status = WEXITSTATUS(status); 1968f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton status_cstr = "EXITED"; 1973bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor exited = true; 1988f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton } 1998f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton else if (WIFSIGNALED(status)) 2008f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton { 2018f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton signal = WTERMSIG(status); 2028f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton status_cstr = "SIGNALED"; 203f1fda3748c39c92d2e79aeba0715baffabd3286bMatt Kopec if (wait_pid == pid) { 204f1fda3748c39c92d2e79aeba0715baffabd3286bMatt Kopec exited = true; 205f1fda3748c39c92d2e79aeba0715baffabd3286bMatt Kopec exit_status = -1; 206f1fda3748c39c92d2e79aeba0715baffabd3286bMatt Kopec } 2078f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton } 2088f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton else 2098f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton { 2102bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen status_cstr = "(\?\?\?)"; 2118f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton } 2128f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 2138f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton // Scope for pthread_cancel_disabler 2148f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton { 2158f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton ScopedPThreadCancelDisabler pthread_cancel_disabler; 2168f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 217926060e198137f8a64face70455324a8cd4362a5Caroline Tice log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS); 2188f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton if (log) 2195f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf ("%s ::waitpid (pid = %" PRIu64 ", &status, options = %i) => pid = %" PRIu64 ", status = 0x%8.8x (%s), signal = %i, exit_state = %i", 2208f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton function, 2218f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton wait_pid, 2228f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton options, 2238f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton pid, 2248f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton status, 2258f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton status_cstr, 2268f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton signal, 2278f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton exit_status); 2288f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 2298f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton if (exited || (signal != 0 && monitor_signals)) 2308f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton { 2311c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton bool callback_return = false; 2321c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton if (callback) 233f1fda3748c39c92d2e79aeba0715baffabd3286bMatt Kopec callback_return = callback (callback_baton, wait_pid, exited, signal, exit_status); 2348f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 2358f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton // If our process exited, then this thread should exit 2363bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor if (exited && wait_pid == pid) 2373bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor { 2383bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor if (log) 2393bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor log->Printf ("%s (arg = %p) thread exiting because pid received exit signal...", __FUNCTION__, arg); 2408f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton break; 2413bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor } 2428f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton // If the callback returns true, it means this process should 2438f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton // exit 2448f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton if (callback_return) 2453bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor { 2463bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor if (log) 2473bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor log->Printf ("%s (arg = %p) thread exiting because callback returned true...", __FUNCTION__, arg); 2488f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton break; 2493bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor } 2508f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton } 2518f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton } 2528f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton } 2538f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton } 2548f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 255926060e198137f8a64face70455324a8cd4362a5Caroline Tice log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS); 2568f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton if (log) 2578f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton log->Printf ("%s (arg = %p) thread exiting...", __FUNCTION__, arg); 2588f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 2598f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton return NULL; 2608f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton} 2618f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 262df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 263df6dc88322f103b263092d752db4490e628a1cbdGreg Claytonvoid 264df6dc88322f103b263092d752db4490e628a1cbdGreg ClaytonHost::SystemLog (SystemLogType type, const char *format, va_list args) 265df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton{ 266df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton vfprintf (stderr, format, args); 267df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton} 268df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 2691c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton#endif // #if !defined (__APPLE__) 2701c4642c6ab741d85c98d4288cf922c9a2ef77007Greg Clayton 271df6dc88322f103b263092d752db4490e628a1cbdGreg Claytonvoid 272df6dc88322f103b263092d752db4490e628a1cbdGreg ClaytonHost::SystemLog (SystemLogType type, const char *format, ...) 273df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton{ 274df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_list args; 275df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_start (args, format); 276df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton SystemLog (type, format, args); 277df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton va_end (args); 278df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton} 279df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton 2807c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedmansize_t 2817c7c19d37de4ae8d455c18615fcce5691b236831Eli FriedmanHost::GetPageSize() 2827c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman{ 2837c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman return ::getpagesize(); 2847c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman} 2857c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman 2867c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedmanconst ArchSpec & 287395fc33dc4b06c048ed35047ec461bc092ef2df3Greg ClaytonHost::GetArchitecture (SystemDefaultArchitecture arch_kind) 2887c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman{ 289395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton static bool g_supports_32 = false; 290395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton static bool g_supports_64 = false; 291395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton static ArchSpec g_host_arch_32; 292395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton static ArchSpec g_host_arch_64; 293395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 2948f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton#if defined (__APPLE__) 295395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 296395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton // Apple is different in that it can support both 32 and 64 bit executables 297395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton // in the same operating system running concurrently. Here we detect the 298395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton // correct host architectures for both 32 and 64 bit including if 64 bit 299395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton // executables are supported on the system. 300395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 301395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton if (g_supports_32 == false && g_supports_64 == false) 302395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton { 303395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton // All apple systems support 32 bit execution. 304395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton g_supports_32 = true; 3057c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman uint32_t cputype, cpusubtype; 306395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton uint32_t is_64_bit_capable = false; 3077c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman size_t len = sizeof(cputype); 308395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton ArchSpec host_arch; 309395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton // These will tell us about the kernel architecture, which even on a 64 310395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton // bit machine can be 32 bit... 3117c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman if (::sysctlbyname("hw.cputype", &cputype, &len, NULL, 0) == 0) 3127c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman { 313395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton len = sizeof (cpusubtype); 314395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton if (::sysctlbyname("hw.cpusubtype", &cpusubtype, &len, NULL, 0) != 0) 315395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton cpusubtype = CPU_TYPE_ANY; 316395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 3177c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman len = sizeof (is_64_bit_capable); 3187c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman if (::sysctlbyname("hw.cpu64bit_capable", &is_64_bit_capable, &len, NULL, 0) == 0) 3197c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman { 3207c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman if (is_64_bit_capable) 321395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton g_supports_64 = true; 322395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton } 323395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 324395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton if (is_64_bit_capable) 325395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton { 32675c703dd8b492bad25a987b96853626641ae7246Greg Clayton#if defined (__i386__) || defined (__x86_64__) 32775c703dd8b492bad25a987b96853626641ae7246Greg Clayton if (cpusubtype == CPU_SUBTYPE_486) 32875c703dd8b492bad25a987b96853626641ae7246Greg Clayton cpusubtype = CPU_SUBTYPE_I386_ALL; 32975c703dd8b492bad25a987b96853626641ae7246Greg Clayton#endif 330395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton if (cputype & CPU_ARCH_ABI64) 331395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton { 332395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton // We have a 64 bit kernel on a 64 bit system 333b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton g_host_arch_32.SetArchitecture (eArchTypeMachO, ~(CPU_ARCH_MASK) & cputype, cpusubtype); 334b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton g_host_arch_64.SetArchitecture (eArchTypeMachO, cputype, cpusubtype); 335395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton } 336395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton else 3377c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman { 338395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton // We have a 32 bit kernel on a 64 bit system 339b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton g_host_arch_32.SetArchitecture (eArchTypeMachO, cputype, cpusubtype); 3407c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman cputype |= CPU_ARCH_ABI64; 341b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton g_host_arch_64.SetArchitecture (eArchTypeMachO, cputype, cpusubtype); 3427c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman } 3437c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman } 344395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton else 345395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton { 346b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton g_host_arch_32.SetArchitecture (eArchTypeMachO, cputype, cpusubtype); 347395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton g_host_arch_64.Clear(); 348395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton } 3497c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman } 350395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton } 351395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 352395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton#else // #if defined (__APPLE__) 3537f513ba286dff6c8b12ccb910ec4435eef488e9bStephen Wilson 354395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton if (g_supports_32 == false && g_supports_64 == false) 355395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton { 356b47c99887354d7b3e2875703c0de5cb398190b2cPeter Collingbourne llvm::Triple triple(llvm::sys::getDefaultTargetTriple()); 357395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 3587f513ba286dff6c8b12ccb910ec4435eef488e9bStephen Wilson g_host_arch_32.Clear(); 3597f513ba286dff6c8b12ccb910ec4435eef488e9bStephen Wilson g_host_arch_64.Clear(); 360395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 3617971a03710f98eb936a750ce5e860ae429d394cdGreg Clayton // If the OS is Linux, "unknown" in the vendor slot isn't what we want 3627971a03710f98eb936a750ce5e860ae429d394cdGreg Clayton // for the default triple. It's probably an artifact of config.guess. 3637971a03710f98eb936a750ce5e860ae429d394cdGreg Clayton if (triple.getOS() == llvm::Triple::Linux && triple.getVendor() == llvm::Triple::UnknownVendor) 3647971a03710f98eb936a750ce5e860ae429d394cdGreg Clayton triple.setVendorName(""); 3657971a03710f98eb936a750ce5e860ae429d394cdGreg Clayton 3667f513ba286dff6c8b12ccb910ec4435eef488e9bStephen Wilson switch (triple.getArch()) 3677f513ba286dff6c8b12ccb910ec4435eef488e9bStephen Wilson { 3687f513ba286dff6c8b12ccb910ec4435eef488e9bStephen Wilson default: 3697f513ba286dff6c8b12ccb910ec4435eef488e9bStephen Wilson g_host_arch_32.SetTriple(triple); 3707f513ba286dff6c8b12ccb910ec4435eef488e9bStephen Wilson g_supports_32 = true; 3717f513ba286dff6c8b12ccb910ec4435eef488e9bStephen Wilson break; 3727f513ba286dff6c8b12ccb910ec4435eef488e9bStephen Wilson 3737f513ba286dff6c8b12ccb910ec4435eef488e9bStephen Wilson case llvm::Triple::x86_64: 3741a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton g_host_arch_64.SetTriple(triple); 3751a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton g_supports_64 = true; 3761a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton g_host_arch_32.SetTriple(triple.get32BitArchVariant()); 3771a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton g_supports_32 = true; 3781a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton break; 3791a450cd9bc58d024c81501fada890d6947720bbbGreg Clayton 3807f513ba286dff6c8b12ccb910ec4435eef488e9bStephen Wilson case llvm::Triple::sparcv9: 3817f513ba286dff6c8b12ccb910ec4435eef488e9bStephen Wilson case llvm::Triple::ppc64: 3827f513ba286dff6c8b12ccb910ec4435eef488e9bStephen Wilson g_host_arch_64.SetTriple(triple); 3837f513ba286dff6c8b12ccb910ec4435eef488e9bStephen Wilson g_supports_64 = true; 3847f513ba286dff6c8b12ccb910ec4435eef488e9bStephen Wilson break; 3857f513ba286dff6c8b12ccb910ec4435eef488e9bStephen Wilson } 3864fefe326fba2e20d2cd81597334064918cbb4a90Greg Clayton 3874fefe326fba2e20d2cd81597334064918cbb4a90Greg Clayton g_supports_32 = g_host_arch_32.IsValid(); 3884fefe326fba2e20d2cd81597334064918cbb4a90Greg Clayton g_supports_64 = g_host_arch_64.IsValid(); 3898f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton } 390395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 391395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton#endif // #else for #if defined (__APPLE__) 392395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 393395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton if (arch_kind == eSystemDefaultArchitecture32) 394395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton return g_host_arch_32; 395395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton else if (arch_kind == eSystemDefaultArchitecture64) 396395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton return g_host_arch_64; 397395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 398395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton if (g_supports_64) 399395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton return g_host_arch_64; 400395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton 401395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton return g_host_arch_32; 4027c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman} 4037c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman 4047c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedmanconst ConstString & 4057c7c19d37de4ae8d455c18615fcce5691b236831Eli FriedmanHost::GetVendorString() 4067c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman{ 4077c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman static ConstString g_vendor; 4087c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman if (!g_vendor) 4097c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman { 4105b0025fb034bfa6d4ee639f6342f56d9845ada7bGreg Clayton const ArchSpec &host_arch = GetArchitecture (eSystemDefaultArchitecture); 4115b0025fb034bfa6d4ee639f6342f56d9845ada7bGreg Clayton const llvm::StringRef &str_ref = host_arch.GetTriple().getVendorName(); 4125b0025fb034bfa6d4ee639f6342f56d9845ada7bGreg Clayton g_vendor.SetCStringWithLength(str_ref.data(), str_ref.size()); 4137c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman } 4147c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman return g_vendor; 4157c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman} 4167c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman 4177c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedmanconst ConstString & 4187c7c19d37de4ae8d455c18615fcce5691b236831Eli FriedmanHost::GetOSString() 4197c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman{ 4208f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton static ConstString g_os_string; 4218f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton if (!g_os_string) 4228f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton { 4235b0025fb034bfa6d4ee639f6342f56d9845ada7bGreg Clayton const ArchSpec &host_arch = GetArchitecture (eSystemDefaultArchitecture); 4245b0025fb034bfa6d4ee639f6342f56d9845ada7bGreg Clayton const llvm::StringRef &str_ref = host_arch.GetTriple().getOSName(); 4255b0025fb034bfa6d4ee639f6342f56d9845ada7bGreg Clayton g_os_string.SetCStringWithLength(str_ref.data(), str_ref.size()); 4268f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton } 4277c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman return g_os_string; 4287c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman} 4297c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman 4307c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedmanconst ConstString & 4317c7c19d37de4ae8d455c18615fcce5691b236831Eli FriedmanHost::GetTargetTriple() 4327c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman{ 4337c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman static ConstString g_host_triple; 4347c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman if (!(g_host_triple)) 4357c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman { 4365b0025fb034bfa6d4ee639f6342f56d9845ada7bGreg Clayton const ArchSpec &host_arch = GetArchitecture (eSystemDefaultArchitecture); 4375b0025fb034bfa6d4ee639f6342f56d9845ada7bGreg Clayton g_host_triple.SetCString(host_arch.GetTriple().getTriple().c_str()); 4387c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman } 4397c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman return g_host_triple; 4407c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman} 4417c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman 4428f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Claytonlldb::pid_t 4438f3b21daa0d509ac49b2b82f45aaed35f6874502Greg ClaytonHost::GetCurrentProcessID() 4448f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton{ 4458f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton return ::getpid(); 4468f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton} 4478f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 4488f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Claytonlldb::tid_t 4498f3b21daa0d509ac49b2b82f45aaed35f6874502Greg ClaytonHost::GetCurrentThreadID() 4508f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton{ 4518f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton#if defined (__APPLE__) 452e93725bec81a4433756b2acfa3adc7223bc51a9aGreg Clayton // Calling "mach_port_deallocate()" bumps the reference count on the thread 453e93725bec81a4433756b2acfa3adc7223bc51a9aGreg Clayton // port, so we need to deallocate it. mach_task_self() doesn't bump the ref 454e93725bec81a4433756b2acfa3adc7223bc51a9aGreg Clayton // count. 455e93725bec81a4433756b2acfa3adc7223bc51a9aGreg Clayton thread_port_t thread_self = mach_thread_self(); 456e93725bec81a4433756b2acfa3adc7223bc51a9aGreg Clayton mach_port_deallocate(mach_task_self(), thread_self); 457e93725bec81a4433756b2acfa3adc7223bc51a9aGreg Clayton return thread_self; 4584b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen#elif defined(__FreeBSD__) 4594b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen return lldb::tid_t(pthread_getthreadid_np()); 4607526625a76ca97a2637749b0cc4068bf0bd907fbMichael Sartain#elif defined(__linux__) 4617526625a76ca97a2637749b0cc4068bf0bd907fbMichael Sartain return lldb::tid_t(syscall(SYS_gettid)); 4628f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton#else 4638f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton return lldb::tid_t(pthread_self()); 4648f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton#endif 4658f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton} 4668f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 4671831e78a6253392fca1c99e555e7adaa3f372647Jim Inghamlldb::thread_t 4681831e78a6253392fca1c99e555e7adaa3f372647Jim InghamHost::GetCurrentThread () 4691831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham{ 4701831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham return lldb::thread_t(pthread_self()); 4711831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham} 4721831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham 4738f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Claytonconst char * 4748f3b21daa0d509ac49b2b82f45aaed35f6874502Greg ClaytonHost::GetSignalAsCString (int signo) 4758f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton{ 4768f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton switch (signo) 4778f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton { 4788f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGHUP: return "SIGHUP"; // 1 hangup 4798f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGINT: return "SIGINT"; // 2 interrupt 4808f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGQUIT: return "SIGQUIT"; // 3 quit 4818f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGILL: return "SIGILL"; // 4 illegal instruction (not reset when caught) 4828f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGTRAP: return "SIGTRAP"; // 5 trace trap (not reset when caught) 4838f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGABRT: return "SIGABRT"; // 6 abort() 484193cc83d10ec6a780c9d80c429638a8cd42a0952Greg Clayton#if (defined(_POSIX_C_SOURCE) && !defined(_DARWIN_C_SOURCE)) 4858f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGPOLL: return "SIGPOLL"; // 7 pollable event ([XSR] generated, not supported) 48606c306cce353ec1bc413a2d61fc79c5f1161efb4Benjamin Kramer#endif 48706c306cce353ec1bc413a2d61fc79c5f1161efb4Benjamin Kramer#if !defined(_POSIX_C_SOURCE) 4888f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGEMT: return "SIGEMT"; // 7 EMT instruction 48906c306cce353ec1bc413a2d61fc79c5f1161efb4Benjamin Kramer#endif 4908f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGFPE: return "SIGFPE"; // 8 floating point exception 4918f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGKILL: return "SIGKILL"; // 9 kill (cannot be caught or ignored) 4928f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGBUS: return "SIGBUS"; // 10 bus error 4938f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGSEGV: return "SIGSEGV"; // 11 segmentation violation 4948f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGSYS: return "SIGSYS"; // 12 bad argument to system call 4958f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGPIPE: return "SIGPIPE"; // 13 write on a pipe with no one to read it 4968f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGALRM: return "SIGALRM"; // 14 alarm clock 4978f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGTERM: return "SIGTERM"; // 15 software termination signal from kill 4988f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGURG: return "SIGURG"; // 16 urgent condition on IO channel 4998f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGSTOP: return "SIGSTOP"; // 17 sendable stop signal not from tty 5008f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGTSTP: return "SIGTSTP"; // 18 stop signal from tty 5018f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGCONT: return "SIGCONT"; // 19 continue a stopped process 5028f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGCHLD: return "SIGCHLD"; // 20 to parent on child stop or exit 5038f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGTTIN: return "SIGTTIN"; // 21 to readers pgrp upon background tty read 5048f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGTTOU: return "SIGTTOU"; // 22 like TTIN for output if (tp->t_local<OSTOP) 5058f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton#if !defined(_POSIX_C_SOURCE) 5068f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGIO: return "SIGIO"; // 23 input/output possible signal 5078f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton#endif 5088f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGXCPU: return "SIGXCPU"; // 24 exceeded CPU time limit 5098f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGXFSZ: return "SIGXFSZ"; // 25 exceeded file size limit 5108f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGVTALRM: return "SIGVTALRM"; // 26 virtual time alarm 5118f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGPROF: return "SIGPROF"; // 27 profiling time alarm 5128f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton#if !defined(_POSIX_C_SOURCE) 5138f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGWINCH: return "SIGWINCH"; // 28 window size changes 5148f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGINFO: return "SIGINFO"; // 29 information request 5158f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton#endif 5168f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGUSR1: return "SIGUSR1"; // 30 user defined signal 1 5178f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton case SIGUSR2: return "SIGUSR2"; // 31 user defined signal 2 5188f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton default: 5198f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton break; 5208f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton } 5218f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton return NULL; 5228f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton} 5238f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 5248f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Claytonvoid 5258f3b21daa0d509ac49b2b82f45aaed35f6874502Greg ClaytonHost::WillTerminate () 5268f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton{ 5278f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton} 5287c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman 529fa2cd91f47a7782b9c040058aed369e022e332d3Sylvestre Ledru#if !defined (__APPLE__) && !defined (__FreeBSD__) && !defined (__FreeBSD_kernel__) && !defined (__linux__) // see macosx/Host.mm 530024497728739eedffc9b79c28337fba22f07f8b4Matt Kopec 5318f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Claytonvoid 5328f3b21daa0d509ac49b2b82f45aaed35f6874502Greg ClaytonHost::ThreadCreated (const char *thread_name) 5337c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman{ 5347c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman} 535b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton 5365f0559d972936a26d6571df94d7aabf989eb97e9Peter Collingbournevoid 537b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg ClaytonHost::Backtrace (Stream &strm, uint32_t max_frames) 538b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton{ 5390bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain // TODO: Is there a way to backtrace the current process on other systems? 540b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton} 541b749a265a2b97f9cef71c362dfd6dae26c8f2973Greg Clayton 542638351aee118e89c658ca295cb4e9d1db7849befGreg Claytonsize_t 543638351aee118e89c658ca295cb4e9d1db7849befGreg ClaytonHost::GetEnvironment (StringList &env) 544638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton{ 5450bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain // TODO: Is there a way to the host environment for this process on other systems? 546638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton return 0; 547638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton} 548638351aee118e89c658ca295cb4e9d1db7849befGreg Clayton 549fa2cd91f47a7782b9c040058aed369e022e332d3Sylvestre Ledru#endif // #if !defined (__APPLE__) && !defined (__FreeBSD__) && !defined (__FreeBSD_kernel__) && !defined (__linux__) 5507c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman 5517c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedmanstruct HostThreadCreateInfo 5527c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman{ 5537c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman std::string thread_name; 5547c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman thread_func_t thread_fptr; 5557c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman thread_arg_t thread_arg; 5568f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 5577c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman HostThreadCreateInfo (const char *name, thread_func_t fptr, thread_arg_t arg) : 5587c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman thread_name (name ? name : ""), 5597c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman thread_fptr (fptr), 5607c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman thread_arg (arg) 5617c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman { 5627c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman } 5637c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman}; 5647c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman 5657c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedmanstatic thread_result_t 5667c7c19d37de4ae8d455c18615fcce5691b236831Eli FriedmanThreadCreateTrampoline (thread_arg_t arg) 5677c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman{ 5687c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman HostThreadCreateInfo *info = (HostThreadCreateInfo *)arg; 5697c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman Host::ThreadCreated (info->thread_name.c_str()); 5707c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman thread_func_t thread_fptr = info->thread_fptr; 5717c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman thread_arg_t thread_arg = info->thread_arg; 5728f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 573952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD)); 5747c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman if (log) 5757c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman log->Printf("thread created"); 5768f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 5777c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman delete info; 5787c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman return thread_fptr (thread_arg); 5797c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman} 5807c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman 5817c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedmanlldb::thread_t 5827c7c19d37de4ae8d455c18615fcce5691b236831Eli FriedmanHost::ThreadCreate 5837c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman( 5847c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman const char *thread_name, 5857c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman thread_func_t thread_fptr, 5867c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman thread_arg_t thread_arg, 5877c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman Error *error 5887c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman) 5897c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman{ 5907c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman lldb::thread_t thread = LLDB_INVALID_HOST_THREAD; 5918f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 5927c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman // Host::ThreadCreateTrampoline will delete this pointer for us. 5937c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman HostThreadCreateInfo *info_ptr = new HostThreadCreateInfo (thread_name, thread_fptr, thread_arg); 5948f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 5957c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman int err = ::pthread_create (&thread, NULL, ThreadCreateTrampoline, info_ptr); 5967c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman if (err == 0) 5977c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman { 5987c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman if (error) 5997c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman error->Clear(); 6007c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman return thread; 6017c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman } 6028f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 6037c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman if (error) 6047c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman error->SetError (err, eErrorTypePOSIX); 6058f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 6067c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman return LLDB_INVALID_HOST_THREAD; 6077c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman} 6087c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman 6097c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedmanbool 6107c7c19d37de4ae8d455c18615fcce5691b236831Eli FriedmanHost::ThreadCancel (lldb::thread_t thread, Error *error) 6117c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman{ 6127c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman int err = ::pthread_cancel (thread); 6137c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman if (error) 6147c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman error->SetError(err, eErrorTypePOSIX); 6157c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman return err == 0; 6167c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman} 6177c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman 6187c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedmanbool 6197c7c19d37de4ae8d455c18615fcce5691b236831Eli FriedmanHost::ThreadDetach (lldb::thread_t thread, Error *error) 6207c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman{ 6217c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman int err = ::pthread_detach (thread); 6227c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman if (error) 6237c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman error->SetError(err, eErrorTypePOSIX); 6247c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman return err == 0; 6257c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman} 6267c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman 6277c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedmanbool 6287c7c19d37de4ae8d455c18615fcce5691b236831Eli FriedmanHost::ThreadJoin (lldb::thread_t thread, thread_result_t *thread_result_ptr, Error *error) 6297c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman{ 6307c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman int err = ::pthread_join (thread, thread_result_ptr); 6317c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman if (error) 6327c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman error->SetError(err, eErrorTypePOSIX); 6337c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman return err == 0; 6347c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman} 6357c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman 636024497728739eedffc9b79c28337fba22f07f8b4Matt Kopecbool 6377c7c19d37de4ae8d455c18615fcce5691b236831Eli FriedmanHost::SetThreadName (lldb::pid_t pid, lldb::tid_t tid, const char *name) 6387c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman{ 6396f0165b3dc0ecc689f565c792e53dd3397b4a432Greg Clayton#if defined(__APPLE__) && MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5 6407c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman lldb::pid_t curr_pid = Host::GetCurrentProcessID(); 6417c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman lldb::tid_t curr_tid = Host::GetCurrentThreadID(); 6427c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman if (pid == LLDB_INVALID_PROCESS_ID) 6437c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman pid = curr_pid; 6447c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman 6457c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman if (tid == LLDB_INVALID_THREAD_ID) 6467c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman tid = curr_tid; 6477c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman 6487c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman // Set the pthread name if possible 6497c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman if (pid == curr_pid && tid == curr_tid) 6507c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman { 651024497728739eedffc9b79c28337fba22f07f8b4Matt Kopec if (::pthread_setname_np (name) == 0) 652024497728739eedffc9b79c28337fba22f07f8b4Matt Kopec return true; 653024497728739eedffc9b79c28337fba22f07f8b4Matt Kopec } 654024497728739eedffc9b79c28337fba22f07f8b4Matt Kopec return false; 655f476592805f813aa7a94f7d6770481503140aae2Ed Maste#elif defined (__FreeBSD__) 656f476592805f813aa7a94f7d6770481503140aae2Ed Maste lldb::pid_t curr_pid = Host::GetCurrentProcessID(); 657f476592805f813aa7a94f7d6770481503140aae2Ed Maste lldb::tid_t curr_tid = Host::GetCurrentThreadID(); 658f476592805f813aa7a94f7d6770481503140aae2Ed Maste if (pid == LLDB_INVALID_PROCESS_ID) 659f476592805f813aa7a94f7d6770481503140aae2Ed Maste pid = curr_pid; 660f476592805f813aa7a94f7d6770481503140aae2Ed Maste 661f476592805f813aa7a94f7d6770481503140aae2Ed Maste if (tid == LLDB_INVALID_THREAD_ID) 662f476592805f813aa7a94f7d6770481503140aae2Ed Maste tid = curr_tid; 663f476592805f813aa7a94f7d6770481503140aae2Ed Maste 664f476592805f813aa7a94f7d6770481503140aae2Ed Maste // Set the pthread name if possible 665f476592805f813aa7a94f7d6770481503140aae2Ed Maste if (pid == curr_pid && tid == curr_tid) 666f476592805f813aa7a94f7d6770481503140aae2Ed Maste { 6677526625a76ca97a2637749b0cc4068bf0bd907fbMichael Sartain ::pthread_set_name_np (::pthread_self(), name); 668f476592805f813aa7a94f7d6770481503140aae2Ed Maste return true; 669f476592805f813aa7a94f7d6770481503140aae2Ed Maste } 670f476592805f813aa7a94f7d6770481503140aae2Ed Maste return false; 671fa2cd91f47a7782b9c040058aed369e022e332d3Sylvestre Ledru#elif defined (__linux__) || defined (__GLIBC__) 672024497728739eedffc9b79c28337fba22f07f8b4Matt Kopec void *fn = dlsym (RTLD_DEFAULT, "pthread_setname_np"); 673024497728739eedffc9b79c28337fba22f07f8b4Matt Kopec if (fn) 674024497728739eedffc9b79c28337fba22f07f8b4Matt Kopec { 675024497728739eedffc9b79c28337fba22f07f8b4Matt Kopec lldb::pid_t curr_pid = Host::GetCurrentProcessID(); 676024497728739eedffc9b79c28337fba22f07f8b4Matt Kopec lldb::tid_t curr_tid = Host::GetCurrentThreadID(); 677024497728739eedffc9b79c28337fba22f07f8b4Matt Kopec if (pid == LLDB_INVALID_PROCESS_ID) 678024497728739eedffc9b79c28337fba22f07f8b4Matt Kopec pid = curr_pid; 679024497728739eedffc9b79c28337fba22f07f8b4Matt Kopec 680024497728739eedffc9b79c28337fba22f07f8b4Matt Kopec if (tid == LLDB_INVALID_THREAD_ID) 681024497728739eedffc9b79c28337fba22f07f8b4Matt Kopec tid = curr_tid; 682024497728739eedffc9b79c28337fba22f07f8b4Matt Kopec 6837526625a76ca97a2637749b0cc4068bf0bd907fbMichael Sartain if (pid == curr_pid && tid == curr_tid) 684024497728739eedffc9b79c28337fba22f07f8b4Matt Kopec { 6857526625a76ca97a2637749b0cc4068bf0bd907fbMichael Sartain int (*pthread_setname_np_func)(pthread_t thread, const char *name); 6867526625a76ca97a2637749b0cc4068bf0bd907fbMichael Sartain *reinterpret_cast<void **> (&pthread_setname_np_func) = fn; 6877526625a76ca97a2637749b0cc4068bf0bd907fbMichael Sartain 6887526625a76ca97a2637749b0cc4068bf0bd907fbMichael Sartain if (pthread_setname_np_func (::pthread_self(), name) == 0) 689024497728739eedffc9b79c28337fba22f07f8b4Matt Kopec return true; 690024497728739eedffc9b79c28337fba22f07f8b4Matt Kopec } 6917c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman } 692024497728739eedffc9b79c28337fba22f07f8b4Matt Kopec return false; 6930c2921f5b9dab2ca1832bb746ab3aa3f66fdd0b5Jim Ingham#else 6940c2921f5b9dab2ca1832bb746ab3aa3f66fdd0b5Jim Ingham return false; 6957c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman#endif 6967c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman} 6977c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman 698f476592805f813aa7a94f7d6770481503140aae2Ed Mastebool 699f476592805f813aa7a94f7d6770481503140aae2Ed MasteHost::SetShortThreadName (lldb::pid_t pid, lldb::tid_t tid, 700f476592805f813aa7a94f7d6770481503140aae2Ed Maste const char *thread_name, size_t len) 701f476592805f813aa7a94f7d6770481503140aae2Ed Maste{ 702f476592805f813aa7a94f7d6770481503140aae2Ed Maste char *namebuf = (char *)::malloc (len + 1); 703f476592805f813aa7a94f7d6770481503140aae2Ed Maste 704f476592805f813aa7a94f7d6770481503140aae2Ed Maste // Thread names are coming in like '<lldb.comm.debugger.edit>' and 705f476592805f813aa7a94f7d6770481503140aae2Ed Maste // '<lldb.comm.debugger.editline>'. So just chopping the end of the string 706f476592805f813aa7a94f7d6770481503140aae2Ed Maste // off leads to a lot of similar named threads. Go through the thread name 707f476592805f813aa7a94f7d6770481503140aae2Ed Maste // and search for the last dot and use that. 708f476592805f813aa7a94f7d6770481503140aae2Ed Maste const char *lastdot = ::strrchr (thread_name, '.'); 709f476592805f813aa7a94f7d6770481503140aae2Ed Maste 710f476592805f813aa7a94f7d6770481503140aae2Ed Maste if (lastdot && lastdot != thread_name) 711f476592805f813aa7a94f7d6770481503140aae2Ed Maste thread_name = lastdot + 1; 712f476592805f813aa7a94f7d6770481503140aae2Ed Maste ::strncpy (namebuf, thread_name, len); 713f476592805f813aa7a94f7d6770481503140aae2Ed Maste namebuf[len] = 0; 714f476592805f813aa7a94f7d6770481503140aae2Ed Maste 715f476592805f813aa7a94f7d6770481503140aae2Ed Maste int namebuflen = strlen(namebuf); 716f476592805f813aa7a94f7d6770481503140aae2Ed Maste if (namebuflen > 0) 717f476592805f813aa7a94f7d6770481503140aae2Ed Maste { 718f476592805f813aa7a94f7d6770481503140aae2Ed Maste if (namebuf[namebuflen - 1] == '(' || namebuf[namebuflen - 1] == '>') 719f476592805f813aa7a94f7d6770481503140aae2Ed Maste { 720f476592805f813aa7a94f7d6770481503140aae2Ed Maste // Trim off trailing '(' and '>' characters for a bit more cleanup. 721f476592805f813aa7a94f7d6770481503140aae2Ed Maste namebuflen--; 722f476592805f813aa7a94f7d6770481503140aae2Ed Maste namebuf[namebuflen] = 0; 723f476592805f813aa7a94f7d6770481503140aae2Ed Maste } 724f476592805f813aa7a94f7d6770481503140aae2Ed Maste return Host::SetThreadName (pid, tid, namebuf); 725f476592805f813aa7a94f7d6770481503140aae2Ed Maste } 726f476592805f813aa7a94f7d6770481503140aae2Ed Maste return false; 727f476592805f813aa7a94f7d6770481503140aae2Ed Maste} 728f476592805f813aa7a94f7d6770481503140aae2Ed Maste 7297c7c19d37de4ae8d455c18615fcce5691b236831Eli FriedmanFileSpec 7307c7c19d37de4ae8d455c18615fcce5691b236831Eli FriedmanHost::GetProgramFileSpec () 7317c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman{ 7328f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton static FileSpec g_program_filespec; 7338f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton if (!g_program_filespec) 7347c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman { 7358f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton#if defined (__APPLE__) 7368f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton char program_fullpath[PATH_MAX]; 7378f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton // If DST is NULL, then return the number of bytes needed. 7388f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton uint32_t len = sizeof(program_fullpath); 7398f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton int err = _NSGetExecutablePath (program_fullpath, &len); 7408f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton if (err == 0) 74120fbf8d0b4ad24fb11d949b96b7fc5379eafb29eGreg Clayton g_program_filespec.SetFile (program_fullpath, false); 7428f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton else if (err == -1) 7438f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton { 7448f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton char *large_program_fullpath = (char *)::malloc (len + 1); 7458f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 7468f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton err = _NSGetExecutablePath (large_program_fullpath, &len); 7478f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton if (err == 0) 74820fbf8d0b4ad24fb11d949b96b7fc5379eafb29eGreg Clayton g_program_filespec.SetFile (large_program_fullpath, false); 7498f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton 7508f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton ::free (large_program_fullpath); 7518f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton } 7528f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton#elif defined (__linux__) 7538f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton char exe_path[PATH_MAX]; 754f302a9e10a78430bbd8608dd8aca0d543db54890Stephen Wilson ssize_t len = readlink("/proc/self/exe", exe_path, sizeof(exe_path) - 1); 755f302a9e10a78430bbd8608dd8aca0d543db54890Stephen Wilson if (len > 0) { 756f302a9e10a78430bbd8608dd8aca0d543db54890Stephen Wilson exe_path[len] = 0; 75720fbf8d0b4ad24fb11d949b96b7fc5379eafb29eGreg Clayton g_program_filespec.SetFile(exe_path, false); 758f302a9e10a78430bbd8608dd8aca0d543db54890Stephen Wilson } 759fa2cd91f47a7782b9c040058aed369e022e332d3Sylvestre Ledru#elif defined (__FreeBSD__) || defined (__FreeBSD_kernel__) 7608f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton int exe_path_mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, getpid() }; 7618f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton size_t exe_path_size; 7628f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton if (sysctl(exe_path_mib, 4, NULL, &exe_path_size, NULL, 0) == 0) 7638f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton { 764366795e6d866f5698fad1d55e4357e0dafc60edcGreg Clayton char *exe_path = new char[exe_path_size]; 765366795e6d866f5698fad1d55e4357e0dafc60edcGreg Clayton if (sysctl(exe_path_mib, 4, exe_path, &exe_path_size, NULL, 0) == 0) 766366795e6d866f5698fad1d55e4357e0dafc60edcGreg Clayton g_program_filespec.SetFile(exe_path, false); 767366795e6d866f5698fad1d55e4357e0dafc60edcGreg Clayton delete[] exe_path; 7688f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton } 7698f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton#endif 7707c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman } 7718f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton return g_program_filespec; 7727c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman} 7737c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman 7747c7c19d37de4ae8d455c18615fcce5691b236831Eli FriedmanFileSpec 7757c7c19d37de4ae8d455c18615fcce5691b236831Eli FriedmanHost::GetModuleFileSpecForHostAddress (const void *host_addr) 7767c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman{ 7777c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman FileSpec module_filespec; 7787c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman Dl_info info; 7797c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman if (::dladdr (host_addr, &info)) 7807c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman { 7817c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman if (info.dli_fname) 782537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton module_filespec.SetFile(info.dli_fname, true); 7837c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman } 7847c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman return module_filespec; 7857c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman} 7867c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman 7878f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton#if !defined (__APPLE__) // see Host.mm 7889ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 7899ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonbool 7909ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonHost::GetBundleDirectory (const FileSpec &file, FileSpec &bundle) 7919ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton{ 7929ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton bundle.Clear(); 7939ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return false; 7949ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton} 7959ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 7967c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedmanbool 79724b48ff28b7c60dd4598212c3e77935a0fc1142dGreg ClaytonHost::ResolveExecutableInBundle (FileSpec &file) 7987c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman{ 79924b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton return false; 8007c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman} 8018f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton#endif 8027c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman 80314ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton// Opaque info that tracks a dynamic library that was loaded 80414ef59fe5728d862c040cf5a6b99c384229a34eeGreg Claytonstruct DynamicLibraryInfo 80514ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton{ 80614ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton DynamicLibraryInfo (const FileSpec &fs, int o, void *h) : 80714ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton file_spec (fs), 80814ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton open_options (o), 80914ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton handle (h) 81014ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton { 81114ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton } 81214ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton 81314ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton const FileSpec file_spec; 81414ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton uint32_t open_options; 81514ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton void * handle; 81614ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton}; 81714ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton 81852fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Claytonvoid * 81914ef59fe5728d862c040cf5a6b99c384229a34eeGreg ClaytonHost::DynamicLibraryOpen (const FileSpec &file_spec, uint32_t options, Error &error) 82052fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton{ 82152fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton char path[PATH_MAX]; 82252fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton if (file_spec.GetPath(path, sizeof(path))) 82352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton { 82414ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton int mode = 0; 82514ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton 82614ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton if (options & eDynamicLibraryOpenOptionLazy) 82714ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton mode |= RTLD_LAZY; 828bf467b0f74953c0bbe5a05128601f621cdf51733Greg Clayton else 829bf467b0f74953c0bbe5a05128601f621cdf51733Greg Clayton mode |= RTLD_NOW; 830bf467b0f74953c0bbe5a05128601f621cdf51733Greg Clayton 83114ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton 83214ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton if (options & eDynamicLibraryOpenOptionLocal) 83314ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton mode |= RTLD_LOCAL; 83414ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton else 83514ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton mode |= RTLD_GLOBAL; 83614ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton 83714ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton#ifdef LLDB_CONFIG_DLOPEN_RTLD_FIRST_SUPPORTED 83814ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton if (options & eDynamicLibraryOpenOptionLimitGetSymbol) 83914ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton mode |= RTLD_FIRST; 8400f577c2ab79604f7300ac66afebcaa4a4b2dceefGreg Clayton#endif 84114ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton 84214ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton void * opaque = ::dlopen (path, mode); 84314ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton 84414ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton if (opaque) 84552fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton { 84652fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton error.Clear(); 84714ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton return new DynamicLibraryInfo (file_spec, options, opaque); 84852fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton } 84952fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton else 85052fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton { 85152fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton error.SetErrorString(::dlerror()); 85252fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton } 85352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton } 85452fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton else 85552fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton { 85652fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton error.SetErrorString("failed to extract path"); 85752fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton } 85814ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton return NULL; 85952fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton} 86052fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton 86152fd984f7e67c3a0ab18d5565f40356bcfa84822Greg ClaytonError 86214ef59fe5728d862c040cf5a6b99c384229a34eeGreg ClaytonHost::DynamicLibraryClose (void *opaque) 86352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton{ 86452fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton Error error; 86514ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton if (opaque == NULL) 86652fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton { 86752fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton error.SetErrorString ("invalid dynamic library handle"); 86852fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton } 86914ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton else 87052fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton { 87114ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton DynamicLibraryInfo *dylib_info = (DynamicLibraryInfo *) opaque; 87214ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton if (::dlclose (dylib_info->handle) != 0) 87314ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton { 87414ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton error.SetErrorString(::dlerror()); 87514ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton } 87614ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton 87714ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton dylib_info->open_options = 0; 87814ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton dylib_info->handle = 0; 87914ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton delete dylib_info; 88052fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton } 88152fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton return error; 88252fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton} 88352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton 88452fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Claytonvoid * 88514ef59fe5728d862c040cf5a6b99c384229a34eeGreg ClaytonHost::DynamicLibraryGetSymbol (void *opaque, const char *symbol_name, Error &error) 88652fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton{ 88714ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton if (opaque == NULL) 88852fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton { 88952fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton error.SetErrorString ("invalid dynamic library handle"); 89052fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton } 89152fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton else 89214ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton { 89314ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton DynamicLibraryInfo *dylib_info = (DynamicLibraryInfo *) opaque; 89414ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton 89514ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton void *symbol_addr = ::dlsym (dylib_info->handle, symbol_name); 89614ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton if (symbol_addr) 89714ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton { 89814ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton#ifndef LLDB_CONFIG_DLOPEN_RTLD_FIRST_SUPPORTED 89914ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton // This host doesn't support limiting searches to this shared library 90014ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton // so we need to verify that the match came from this shared library 90114ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton // if it was requested in the Host::DynamicLibraryOpen() function. 902bf467b0f74953c0bbe5a05128601f621cdf51733Greg Clayton if (dylib_info->open_options & eDynamicLibraryOpenOptionLimitGetSymbol) 90314ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton { 90414ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton FileSpec match_dylib_spec (Host::GetModuleFileSpecForHostAddress (symbol_addr)); 90514ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton if (match_dylib_spec != dylib_info->file_spec) 90614ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton { 90714ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton char dylib_path[PATH_MAX]; 90814ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton if (dylib_info->file_spec.GetPath (dylib_path, sizeof(dylib_path))) 90914ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton error.SetErrorStringWithFormat ("symbol not found in \"%s\"", dylib_path); 91014ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton else 91114ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton error.SetErrorString ("symbol not found"); 91214ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton return NULL; 91314ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton } 91414ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton } 91514ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton#endif 91614ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton error.Clear(); 91714ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton return symbol_addr; 91814ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton } 91914ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton else 92014ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton { 92114ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton error.SetErrorString(::dlerror()); 92214ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton } 92314ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton } 92414ef59fe5728d862c040cf5a6b99c384229a34eeGreg Clayton return NULL; 92552fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton} 92624b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton 92724b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Claytonbool 92824b48ff28b7c60dd4598212c3e77935a0fc1142dGreg ClaytonHost::GetLLDBPath (PathType path_type, FileSpec &file_spec) 92924b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton{ 9305d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton // To get paths related to LLDB we get the path to the executable that 93124b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton // contains this function. On MacOSX this will be "LLDB.framework/.../LLDB", 93224b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton // on linux this is assumed to be the "lldb" main executable. If LLDB on 9330bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain // linux is actually in a shared library (liblldb.so) then this function will 93424b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton // need to be modified to "do the right thing". 93524b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton 93624b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton switch (path_type) 93724b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton { 93824b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton case ePathTypeLLDBShlibDir: 93924b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton { 94024b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton static ConstString g_lldb_so_dir; 94124b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton if (!g_lldb_so_dir) 94224b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton { 94324b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton FileSpec lldb_file_spec (Host::GetModuleFileSpecForHostAddress ((void *)Host::GetLLDBPath)); 94424b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton g_lldb_so_dir = lldb_file_spec.GetDirectory(); 94524b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton } 94624b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton file_spec.GetDirectory() = g_lldb_so_dir; 94724b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton return file_spec.GetDirectory(); 94824b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton } 94924b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton break; 95024b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton 95124b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton case ePathTypeSupportExecutableDir: 95224b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton { 95324b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton static ConstString g_lldb_support_exe_dir; 95424b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton if (!g_lldb_support_exe_dir) 95524b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton { 95624b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton FileSpec lldb_file_spec; 95724b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton if (GetLLDBPath (ePathTypeLLDBShlibDir, lldb_file_spec)) 95824b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton { 95924b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton char raw_path[PATH_MAX]; 96024b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton char resolved_path[PATH_MAX]; 96124b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton lldb_file_spec.GetPath(raw_path, sizeof(raw_path)); 96224b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton 96324b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton#if defined (__APPLE__) 96424b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton char *framework_pos = ::strstr (raw_path, "LLDB.framework"); 96524b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton if (framework_pos) 96624b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton { 96724b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton framework_pos += strlen("LLDB.framework"); 9683e4238d47a6d1a3106f357d2e7b495870721c7aeGreg Clayton#if !defined (__arm__) 96924b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton ::strncpy (framework_pos, "/Resources", PATH_MAX - (framework_pos - raw_path)); 9703e4238d47a6d1a3106f357d2e7b495870721c7aeGreg Clayton#endif 97124b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton } 97224b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton#endif 97324b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton FileSpec::Resolve (raw_path, resolved_path, sizeof(resolved_path)); 97424b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton g_lldb_support_exe_dir.SetCString(resolved_path); 97524b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton } 97624b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton } 97724b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton file_spec.GetDirectory() = g_lldb_support_exe_dir; 97824b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton return file_spec.GetDirectory(); 97924b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton } 98024b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton break; 98124b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton 98224b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton case ePathTypeHeaderDir: 98324b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton { 98424b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton static ConstString g_lldb_headers_dir; 98524b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton if (!g_lldb_headers_dir) 98624b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton { 98724b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton#if defined (__APPLE__) 98824b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton FileSpec lldb_file_spec; 98924b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton if (GetLLDBPath (ePathTypeLLDBShlibDir, lldb_file_spec)) 99024b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton { 99124b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton char raw_path[PATH_MAX]; 99224b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton char resolved_path[PATH_MAX]; 99324b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton lldb_file_spec.GetPath(raw_path, sizeof(raw_path)); 99424b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton 99524b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton char *framework_pos = ::strstr (raw_path, "LLDB.framework"); 99624b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton if (framework_pos) 99724b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton { 99824b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton framework_pos += strlen("LLDB.framework"); 99924b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton ::strncpy (framework_pos, "/Headers", PATH_MAX - (framework_pos - raw_path)); 100024b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton } 100124b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton FileSpec::Resolve (raw_path, resolved_path, sizeof(resolved_path)); 100224b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton g_lldb_headers_dir.SetCString(resolved_path); 100324b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton } 100424b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton#else 100552fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton // TODO: Anyone know how we can determine this for linux? Other systems?? 100624b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton g_lldb_headers_dir.SetCString ("/opt/local/include/lldb"); 100724b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton#endif 100824b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton } 100924b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton file_spec.GetDirectory() = g_lldb_headers_dir; 101024b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton return file_spec.GetDirectory(); 101124b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton } 101224b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton break; 101324b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton 1014ca14706d1e1c22f60b2d0793a96f3385d9d2d115Ed Maste#ifndef LLDB_DISABLE_PYTHON 101524b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton case ePathTypePythonDir: 101624b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton { 101724b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton static ConstString g_lldb_python_dir; 101824b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton if (!g_lldb_python_dir) 101924b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton { 102024b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton FileSpec lldb_file_spec; 102124b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton if (GetLLDBPath (ePathTypeLLDBShlibDir, lldb_file_spec)) 102224b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton { 102324b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton char raw_path[PATH_MAX]; 102424b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton char resolved_path[PATH_MAX]; 102524b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton lldb_file_spec.GetPath(raw_path, sizeof(raw_path)); 102624b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton 102724b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton#if defined (__APPLE__) 102824b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton char *framework_pos = ::strstr (raw_path, "LLDB.framework"); 102924b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton if (framework_pos) 103024b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton { 103124b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton framework_pos += strlen("LLDB.framework"); 103224b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton ::strncpy (framework_pos, "/Resources/Python", PATH_MAX - (framework_pos - raw_path)); 103324b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton } 1034df80272eecb8b494866980243c5cef76818b1a91Filipe Cabecinhas#else 1035a984aa968d40e16e6fe2d53bb0eb64a54964f439Daniel Malea llvm::SmallString<256> python_version_dir; 1036a984aa968d40e16e6fe2d53bb0eb64a54964f439Daniel Malea llvm::raw_svector_ostream os(python_version_dir); 1037a984aa968d40e16e6fe2d53bb0eb64a54964f439Daniel Malea os << "/python" << PY_MAJOR_VERSION << '.' << PY_MINOR_VERSION << "/site-packages"; 1038a984aa968d40e16e6fe2d53bb0eb64a54964f439Daniel Malea os.flush(); 103921e32a6354ca6a318332e5e0b32d04c984a4708aDaniel Malea 104067aa5b6d71518b3be449344e271a03a96fc6b48dFilipe Cabecinhas // We may get our string truncated. Should we protect 104167aa5b6d71518b3be449344e271a03a96fc6b48dFilipe Cabecinhas // this with an assert? 104221e32a6354ca6a318332e5e0b32d04c984a4708aDaniel Malea 1043a984aa968d40e16e6fe2d53bb0eb64a54964f439Daniel Malea ::strncat(raw_path, python_version_dir.c_str(), 104421e32a6354ca6a318332e5e0b32d04c984a4708aDaniel Malea sizeof(raw_path) - strlen(raw_path) - 1); 104521e32a6354ca6a318332e5e0b32d04c984a4708aDaniel Malea 104624b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton#endif 104724b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton FileSpec::Resolve (raw_path, resolved_path, sizeof(resolved_path)); 104824b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton g_lldb_python_dir.SetCString(resolved_path); 104924b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton } 105024b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton } 105124b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton file_spec.GetDirectory() = g_lldb_python_dir; 105224b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton return file_spec.GetDirectory(); 105324b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton } 105424b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton break; 1055ca14706d1e1c22f60b2d0793a96f3385d9d2d115Ed Maste#endif 1056ca14706d1e1c22f60b2d0793a96f3385d9d2d115Ed Maste 105752fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton case ePathTypeLLDBSystemPlugins: // System plug-ins directory 105852fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton { 10590bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain#if defined (__APPLE__) || defined(__linux__) 106052fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton static ConstString g_lldb_system_plugin_dir; 106158e26e0935138225477fd61283215ceff2068899Greg Clayton static bool g_lldb_system_plugin_dir_located = false; 106258e26e0935138225477fd61283215ceff2068899Greg Clayton if (!g_lldb_system_plugin_dir_located) 106352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton { 106458e26e0935138225477fd61283215ceff2068899Greg Clayton g_lldb_system_plugin_dir_located = true; 10650bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain#if defined (__APPLE__) 106652fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton FileSpec lldb_file_spec; 106752fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton if (GetLLDBPath (ePathTypeLLDBShlibDir, lldb_file_spec)) 106852fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton { 106952fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton char raw_path[PATH_MAX]; 107052fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton char resolved_path[PATH_MAX]; 107152fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton lldb_file_spec.GetPath(raw_path, sizeof(raw_path)); 107252fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton 107352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton char *framework_pos = ::strstr (raw_path, "LLDB.framework"); 107452fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton if (framework_pos) 107552fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton { 107652fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton framework_pos += strlen("LLDB.framework"); 107752fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton ::strncpy (framework_pos, "/Resources/PlugIns", PATH_MAX - (framework_pos - raw_path)); 107858e26e0935138225477fd61283215ceff2068899Greg Clayton FileSpec::Resolve (raw_path, resolved_path, sizeof(resolved_path)); 107958e26e0935138225477fd61283215ceff2068899Greg Clayton g_lldb_system_plugin_dir.SetCString(resolved_path); 108052fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton } 108158e26e0935138225477fd61283215ceff2068899Greg Clayton return false; 108252fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton } 10830bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain#elif defined (__linux__) 10840bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain FileSpec lldb_file_spec("/usr/lib/lldb", true); 10850bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain if (lldb_file_spec.Exists()) 10860bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain { 10870bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain g_lldb_system_plugin_dir.SetCString(lldb_file_spec.GetPath().c_str()); 10880bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain } 10890bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain#endif // __APPLE__ || __linux__ 109052fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton } 109158e26e0935138225477fd61283215ceff2068899Greg Clayton 109258e26e0935138225477fd61283215ceff2068899Greg Clayton if (g_lldb_system_plugin_dir) 109358e26e0935138225477fd61283215ceff2068899Greg Clayton { 109458e26e0935138225477fd61283215ceff2068899Greg Clayton file_spec.GetDirectory() = g_lldb_system_plugin_dir; 109558e26e0935138225477fd61283215ceff2068899Greg Clayton return true; 109658e26e0935138225477fd61283215ceff2068899Greg Clayton } 10970bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain#else 10980bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain // TODO: where would system LLDB plug-ins be located on other systems? 109952fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton return false; 11000bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain#endif 110152fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton } 110252fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton break; 110352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton 110452fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton case ePathTypeLLDBUserPlugins: // User plug-ins directory 110552fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton { 110652fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton#if defined (__APPLE__) 110752fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton static ConstString g_lldb_user_plugin_dir; 110852fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton if (!g_lldb_user_plugin_dir) 110952fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton { 111052fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton char user_plugin_path[PATH_MAX]; 111152fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton if (FileSpec::Resolve ("~/Library/Application Support/LLDB/PlugIns", 111252fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton user_plugin_path, 111352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton sizeof(user_plugin_path))) 111452fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton { 111552fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton g_lldb_user_plugin_dir.SetCString(user_plugin_path); 111652fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton } 111752fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton } 111852fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton file_spec.GetDirectory() = g_lldb_user_plugin_dir; 111952fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton return file_spec.GetDirectory(); 11200bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain#elif defined (__linux__) 11210bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain static ConstString g_lldb_user_plugin_dir; 11220bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain if (!g_lldb_user_plugin_dir) 11230bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain { 11240bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain // XDG Base Directory Specification 11250bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain // http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html 11260bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain // If XDG_DATA_HOME exists, use that, otherwise use ~/.local/share/lldb. 11270bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain FileSpec lldb_file_spec; 11280bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain const char *xdg_data_home = getenv("XDG_DATA_HOME"); 11290bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain if (xdg_data_home && xdg_data_home[0]) 11300bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain { 11310bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain std::string user_plugin_dir (xdg_data_home); 11320bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain user_plugin_dir += "/lldb"; 11330bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain lldb_file_spec.SetFile (user_plugin_dir.c_str(), true); 11340bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain } 11350bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain else 11360bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain { 11370bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain const char *home_dir = getenv("HOME"); 11380bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain if (home_dir && home_dir[0]) 11390bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain { 11400bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain std::string user_plugin_dir (home_dir); 11410bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain user_plugin_dir += "/.local/share/lldb"; 11420bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain lldb_file_spec.SetFile (user_plugin_dir.c_str(), true); 11430bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain } 11440bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain } 11450bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain 11460bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain if (lldb_file_spec.Exists()) 11470bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain g_lldb_user_plugin_dir.SetCString(lldb_file_spec.GetPath().c_str()); 11480bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain } 11490bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain file_spec.GetDirectory() = g_lldb_user_plugin_dir; 11500bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain return file_spec.GetDirectory(); 115152fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton#endif 11520bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain // TODO: where would user LLDB plug-ins be located on other systems? 115352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton return false; 115452fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton } 115524b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton } 115624b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton 115724b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton return false; 115824b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton} 115924b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton 116058e26e0935138225477fd61283215ceff2068899Greg Clayton 116158e26e0935138225477fd61283215ceff2068899Greg Claytonbool 116258e26e0935138225477fd61283215ceff2068899Greg ClaytonHost::GetHostname (std::string &s) 116358e26e0935138225477fd61283215ceff2068899Greg Clayton{ 116458e26e0935138225477fd61283215ceff2068899Greg Clayton char hostname[PATH_MAX]; 116558e26e0935138225477fd61283215ceff2068899Greg Clayton hostname[sizeof(hostname) - 1] = '\0'; 116658e26e0935138225477fd61283215ceff2068899Greg Clayton if (::gethostname (hostname, sizeof(hostname) - 1) == 0) 116758e26e0935138225477fd61283215ceff2068899Greg Clayton { 116858e26e0935138225477fd61283215ceff2068899Greg Clayton struct hostent* h = ::gethostbyname (hostname); 116958e26e0935138225477fd61283215ceff2068899Greg Clayton if (h) 117058e26e0935138225477fd61283215ceff2068899Greg Clayton s.assign (h->h_name); 117158e26e0935138225477fd61283215ceff2068899Greg Clayton else 117258e26e0935138225477fd61283215ceff2068899Greg Clayton s.assign (hostname); 117358e26e0935138225477fd61283215ceff2068899Greg Clayton return true; 117458e26e0935138225477fd61283215ceff2068899Greg Clayton } 117558e26e0935138225477fd61283215ceff2068899Greg Clayton return false; 117658e26e0935138225477fd61283215ceff2068899Greg Clayton} 117758e26e0935138225477fd61283215ceff2068899Greg Clayton 117824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonconst char * 117924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonHost::GetUserName (uint32_t uid, std::string &user_name) 118024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 118124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton struct passwd user_info; 118224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton struct passwd *user_info_ptr = &user_info; 118324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton char user_buffer[PATH_MAX]; 118424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton size_t user_buffer_size = sizeof(user_buffer); 118524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (::getpwuid_r (uid, 118624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton &user_info, 118724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton user_buffer, 118824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton user_buffer_size, 118924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton &user_info_ptr) == 0) 119024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 119124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (user_info_ptr) 119224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 119324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton user_name.assign (user_info_ptr->pw_name); 119424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return user_name.c_str(); 119524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 119624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 119724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton user_name.clear(); 119824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return NULL; 119924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 120024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 120124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Claytonconst char * 120224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonHost::GetGroupName (uint32_t gid, std::string &group_name) 120324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{ 120424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton char group_buffer[PATH_MAX]; 120524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton size_t group_buffer_size = sizeof(group_buffer); 120624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton struct group group_info; 120724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton struct group *group_info_ptr = &group_info; 120824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // Try the threadsafe version first 120924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (::getgrgid_r (gid, 121024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton &group_info, 121124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton group_buffer, 121224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton group_buffer_size, 121324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton &group_info_ptr) == 0) 121424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 121524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (group_info_ptr) 121624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 121724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton group_name.assign (group_info_ptr->gr_name); 121824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return group_name.c_str(); 121924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 122024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 122124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton else 122224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 122324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // The threadsafe version isn't currently working 122424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // for me on darwin, but the non-threadsafe version 122524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton // is, so I am calling it below. 122624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton group_info_ptr = ::getgrgid (gid); 122724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton if (group_info_ptr) 122824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton { 122924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton group_name.assign (group_info_ptr->gr_name); 123024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return group_name.c_str(); 123124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 123224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton } 123324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton group_name.clear(); 123424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton return NULL; 123524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton} 123624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton 1237fa2cd91f47a7782b9c040058aed369e022e332d3Sylvestre Ledru#if !defined (__APPLE__) && !defined (__FreeBSD__) && !defined (__FreeBSD_kernel__) // see macosx/Host.mm 123858e26e0935138225477fd61283215ceff2068899Greg Claytonbool 123958e26e0935138225477fd61283215ceff2068899Greg ClaytonHost::GetOSBuildString (std::string &s) 124058e26e0935138225477fd61283215ceff2068899Greg Clayton{ 124158e26e0935138225477fd61283215ceff2068899Greg Clayton s.clear(); 124258e26e0935138225477fd61283215ceff2068899Greg Clayton return false; 124358e26e0935138225477fd61283215ceff2068899Greg Clayton} 124458e26e0935138225477fd61283215ceff2068899Greg Clayton 124558e26e0935138225477fd61283215ceff2068899Greg Claytonbool 124658e26e0935138225477fd61283215ceff2068899Greg ClaytonHost::GetOSKernelDescription (std::string &s) 124758e26e0935138225477fd61283215ceff2068899Greg Clayton{ 124858e26e0935138225477fd61283215ceff2068899Greg Clayton s.clear(); 124958e26e0935138225477fd61283215ceff2068899Greg Clayton return false; 125058e26e0935138225477fd61283215ceff2068899Greg Clayton} 12514b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen#endif 125258e26e0935138225477fd61283215ceff2068899Greg Clayton 1253d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Onguint32_t 1254d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming OngHost::GetUserID () 1255d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong{ 1256d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong return getuid(); 1257d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong} 1258d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong 1259d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Onguint32_t 1260d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming OngHost::GetGroupID () 1261d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong{ 1262d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong return getgid(); 1263d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong} 1264d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong 1265d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Onguint32_t 1266d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming OngHost::GetEffectiveUserID () 1267d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong{ 1268d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong return geteuid(); 1269d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong} 1270d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong 1271d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Onguint32_t 1272d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming OngHost::GetEffectiveGroupID () 1273d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong{ 1274d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong return getegid(); 1275d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong} 1276d1040dd360c07305a30d33b5d4501cb9dfb03114Han Ming Ong 12779b4c5483a697a45744975c395de08b06a6c7d1d0Daniel Malea#if !defined (__APPLE__) && !defined(__linux__) 1278e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonuint32_t 1279b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonHost::FindProcesses (const ProcessInstanceInfoMatch &match_info, ProcessInstanceInfoList &process_infos) 1280e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton{ 1281e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton process_infos.Clear(); 1282e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return process_infos.GetSize(); 12837c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman} 12849b4c5483a697a45744975c395de08b06a6c7d1d0Daniel Malea#endif // #if !defined (__APPLE__) && !defined(__linux__) 12857c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman 1286fa2cd91f47a7782b9c040058aed369e022e332d3Sylvestre Ledru#if !defined (__APPLE__) && !defined (__FreeBSD__) && !defined (__FreeBSD_kernel__) && !defined(__linux__) 1287e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Claytonbool 1288b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonHost::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info) 12897c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman{ 1290e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton process_info.Clear(); 1291e4b9c1fb338ee1ada72e6a3c198afb342d68c5c1Greg Clayton return false; 12927c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman} 12934b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen#endif 12947c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman 1295c350e13fd3351613345141bee7d8b2543df54636Matt Kopec#if !defined(__linux__) 1296c350e13fd3351613345141bee7d8b2543df54636Matt Kopecbool 1297c350e13fd3351613345141bee7d8b2543df54636Matt KopecHost::FindProcessThreads (const lldb::pid_t pid, TidMap &tids_to_attach) 1298c350e13fd3351613345141bee7d8b2543df54636Matt Kopec{ 1299c350e13fd3351613345141bee7d8b2543df54636Matt Kopec return false; 1300c350e13fd3351613345141bee7d8b2543df54636Matt Kopec} 1301c350e13fd3351613345141bee7d8b2543df54636Matt Kopec#endif 1302c350e13fd3351613345141bee7d8b2543df54636Matt Kopec 1303f35a96c63732a1b3adf875ea44c7d3d7de6f8eecSean Callananlldb::TargetSP 1304f35a96c63732a1b3adf875ea44c7d3d7de6f8eecSean CallananHost::GetDummyTarget (lldb_private::Debugger &debugger) 1305f35a96c63732a1b3adf875ea44c7d3d7de6f8eecSean Callanan{ 1306f7d782b70647870cdf3c2683b3a027660a9534d5Filipe Cabecinhas static TargetSP g_dummy_target_sp; 1307f7d782b70647870cdf3c2683b3a027660a9534d5Filipe Cabecinhas 1308f7d782b70647870cdf3c2683b3a027660a9534d5Filipe Cabecinhas // FIXME: Maybe the dummy target should be per-Debugger 1309f7d782b70647870cdf3c2683b3a027660a9534d5Filipe Cabecinhas if (!g_dummy_target_sp || !g_dummy_target_sp->IsValid()) 1310f7d782b70647870cdf3c2683b3a027660a9534d5Filipe Cabecinhas { 1311f7d782b70647870cdf3c2683b3a027660a9534d5Filipe Cabecinhas ArchSpec arch(Target::GetDefaultArchitecture()); 1312f7d782b70647870cdf3c2683b3a027660a9534d5Filipe Cabecinhas if (!arch.IsValid()) 1313f7d782b70647870cdf3c2683b3a027660a9534d5Filipe Cabecinhas arch = Host::GetArchitecture (); 1314f7d782b70647870cdf3c2683b3a027660a9534d5Filipe Cabecinhas Error err = debugger.GetTargetList().CreateTarget(debugger, 1315ed0a0fbd021e44727469d6fa20cc337c58bd04c3Greg Clayton NULL, 1316f7d782b70647870cdf3c2683b3a027660a9534d5Filipe Cabecinhas arch.GetTriple().getTriple().c_str(), 1317f7d782b70647870cdf3c2683b3a027660a9534d5Filipe Cabecinhas false, 1318f7d782b70647870cdf3c2683b3a027660a9534d5Filipe Cabecinhas NULL, 1319f7d782b70647870cdf3c2683b3a027660a9534d5Filipe Cabecinhas g_dummy_target_sp); 1320f7d782b70647870cdf3c2683b3a027660a9534d5Filipe Cabecinhas } 1321f7d782b70647870cdf3c2683b3a027660a9534d5Filipe Cabecinhas 1322f7d782b70647870cdf3c2683b3a027660a9534d5Filipe Cabecinhas return g_dummy_target_sp; 1323f35a96c63732a1b3adf875ea44c7d3d7de6f8eecSean Callanan} 1324f35a96c63732a1b3adf875ea44c7d3d7de6f8eecSean Callanan 132597471184b8823c949bc68bbf54ea3edf3845a750Greg Claytonstruct ShellInfo 132697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton{ 132797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton ShellInfo () : 132897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton process_reaped (false), 132997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton can_delete (false), 133097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton pid (LLDB_INVALID_PROCESS_ID), 133197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton signo(-1), 133297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton status(-1) 133397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton { 133497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton } 133597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton 133697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton lldb_private::Predicate<bool> process_reaped; 133797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton lldb_private::Predicate<bool> can_delete; 133897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton lldb::pid_t pid; 133997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton int signo; 134097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton int status; 134197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton}; 134297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton 134397471184b8823c949bc68bbf54ea3edf3845a750Greg Claytonstatic bool 134497471184b8823c949bc68bbf54ea3edf3845a750Greg ClaytonMonitorShellCommand (void *callback_baton, 134597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton lldb::pid_t pid, 134697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton bool exited, // True if the process did exit 134797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton int signo, // Zero for no signal 134897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton int status) // Exit value of process if signal is zero 134997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton{ 135097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton ShellInfo *shell_info = (ShellInfo *)callback_baton; 135197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton shell_info->pid = pid; 135297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton shell_info->signo = signo; 135397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton shell_info->status = status; 135497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // Let the thread running Host::RunShellCommand() know that the process 135597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // exited and that ShellInfo has been filled in by broadcasting to it 135697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton shell_info->process_reaped.SetValue(1, eBroadcastAlways); 135797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // Now wait for a handshake back from that thread running Host::RunShellCommand 135897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // so we know that we can delete shell_info_ptr 135997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton shell_info->can_delete.WaitForValueEqualTo(true); 136097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // Sleep a bit to allow the shell_info->can_delete.SetValue() to complete... 136197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton usleep(1000); 136297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // Now delete the shell info that was passed into this function 136397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton delete shell_info; 136497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton return true; 136597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton} 136697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton 136797471184b8823c949bc68bbf54ea3edf3845a750Greg ClaytonError 136897471184b8823c949bc68bbf54ea3edf3845a750Greg ClaytonHost::RunShellCommand (const char *command, 136997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton const char *working_dir, 137097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton int *status_ptr, 137197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton int *signo_ptr, 137297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton std::string *command_output_ptr, 1373b924eb6c5250a9909dc55ac736d231f7ccae423bGreg Clayton uint32_t timeout_sec, 1374b924eb6c5250a9909dc55ac736d231f7ccae423bGreg Clayton const char *shell) 137597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton{ 137697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton Error error; 137797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton ProcessLaunchInfo launch_info; 1378b924eb6c5250a9909dc55ac736d231f7ccae423bGreg Clayton if (shell && shell[0]) 1379b924eb6c5250a9909dc55ac736d231f7ccae423bGreg Clayton { 1380b924eb6c5250a9909dc55ac736d231f7ccae423bGreg Clayton // Run the command in a shell 1381b924eb6c5250a9909dc55ac736d231f7ccae423bGreg Clayton launch_info.SetShell(shell); 1382b924eb6c5250a9909dc55ac736d231f7ccae423bGreg Clayton launch_info.GetArguments().AppendArgument(command); 1383b924eb6c5250a9909dc55ac736d231f7ccae423bGreg Clayton const bool localhost = true; 1384b924eb6c5250a9909dc55ac736d231f7ccae423bGreg Clayton const bool will_debug = false; 1385b924eb6c5250a9909dc55ac736d231f7ccae423bGreg Clayton const bool first_arg_is_full_shell_command = true; 1386b924eb6c5250a9909dc55ac736d231f7ccae423bGreg Clayton launch_info.ConvertArgumentsForLaunchingInShell (error, 1387b924eb6c5250a9909dc55ac736d231f7ccae423bGreg Clayton localhost, 1388b924eb6c5250a9909dc55ac736d231f7ccae423bGreg Clayton will_debug, 1389b924eb6c5250a9909dc55ac736d231f7ccae423bGreg Clayton first_arg_is_full_shell_command); 1390b924eb6c5250a9909dc55ac736d231f7ccae423bGreg Clayton } 1391b924eb6c5250a9909dc55ac736d231f7ccae423bGreg Clayton else 1392b924eb6c5250a9909dc55ac736d231f7ccae423bGreg Clayton { 1393b924eb6c5250a9909dc55ac736d231f7ccae423bGreg Clayton // No shell, just run it 1394b924eb6c5250a9909dc55ac736d231f7ccae423bGreg Clayton Args args (command); 1395b924eb6c5250a9909dc55ac736d231f7ccae423bGreg Clayton const bool first_arg_is_executable = true; 13960c8446cc220c429fb51f8f9864275c8b1c768533Greg Clayton launch_info.SetArguments(args, first_arg_is_executable); 1397b924eb6c5250a9909dc55ac736d231f7ccae423bGreg Clayton } 139897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton 139997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton if (working_dir) 140097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton launch_info.SetWorkingDirectory(working_dir); 140197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton char output_file_path_buffer[L_tmpnam]; 140297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton const char *output_file_path = NULL; 140397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton if (command_output_ptr) 140497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton { 140597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // Create a temporary file to get the stdout/stderr and redirect the 140697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // output of the command into this file. We will later read this file 140797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // if all goes well and fill the data into "command_output_ptr" 140897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton output_file_path = ::tmpnam(output_file_path_buffer); 140997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton launch_info.AppendSuppressFileAction (STDIN_FILENO, true, false); 141097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton launch_info.AppendOpenFileAction(STDOUT_FILENO, output_file_path, false, true); 1411b924eb6c5250a9909dc55ac736d231f7ccae423bGreg Clayton launch_info.AppendDuplicateFileAction(STDOUT_FILENO, STDERR_FILENO); 141297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton } 141397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton else 141497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton { 141597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton launch_info.AppendSuppressFileAction (STDIN_FILENO, true, false); 141697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton launch_info.AppendSuppressFileAction (STDOUT_FILENO, false, true); 141797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton launch_info.AppendSuppressFileAction (STDERR_FILENO, false, true); 141897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton } 141997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton 142097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // The process monitor callback will delete the 'shell_info_ptr' below... 1421102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton std::unique_ptr<ShellInfo> shell_info_ap (new ShellInfo()); 142297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton 142397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton const bool monitor_signals = false; 142497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton launch_info.SetMonitorProcessCallback(MonitorShellCommand, shell_info_ap.get(), monitor_signals); 142597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton 142697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton error = LaunchProcess (launch_info); 142797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton const lldb::pid_t pid = launch_info.GetProcessID(); 142897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton if (pid != LLDB_INVALID_PROCESS_ID) 142997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton { 143097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // The process successfully launched, so we can defer ownership of 143197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // "shell_info" to the MonitorShellCommand callback function that will 143281a96aa6242f7b559770f5dc62316253cb8cb0d4Greg Clayton // get called when the process dies. We release the unique pointer as it 143397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // doesn't need to delete the ShellInfo anymore. 143497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton ShellInfo *shell_info = shell_info_ap.release(); 143597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton TimeValue timeout_time(TimeValue::Now()); 143697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton timeout_time.OffsetWithSeconds(timeout_sec); 143797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton bool timed_out = false; 143897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton shell_info->process_reaped.WaitForValueEqualTo(true, &timeout_time, &timed_out); 143997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton if (timed_out) 144097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton { 144197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton error.SetErrorString("timed out waiting for shell command to complete"); 144297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton 144397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // Kill the process since it didn't complete withint the timeout specified 144497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton ::kill (pid, SIGKILL); 144597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // Wait for the monitor callback to get the message 144697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton timeout_time = TimeValue::Now(); 144797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton timeout_time.OffsetWithSeconds(1); 144897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton timed_out = false; 144997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton shell_info->process_reaped.WaitForValueEqualTo(true, &timeout_time, &timed_out); 145097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton } 145197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton else 145297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton { 145397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton if (status_ptr) 145497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton *status_ptr = shell_info->status; 145597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton 145697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton if (signo_ptr) 145797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton *signo_ptr = shell_info->signo; 145897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton 145997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton if (command_output_ptr) 146097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton { 146197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton command_output_ptr->clear(); 146297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton FileSpec file_spec(output_file_path, File::eOpenOptionRead); 146397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton uint64_t file_size = file_spec.GetByteSize(); 146497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton if (file_size > 0) 146597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton { 146697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton if (file_size > command_output_ptr->max_size()) 146797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton { 146897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton error.SetErrorStringWithFormat("shell command output is too large to fit into a std::string"); 146997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton } 147097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton else 147197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton { 147297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton command_output_ptr->resize(file_size); 147397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton file_spec.ReadFileContents(0, &((*command_output_ptr)[0]), command_output_ptr->size(), &error); 147497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton } 147597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton } 147697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton } 147797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton } 147897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton shell_info->can_delete.SetValue(true, eBroadcastAlways); 147997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton } 148097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton else 148197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton { 148297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton error.SetErrorString("failed to get process ID"); 148397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton } 148497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton 148597471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton if (output_file_path) 148697471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton ::unlink (output_file_path); 148797471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // Handshake with the monitor thread, or just let it know in advance that 148897471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // it can delete "shell_info" in case we timed out and were not able to kill 148997471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton // the process... 149097471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton return error; 149197471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton} 149297471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton 149397471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton 1494132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Claytonuint32_t 1495132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg ClaytonHost::GetNumberCPUS () 1496132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton{ 1497132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton static uint32_t g_num_cores = UINT32_MAX; 1498132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton if (g_num_cores == UINT32_MAX) 1499132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton { 1500fa2cd91f47a7782b9c040058aed369e022e332d3Sylvestre Ledru#if defined(__APPLE__) or defined (__linux__) or defined (__FreeBSD__) or defined (__FreeBSD_kernel__) 1501132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton 1502132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton g_num_cores = ::sysconf(_SC_NPROCESSORS_ONLN); 1503132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton 1504132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton#elif defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) 1505132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton 1506132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton // Header file for this might need to be included at the top of this file 1507132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton SYSTEM_INFO system_info; 1508132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton ::GetSystemInfo (&system_info); 1509132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton g_num_cores = system_info.dwNumberOfProcessors; 1510132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton 1511132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton#else 1512132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton 1513132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton // Assume POSIX support if a host specific case has not been supplied above 1514132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton g_num_cores = 0; 1515132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton int num_cores = 0; 1516132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton size_t num_cores_len = sizeof(num_cores); 1517fa2cd91f47a7782b9c040058aed369e022e332d3Sylvestre Ledru#ifdef HW_AVAILCPU 1518132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton int mib[] = { CTL_HW, HW_AVAILCPU }; 1519fa2cd91f47a7782b9c040058aed369e022e332d3Sylvestre Ledru#else 1520fa2cd91f47a7782b9c040058aed369e022e332d3Sylvestre Ledru int mib[] = { CTL_HW, HW_NCPU }; 1521fa2cd91f47a7782b9c040058aed369e022e332d3Sylvestre Ledru#endif 1522132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton 1523132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton /* get the number of CPUs from the system */ 1524132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton if (sysctl(mib, sizeof(mib)/sizeof(int), &num_cores, &num_cores_len, NULL, 0) == 0 && (num_cores > 0)) 1525132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton { 1526132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton g_num_cores = num_cores; 1527132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton } 1528132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton else 1529132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton { 1530132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton mib[1] = HW_NCPU; 1531132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton num_cores_len = sizeof(num_cores); 1532132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton if (sysctl(mib, sizeof(mib)/sizeof(int), &num_cores, &num_cores_len, NULL, 0) == 0 && (num_cores > 0)) 1533132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton { 1534132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton if (num_cores > 0) 1535132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton g_num_cores = num_cores; 1536132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton } 1537132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton } 1538132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton#endif 1539132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton } 1540132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton return g_num_cores; 1541132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton} 1542132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton 1543132c49a1c94927a2e1da9e7b383a2512af3b75eeGreg Clayton 154497471184b8823c949bc68bbf54ea3edf3845a750Greg Clayton 15454b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen#if !defined (__APPLE__) 15467c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedmanbool 1547b73620c1b988324095aae0510f1867cf9a402fbeGreg ClaytonHost::OpenFileInExternalEditor (const FileSpec &file_spec, uint32_t line_no) 15487c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman{ 15497c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman return false; 15507c7c19d37de4ae8d455c18615fcce5691b236831Eli Friedman} 155124b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton 1552e98ac25604b3d967158917f6fdd5289b3096fd80Greg Claytonvoid 1553e98ac25604b3d967158917f6fdd5289b3096fd80Greg ClaytonHost::SetCrashDescriptionWithFormat (const char *format, ...) 1554e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton{ 1555e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton} 1556e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton 1557e98ac25604b3d967158917f6fdd5289b3096fd80Greg Claytonvoid 1558e98ac25604b3d967158917f6fdd5289b3096fd80Greg ClaytonHost::SetCrashDescription (const char *description) 1559e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton{ 1560e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton} 156124b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton 156224b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Claytonlldb::pid_t 156324b48ff28b7c60dd4598212c3e77935a0fc1142dGreg ClaytonLaunchApplication (const FileSpec &app_file_spec) 156424b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton{ 156524b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton return LLDB_INVALID_PROCESS_ID; 156624b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton} 156724b48ff28b7c60dd4598212c3e77935a0fc1142dGreg Clayton 15688f3b21daa0d509ac49b2b82f45aaed35f6874502Greg Clayton#endif 1569