blob: cc295b9b06316f6506ec56486dfaf422769385aa [file] [log] [blame]
Greg Clayton2bddd342010-09-07 20:11:56 +00001//===-- Host.cpp ------------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Daniel Malea93a64302012-12-05 00:20:57 +000010#include "lldb/lldb-python.h"
11
Greg Claytone3e3fee2013-02-17 20:46:30 +000012// C includes
Greg Claytone3e3fee2013-02-17 20:46:30 +000013#include <errno.h>
Greg Claytone3e3fee2013-02-17 20:46:30 +000014#include <limits.h>
Virgile Bellob2f1fb22013-08-23 12:44:05 +000015#include <sys/types.h>
16#include <unistd.h>
17#ifdef _WIN32
18#include "lldb/Host/windows/windows.h"
19#include <winsock2.h>
20#include <WS2tcpip.h>
21#else
22#include <dlfcn.h>
23#include <grp.h>
Greg Claytone3e3fee2013-02-17 20:46:30 +000024#include <netdb.h>
25#include <pwd.h>
Ed Mastef2b01622013-06-28 12:35:08 +000026#include <sys/sysctl.h>
Virgile Bellob2f1fb22013-08-23 12:44:05 +000027#endif
Greg Claytone3e3fee2013-02-17 20:46:30 +000028
29#if defined (__APPLE__)
Greg Claytone3e3fee2013-02-17 20:46:30 +000030#include <mach/mach_port.h>
Charles Davis510938e2013-08-27 05:04:57 +000031#include <mach/mach_init.h>
32#include <mach-o/dyld.h>
Ed Maste8b006c62013-06-25 18:58:11 +000033#endif
Greg Claytone3e3fee2013-02-17 20:46:30 +000034
Ed Maste8b006c62013-06-25 18:58:11 +000035#if defined (__linux__) || defined (__FreeBSD__) || defined (__FreeBSD_kernel__)
Daniel Malea4244cbd2013-08-27 20:58:59 +000036#include <spawn.h>
Greg Claytone3e3fee2013-02-17 20:46:30 +000037#include <sys/wait.h>
Michael Sartainc2052432013-08-01 18:51:08 +000038#include <sys/syscall.h>
Ed Maste8b006c62013-06-25 18:58:11 +000039#endif
Greg Claytone3e3fee2013-02-17 20:46:30 +000040
Ed Maste8b006c62013-06-25 18:58:11 +000041#if defined (__FreeBSD__)
Greg Claytone3e3fee2013-02-17 20:46:30 +000042#include <pthread_np.h>
Greg Claytone3e3fee2013-02-17 20:46:30 +000043#endif
44
Greg Clayton2bddd342010-09-07 20:11:56 +000045#include "lldb/Host/Host.h"
46#include "lldb/Core/ArchSpec.h"
47#include "lldb/Core/ConstString.h"
Sean Callananc0a6e062011-10-27 21:22:25 +000048#include "lldb/Core/Debugger.h"
Greg Clayton2bddd342010-09-07 20:11:56 +000049#include "lldb/Core/Error.h"
Greg Clayton2bddd342010-09-07 20:11:56 +000050#include "lldb/Core/Log.h"
Daniel Malea4244cbd2013-08-27 20:58:59 +000051#include "lldb/Core/Module.h"
Greg Clayton2bddd342010-09-07 20:11:56 +000052#include "lldb/Core/StreamString.h"
Jim Inghamc075ecd2012-05-04 19:24:49 +000053#include "lldb/Core/ThreadSafeSTLMap.h"
Greg Clayton45319462011-02-08 00:35:34 +000054#include "lldb/Host/Config.h"
Greg Clayton7fb56d02011-02-01 01:31:41 +000055#include "lldb/Host/Endian.h"
Greg Claytone996fd32011-03-08 22:40:15 +000056#include "lldb/Host/FileSpec.h"
Greg Clayton2bddd342010-09-07 20:11:56 +000057#include "lldb/Host/Mutex.h"
Greg Claytone996fd32011-03-08 22:40:15 +000058#include "lldb/Target/Process.h"
Sean Callananc0a6e062011-10-27 21:22:25 +000059#include "lldb/Target/TargetList.h"
Daniel Malea4244cbd2013-08-27 20:58:59 +000060#include "lldb/Utility/CleanUp.h"
Greg Clayton2bddd342010-09-07 20:11:56 +000061
Daniel Maleafa7425d2013-08-06 21:40:08 +000062#include "llvm/ADT/SmallString.h"
Stephen Wilsonbd588712011-02-24 19:15:09 +000063#include "llvm/Support/Host.h"
Daniel Maleafa7425d2013-08-06 21:40:08 +000064#include "llvm/Support/raw_ostream.h"
Stephen Wilsonbd588712011-02-24 19:15:09 +000065
Greg Clayton32e0a752011-03-30 18:16:51 +000066
Greg Clayton2bddd342010-09-07 20:11:56 +000067using namespace lldb;
68using namespace lldb_private;
69
Greg Claytone4e45922011-11-16 05:37:56 +000070
Virgile Bellob2f1fb22013-08-23 12:44:05 +000071#if !defined (__APPLE__) && !defined (_WIN32)
Greg Clayton2bddd342010-09-07 20:11:56 +000072struct MonitorInfo
73{
74 lldb::pid_t pid; // The process ID to monitor
75 Host::MonitorChildProcessCallback callback; // The callback function to call when "pid" exits or signals
76 void *callback_baton; // The callback baton for the callback function
77 bool monitor_signals; // If true, call the callback when "pid" gets signaled.
78};
79
Virgile Bellob2f1fb22013-08-23 12:44:05 +000080static thread_result_t
Greg Clayton2bddd342010-09-07 20:11:56 +000081MonitorChildProcessThreadFunction (void *arg);
82
83lldb::thread_t
84Host::StartMonitoringChildProcess
85(
86 Host::MonitorChildProcessCallback callback,
87 void *callback_baton,
88 lldb::pid_t pid,
89 bool monitor_signals
90)
91{
92 lldb::thread_t thread = LLDB_INVALID_HOST_THREAD;
Greg Claytone4e45922011-11-16 05:37:56 +000093 MonitorInfo * info_ptr = new MonitorInfo();
Daniel Malea4244cbd2013-08-27 20:58:59 +000094
Greg Claytone4e45922011-11-16 05:37:56 +000095 info_ptr->pid = pid;
96 info_ptr->callback = callback;
97 info_ptr->callback_baton = callback_baton;
98 info_ptr->monitor_signals = monitor_signals;
99
100 char thread_name[256];
Daniel Malead01b2952012-11-29 21:49:15 +0000101 ::snprintf (thread_name, sizeof(thread_name), "<lldb.host.wait4(pid=%" PRIu64 ")>", pid);
Greg Claytone4e45922011-11-16 05:37:56 +0000102 thread = ThreadCreate (thread_name,
103 MonitorChildProcessThreadFunction,
104 info_ptr,
105 NULL);
106
Greg Clayton2bddd342010-09-07 20:11:56 +0000107 return thread;
108}
109
110//------------------------------------------------------------------
111// Scoped class that will disable thread canceling when it is
112// constructed, and exception safely restore the previous value it
113// when it goes out of scope.
114//------------------------------------------------------------------
115class ScopedPThreadCancelDisabler
116{
117public:
118 ScopedPThreadCancelDisabler()
119 {
120 // Disable the ability for this thread to be cancelled
121 int err = ::pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &m_old_state);
122 if (err != 0)
123 m_old_state = -1;
124
125 }
126
127 ~ScopedPThreadCancelDisabler()
128 {
129 // Restore the ability for this thread to be cancelled to what it
130 // previously was.
131 if (m_old_state != -1)
132 ::pthread_setcancelstate (m_old_state, 0);
133 }
134private:
135 int m_old_state; // Save the old cancelability state.
136};
137
Virgile Bellob2f1fb22013-08-23 12:44:05 +0000138static thread_result_t
Greg Clayton2bddd342010-09-07 20:11:56 +0000139MonitorChildProcessThreadFunction (void *arg)
140{
Greg Clayton5160ce52013-03-27 23:08:40 +0000141 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
Greg Clayton2bddd342010-09-07 20:11:56 +0000142 const char *function = __FUNCTION__;
143 if (log)
144 log->Printf ("%s (arg = %p) thread starting...", function, arg);
145
146 MonitorInfo *info = (MonitorInfo *)arg;
147
148 const Host::MonitorChildProcessCallback callback = info->callback;
149 void * const callback_baton = info->callback_baton;
Greg Clayton2bddd342010-09-07 20:11:56 +0000150 const bool monitor_signals = info->monitor_signals;
151
Daniel Malea4244cbd2013-08-27 20:58:59 +0000152 assert (info->pid <= UINT32_MAX);
153 const ::pid_t pid = monitor_signals ? -1 * info->pid : info->pid;
154
Greg Clayton2bddd342010-09-07 20:11:56 +0000155 delete info;
156
157 int status = -1;
Sylvestre Ledru59405832013-07-01 08:21:36 +0000158#if defined (__FreeBSD__) || defined (__FreeBSD_kernel__)
Ashok Thirumurthi0f3b9b82013-05-01 20:38:19 +0000159 #define __WALL 0
160#endif
Matt Kopec650648f2013-01-08 16:30:18 +0000161 const int options = __WALL;
162
Greg Clayton2bddd342010-09-07 20:11:56 +0000163 while (1)
164 {
Caroline Tice20ad3c42010-10-29 21:48:37 +0000165 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS);
Greg Clayton2bddd342010-09-07 20:11:56 +0000166 if (log)
Daniel Malea4244cbd2013-08-27 20:58:59 +0000167 log->Printf("%s ::wait_pid (pid = %" PRIi32 ", &status, options = %i)...", function, pid, options);
Greg Clayton2bddd342010-09-07 20:11:56 +0000168
169 // Wait for all child processes
170 ::pthread_testcancel ();
Matt Kopec650648f2013-01-08 16:30:18 +0000171 // Get signals from all children with same process group of pid
Daniel Malea4244cbd2013-08-27 20:58:59 +0000172 const ::pid_t wait_pid = ::waitpid (pid, &status, options);
Greg Clayton2bddd342010-09-07 20:11:56 +0000173 ::pthread_testcancel ();
174
175 if (wait_pid == -1)
176 {
177 if (errno == EINTR)
178 continue;
179 else
Andrew Kaylor93132f52013-05-28 23:04:25 +0000180 {
181 if (log)
182 log->Printf ("%s (arg = %p) thread exiting because waitpid failed (%s)...", __FUNCTION__, arg, strerror(errno));
Greg Clayton2bddd342010-09-07 20:11:56 +0000183 break;
Andrew Kaylor93132f52013-05-28 23:04:25 +0000184 }
Greg Clayton2bddd342010-09-07 20:11:56 +0000185 }
Matt Kopec650648f2013-01-08 16:30:18 +0000186 else if (wait_pid > 0)
Greg Clayton2bddd342010-09-07 20:11:56 +0000187 {
188 bool exited = false;
189 int signal = 0;
190 int exit_status = 0;
191 const char *status_cstr = NULL;
192 if (WIFSTOPPED(status))
193 {
194 signal = WSTOPSIG(status);
195 status_cstr = "STOPPED";
196 }
197 else if (WIFEXITED(status))
198 {
199 exit_status = WEXITSTATUS(status);
200 status_cstr = "EXITED";
Andrew Kaylor93132f52013-05-28 23:04:25 +0000201 exited = true;
Greg Clayton2bddd342010-09-07 20:11:56 +0000202 }
203 else if (WIFSIGNALED(status))
204 {
205 signal = WTERMSIG(status);
206 status_cstr = "SIGNALED";
Matt Kopec650648f2013-01-08 16:30:18 +0000207 if (wait_pid == pid) {
208 exited = true;
209 exit_status = -1;
210 }
Greg Clayton2bddd342010-09-07 20:11:56 +0000211 }
212 else
213 {
Johnny Chen44805302011-07-19 19:48:13 +0000214 status_cstr = "(\?\?\?)";
Greg Clayton2bddd342010-09-07 20:11:56 +0000215 }
216
217 // Scope for pthread_cancel_disabler
218 {
219 ScopedPThreadCancelDisabler pthread_cancel_disabler;
220
Caroline Tice20ad3c42010-10-29 21:48:37 +0000221 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS);
Greg Clayton2bddd342010-09-07 20:11:56 +0000222 if (log)
Daniel Malea4244cbd2013-08-27 20:58:59 +0000223 log->Printf ("%s ::waitpid (pid = %" PRIi32 ", &status, options = %i) => pid = %" PRIi32 ", status = 0x%8.8x (%s), signal = %i, exit_state = %i",
Greg Clayton2bddd342010-09-07 20:11:56 +0000224 function,
225 wait_pid,
226 options,
Greg Clayton2bddd342010-09-07 20:11:56 +0000227 pid,
228 status,
229 status_cstr,
230 signal,
231 exit_status);
232
233 if (exited || (signal != 0 && monitor_signals))
234 {
Greg Claytone4e45922011-11-16 05:37:56 +0000235 bool callback_return = false;
236 if (callback)
Matt Kopec650648f2013-01-08 16:30:18 +0000237 callback_return = callback (callback_baton, wait_pid, exited, signal, exit_status);
Greg Clayton2bddd342010-09-07 20:11:56 +0000238
239 // If our process exited, then this thread should exit
Andrew Kaylor93132f52013-05-28 23:04:25 +0000240 if (exited && wait_pid == pid)
241 {
242 if (log)
243 log->Printf ("%s (arg = %p) thread exiting because pid received exit signal...", __FUNCTION__, arg);
Greg Clayton2bddd342010-09-07 20:11:56 +0000244 break;
Andrew Kaylor93132f52013-05-28 23:04:25 +0000245 }
Greg Clayton2bddd342010-09-07 20:11:56 +0000246 // If the callback returns true, it means this process should
247 // exit
248 if (callback_return)
Andrew Kaylor93132f52013-05-28 23:04:25 +0000249 {
250 if (log)
251 log->Printf ("%s (arg = %p) thread exiting because callback returned true...", __FUNCTION__, arg);
Greg Clayton2bddd342010-09-07 20:11:56 +0000252 break;
Andrew Kaylor93132f52013-05-28 23:04:25 +0000253 }
Greg Clayton2bddd342010-09-07 20:11:56 +0000254 }
255 }
256 }
257 }
258
Caroline Tice20ad3c42010-10-29 21:48:37 +0000259 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS);
Greg Clayton2bddd342010-09-07 20:11:56 +0000260 if (log)
261 log->Printf ("%s (arg = %p) thread exiting...", __FUNCTION__, arg);
262
263 return NULL;
264}
265
Virgile Bellob2f1fb22013-08-23 12:44:05 +0000266#endif // #if !defined (__APPLE__) && !defined (_WIN32)
267
268#if !defined (__APPLE__)
Greg Claytone38a5ed2012-01-05 03:57:59 +0000269
270void
271Host::SystemLog (SystemLogType type, const char *format, va_list args)
272{
273 vfprintf (stderr, format, args);
274}
275
Virgile Bellob2f1fb22013-08-23 12:44:05 +0000276#endif
Greg Claytone4e45922011-11-16 05:37:56 +0000277
Greg Claytone38a5ed2012-01-05 03:57:59 +0000278void
279Host::SystemLog (SystemLogType type, const char *format, ...)
280{
281 va_list args;
282 va_start (args, format);
283 SystemLog (type, format, args);
284 va_end (args);
285}
286
Greg Clayton2bddd342010-09-07 20:11:56 +0000287const ArchSpec &
Greg Clayton514487e2011-02-15 21:59:32 +0000288Host::GetArchitecture (SystemDefaultArchitecture arch_kind)
Greg Clayton2bddd342010-09-07 20:11:56 +0000289{
Greg Clayton514487e2011-02-15 21:59:32 +0000290 static bool g_supports_32 = false;
291 static bool g_supports_64 = false;
292 static ArchSpec g_host_arch_32;
293 static ArchSpec g_host_arch_64;
294
Greg Clayton2bddd342010-09-07 20:11:56 +0000295#if defined (__APPLE__)
Greg Clayton514487e2011-02-15 21:59:32 +0000296
297 // Apple is different in that it can support both 32 and 64 bit executables
298 // in the same operating system running concurrently. Here we detect the
299 // correct host architectures for both 32 and 64 bit including if 64 bit
300 // executables are supported on the system.
301
302 if (g_supports_32 == false && g_supports_64 == false)
303 {
304 // All apple systems support 32 bit execution.
305 g_supports_32 = true;
Greg Clayton2bddd342010-09-07 20:11:56 +0000306 uint32_t cputype, cpusubtype;
Greg Clayton514487e2011-02-15 21:59:32 +0000307 uint32_t is_64_bit_capable = false;
Greg Clayton2bddd342010-09-07 20:11:56 +0000308 size_t len = sizeof(cputype);
Greg Clayton514487e2011-02-15 21:59:32 +0000309 ArchSpec host_arch;
310 // These will tell us about the kernel architecture, which even on a 64
311 // bit machine can be 32 bit...
Greg Clayton2bddd342010-09-07 20:11:56 +0000312 if (::sysctlbyname("hw.cputype", &cputype, &len, NULL, 0) == 0)
313 {
Greg Clayton514487e2011-02-15 21:59:32 +0000314 len = sizeof (cpusubtype);
315 if (::sysctlbyname("hw.cpusubtype", &cpusubtype, &len, NULL, 0) != 0)
316 cpusubtype = CPU_TYPE_ANY;
317
Greg Clayton2bddd342010-09-07 20:11:56 +0000318 len = sizeof (is_64_bit_capable);
319 if (::sysctlbyname("hw.cpu64bit_capable", &is_64_bit_capable, &len, NULL, 0) == 0)
320 {
321 if (is_64_bit_capable)
Greg Clayton514487e2011-02-15 21:59:32 +0000322 g_supports_64 = true;
323 }
324
325 if (is_64_bit_capable)
326 {
Greg Clayton93d3c8332011-02-16 04:46:07 +0000327#if defined (__i386__) || defined (__x86_64__)
328 if (cpusubtype == CPU_SUBTYPE_486)
329 cpusubtype = CPU_SUBTYPE_I386_ALL;
330#endif
Greg Clayton514487e2011-02-15 21:59:32 +0000331 if (cputype & CPU_ARCH_ABI64)
Greg Clayton2bddd342010-09-07 20:11:56 +0000332 {
Greg Clayton514487e2011-02-15 21:59:32 +0000333 // We have a 64 bit kernel on a 64 bit system
Greg Claytone0d378b2011-03-24 21:19:54 +0000334 g_host_arch_32.SetArchitecture (eArchTypeMachO, ~(CPU_ARCH_MASK) & cputype, cpusubtype);
335 g_host_arch_64.SetArchitecture (eArchTypeMachO, cputype, cpusubtype);
Greg Clayton514487e2011-02-15 21:59:32 +0000336 }
337 else
338 {
339 // We have a 32 bit kernel on a 64 bit system
Greg Claytone0d378b2011-03-24 21:19:54 +0000340 g_host_arch_32.SetArchitecture (eArchTypeMachO, cputype, cpusubtype);
Greg Clayton2bddd342010-09-07 20:11:56 +0000341 cputype |= CPU_ARCH_ABI64;
Greg Claytone0d378b2011-03-24 21:19:54 +0000342 g_host_arch_64.SetArchitecture (eArchTypeMachO, cputype, cpusubtype);
Greg Clayton2bddd342010-09-07 20:11:56 +0000343 }
344 }
Greg Clayton514487e2011-02-15 21:59:32 +0000345 else
346 {
Greg Claytone0d378b2011-03-24 21:19:54 +0000347 g_host_arch_32.SetArchitecture (eArchTypeMachO, cputype, cpusubtype);
Greg Clayton514487e2011-02-15 21:59:32 +0000348 g_host_arch_64.Clear();
349 }
Greg Clayton2bddd342010-09-07 20:11:56 +0000350 }
Greg Clayton514487e2011-02-15 21:59:32 +0000351 }
352
353#else // #if defined (__APPLE__)
Stephen Wilsonbd588712011-02-24 19:15:09 +0000354
Greg Clayton514487e2011-02-15 21:59:32 +0000355 if (g_supports_32 == false && g_supports_64 == false)
356 {
Peter Collingbourne1f6198d2011-11-05 01:35:31 +0000357 llvm::Triple triple(llvm::sys::getDefaultTargetTriple());
Greg Clayton514487e2011-02-15 21:59:32 +0000358
Stephen Wilsonbd588712011-02-24 19:15:09 +0000359 g_host_arch_32.Clear();
360 g_host_arch_64.Clear();
Greg Clayton514487e2011-02-15 21:59:32 +0000361
Greg Claytonb29e6c62012-10-11 17:38:58 +0000362 // If the OS is Linux, "unknown" in the vendor slot isn't what we want
363 // for the default triple. It's probably an artifact of config.guess.
364 if (triple.getOS() == llvm::Triple::Linux && triple.getVendor() == llvm::Triple::UnknownVendor)
365 triple.setVendorName("");
366
Stephen Wilsonbd588712011-02-24 19:15:09 +0000367 switch (triple.getArch())
368 {
369 default:
370 g_host_arch_32.SetTriple(triple);
371 g_supports_32 = true;
372 break;
Greg Clayton514487e2011-02-15 21:59:32 +0000373
Stephen Wilsonbd588712011-02-24 19:15:09 +0000374 case llvm::Triple::x86_64:
Greg Clayton542e4072012-09-07 17:49:29 +0000375 g_host_arch_64.SetTriple(triple);
376 g_supports_64 = true;
377 g_host_arch_32.SetTriple(triple.get32BitArchVariant());
378 g_supports_32 = true;
379 break;
380
Stephen Wilsonbd588712011-02-24 19:15:09 +0000381 case llvm::Triple::sparcv9:
382 case llvm::Triple::ppc64:
Stephen Wilsonbd588712011-02-24 19:15:09 +0000383 g_host_arch_64.SetTriple(triple);
384 g_supports_64 = true;
385 break;
386 }
Greg Clayton4796c4f2011-02-17 02:05:38 +0000387
388 g_supports_32 = g_host_arch_32.IsValid();
389 g_supports_64 = g_host_arch_64.IsValid();
Greg Clayton2bddd342010-09-07 20:11:56 +0000390 }
Greg Clayton514487e2011-02-15 21:59:32 +0000391
392#endif // #else for #if defined (__APPLE__)
393
394 if (arch_kind == eSystemDefaultArchitecture32)
395 return g_host_arch_32;
396 else if (arch_kind == eSystemDefaultArchitecture64)
397 return g_host_arch_64;
398
399 if (g_supports_64)
400 return g_host_arch_64;
401
402 return g_host_arch_32;
Greg Clayton2bddd342010-09-07 20:11:56 +0000403}
404
405const ConstString &
406Host::GetVendorString()
407{
408 static ConstString g_vendor;
409 if (!g_vendor)
410 {
Greg Clayton950971f2012-05-12 00:01:21 +0000411 const ArchSpec &host_arch = GetArchitecture (eSystemDefaultArchitecture);
412 const llvm::StringRef &str_ref = host_arch.GetTriple().getVendorName();
413 g_vendor.SetCStringWithLength(str_ref.data(), str_ref.size());
Greg Clayton2bddd342010-09-07 20:11:56 +0000414 }
415 return g_vendor;
416}
417
418const ConstString &
419Host::GetOSString()
420{
421 static ConstString g_os_string;
422 if (!g_os_string)
423 {
Greg Clayton950971f2012-05-12 00:01:21 +0000424 const ArchSpec &host_arch = GetArchitecture (eSystemDefaultArchitecture);
425 const llvm::StringRef &str_ref = host_arch.GetTriple().getOSName();
426 g_os_string.SetCStringWithLength(str_ref.data(), str_ref.size());
Greg Clayton2bddd342010-09-07 20:11:56 +0000427 }
428 return g_os_string;
429}
430
431const ConstString &
432Host::GetTargetTriple()
433{
434 static ConstString g_host_triple;
435 if (!(g_host_triple))
436 {
Greg Clayton950971f2012-05-12 00:01:21 +0000437 const ArchSpec &host_arch = GetArchitecture (eSystemDefaultArchitecture);
438 g_host_triple.SetCString(host_arch.GetTriple().getTriple().c_str());
Greg Clayton2bddd342010-09-07 20:11:56 +0000439 }
440 return g_host_triple;
441}
442
443lldb::pid_t
444Host::GetCurrentProcessID()
445{
446 return ::getpid();
447}
448
Virgile Bellob2f1fb22013-08-23 12:44:05 +0000449#ifndef _WIN32
450
Greg Clayton2bddd342010-09-07 20:11:56 +0000451lldb::tid_t
452Host::GetCurrentThreadID()
453{
454#if defined (__APPLE__)
Greg Clayton813ddfc2012-09-18 18:19:49 +0000455 // Calling "mach_port_deallocate()" bumps the reference count on the thread
456 // port, so we need to deallocate it. mach_task_self() doesn't bump the ref
457 // count.
458 thread_port_t thread_self = mach_thread_self();
459 mach_port_deallocate(mach_task_self(), thread_self);
460 return thread_self;
Johnny Chen8f3d8382011-08-02 20:52:42 +0000461#elif defined(__FreeBSD__)
462 return lldb::tid_t(pthread_getthreadid_np());
Michael Sartainc2052432013-08-01 18:51:08 +0000463#elif defined(__linux__)
464 return lldb::tid_t(syscall(SYS_gettid));
Greg Clayton2bddd342010-09-07 20:11:56 +0000465#else
466 return lldb::tid_t(pthread_self());
467#endif
468}
469
Jim Ingham372787f2012-04-07 00:00:41 +0000470lldb::thread_t
471Host::GetCurrentThread ()
472{
473 return lldb::thread_t(pthread_self());
474}
475
Greg Clayton2bddd342010-09-07 20:11:56 +0000476const char *
477Host::GetSignalAsCString (int signo)
478{
479 switch (signo)
480 {
481 case SIGHUP: return "SIGHUP"; // 1 hangup
482 case SIGINT: return "SIGINT"; // 2 interrupt
483 case SIGQUIT: return "SIGQUIT"; // 3 quit
484 case SIGILL: return "SIGILL"; // 4 illegal instruction (not reset when caught)
485 case SIGTRAP: return "SIGTRAP"; // 5 trace trap (not reset when caught)
486 case SIGABRT: return "SIGABRT"; // 6 abort()
Greg Clayton0ddf6be2011-11-04 03:42:38 +0000487#if (defined(_POSIX_C_SOURCE) && !defined(_DARWIN_C_SOURCE))
Greg Clayton2bddd342010-09-07 20:11:56 +0000488 case SIGPOLL: return "SIGPOLL"; // 7 pollable event ([XSR] generated, not supported)
Benjamin Kramer44030f12011-11-04 16:06:40 +0000489#endif
490#if !defined(_POSIX_C_SOURCE)
Greg Clayton2bddd342010-09-07 20:11:56 +0000491 case SIGEMT: return "SIGEMT"; // 7 EMT instruction
Benjamin Kramer44030f12011-11-04 16:06:40 +0000492#endif
Greg Clayton2bddd342010-09-07 20:11:56 +0000493 case SIGFPE: return "SIGFPE"; // 8 floating point exception
494 case SIGKILL: return "SIGKILL"; // 9 kill (cannot be caught or ignored)
495 case SIGBUS: return "SIGBUS"; // 10 bus error
496 case SIGSEGV: return "SIGSEGV"; // 11 segmentation violation
497 case SIGSYS: return "SIGSYS"; // 12 bad argument to system call
498 case SIGPIPE: return "SIGPIPE"; // 13 write on a pipe with no one to read it
499 case SIGALRM: return "SIGALRM"; // 14 alarm clock
500 case SIGTERM: return "SIGTERM"; // 15 software termination signal from kill
501 case SIGURG: return "SIGURG"; // 16 urgent condition on IO channel
502 case SIGSTOP: return "SIGSTOP"; // 17 sendable stop signal not from tty
503 case SIGTSTP: return "SIGTSTP"; // 18 stop signal from tty
504 case SIGCONT: return "SIGCONT"; // 19 continue a stopped process
505 case SIGCHLD: return "SIGCHLD"; // 20 to parent on child stop or exit
506 case SIGTTIN: return "SIGTTIN"; // 21 to readers pgrp upon background tty read
507 case SIGTTOU: return "SIGTTOU"; // 22 like TTIN for output if (tp->t_local&LTOSTOP)
508#if !defined(_POSIX_C_SOURCE)
509 case SIGIO: return "SIGIO"; // 23 input/output possible signal
510#endif
511 case SIGXCPU: return "SIGXCPU"; // 24 exceeded CPU time limit
512 case SIGXFSZ: return "SIGXFSZ"; // 25 exceeded file size limit
513 case SIGVTALRM: return "SIGVTALRM"; // 26 virtual time alarm
514 case SIGPROF: return "SIGPROF"; // 27 profiling time alarm
515#if !defined(_POSIX_C_SOURCE)
516 case SIGWINCH: return "SIGWINCH"; // 28 window size changes
517 case SIGINFO: return "SIGINFO"; // 29 information request
518#endif
519 case SIGUSR1: return "SIGUSR1"; // 30 user defined signal 1
520 case SIGUSR2: return "SIGUSR2"; // 31 user defined signal 2
521 default:
522 break;
523 }
524 return NULL;
525}
526
Virgile Bellob2f1fb22013-08-23 12:44:05 +0000527#endif
528
Greg Clayton2bddd342010-09-07 20:11:56 +0000529void
530Host::WillTerminate ()
531{
532}
533
Sylvestre Ledru59405832013-07-01 08:21:36 +0000534#if !defined (__APPLE__) && !defined (__FreeBSD__) && !defined (__FreeBSD_kernel__) && !defined (__linux__) // see macosx/Host.mm
Matt Kopec62502c62013-05-13 19:33:58 +0000535
Greg Clayton2bddd342010-09-07 20:11:56 +0000536void
537Host::ThreadCreated (const char *thread_name)
538{
539}
Greg Claytone5219662010-12-03 06:02:24 +0000540
Peter Collingbourne2ced9132011-08-05 00:35:43 +0000541void
Greg Claytone5219662010-12-03 06:02:24 +0000542Host::Backtrace (Stream &strm, uint32_t max_frames)
543{
Michael Sartain3cf443d2013-07-17 00:26:30 +0000544 // TODO: Is there a way to backtrace the current process on other systems?
Greg Claytone5219662010-12-03 06:02:24 +0000545}
546
Greg Clayton85851dd2010-12-04 00:10:17 +0000547size_t
548Host::GetEnvironment (StringList &env)
549{
Michael Sartain3cf443d2013-07-17 00:26:30 +0000550 // TODO: Is there a way to the host environment for this process on other systems?
Greg Clayton85851dd2010-12-04 00:10:17 +0000551 return 0;
552}
553
Sylvestre Ledru59405832013-07-01 08:21:36 +0000554#endif // #if !defined (__APPLE__) && !defined (__FreeBSD__) && !defined (__FreeBSD_kernel__) && !defined (__linux__)
Greg Clayton2bddd342010-09-07 20:11:56 +0000555
556struct HostThreadCreateInfo
557{
558 std::string thread_name;
559 thread_func_t thread_fptr;
560 thread_arg_t thread_arg;
561
562 HostThreadCreateInfo (const char *name, thread_func_t fptr, thread_arg_t arg) :
563 thread_name (name ? name : ""),
564 thread_fptr (fptr),
565 thread_arg (arg)
566 {
567 }
568};
569
570static thread_result_t
Virgile Bellob2f1fb22013-08-23 12:44:05 +0000571#ifdef _WIN32
572__stdcall
573#endif
Greg Clayton2bddd342010-09-07 20:11:56 +0000574ThreadCreateTrampoline (thread_arg_t arg)
575{
576 HostThreadCreateInfo *info = (HostThreadCreateInfo *)arg;
577 Host::ThreadCreated (info->thread_name.c_str());
578 thread_func_t thread_fptr = info->thread_fptr;
579 thread_arg_t thread_arg = info->thread_arg;
580
Greg Clayton5160ce52013-03-27 23:08:40 +0000581 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD));
Greg Clayton2bddd342010-09-07 20:11:56 +0000582 if (log)
583 log->Printf("thread created");
584
585 delete info;
586 return thread_fptr (thread_arg);
587}
588
589lldb::thread_t
590Host::ThreadCreate
591(
592 const char *thread_name,
593 thread_func_t thread_fptr,
594 thread_arg_t thread_arg,
595 Error *error
596)
597{
598 lldb::thread_t thread = LLDB_INVALID_HOST_THREAD;
599
600 // Host::ThreadCreateTrampoline will delete this pointer for us.
601 HostThreadCreateInfo *info_ptr = new HostThreadCreateInfo (thread_name, thread_fptr, thread_arg);
602
Virgile Bellob2f1fb22013-08-23 12:44:05 +0000603#ifdef _WIN32
604 thread = ::_beginthreadex(0, 0, ThreadCreateTrampoline, info_ptr, 0, NULL);
605 int err = thread <= 0 ? GetLastError() : 0;
606#else
Greg Clayton2bddd342010-09-07 20:11:56 +0000607 int err = ::pthread_create (&thread, NULL, ThreadCreateTrampoline, info_ptr);
Virgile Bellob2f1fb22013-08-23 12:44:05 +0000608#endif
Greg Clayton2bddd342010-09-07 20:11:56 +0000609 if (err == 0)
610 {
611 if (error)
612 error->Clear();
613 return thread;
614 }
615
616 if (error)
617 error->SetError (err, eErrorTypePOSIX);
618
619 return LLDB_INVALID_HOST_THREAD;
620}
621
Virgile Bellob2f1fb22013-08-23 12:44:05 +0000622#ifndef _WIN32
623
Greg Clayton2bddd342010-09-07 20:11:56 +0000624bool
625Host::ThreadCancel (lldb::thread_t thread, Error *error)
626{
627 int err = ::pthread_cancel (thread);
628 if (error)
629 error->SetError(err, eErrorTypePOSIX);
630 return err == 0;
631}
632
633bool
634Host::ThreadDetach (lldb::thread_t thread, Error *error)
635{
636 int err = ::pthread_detach (thread);
637 if (error)
638 error->SetError(err, eErrorTypePOSIX);
639 return err == 0;
640}
641
642bool
643Host::ThreadJoin (lldb::thread_t thread, thread_result_t *thread_result_ptr, Error *error)
644{
645 int err = ::pthread_join (thread, thread_result_ptr);
646 if (error)
647 error->SetError(err, eErrorTypePOSIX);
648 return err == 0;
649}
650
Virgile Bellob2f1fb22013-08-23 12:44:05 +0000651lldb::thread_key_t
652Host::ThreadLocalStorageCreate(ThreadLocalStorageCleanupCallback callback)
653{
654 pthread_key_t key;
655 ::pthread_key_create (&key, callback);
656 return key;
657}
658
659void*
660Host::ThreadLocalStorageGet(lldb::thread_key_t key)
661{
662 return ::pthread_getspecific (key);
663}
664
665void
666Host::ThreadLocalStorageSet(lldb::thread_key_t key, void *value)
667{
668 ::pthread_setspecific (key, value);
669}
670
Matt Kopec62502c62013-05-13 19:33:58 +0000671bool
Greg Clayton2bddd342010-09-07 20:11:56 +0000672Host::SetThreadName (lldb::pid_t pid, lldb::tid_t tid, const char *name)
673{
Greg Clayton85719632013-02-27 22:51:58 +0000674#if defined(__APPLE__) && MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_5
Greg Clayton2bddd342010-09-07 20:11:56 +0000675 lldb::pid_t curr_pid = Host::GetCurrentProcessID();
676 lldb::tid_t curr_tid = Host::GetCurrentThreadID();
677 if (pid == LLDB_INVALID_PROCESS_ID)
678 pid = curr_pid;
679
680 if (tid == LLDB_INVALID_THREAD_ID)
681 tid = curr_tid;
682
Greg Clayton2bddd342010-09-07 20:11:56 +0000683 // Set the pthread name if possible
684 if (pid == curr_pid && tid == curr_tid)
685 {
Matt Kopec62502c62013-05-13 19:33:58 +0000686 if (::pthread_setname_np (name) == 0)
687 return true;
Greg Clayton2bddd342010-09-07 20:11:56 +0000688 }
Matt Kopec62502c62013-05-13 19:33:58 +0000689 return false;
Ed Maste02983be2013-07-25 19:10:32 +0000690#elif defined (__FreeBSD__)
691 lldb::pid_t curr_pid = Host::GetCurrentProcessID();
692 lldb::tid_t curr_tid = Host::GetCurrentThreadID();
693 if (pid == LLDB_INVALID_PROCESS_ID)
694 pid = curr_pid;
695
696 if (tid == LLDB_INVALID_THREAD_ID)
697 tid = curr_tid;
698
699 // Set the pthread name if possible
700 if (pid == curr_pid && tid == curr_tid)
701 {
Michael Sartainc2052432013-08-01 18:51:08 +0000702 ::pthread_set_name_np (::pthread_self(), name);
Ed Maste02983be2013-07-25 19:10:32 +0000703 return true;
704 }
705 return false;
Sylvestre Ledru59405832013-07-01 08:21:36 +0000706#elif defined (__linux__) || defined (__GLIBC__)
Matt Kopec62502c62013-05-13 19:33:58 +0000707 void *fn = dlsym (RTLD_DEFAULT, "pthread_setname_np");
708 if (fn)
709 {
Matt Kopec62502c62013-05-13 19:33:58 +0000710 lldb::pid_t curr_pid = Host::GetCurrentProcessID();
711 lldb::tid_t curr_tid = Host::GetCurrentThreadID();
Matt Kopec62502c62013-05-13 19:33:58 +0000712 if (pid == LLDB_INVALID_PROCESS_ID)
713 pid = curr_pid;
714
715 if (tid == LLDB_INVALID_THREAD_ID)
716 tid = curr_tid;
717
Michael Sartainc2052432013-08-01 18:51:08 +0000718 if (pid == curr_pid && tid == curr_tid)
Matt Kopec62502c62013-05-13 19:33:58 +0000719 {
Michael Sartainc2052432013-08-01 18:51:08 +0000720 int (*pthread_setname_np_func)(pthread_t thread, const char *name);
721 *reinterpret_cast<void **> (&pthread_setname_np_func) = fn;
722
723 if (pthread_setname_np_func (::pthread_self(), name) == 0)
Matt Kopec62502c62013-05-13 19:33:58 +0000724 return true;
725 }
726 }
727 return false;
Jim Ingham5c42d8a2013-05-15 18:27:08 +0000728#else
729 return false;
Greg Clayton2bddd342010-09-07 20:11:56 +0000730#endif
Greg Clayton2bddd342010-09-07 20:11:56 +0000731}
732
Ed Maste02983be2013-07-25 19:10:32 +0000733bool
734Host::SetShortThreadName (lldb::pid_t pid, lldb::tid_t tid,
735 const char *thread_name, size_t len)
736{
737 char *namebuf = (char *)::malloc (len + 1);
738
739 // Thread names are coming in like '<lldb.comm.debugger.edit>' and
740 // '<lldb.comm.debugger.editline>'. So just chopping the end of the string
741 // off leads to a lot of similar named threads. Go through the thread name
742 // and search for the last dot and use that.
743 const char *lastdot = ::strrchr (thread_name, '.');
744
745 if (lastdot && lastdot != thread_name)
746 thread_name = lastdot + 1;
747 ::strncpy (namebuf, thread_name, len);
748 namebuf[len] = 0;
749
750 int namebuflen = strlen(namebuf);
751 if (namebuflen > 0)
752 {
753 if (namebuf[namebuflen - 1] == '(' || namebuf[namebuflen - 1] == '>')
754 {
755 // Trim off trailing '(' and '>' characters for a bit more cleanup.
756 namebuflen--;
757 namebuf[namebuflen] = 0;
758 }
759 return Host::SetThreadName (pid, tid, namebuf);
760 }
761 return false;
762}
763
Virgile Bellob2f1fb22013-08-23 12:44:05 +0000764#endif
765
Greg Clayton2bddd342010-09-07 20:11:56 +0000766FileSpec
767Host::GetProgramFileSpec ()
768{
769 static FileSpec g_program_filespec;
770 if (!g_program_filespec)
771 {
772#if defined (__APPLE__)
773 char program_fullpath[PATH_MAX];
774 // If DST is NULL, then return the number of bytes needed.
775 uint32_t len = sizeof(program_fullpath);
776 int err = _NSGetExecutablePath (program_fullpath, &len);
777 if (err == 0)
Greg Claytonb3326392011-01-13 01:23:43 +0000778 g_program_filespec.SetFile (program_fullpath, false);
Greg Clayton2bddd342010-09-07 20:11:56 +0000779 else if (err == -1)
780 {
781 char *large_program_fullpath = (char *)::malloc (len + 1);
782
783 err = _NSGetExecutablePath (large_program_fullpath, &len);
784 if (err == 0)
Greg Claytonb3326392011-01-13 01:23:43 +0000785 g_program_filespec.SetFile (large_program_fullpath, false);
Greg Clayton2bddd342010-09-07 20:11:56 +0000786
787 ::free (large_program_fullpath);
788 }
789#elif defined (__linux__)
790 char exe_path[PATH_MAX];
Stephen Wilsone5b94a92011-01-12 04:21:21 +0000791 ssize_t len = readlink("/proc/self/exe", exe_path, sizeof(exe_path) - 1);
792 if (len > 0) {
793 exe_path[len] = 0;
Greg Claytonb3326392011-01-13 01:23:43 +0000794 g_program_filespec.SetFile(exe_path, false);
Stephen Wilsone5b94a92011-01-12 04:21:21 +0000795 }
Sylvestre Ledru59405832013-07-01 08:21:36 +0000796#elif defined (__FreeBSD__) || defined (__FreeBSD_kernel__)
Greg Clayton2bddd342010-09-07 20:11:56 +0000797 int exe_path_mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, getpid() };
798 size_t exe_path_size;
799 if (sysctl(exe_path_mib, 4, NULL, &exe_path_size, NULL, 0) == 0)
800 {
Greg Clayton87ff1ac2011-01-13 01:27:55 +0000801 char *exe_path = new char[exe_path_size];
802 if (sysctl(exe_path_mib, 4, exe_path, &exe_path_size, NULL, 0) == 0)
803 g_program_filespec.SetFile(exe_path, false);
804 delete[] exe_path;
Greg Clayton2bddd342010-09-07 20:11:56 +0000805 }
806#endif
807 }
808 return g_program_filespec;
809}
810
Greg Clayton2bddd342010-09-07 20:11:56 +0000811#if !defined (__APPLE__) // see Host.mm
Greg Claytonc859e2d2012-02-13 23:10:39 +0000812
813bool
814Host::GetBundleDirectory (const FileSpec &file, FileSpec &bundle)
815{
816 bundle.Clear();
817 return false;
818}
819
Greg Clayton2bddd342010-09-07 20:11:56 +0000820bool
Greg Claytondd36def2010-10-17 22:03:32 +0000821Host::ResolveExecutableInBundle (FileSpec &file)
Greg Clayton2bddd342010-09-07 20:11:56 +0000822{
Greg Claytondd36def2010-10-17 22:03:32 +0000823 return false;
Greg Clayton2bddd342010-09-07 20:11:56 +0000824}
825#endif
826
Virgile Bellob2f1fb22013-08-23 12:44:05 +0000827#ifndef _WIN32
828
Greg Clayton45319462011-02-08 00:35:34 +0000829// Opaque info that tracks a dynamic library that was loaded
830struct DynamicLibraryInfo
Greg Clayton4272cc72011-02-02 02:24:04 +0000831{
Greg Clayton45319462011-02-08 00:35:34 +0000832 DynamicLibraryInfo (const FileSpec &fs, int o, void *h) :
833 file_spec (fs),
834 open_options (o),
835 handle (h)
836 {
837 }
838
839 const FileSpec file_spec;
840 uint32_t open_options;
841 void * handle;
842};
843
844void *
845Host::DynamicLibraryOpen (const FileSpec &file_spec, uint32_t options, Error &error)
846{
Greg Clayton4272cc72011-02-02 02:24:04 +0000847 char path[PATH_MAX];
848 if (file_spec.GetPath(path, sizeof(path)))
849 {
Greg Clayton45319462011-02-08 00:35:34 +0000850 int mode = 0;
851
852 if (options & eDynamicLibraryOpenOptionLazy)
853 mode |= RTLD_LAZY;
Greg Claytonf9399452011-02-08 05:24:57 +0000854 else
855 mode |= RTLD_NOW;
856
Greg Clayton45319462011-02-08 00:35:34 +0000857
858 if (options & eDynamicLibraryOpenOptionLocal)
859 mode |= RTLD_LOCAL;
860 else
861 mode |= RTLD_GLOBAL;
862
863#ifdef LLDB_CONFIG_DLOPEN_RTLD_FIRST_SUPPORTED
864 if (options & eDynamicLibraryOpenOptionLimitGetSymbol)
865 mode |= RTLD_FIRST;
Greg Clayton75852f52011-02-07 17:43:47 +0000866#endif
Greg Clayton45319462011-02-08 00:35:34 +0000867
868 void * opaque = ::dlopen (path, mode);
869
870 if (opaque)
Greg Clayton4272cc72011-02-02 02:24:04 +0000871 {
872 error.Clear();
Greg Clayton45319462011-02-08 00:35:34 +0000873 return new DynamicLibraryInfo (file_spec, options, opaque);
Greg Clayton4272cc72011-02-02 02:24:04 +0000874 }
875 else
876 {
877 error.SetErrorString(::dlerror());
878 }
879 }
880 else
881 {
882 error.SetErrorString("failed to extract path");
883 }
Greg Clayton45319462011-02-08 00:35:34 +0000884 return NULL;
Greg Clayton4272cc72011-02-02 02:24:04 +0000885}
886
887Error
Greg Clayton45319462011-02-08 00:35:34 +0000888Host::DynamicLibraryClose (void *opaque)
Greg Clayton4272cc72011-02-02 02:24:04 +0000889{
890 Error error;
Greg Clayton45319462011-02-08 00:35:34 +0000891 if (opaque == NULL)
Greg Clayton4272cc72011-02-02 02:24:04 +0000892 {
893 error.SetErrorString ("invalid dynamic library handle");
894 }
Greg Clayton45319462011-02-08 00:35:34 +0000895 else
Greg Clayton4272cc72011-02-02 02:24:04 +0000896 {
Greg Clayton45319462011-02-08 00:35:34 +0000897 DynamicLibraryInfo *dylib_info = (DynamicLibraryInfo *) opaque;
898 if (::dlclose (dylib_info->handle) != 0)
899 {
900 error.SetErrorString(::dlerror());
901 }
902
903 dylib_info->open_options = 0;
904 dylib_info->handle = 0;
905 delete dylib_info;
Greg Clayton4272cc72011-02-02 02:24:04 +0000906 }
907 return error;
908}
909
910void *
Greg Clayton45319462011-02-08 00:35:34 +0000911Host::DynamicLibraryGetSymbol (void *opaque, const char *symbol_name, Error &error)
Greg Clayton4272cc72011-02-02 02:24:04 +0000912{
Greg Clayton45319462011-02-08 00:35:34 +0000913 if (opaque == NULL)
Greg Clayton4272cc72011-02-02 02:24:04 +0000914 {
915 error.SetErrorString ("invalid dynamic library handle");
Greg Clayton4272cc72011-02-02 02:24:04 +0000916 }
Greg Clayton4272cc72011-02-02 02:24:04 +0000917 else
Greg Clayton45319462011-02-08 00:35:34 +0000918 {
919 DynamicLibraryInfo *dylib_info = (DynamicLibraryInfo *) opaque;
920
921 void *symbol_addr = ::dlsym (dylib_info->handle, symbol_name);
922 if (symbol_addr)
923 {
924#ifndef LLDB_CONFIG_DLOPEN_RTLD_FIRST_SUPPORTED
925 // This host doesn't support limiting searches to this shared library
926 // so we need to verify that the match came from this shared library
927 // if it was requested in the Host::DynamicLibraryOpen() function.
Greg Claytonf9399452011-02-08 05:24:57 +0000928 if (dylib_info->open_options & eDynamicLibraryOpenOptionLimitGetSymbol)
Greg Clayton45319462011-02-08 00:35:34 +0000929 {
930 FileSpec match_dylib_spec (Host::GetModuleFileSpecForHostAddress (symbol_addr));
931 if (match_dylib_spec != dylib_info->file_spec)
932 {
933 char dylib_path[PATH_MAX];
934 if (dylib_info->file_spec.GetPath (dylib_path, sizeof(dylib_path)))
935 error.SetErrorStringWithFormat ("symbol not found in \"%s\"", dylib_path);
936 else
937 error.SetErrorString ("symbol not found");
938 return NULL;
939 }
940 }
941#endif
942 error.Clear();
943 return symbol_addr;
944 }
945 else
946 {
947 error.SetErrorString(::dlerror());
948 }
949 }
950 return NULL;
Greg Clayton4272cc72011-02-02 02:24:04 +0000951}
Greg Claytondd36def2010-10-17 22:03:32 +0000952
Virgile Bellob2f1fb22013-08-23 12:44:05 +0000953FileSpec
954Host::GetModuleFileSpecForHostAddress (const void *host_addr)
955{
956 FileSpec module_filespec;
957 Dl_info info;
958 if (::dladdr (host_addr, &info))
959 {
960 if (info.dli_fname)
961 module_filespec.SetFile(info.dli_fname, true);
962 }
963 return module_filespec;
964}
965
966#endif
967
Greg Claytondd36def2010-10-17 22:03:32 +0000968bool
969Host::GetLLDBPath (PathType path_type, FileSpec &file_spec)
970{
Greg Clayton710dd5a2011-01-08 20:28:42 +0000971 // To get paths related to LLDB we get the path to the executable that
Greg Claytondd36def2010-10-17 22:03:32 +0000972 // contains this function. On MacOSX this will be "LLDB.framework/.../LLDB",
973 // on linux this is assumed to be the "lldb" main executable. If LLDB on
Michael Sartain3cf443d2013-07-17 00:26:30 +0000974 // linux is actually in a shared library (liblldb.so) then this function will
Greg Claytondd36def2010-10-17 22:03:32 +0000975 // need to be modified to "do the right thing".
976
977 switch (path_type)
978 {
979 case ePathTypeLLDBShlibDir:
980 {
981 static ConstString g_lldb_so_dir;
982 if (!g_lldb_so_dir)
983 {
984 FileSpec lldb_file_spec (Host::GetModuleFileSpecForHostAddress ((void *)Host::GetLLDBPath));
985 g_lldb_so_dir = lldb_file_spec.GetDirectory();
986 }
987 file_spec.GetDirectory() = g_lldb_so_dir;
988 return file_spec.GetDirectory();
989 }
990 break;
991
992 case ePathTypeSupportExecutableDir:
993 {
994 static ConstString g_lldb_support_exe_dir;
995 if (!g_lldb_support_exe_dir)
996 {
997 FileSpec lldb_file_spec;
998 if (GetLLDBPath (ePathTypeLLDBShlibDir, lldb_file_spec))
999 {
1000 char raw_path[PATH_MAX];
1001 char resolved_path[PATH_MAX];
1002 lldb_file_spec.GetPath(raw_path, sizeof(raw_path));
1003
1004#if defined (__APPLE__)
1005 char *framework_pos = ::strstr (raw_path, "LLDB.framework");
1006 if (framework_pos)
1007 {
1008 framework_pos += strlen("LLDB.framework");
Greg Claytondce502e2011-11-04 03:34:56 +00001009#if !defined (__arm__)
Greg Claytondd36def2010-10-17 22:03:32 +00001010 ::strncpy (framework_pos, "/Resources", PATH_MAX - (framework_pos - raw_path));
Greg Claytondce502e2011-11-04 03:34:56 +00001011#endif
Greg Claytondd36def2010-10-17 22:03:32 +00001012 }
1013#endif
1014 FileSpec::Resolve (raw_path, resolved_path, sizeof(resolved_path));
1015 g_lldb_support_exe_dir.SetCString(resolved_path);
1016 }
1017 }
1018 file_spec.GetDirectory() = g_lldb_support_exe_dir;
1019 return file_spec.GetDirectory();
1020 }
1021 break;
1022
1023 case ePathTypeHeaderDir:
1024 {
1025 static ConstString g_lldb_headers_dir;
1026 if (!g_lldb_headers_dir)
1027 {
1028#if defined (__APPLE__)
1029 FileSpec lldb_file_spec;
1030 if (GetLLDBPath (ePathTypeLLDBShlibDir, lldb_file_spec))
1031 {
1032 char raw_path[PATH_MAX];
1033 char resolved_path[PATH_MAX];
1034 lldb_file_spec.GetPath(raw_path, sizeof(raw_path));
1035
1036 char *framework_pos = ::strstr (raw_path, "LLDB.framework");
1037 if (framework_pos)
1038 {
1039 framework_pos += strlen("LLDB.framework");
1040 ::strncpy (framework_pos, "/Headers", PATH_MAX - (framework_pos - raw_path));
1041 }
1042 FileSpec::Resolve (raw_path, resolved_path, sizeof(resolved_path));
1043 g_lldb_headers_dir.SetCString(resolved_path);
1044 }
1045#else
Greg Clayton4272cc72011-02-02 02:24:04 +00001046 // TODO: Anyone know how we can determine this for linux? Other systems??
Greg Claytondd36def2010-10-17 22:03:32 +00001047 g_lldb_headers_dir.SetCString ("/opt/local/include/lldb");
1048#endif
1049 }
1050 file_spec.GetDirectory() = g_lldb_headers_dir;
1051 return file_spec.GetDirectory();
1052 }
1053 break;
1054
Ed Mastea85d3642013-07-02 19:30:52 +00001055#ifndef LLDB_DISABLE_PYTHON
Greg Claytondd36def2010-10-17 22:03:32 +00001056 case ePathTypePythonDir:
1057 {
Greg Claytondd36def2010-10-17 22:03:32 +00001058 static ConstString g_lldb_python_dir;
1059 if (!g_lldb_python_dir)
1060 {
1061 FileSpec lldb_file_spec;
1062 if (GetLLDBPath (ePathTypeLLDBShlibDir, lldb_file_spec))
1063 {
1064 char raw_path[PATH_MAX];
1065 char resolved_path[PATH_MAX];
1066 lldb_file_spec.GetPath(raw_path, sizeof(raw_path));
1067
1068#if defined (__APPLE__)
1069 char *framework_pos = ::strstr (raw_path, "LLDB.framework");
1070 if (framework_pos)
1071 {
1072 framework_pos += strlen("LLDB.framework");
1073 ::strncpy (framework_pos, "/Resources/Python", PATH_MAX - (framework_pos - raw_path));
1074 }
Filipe Cabecinhas0b751162012-07-30 16:46:32 +00001075#else
Daniel Maleafa7425d2013-08-06 21:40:08 +00001076 llvm::SmallString<256> python_version_dir;
1077 llvm::raw_svector_ostream os(python_version_dir);
1078 os << "/python" << PY_MAJOR_VERSION << '.' << PY_MINOR_VERSION << "/site-packages";
1079 os.flush();
Daniel Malea53430eb2013-01-04 23:35:13 +00001080
Filipe Cabecinhascffbd092012-07-30 18:56:10 +00001081 // We may get our string truncated. Should we protect
1082 // this with an assert?
Daniel Malea53430eb2013-01-04 23:35:13 +00001083
Daniel Maleafa7425d2013-08-06 21:40:08 +00001084 ::strncat(raw_path, python_version_dir.c_str(),
Daniel Malea53430eb2013-01-04 23:35:13 +00001085 sizeof(raw_path) - strlen(raw_path) - 1);
1086
Greg Claytondd36def2010-10-17 22:03:32 +00001087#endif
1088 FileSpec::Resolve (raw_path, resolved_path, sizeof(resolved_path));
1089 g_lldb_python_dir.SetCString(resolved_path);
1090 }
1091 }
1092 file_spec.GetDirectory() = g_lldb_python_dir;
1093 return file_spec.GetDirectory();
1094 }
1095 break;
Ed Mastea85d3642013-07-02 19:30:52 +00001096#endif
1097
Greg Clayton4272cc72011-02-02 02:24:04 +00001098 case ePathTypeLLDBSystemPlugins: // System plug-ins directory
1099 {
Michael Sartain3cf443d2013-07-17 00:26:30 +00001100#if defined (__APPLE__) || defined(__linux__)
Greg Clayton4272cc72011-02-02 02:24:04 +00001101 static ConstString g_lldb_system_plugin_dir;
Greg Clayton1cb64962011-03-24 04:28:38 +00001102 static bool g_lldb_system_plugin_dir_located = false;
1103 if (!g_lldb_system_plugin_dir_located)
Greg Clayton4272cc72011-02-02 02:24:04 +00001104 {
Greg Clayton1cb64962011-03-24 04:28:38 +00001105 g_lldb_system_plugin_dir_located = true;
Michael Sartain3cf443d2013-07-17 00:26:30 +00001106#if defined (__APPLE__)
Greg Clayton4272cc72011-02-02 02:24:04 +00001107 FileSpec lldb_file_spec;
1108 if (GetLLDBPath (ePathTypeLLDBShlibDir, lldb_file_spec))
1109 {
1110 char raw_path[PATH_MAX];
1111 char resolved_path[PATH_MAX];
1112 lldb_file_spec.GetPath(raw_path, sizeof(raw_path));
1113
1114 char *framework_pos = ::strstr (raw_path, "LLDB.framework");
1115 if (framework_pos)
1116 {
1117 framework_pos += strlen("LLDB.framework");
1118 ::strncpy (framework_pos, "/Resources/PlugIns", PATH_MAX - (framework_pos - raw_path));
Greg Clayton1cb64962011-03-24 04:28:38 +00001119 FileSpec::Resolve (raw_path, resolved_path, sizeof(resolved_path));
1120 g_lldb_system_plugin_dir.SetCString(resolved_path);
Greg Clayton4272cc72011-02-02 02:24:04 +00001121 }
Greg Clayton1cb64962011-03-24 04:28:38 +00001122 return false;
Greg Clayton4272cc72011-02-02 02:24:04 +00001123 }
Michael Sartain3cf443d2013-07-17 00:26:30 +00001124#elif defined (__linux__)
1125 FileSpec lldb_file_spec("/usr/lib/lldb", true);
1126 if (lldb_file_spec.Exists())
1127 {
1128 g_lldb_system_plugin_dir.SetCString(lldb_file_spec.GetPath().c_str());
1129 }
1130#endif // __APPLE__ || __linux__
Greg Clayton4272cc72011-02-02 02:24:04 +00001131 }
Greg Clayton1cb64962011-03-24 04:28:38 +00001132
1133 if (g_lldb_system_plugin_dir)
1134 {
1135 file_spec.GetDirectory() = g_lldb_system_plugin_dir;
1136 return true;
1137 }
Michael Sartain3cf443d2013-07-17 00:26:30 +00001138#else
1139 // TODO: where would system LLDB plug-ins be located on other systems?
Greg Clayton4272cc72011-02-02 02:24:04 +00001140 return false;
Michael Sartain3cf443d2013-07-17 00:26:30 +00001141#endif
Greg Clayton4272cc72011-02-02 02:24:04 +00001142 }
1143 break;
1144
1145 case ePathTypeLLDBUserPlugins: // User plug-ins directory
1146 {
1147#if defined (__APPLE__)
1148 static ConstString g_lldb_user_plugin_dir;
1149 if (!g_lldb_user_plugin_dir)
1150 {
1151 char user_plugin_path[PATH_MAX];
1152 if (FileSpec::Resolve ("~/Library/Application Support/LLDB/PlugIns",
1153 user_plugin_path,
1154 sizeof(user_plugin_path)))
1155 {
1156 g_lldb_user_plugin_dir.SetCString(user_plugin_path);
1157 }
1158 }
1159 file_spec.GetDirectory() = g_lldb_user_plugin_dir;
1160 return file_spec.GetDirectory();
Michael Sartain3cf443d2013-07-17 00:26:30 +00001161#elif defined (__linux__)
1162 static ConstString g_lldb_user_plugin_dir;
1163 if (!g_lldb_user_plugin_dir)
1164 {
1165 // XDG Base Directory Specification
1166 // http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
1167 // If XDG_DATA_HOME exists, use that, otherwise use ~/.local/share/lldb.
1168 FileSpec lldb_file_spec;
1169 const char *xdg_data_home = getenv("XDG_DATA_HOME");
1170 if (xdg_data_home && xdg_data_home[0])
1171 {
1172 std::string user_plugin_dir (xdg_data_home);
1173 user_plugin_dir += "/lldb";
1174 lldb_file_spec.SetFile (user_plugin_dir.c_str(), true);
1175 }
1176 else
1177 {
1178 const char *home_dir = getenv("HOME");
1179 if (home_dir && home_dir[0])
1180 {
1181 std::string user_plugin_dir (home_dir);
1182 user_plugin_dir += "/.local/share/lldb";
1183 lldb_file_spec.SetFile (user_plugin_dir.c_str(), true);
1184 }
1185 }
1186
1187 if (lldb_file_spec.Exists())
1188 g_lldb_user_plugin_dir.SetCString(lldb_file_spec.GetPath().c_str());
1189 }
1190 file_spec.GetDirectory() = g_lldb_user_plugin_dir;
1191 return file_spec.GetDirectory();
Greg Clayton4272cc72011-02-02 02:24:04 +00001192#endif
Michael Sartain3cf443d2013-07-17 00:26:30 +00001193 // TODO: where would user LLDB plug-ins be located on other systems?
Greg Clayton4272cc72011-02-02 02:24:04 +00001194 return false;
1195 }
Greg Claytondd36def2010-10-17 22:03:32 +00001196 }
1197
1198 return false;
1199}
1200
Greg Clayton1cb64962011-03-24 04:28:38 +00001201
1202bool
1203Host::GetHostname (std::string &s)
1204{
1205 char hostname[PATH_MAX];
1206 hostname[sizeof(hostname) - 1] = '\0';
1207 if (::gethostname (hostname, sizeof(hostname) - 1) == 0)
1208 {
1209 struct hostent* h = ::gethostbyname (hostname);
1210 if (h)
1211 s.assign (h->h_name);
1212 else
1213 s.assign (hostname);
1214 return true;
1215 }
1216 return false;
1217}
1218
Virgile Bellob2f1fb22013-08-23 12:44:05 +00001219#ifndef _WIN32
1220
Greg Clayton32e0a752011-03-30 18:16:51 +00001221const char *
1222Host::GetUserName (uint32_t uid, std::string &user_name)
1223{
1224 struct passwd user_info;
1225 struct passwd *user_info_ptr = &user_info;
1226 char user_buffer[PATH_MAX];
1227 size_t user_buffer_size = sizeof(user_buffer);
1228 if (::getpwuid_r (uid,
1229 &user_info,
1230 user_buffer,
1231 user_buffer_size,
1232 &user_info_ptr) == 0)
1233 {
1234 if (user_info_ptr)
1235 {
1236 user_name.assign (user_info_ptr->pw_name);
1237 return user_name.c_str();
1238 }
1239 }
1240 user_name.clear();
1241 return NULL;
1242}
1243
1244const char *
1245Host::GetGroupName (uint32_t gid, std::string &group_name)
1246{
1247 char group_buffer[PATH_MAX];
1248 size_t group_buffer_size = sizeof(group_buffer);
1249 struct group group_info;
1250 struct group *group_info_ptr = &group_info;
1251 // Try the threadsafe version first
1252 if (::getgrgid_r (gid,
1253 &group_info,
1254 group_buffer,
1255 group_buffer_size,
1256 &group_info_ptr) == 0)
1257 {
1258 if (group_info_ptr)
1259 {
1260 group_name.assign (group_info_ptr->gr_name);
1261 return group_name.c_str();
1262 }
1263 }
1264 else
1265 {
1266 // The threadsafe version isn't currently working
1267 // for me on darwin, but the non-threadsafe version
1268 // is, so I am calling it below.
1269 group_info_ptr = ::getgrgid (gid);
1270 if (group_info_ptr)
1271 {
1272 group_name.assign (group_info_ptr->gr_name);
1273 return group_name.c_str();
1274 }
1275 }
1276 group_name.clear();
1277 return NULL;
1278}
1279
Han Ming Ong84647042012-02-25 01:07:38 +00001280uint32_t
1281Host::GetUserID ()
1282{
1283 return getuid();
1284}
1285
1286uint32_t
1287Host::GetGroupID ()
1288{
1289 return getgid();
1290}
1291
1292uint32_t
1293Host::GetEffectiveUserID ()
1294{
1295 return geteuid();
1296}
1297
1298uint32_t
1299Host::GetEffectiveGroupID ()
1300{
1301 return getegid();
1302}
1303
Virgile Bellob2f1fb22013-08-23 12:44:05 +00001304#endif
1305
1306#if !defined (__APPLE__) && !defined (__FreeBSD__) && !defined (__FreeBSD_kernel__) // see macosx/Host.mm
1307bool
1308Host::GetOSBuildString (std::string &s)
1309{
1310 s.clear();
1311 return false;
1312}
1313
1314bool
1315Host::GetOSKernelDescription (std::string &s)
1316{
1317 s.clear();
1318 return false;
1319}
1320#endif
1321
Daniel Malea25d7eb02013-05-15 17:54:07 +00001322#if !defined (__APPLE__) && !defined(__linux__)
Greg Claytone996fd32011-03-08 22:40:15 +00001323uint32_t
Greg Clayton8b82f082011-04-12 05:54:46 +00001324Host::FindProcesses (const ProcessInstanceInfoMatch &match_info, ProcessInstanceInfoList &process_infos)
Greg Claytone996fd32011-03-08 22:40:15 +00001325{
1326 process_infos.Clear();
Greg Claytone996fd32011-03-08 22:40:15 +00001327 return process_infos.GetSize();
Greg Clayton2bddd342010-09-07 20:11:56 +00001328}
Daniel Malea25d7eb02013-05-15 17:54:07 +00001329#endif // #if !defined (__APPLE__) && !defined(__linux__)
Greg Clayton2bddd342010-09-07 20:11:56 +00001330
Sylvestre Ledru59405832013-07-01 08:21:36 +00001331#if !defined (__APPLE__) && !defined (__FreeBSD__) && !defined (__FreeBSD_kernel__) && !defined(__linux__)
Greg Claytone996fd32011-03-08 22:40:15 +00001332bool
Greg Clayton8b82f082011-04-12 05:54:46 +00001333Host::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info)
Greg Clayton2bddd342010-09-07 20:11:56 +00001334{
Greg Claytone996fd32011-03-08 22:40:15 +00001335 process_info.Clear();
1336 return false;
Greg Clayton2bddd342010-09-07 20:11:56 +00001337}
Johnny Chen8f3d8382011-08-02 20:52:42 +00001338#endif
Greg Clayton2bddd342010-09-07 20:11:56 +00001339
Matt Kopec085d6ce2013-05-31 22:00:07 +00001340#if !defined(__linux__)
1341bool
1342Host::FindProcessThreads (const lldb::pid_t pid, TidMap &tids_to_attach)
1343{
1344 return false;
1345}
1346#endif
1347
Sean Callananc0a6e062011-10-27 21:22:25 +00001348lldb::TargetSP
1349Host::GetDummyTarget (lldb_private::Debugger &debugger)
1350{
Filipe Cabecinhas721ba3f2012-05-19 09:59:08 +00001351 static TargetSP g_dummy_target_sp;
Filipe Cabecinhasb0183452012-05-17 15:48:02 +00001352
Filipe Cabecinhas721ba3f2012-05-19 09:59:08 +00001353 // FIXME: Maybe the dummy target should be per-Debugger
1354 if (!g_dummy_target_sp || !g_dummy_target_sp->IsValid())
1355 {
1356 ArchSpec arch(Target::GetDefaultArchitecture());
1357 if (!arch.IsValid())
1358 arch = Host::GetArchitecture ();
1359 Error err = debugger.GetTargetList().CreateTarget(debugger,
Greg Claytona0ca6602012-10-18 16:33:33 +00001360 NULL,
Filipe Cabecinhas721ba3f2012-05-19 09:59:08 +00001361 arch.GetTriple().getTriple().c_str(),
1362 false,
1363 NULL,
1364 g_dummy_target_sp);
1365 }
Filipe Cabecinhasb0183452012-05-17 15:48:02 +00001366
Filipe Cabecinhas721ba3f2012-05-19 09:59:08 +00001367 return g_dummy_target_sp;
Sean Callananc0a6e062011-10-27 21:22:25 +00001368}
1369
Greg Claytond1cf11a2012-04-14 01:42:46 +00001370struct ShellInfo
1371{
1372 ShellInfo () :
1373 process_reaped (false),
1374 can_delete (false),
1375 pid (LLDB_INVALID_PROCESS_ID),
1376 signo(-1),
1377 status(-1)
1378 {
1379 }
1380
1381 lldb_private::Predicate<bool> process_reaped;
1382 lldb_private::Predicate<bool> can_delete;
1383 lldb::pid_t pid;
1384 int signo;
1385 int status;
1386};
1387
1388static bool
1389MonitorShellCommand (void *callback_baton,
1390 lldb::pid_t pid,
1391 bool exited, // True if the process did exit
1392 int signo, // Zero for no signal
1393 int status) // Exit value of process if signal is zero
1394{
1395 ShellInfo *shell_info = (ShellInfo *)callback_baton;
1396 shell_info->pid = pid;
1397 shell_info->signo = signo;
1398 shell_info->status = status;
1399 // Let the thread running Host::RunShellCommand() know that the process
1400 // exited and that ShellInfo has been filled in by broadcasting to it
1401 shell_info->process_reaped.SetValue(1, eBroadcastAlways);
1402 // Now wait for a handshake back from that thread running Host::RunShellCommand
1403 // so we know that we can delete shell_info_ptr
1404 shell_info->can_delete.WaitForValueEqualTo(true);
1405 // Sleep a bit to allow the shell_info->can_delete.SetValue() to complete...
1406 usleep(1000);
1407 // Now delete the shell info that was passed into this function
1408 delete shell_info;
1409 return true;
1410}
1411
1412Error
1413Host::RunShellCommand (const char *command,
1414 const char *working_dir,
1415 int *status_ptr,
1416 int *signo_ptr,
1417 std::string *command_output_ptr,
Greg Claytonc8f814d2012-09-27 03:13:55 +00001418 uint32_t timeout_sec,
1419 const char *shell)
Greg Claytond1cf11a2012-04-14 01:42:46 +00001420{
1421 Error error;
1422 ProcessLaunchInfo launch_info;
Greg Claytonc8f814d2012-09-27 03:13:55 +00001423 if (shell && shell[0])
1424 {
1425 // Run the command in a shell
1426 launch_info.SetShell(shell);
1427 launch_info.GetArguments().AppendArgument(command);
1428 const bool localhost = true;
1429 const bool will_debug = false;
1430 const bool first_arg_is_full_shell_command = true;
1431 launch_info.ConvertArgumentsForLaunchingInShell (error,
1432 localhost,
1433 will_debug,
1434 first_arg_is_full_shell_command);
1435 }
1436 else
1437 {
1438 // No shell, just run it
1439 Args args (command);
1440 const bool first_arg_is_executable = true;
Greg Clayton45392552012-10-17 22:57:12 +00001441 launch_info.SetArguments(args, first_arg_is_executable);
Greg Claytonc8f814d2012-09-27 03:13:55 +00001442 }
Greg Claytond1cf11a2012-04-14 01:42:46 +00001443
1444 if (working_dir)
1445 launch_info.SetWorkingDirectory(working_dir);
1446 char output_file_path_buffer[L_tmpnam];
1447 const char *output_file_path = NULL;
1448 if (command_output_ptr)
1449 {
1450 // Create a temporary file to get the stdout/stderr and redirect the
1451 // output of the command into this file. We will later read this file
1452 // if all goes well and fill the data into "command_output_ptr"
1453 output_file_path = ::tmpnam(output_file_path_buffer);
1454 launch_info.AppendSuppressFileAction (STDIN_FILENO, true, false);
1455 launch_info.AppendOpenFileAction(STDOUT_FILENO, output_file_path, false, true);
Greg Claytonc8f814d2012-09-27 03:13:55 +00001456 launch_info.AppendDuplicateFileAction(STDOUT_FILENO, STDERR_FILENO);
Greg Claytond1cf11a2012-04-14 01:42:46 +00001457 }
1458 else
1459 {
1460 launch_info.AppendSuppressFileAction (STDIN_FILENO, true, false);
1461 launch_info.AppendSuppressFileAction (STDOUT_FILENO, false, true);
1462 launch_info.AppendSuppressFileAction (STDERR_FILENO, false, true);
1463 }
1464
1465 // The process monitor callback will delete the 'shell_info_ptr' below...
Greg Clayton7b0992d2013-04-18 22:45:39 +00001466 std::unique_ptr<ShellInfo> shell_info_ap (new ShellInfo());
Greg Claytond1cf11a2012-04-14 01:42:46 +00001467
1468 const bool monitor_signals = false;
1469 launch_info.SetMonitorProcessCallback(MonitorShellCommand, shell_info_ap.get(), monitor_signals);
1470
1471 error = LaunchProcess (launch_info);
1472 const lldb::pid_t pid = launch_info.GetProcessID();
Daniel Maleae0f8f572013-08-26 23:57:52 +00001473
1474 if (error.Success() && pid == LLDB_INVALID_PROCESS_ID)
1475 error.SetErrorString("failed to get process ID");
1476
1477 if (error.Success())
Greg Claytond1cf11a2012-04-14 01:42:46 +00001478 {
1479 // The process successfully launched, so we can defer ownership of
1480 // "shell_info" to the MonitorShellCommand callback function that will
Greg Claytone01e07b2013-04-18 18:10:51 +00001481 // get called when the process dies. We release the unique pointer as it
Greg Claytond1cf11a2012-04-14 01:42:46 +00001482 // doesn't need to delete the ShellInfo anymore.
1483 ShellInfo *shell_info = shell_info_ap.release();
Daniel Malea4244cbd2013-08-27 20:58:59 +00001484 TimeValue *timeout_ptr = nullptr;
Greg Claytond1cf11a2012-04-14 01:42:46 +00001485 TimeValue timeout_time(TimeValue::Now());
Daniel Malea4244cbd2013-08-27 20:58:59 +00001486 if (timeout_sec > 0) {
1487 timeout_time.OffsetWithSeconds(timeout_sec);
1488 timeout_ptr = &timeout_time;
1489 }
Greg Claytond1cf11a2012-04-14 01:42:46 +00001490 bool timed_out = false;
Daniel Malea4244cbd2013-08-27 20:58:59 +00001491 shell_info->process_reaped.WaitForValueEqualTo(true, timeout_ptr, &timed_out);
Greg Claytond1cf11a2012-04-14 01:42:46 +00001492 if (timed_out)
1493 {
1494 error.SetErrorString("timed out waiting for shell command to complete");
Daniel Malea4244cbd2013-08-27 20:58:59 +00001495
Greg Claytond1cf11a2012-04-14 01:42:46 +00001496 // Kill the process since it didn't complete withint the timeout specified
Virgile Bellob2f1fb22013-08-23 12:44:05 +00001497 Kill (pid, SIGKILL);
Greg Claytond1cf11a2012-04-14 01:42:46 +00001498 // Wait for the monitor callback to get the message
1499 timeout_time = TimeValue::Now();
1500 timeout_time.OffsetWithSeconds(1);
1501 timed_out = false;
1502 shell_info->process_reaped.WaitForValueEqualTo(true, &timeout_time, &timed_out);
1503 }
1504 else
1505 {
1506 if (status_ptr)
1507 *status_ptr = shell_info->status;
1508
1509 if (signo_ptr)
1510 *signo_ptr = shell_info->signo;
1511
1512 if (command_output_ptr)
1513 {
1514 command_output_ptr->clear();
1515 FileSpec file_spec(output_file_path, File::eOpenOptionRead);
1516 uint64_t file_size = file_spec.GetByteSize();
1517 if (file_size > 0)
1518 {
1519 if (file_size > command_output_ptr->max_size())
1520 {
1521 error.SetErrorStringWithFormat("shell command output is too large to fit into a std::string");
1522 }
1523 else
1524 {
1525 command_output_ptr->resize(file_size);
1526 file_spec.ReadFileContents(0, &((*command_output_ptr)[0]), command_output_ptr->size(), &error);
1527 }
1528 }
1529 }
1530 }
1531 shell_info->can_delete.SetValue(true, eBroadcastAlways);
1532 }
Greg Claytond1cf11a2012-04-14 01:42:46 +00001533
1534 if (output_file_path)
1535 ::unlink (output_file_path);
1536 // Handshake with the monitor thread, or just let it know in advance that
1537 // it can delete "shell_info" in case we timed out and were not able to kill
1538 // the process...
1539 return error;
1540}
1541
Daniel Malea4244cbd2013-08-27 20:58:59 +00001542#if defined(__linux__) or defined(__FreeBSD__)
1543// The functions below implement process launching via posix_spawn() for Linux
1544// and FreeBSD.
1545
1546// The posix_spawn() and posix_spawnp() functions first appeared in FreeBSD 8.0,
1547static Error
1548LaunchProcessPosixSpawn (const char *exe_path, ProcessLaunchInfo &launch_info, ::pid_t &pid)
1549{
1550 Error error;
1551 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_HOST | LIBLLDB_LOG_PROCESS));
1552
1553 assert(exe_path);
1554 assert(!launch_info.GetFlags().Test (eLaunchFlagDebug));
1555
1556 posix_spawnattr_t attr;
1557
1558 error.SetError( ::posix_spawnattr_init (&attr), eErrorTypePOSIX);
1559 error.LogIfError(log, "::posix_spawnattr_init ( &attr )");
1560 if (error.Fail())
1561 return error;
1562
1563 // Make a quick class that will cleanup the posix spawn attributes in case
1564 // we return in the middle of this function.
1565 lldb_utility::CleanUp <posix_spawnattr_t *, int> posix_spawnattr_cleanup(&attr, posix_spawnattr_destroy);
1566
1567 sigset_t no_signals;
1568 sigset_t all_signals;
1569 sigemptyset (&no_signals);
1570 sigfillset (&all_signals);
1571 ::posix_spawnattr_setsigmask(&attr, &all_signals);
1572 ::posix_spawnattr_setsigdefault(&attr, &no_signals);
1573
1574 short flags = POSIX_SPAWN_SETSIGDEF | POSIX_SPAWN_SETSIGMASK;
1575
1576 error.SetError( ::posix_spawnattr_setflags (&attr, flags), eErrorTypePOSIX);
1577 error.LogIfError(log, "::posix_spawnattr_setflags ( &attr, flags=0x%8.8x )", flags);
1578 if (error.Fail())
1579 return error;
1580
1581 const size_t num_file_actions = launch_info.GetNumFileActions ();
1582 posix_spawn_file_actions_t file_actions, *file_action_ptr = NULL;
1583 // Make a quick class that will cleanup the posix spawn attributes in case
1584 // we return in the middle of this function.
1585 lldb_utility::CleanUp <posix_spawn_file_actions_t *, int>
1586 posix_spawn_file_actions_cleanup (file_action_ptr, NULL, posix_spawn_file_actions_destroy);
1587
1588 if (num_file_actions > 0)
1589 {
1590 error.SetError( ::posix_spawn_file_actions_init (&file_actions), eErrorTypePOSIX);
1591 error.LogIfError(log, "::posix_spawn_file_actions_init ( &file_actions )");
1592 if (error.Fail())
1593 return error;
1594
1595 file_action_ptr = &file_actions;
1596 posix_spawn_file_actions_cleanup.set(file_action_ptr);
1597
1598 for (size_t i = 0; i < num_file_actions; ++i)
1599 {
1600 const ProcessLaunchInfo::FileAction *launch_file_action = launch_info.GetFileActionAtIndex(i);
1601 if (launch_file_action &&
1602 !ProcessLaunchInfo::FileAction::AddPosixSpawnFileAction (&file_actions,
1603 launch_file_action,
1604 log,
1605 error))
1606 return error;
1607 }
1608 }
1609
1610 // Change working directory if neccessary.
1611 char current_dir[PATH_MAX];
1612 current_dir[0] = '\0';
1613
1614 const char *working_dir = launch_info.GetWorkingDirectory();
1615 if (working_dir != NULL)
1616 {
1617 if (::getcwd(current_dir, sizeof(current_dir)) == NULL)
1618 {
1619 error.SetError(errno, eErrorTypePOSIX);
1620 error.LogIfError(log, "unable to save the current directory");
1621 return error;
1622 }
1623
1624 if (::chdir(working_dir) == -1)
1625 {
1626 error.SetError(errno, eErrorTypePOSIX);
1627 error.LogIfError(log, "unable to change working directory to %s", working_dir);
1628 return error;
1629 }
1630 }
1631
1632 const char *tmp_argv[2];
1633 char * const *argv = (char * const*)launch_info.GetArguments().GetConstArgumentVector();
1634 char * const *envp = (char * const*)launch_info.GetEnvironmentEntries().GetConstArgumentVector();
1635
1636 // Prepare minimal argument list if we didn't get it from the launch_info structure.
1637 // We must pass argv into posix_spawnp and it must contain at least two items -
1638 // pointer to an executable and NULL.
1639 if (argv == NULL)
1640 {
1641 tmp_argv[0] = exe_path;
1642 tmp_argv[1] = NULL;
1643 argv = (char * const*)tmp_argv;
1644 }
1645
1646 error.SetError (::posix_spawnp (&pid,
1647 exe_path,
1648 (num_file_actions > 0) ? &file_actions : NULL,
1649 &attr,
1650 argv,
1651 envp),
1652 eErrorTypePOSIX);
1653
1654 error.LogIfError(log, "::posix_spawnp ( pid => %i, path = '%s', file_actions = %p, attr = %p, argv = %p, envp = %p )",
1655 pid, exe_path, file_action_ptr, &attr, argv, envp);
1656
1657 // Change back the current directory.
1658 // NOTE: do not override previously established error from posix_spawnp.
1659 if (working_dir != NULL && ::chdir(current_dir) == -1 && error.Success())
1660 {
1661 error.SetError(errno, eErrorTypePOSIX);
1662 error.LogIfError(log, "unable to change current directory back to %s",
1663 current_dir);
1664 }
1665
1666 return error;
1667}
1668
1669
1670Error
1671Host::LaunchProcess (ProcessLaunchInfo &launch_info)
1672{
1673 Error error;
1674 char exe_path[PATH_MAX];
1675
1676 PlatformSP host_platform_sp (Platform::GetDefaultPlatform ());
1677
1678 const ArchSpec &arch_spec = launch_info.GetArchitecture();
1679
1680 FileSpec exe_spec(launch_info.GetExecutableFile());
1681
1682 FileSpec::FileType file_type = exe_spec.GetFileType();
1683 if (file_type != FileSpec::eFileTypeRegular)
1684 {
1685 lldb::ModuleSP exe_module_sp;
1686 error = host_platform_sp->ResolveExecutable (exe_spec,
1687 arch_spec,
1688 exe_module_sp,
1689 NULL);
1690
1691 if (error.Fail())
1692 return error;
1693
1694 if (exe_module_sp)
1695 exe_spec = exe_module_sp->GetFileSpec();
1696 }
1697
1698 if (exe_spec.Exists())
1699 {
1700 exe_spec.GetPath (exe_path, sizeof(exe_path));
1701 }
1702 else
1703 {
1704 launch_info.GetExecutableFile().GetPath (exe_path, sizeof(exe_path));
1705 error.SetErrorStringWithFormat ("executable doesn't exist: '%s'", exe_path);
1706 return error;
1707 }
1708
1709 assert(!launch_info.GetFlags().Test (eLaunchFlagLaunchInTTY));
1710
1711 ::pid_t pid = LLDB_INVALID_PROCESS_ID;
1712
1713 error = LaunchProcessPosixSpawn(exe_path, launch_info, pid);
1714
1715 if (pid != LLDB_INVALID_PROCESS_ID)
1716 {
1717 // If all went well, then set the process ID into the launch info
1718 launch_info.SetProcessID(pid);
1719
1720 // Make sure we reap any processes we spawn or we will have zombies.
1721 if (!launch_info.MonitorProcess())
1722 {
1723 const bool monitor_signals = false;
1724 StartMonitoringChildProcess (Process::SetProcessExitStatus,
1725 NULL,
1726 pid,
1727 monitor_signals);
1728 }
1729 }
1730 else
1731 {
1732 // Invalid process ID, something didn't go well
1733 if (error.Success())
1734 error.SetErrorString ("process launch failed for unknown reasons");
1735 }
1736 return error;
1737}
1738
1739#endif // defined(__linux__) or defined(__FreeBSD__)
1740
Virgile Bellob2f1fb22013-08-23 12:44:05 +00001741#ifndef _WIN32
1742
1743size_t
1744Host::GetPageSize()
1745{
1746 return ::getpagesize();
1747}
Greg Claytond1cf11a2012-04-14 01:42:46 +00001748
Greg Claytone3e3fee2013-02-17 20:46:30 +00001749uint32_t
1750Host::GetNumberCPUS ()
1751{
1752 static uint32_t g_num_cores = UINT32_MAX;
1753 if (g_num_cores == UINT32_MAX)
1754 {
Sylvestre Ledru59405832013-07-01 08:21:36 +00001755#if defined(__APPLE__) or defined (__linux__) or defined (__FreeBSD__) or defined (__FreeBSD_kernel__)
Greg Claytone3e3fee2013-02-17 20:46:30 +00001756
1757 g_num_cores = ::sysconf(_SC_NPROCESSORS_ONLN);
Virgile Bellob2f1fb22013-08-23 12:44:05 +00001758
Greg Claytone3e3fee2013-02-17 20:46:30 +00001759#else
1760
1761 // Assume POSIX support if a host specific case has not been supplied above
1762 g_num_cores = 0;
1763 int num_cores = 0;
1764 size_t num_cores_len = sizeof(num_cores);
Sylvestre Ledru59405832013-07-01 08:21:36 +00001765#ifdef HW_AVAILCPU
Greg Claytone3e3fee2013-02-17 20:46:30 +00001766 int mib[] = { CTL_HW, HW_AVAILCPU };
Sylvestre Ledru59405832013-07-01 08:21:36 +00001767#else
1768 int mib[] = { CTL_HW, HW_NCPU };
1769#endif
Greg Claytone3e3fee2013-02-17 20:46:30 +00001770
1771 /* get the number of CPUs from the system */
1772 if (sysctl(mib, sizeof(mib)/sizeof(int), &num_cores, &num_cores_len, NULL, 0) == 0 && (num_cores > 0))
1773 {
1774 g_num_cores = num_cores;
1775 }
1776 else
1777 {
1778 mib[1] = HW_NCPU;
1779 num_cores_len = sizeof(num_cores);
1780 if (sysctl(mib, sizeof(mib)/sizeof(int), &num_cores, &num_cores_len, NULL, 0) == 0 && (num_cores > 0))
1781 {
1782 if (num_cores > 0)
1783 g_num_cores = num_cores;
1784 }
1785 }
1786#endif
1787 }
1788 return g_num_cores;
1789}
1790
Virgile Bellob2f1fb22013-08-23 12:44:05 +00001791void
1792Host::Kill(lldb::pid_t pid, int signo)
1793{
1794 ::kill(pid, signo);
1795}
Greg Claytone3e3fee2013-02-17 20:46:30 +00001796
Virgile Bellob2f1fb22013-08-23 12:44:05 +00001797#endif
Greg Claytond1cf11a2012-04-14 01:42:46 +00001798
Johnny Chen8f3d8382011-08-02 20:52:42 +00001799#if !defined (__APPLE__)
Greg Clayton2bddd342010-09-07 20:11:56 +00001800bool
Greg Clayton3b147632010-12-18 01:54:34 +00001801Host::OpenFileInExternalEditor (const FileSpec &file_spec, uint32_t line_no)
Greg Clayton2bddd342010-09-07 20:11:56 +00001802{
1803 return false;
1804}
Greg Claytondd36def2010-10-17 22:03:32 +00001805
Greg Clayton2d95dc9b2010-11-10 04:57:04 +00001806void
1807Host::SetCrashDescriptionWithFormat (const char *format, ...)
1808{
1809}
1810
1811void
1812Host::SetCrashDescription (const char *description)
1813{
1814}
Greg Claytondd36def2010-10-17 22:03:32 +00001815
1816lldb::pid_t
Daniel Maleae0f8f572013-08-26 23:57:52 +00001817Host::LaunchApplication (const FileSpec &app_file_spec)
Greg Claytondd36def2010-10-17 22:03:32 +00001818{
1819 return LLDB_INVALID_PROCESS_ID;
1820}
1821
Daniel Maleae0f8f572013-08-26 23:57:52 +00001822uint32_t
1823Host::MakeDirectory (const char* path, mode_t mode)
1824{
1825 return UINT32_MAX;
1826}
Greg Clayton2bddd342010-09-07 20:11:56 +00001827#endif
Daniel Maleae0f8f572013-08-26 23:57:52 +00001828
1829typedef std::map<lldb::user_id_t, lldb::FileSP> FDToFileMap;
1830FDToFileMap& GetFDToFileMap()
1831{
1832 static FDToFileMap g_fd2filemap;
1833 return g_fd2filemap;
1834}
1835
1836lldb::user_id_t
1837Host::OpenFile (const FileSpec& file_spec,
1838 uint32_t flags,
1839 mode_t mode,
1840 Error &error)
1841{
1842 std::string path (file_spec.GetPath());
1843 if (path.empty())
1844 {
1845 error.SetErrorString("empty path");
1846 return UINT64_MAX;
1847 }
1848 FileSP file_sp(new File());
1849 error = file_sp->Open(path.c_str(),flags,mode);
1850 if (file_sp->IsValid() == false)
1851 return UINT64_MAX;
1852 lldb::user_id_t fd = file_sp->GetDescriptor();
1853 GetFDToFileMap()[fd] = file_sp;
1854 return fd;
1855}
1856
1857bool
1858Host::CloseFile (lldb::user_id_t fd, Error &error)
1859{
1860 if (fd == UINT64_MAX)
1861 {
1862 error.SetErrorString ("invalid file descriptor");
1863 return false;
1864 }
1865 FDToFileMap& file_map = GetFDToFileMap();
1866 FDToFileMap::iterator pos = file_map.find(fd);
1867 if (pos == file_map.end())
1868 {
1869 error.SetErrorStringWithFormat ("invalid host file descriptor %" PRIu64, fd);
1870 return false;
1871 }
1872 FileSP file_sp = pos->second;
1873 if (!file_sp)
1874 {
1875 error.SetErrorString ("invalid host backing file");
1876 return false;
1877 }
1878 error = file_sp->Close();
1879 file_map.erase(pos);
1880 return error.Success();
1881}
1882
1883uint64_t
1884Host::WriteFile (lldb::user_id_t fd, uint64_t offset, const void* src, uint64_t src_len, Error &error)
1885{
1886 if (fd == UINT64_MAX)
1887 {
1888 error.SetErrorString ("invalid file descriptor");
1889 return UINT64_MAX;
1890 }
1891 FDToFileMap& file_map = GetFDToFileMap();
1892 FDToFileMap::iterator pos = file_map.find(fd);
1893 if (pos == file_map.end())
1894 {
1895 error.SetErrorStringWithFormat("invalid host file descriptor %" PRIu64 , fd);
1896 return false;
1897 }
1898 FileSP file_sp = pos->second;
1899 if (!file_sp)
1900 {
1901 error.SetErrorString ("invalid host backing file");
1902 return UINT64_MAX;
1903 }
1904 if (file_sp->SeekFromStart(offset, &error) != offset || error.Fail())
1905 return UINT64_MAX;
1906 size_t bytes_written = src_len;
1907 error = file_sp->Write(src, bytes_written);
1908 if (error.Fail())
1909 return UINT64_MAX;
1910 return bytes_written;
1911}
1912
1913uint64_t
1914Host::ReadFile (lldb::user_id_t fd, uint64_t offset, void* dst, uint64_t dst_len, Error &error)
1915{
1916 if (fd == UINT64_MAX)
1917 {
1918 error.SetErrorString ("invalid file descriptor");
1919 return UINT64_MAX;
1920 }
1921 FDToFileMap& file_map = GetFDToFileMap();
1922 FDToFileMap::iterator pos = file_map.find(fd);
1923 if (pos == file_map.end())
1924 {
1925 error.SetErrorStringWithFormat ("invalid host file descriptor %" PRIu64, fd);
1926 return false;
1927 }
1928 FileSP file_sp = pos->second;
1929 if (!file_sp)
1930 {
1931 error.SetErrorString ("invalid host backing file");
1932 return UINT64_MAX;
1933 }
1934 if (file_sp->SeekFromStart(offset, &error) != offset || error.Fail())
1935 return UINT64_MAX;
1936 size_t bytes_read = dst_len;
1937 error = file_sp->Read(dst ,bytes_read);
1938 if (error.Fail())
1939 return UINT64_MAX;
1940 return bytes_read;
1941}
1942
1943lldb::user_id_t
1944Host::GetFileSize (const FileSpec& file_spec)
1945{
1946 return file_spec.GetByteSize();
1947}
1948
1949bool
1950Host::GetFileExists (const FileSpec& file_spec)
1951{
1952 return file_spec.Exists();
1953}
1954
1955bool
1956Host::CalculateMD5 (const FileSpec& file_spec,
1957 uint64_t &low,
1958 uint64_t &high)
1959{
1960#if defined (__APPLE__)
1961 StreamString md5_cmd_line;
1962 md5_cmd_line.Printf("md5 -q '%s'", file_spec.GetPath().c_str());
1963 std::string hash_string;
1964 Error err = Host::RunShellCommand(md5_cmd_line.GetData(), NULL, NULL, NULL, &hash_string, 60);
1965 if (err.Fail())
1966 return false;
1967 // a correctly formed MD5 is 16-bytes, that is 32 hex digits
1968 // if the output is any other length it is probably wrong
1969 if (hash_string.size() != 32)
1970 return false;
1971 std::string part1(hash_string,0,16);
1972 std::string part2(hash_string,16);
1973 const char* part1_cstr = part1.c_str();
1974 const char* part2_cstr = part2.c_str();
1975 high = ::strtoull(part1_cstr, NULL, 16);
1976 low = ::strtoull(part2_cstr, NULL, 16);
1977 return true;
1978#else
1979 // your own MD5 implementation here
1980 return false;
1981#endif
1982}