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&LTOSTOP)
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