2004-09-13 Andrew Cagney <cagney@gnu.org>
[deliverable/binutils-gdb.git] / gdb / thread-db.c
CommitLineData
fb0e1ba7 1/* libthread_db assisted debugging support, generic parts.
1bac305b 2
a2f23071 3 Copyright 1999, 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
fb0e1ba7
MK
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22#include "defs.h"
23
24#include "gdb_assert.h"
25#include <dlfcn.h>
26#include "gdb_proc_service.h"
27#include "gdb_thread_db.h"
28
bda9cb72 29#include "bfd.h"
fb0e1ba7
MK
30#include "gdbthread.h"
31#include "inferior.h"
bda9cb72
MK
32#include "symfile.h"
33#include "objfiles.h"
fb0e1ba7 34#include "target.h"
4e052eda 35#include "regcache.h"
3f47be5c 36#include "solib-svr4.h"
fb0e1ba7 37
a2f23071
DJ
38#ifdef HAVE_GNU_LIBC_VERSION_H
39#include <gnu/libc-version.h>
40#endif
41
fb0e1ba7
MK
42#ifndef LIBTHREAD_DB_SO
43#define LIBTHREAD_DB_SO "libthread_db.so.1"
44#endif
45
8605d56e
AC
46/* If we're running on GNU/Linux, we must explicitly attach to any new
47 threads. */
fb0e1ba7
MK
48
49/* FIXME: There is certainly some room for improvements:
50 - Cache LWP ids.
51 - Bypass libthread_db when fetching or storing registers for
52 threads bound to a LWP. */
53
54/* This module's target vector. */
55static struct target_ops thread_db_ops;
56
57/* The target vector that we call for things this module can't handle. */
58static struct target_ops *target_beneath;
59
60/* Pointer to the next function on the objfile event chain. */
b4acd559 61static void (*target_new_objfile_chain) (struct objfile * objfile);
fb0e1ba7
MK
62
63/* Non-zero if we're using this module's target vector. */
64static int using_thread_db;
65
66/* Non-zero if we have determined the signals used by the threads
67 library. */
68static int thread_signals;
69static sigset_t thread_stop_set;
70static sigset_t thread_print_set;
71
72/* Structure that identifies the child process for the
73 <proc_service.h> interface. */
74static struct ps_prochandle proc_handle;
75
76/* Connection to the libthread_db library. */
77static td_thragent_t *thread_agent;
78
79/* Pointers to the libthread_db functions. */
80
81static td_err_e (*td_init_p) (void);
82
b4acd559
JJ
83static td_err_e (*td_ta_new_p) (struct ps_prochandle * ps,
84 td_thragent_t **ta);
fb0e1ba7
MK
85static td_err_e (*td_ta_map_id2thr_p) (const td_thragent_t *ta, thread_t pt,
86 td_thrhandle_t *__th);
b4acd559
JJ
87static td_err_e (*td_ta_map_lwp2thr_p) (const td_thragent_t *ta,
88 lwpid_t lwpid, td_thrhandle_t *th);
fb0e1ba7 89static td_err_e (*td_ta_thr_iter_p) (const td_thragent_t *ta,
b4acd559
JJ
90 td_thr_iter_f *callback, void *cbdata_p,
91 td_thr_state_e state, int ti_pri,
92 sigset_t *ti_sigmask_p,
fb0e1ba7
MK
93 unsigned int ti_user_flags);
94static td_err_e (*td_ta_event_addr_p) (const td_thragent_t *ta,
95 td_event_e event, td_notify_t *ptr);
96static td_err_e (*td_ta_set_event_p) (const td_thragent_t *ta,
97 td_thr_events_t *event);
98static td_err_e (*td_ta_event_getmsg_p) (const td_thragent_t *ta,
99 td_event_msg_t *msg);
100
101static td_err_e (*td_thr_validate_p) (const td_thrhandle_t *th);
102static td_err_e (*td_thr_get_info_p) (const td_thrhandle_t *th,
103 td_thrinfo_t *infop);
104static td_err_e (*td_thr_getfpregs_p) (const td_thrhandle_t *th,
105 gdb_prfpregset_t *regset);
106static td_err_e (*td_thr_getgregs_p) (const td_thrhandle_t *th,
107 prgregset_t gregs);
108static td_err_e (*td_thr_setfpregs_p) (const td_thrhandle_t *th,
109 const gdb_prfpregset_t *fpregs);
110static td_err_e (*td_thr_setgregs_p) (const td_thrhandle_t *th,
111 prgregset_t gregs);
b4acd559
JJ
112static td_err_e (*td_thr_event_enable_p) (const td_thrhandle_t *th,
113 int event);
fb0e1ba7 114
3f47be5c 115static td_err_e (*td_thr_tls_get_addr_p) (const td_thrhandle_t *th,
b4acd559
JJ
116 void *map_address,
117 size_t offset, void **address);
3f47be5c 118
fb0e1ba7
MK
119/* Location of the thread creation event breakpoint. The code at this
120 location in the child process will be called by the pthread library
121 whenever a new thread is created. By setting a special breakpoint
122 at this location, GDB can detect when a new thread is created. We
123 obtain this location via the td_ta_event_addr call. */
124static CORE_ADDR td_create_bp_addr;
125
126/* Location of the thread death event breakpoint. */
127static CORE_ADDR td_death_bp_addr;
128
129/* Prototypes for local functions. */
bda9cb72 130static void thread_db_find_new_threads (void);
5365276c
DJ
131static void attach_thread (ptid_t ptid, const td_thrhandle_t *th_p,
132 const td_thrinfo_t *ti_p, int verbose);
a2f23071 133static void detach_thread (ptid_t ptid, int verbose);
fb0e1ba7
MK
134\f
135
136/* Building process ids. */
137
ca6724c1
KB
138#define GET_PID(ptid) ptid_get_pid (ptid)
139#define GET_LWP(ptid) ptid_get_lwp (ptid)
140#define GET_THREAD(ptid) ptid_get_tid (ptid)
fb0e1ba7 141
ca6724c1
KB
142#define is_lwp(ptid) (GET_LWP (ptid) != 0)
143#define is_thread(ptid) (GET_THREAD (ptid) != 0)
fb0e1ba7 144
ca6724c1
KB
145#define BUILD_LWP(lwp, pid) ptid_build (pid, lwp, 0)
146#define BUILD_THREAD(tid, pid) ptid_build (pid, 0, tid)
fb0e1ba7
MK
147\f
148
5365276c
DJ
149/* Use "struct private_thread_info" to cache thread state. This is
150 a substantial optimization. */
151
fb0e1ba7
MK
152struct private_thread_info
153{
a2f23071
DJ
154 /* Flag set when we see a TD_DEATH event for this thread. */
155 unsigned int dying:1;
156
5365276c 157 /* Cached thread state. */
b4acd559
JJ
158 unsigned int th_valid:1;
159 unsigned int ti_valid:1;
5365276c
DJ
160
161 td_thrhandle_t th;
162 td_thrinfo_t ti;
fb0e1ba7 163};
fb0e1ba7 164\f
21bf60fe 165
fb0e1ba7
MK
166static char *
167thread_db_err_str (td_err_e err)
168{
169 static char buf[64];
170
171 switch (err)
172 {
173 case TD_OK:
174 return "generic 'call succeeded'";
175 case TD_ERR:
176 return "generic error";
177 case TD_NOTHR:
178 return "no thread to satisfy query";
179 case TD_NOSV:
180 return "no sync handle to satisfy query";
181 case TD_NOLWP:
182 return "no LWP to satisfy query";
183 case TD_BADPH:
184 return "invalid process handle";
185 case TD_BADTH:
186 return "invalid thread handle";
187 case TD_BADSH:
188 return "invalid synchronization handle";
189 case TD_BADTA:
190 return "invalid thread agent";
191 case TD_BADKEY:
192 return "invalid key";
193 case TD_NOMSG:
194 return "no event message for getmsg";
195 case TD_NOFPREGS:
196 return "FPU register set not available";
197 case TD_NOLIBTHREAD:
198 return "application not linked with libthread";
199 case TD_NOEVENT:
200 return "requested event is not supported";
201 case TD_NOCAPAB:
202 return "capability not available";
203 case TD_DBERR:
204 return "debugger service failed";
205 case TD_NOAPLIC:
206 return "operation not applicable to";
207 case TD_NOTSD:
208 return "no thread-specific data for this thread";
209 case TD_MALLOC:
210 return "malloc failed";
211 case TD_PARTIALREG:
212 return "only part of register set was written/read";
213 case TD_NOXREGS:
214 return "X register set not available for this thread";
215 default:
216 snprintf (buf, sizeof (buf), "unknown thread_db error '%d'", err);
217 return buf;
218 }
219}
220
221static char *
222thread_db_state_str (td_thr_state_e state)
223{
224 static char buf[64];
225
226 switch (state)
227 {
228 case TD_THR_STOPPED:
229 return "stopped by debugger";
230 case TD_THR_RUN:
231 return "runnable";
232 case TD_THR_ACTIVE:
233 return "active";
234 case TD_THR_ZOMBIE:
235 return "zombie";
236 case TD_THR_SLEEP:
237 return "sleeping";
238 case TD_THR_STOPPED_ASLEEP:
239 return "stopped by debugger AND blocked";
240 default:
241 snprintf (buf, sizeof (buf), "unknown thread_db state %d", state);
242 return buf;
243 }
244}
245\f
5365276c 246/* A callback function for td_ta_thr_iter, which we use to map all
cdbc0b18 247 threads to LWPs.
5365276c
DJ
248
249 THP is a handle to the current thread; if INFOP is not NULL, the
250 struct thread_info associated with this thread is returned in
b9b5d7ea
JJ
251 *INFOP.
252
253 If the thread is a zombie, TD_THR_ZOMBIE is returned. Otherwise,
254 zero is returned to indicate success. */
5365276c
DJ
255
256static int
257thread_get_info_callback (const td_thrhandle_t *thp, void *infop)
258{
259 td_thrinfo_t ti;
260 td_err_e err;
261 struct thread_info *thread_info;
262 ptid_t thread_ptid;
263
264 err = td_thr_get_info_p (thp, &ti);
265 if (err != TD_OK)
b4acd559 266 error ("thread_get_info_callback: cannot get thread info: %s",
5365276c
DJ
267 thread_db_err_str (err));
268
269 /* Fill the cache. */
270 thread_ptid = BUILD_THREAD (ti.ti_tid, GET_PID (inferior_ptid));
271 thread_info = find_thread_pid (thread_ptid);
272
b9b5d7ea 273 /* In the case of a zombie thread, don't continue. We don't want to
f90ef764 274 attach to it thinking it is a new thread. */
b9b5d7ea
JJ
275 if (ti.ti_state == TD_THR_UNKNOWN || ti.ti_state == TD_THR_ZOMBIE)
276 {
277 if (infop != NULL)
278 *(struct thread_info **) infop = thread_info;
f90ef764
JJ
279 if (thread_info != NULL)
280 {
281 memcpy (&thread_info->private->th, thp, sizeof (*thp));
282 thread_info->private->th_valid = 1;
283 memcpy (&thread_info->private->ti, &ti, sizeof (ti));
284 thread_info->private->ti_valid = 1;
285 }
b9b5d7ea
JJ
286 return TD_THR_ZOMBIE;
287 }
288
5365276c
DJ
289 if (thread_info == NULL)
290 {
291 /* New thread. Attach to it now (why wait?). */
292 attach_thread (thread_ptid, thp, &ti, 1);
293 thread_info = find_thread_pid (thread_ptid);
294 gdb_assert (thread_info != NULL);
295 }
296
297 memcpy (&thread_info->private->th, thp, sizeof (*thp));
298 thread_info->private->th_valid = 1;
299 memcpy (&thread_info->private->ti, &ti, sizeof (ti));
300 thread_info->private->ti_valid = 1;
301
302 if (infop != NULL)
303 *(struct thread_info **) infop = thread_info;
304
305 return 0;
306}
307
308/* Accessor functions for the thread_db information, with caching. */
fb0e1ba7 309
5365276c
DJ
310static void
311thread_db_map_id2thr (struct thread_info *thread_info, int fatal)
312{
313 td_err_e err;
314
315 if (thread_info->private->th_valid)
316 return;
317
318 err = td_ta_map_id2thr_p (thread_agent, GET_THREAD (thread_info->ptid),
319 &thread_info->private->th);
320 if (err != TD_OK)
321 {
322 if (fatal)
323 error ("Cannot find thread %ld: %s",
b4acd559
JJ
324 (long) GET_THREAD (thread_info->ptid),
325 thread_db_err_str (err));
5365276c
DJ
326 }
327 else
328 thread_info->private->th_valid = 1;
329}
330
331static td_thrinfo_t *
332thread_db_get_info (struct thread_info *thread_info)
333{
334 td_err_e err;
335
336 if (thread_info->private->ti_valid)
337 return &thread_info->private->ti;
338
b4acd559 339 if (!thread_info->private->th_valid)
5365276c
DJ
340 thread_db_map_id2thr (thread_info, 1);
341
b4acd559
JJ
342 err =
343 td_thr_get_info_p (&thread_info->private->th, &thread_info->private->ti);
5365276c 344 if (err != TD_OK)
b4acd559 345 error ("thread_db_get_info: cannot get thread info: %s",
5365276c
DJ
346 thread_db_err_str (err));
347
348 thread_info->private->ti_valid = 1;
349 return &thread_info->private->ti;
350}
351\f
fb0e1ba7
MK
352/* Convert between user-level thread ids and LWP ids. */
353
39f77062
KB
354static ptid_t
355thread_from_lwp (ptid_t ptid)
fb0e1ba7 356{
fb0e1ba7
MK
357 td_thrhandle_t th;
358 td_err_e err;
5365276c
DJ
359 struct thread_info *thread_info;
360 ptid_t thread_ptid;
fb0e1ba7 361
39f77062
KB
362 if (GET_LWP (ptid) == 0)
363 ptid = BUILD_LWP (GET_PID (ptid), GET_PID (ptid));
fb0e1ba7 364
39f77062 365 gdb_assert (is_lwp (ptid));
fb0e1ba7 366
39f77062 367 err = td_ta_map_lwp2thr_p (thread_agent, GET_LWP (ptid), &th);
fb0e1ba7 368 if (err != TD_OK)
823ca731 369 error ("Cannot find user-level thread for LWP %ld: %s",
39f77062 370 GET_LWP (ptid), thread_db_err_str (err));
fb0e1ba7 371
5365276c 372 thread_info = NULL;
b9b5d7ea
JJ
373
374 /* Fetch the thread info. If we get back TD_THR_ZOMBIE, then the
375 event thread has already died. If another gdb interface has called
376 thread_alive() previously, the thread won't be found on the thread list
377 anymore. In that case, we don't want to process this ptid anymore
378 to avoid the possibility of later treating it as a newly
379 discovered thread id that we should add to the list. Thus,
380 we return a -1 ptid which is also how the thread list marks a
381 dead thread. */
382 if (thread_get_info_callback (&th, &thread_info) == TD_THR_ZOMBIE
383 && thread_info == NULL)
384 return pid_to_ptid (-1);
385
5365276c 386 gdb_assert (thread_info && thread_info->private->ti_valid);
fb0e1ba7 387
5365276c 388 return BUILD_THREAD (thread_info->private->ti.ti_tid, GET_PID (ptid));
fb0e1ba7
MK
389}
390
39f77062
KB
391static ptid_t
392lwp_from_thread (ptid_t ptid)
fb0e1ba7 393{
5365276c
DJ
394 struct thread_info *thread_info;
395 ptid_t thread_ptid;
fb0e1ba7 396
21bf60fe 397 if (!is_thread (ptid))
39f77062 398 return ptid;
fb0e1ba7 399
5365276c
DJ
400 thread_info = find_thread_pid (ptid);
401 thread_db_get_info (thread_info);
fb0e1ba7 402
5365276c 403 return BUILD_LWP (thread_info->private->ti.ti_lid, GET_PID (ptid));
fb0e1ba7
MK
404}
405\f
406
407void
408thread_db_init (struct target_ops *target)
409{
410 target_beneath = target;
411}
412
5220ea4c
AC
413static void *
414verbose_dlsym (void *handle, const char *name)
415{
416 void *sym = dlsym (handle, name);
417 if (sym == NULL)
418 warning ("Symbol \"%s\" not found in libthread_db: %s", name, dlerror ());
419 return sym;
420}
421
fb0e1ba7
MK
422static int
423thread_db_load (void)
424{
425 void *handle;
426 td_err_e err;
427
428 handle = dlopen (LIBTHREAD_DB_SO, RTLD_NOW);
429 if (handle == NULL)
f7c1e0f3 430 {
b4acd559 431 fprintf_filtered (gdb_stderr, "\n\ndlopen failed on '%s' - %s\n",
f7c1e0f3 432 LIBTHREAD_DB_SO, dlerror ());
b4acd559 433 fprintf_filtered (gdb_stderr,
f7c1e0f3
MS
434 "GDB will not be able to debug pthreads.\n\n");
435 return 0;
436 }
fb0e1ba7
MK
437
438 /* Initialize pointers to the dynamic library functions we will use.
439 Essential functions first. */
440
5220ea4c 441 td_init_p = verbose_dlsym (handle, "td_init");
fb0e1ba7
MK
442 if (td_init_p == NULL)
443 return 0;
444
5220ea4c 445 td_ta_new_p = verbose_dlsym (handle, "td_ta_new");
fb0e1ba7
MK
446 if (td_ta_new_p == NULL)
447 return 0;
448
5220ea4c 449 td_ta_map_id2thr_p = verbose_dlsym (handle, "td_ta_map_id2thr");
fb0e1ba7
MK
450 if (td_ta_map_id2thr_p == NULL)
451 return 0;
452
5220ea4c 453 td_ta_map_lwp2thr_p = verbose_dlsym (handle, "td_ta_map_lwp2thr");
fb0e1ba7
MK
454 if (td_ta_map_lwp2thr_p == NULL)
455 return 0;
456
5220ea4c 457 td_ta_thr_iter_p = verbose_dlsym (handle, "td_ta_thr_iter");
fb0e1ba7
MK
458 if (td_ta_thr_iter_p == NULL)
459 return 0;
460
5220ea4c 461 td_thr_validate_p = verbose_dlsym (handle, "td_thr_validate");
fb0e1ba7
MK
462 if (td_thr_validate_p == NULL)
463 return 0;
464
5220ea4c 465 td_thr_get_info_p = verbose_dlsym (handle, "td_thr_get_info");
fb0e1ba7
MK
466 if (td_thr_get_info_p == NULL)
467 return 0;
468
5220ea4c 469 td_thr_getfpregs_p = verbose_dlsym (handle, "td_thr_getfpregs");
fb0e1ba7
MK
470 if (td_thr_getfpregs_p == NULL)
471 return 0;
472
5220ea4c 473 td_thr_getgregs_p = verbose_dlsym (handle, "td_thr_getgregs");
fb0e1ba7
MK
474 if (td_thr_getgregs_p == NULL)
475 return 0;
476
5220ea4c 477 td_thr_setfpregs_p = verbose_dlsym (handle, "td_thr_setfpregs");
fb0e1ba7
MK
478 if (td_thr_setfpregs_p == NULL)
479 return 0;
480
5220ea4c 481 td_thr_setgregs_p = verbose_dlsym (handle, "td_thr_setgregs");
fb0e1ba7
MK
482 if (td_thr_setgregs_p == NULL)
483 return 0;
484
485 /* Initialize the library. */
486 err = td_init_p ();
487 if (err != TD_OK)
488 {
489 warning ("Cannot initialize libthread_db: %s", thread_db_err_str (err));
490 return 0;
491 }
492
493 /* These are not essential. */
494 td_ta_event_addr_p = dlsym (handle, "td_ta_event_addr");
495 td_ta_set_event_p = dlsym (handle, "td_ta_set_event");
496 td_ta_event_getmsg_p = dlsym (handle, "td_ta_event_getmsg");
497 td_thr_event_enable_p = dlsym (handle, "td_thr_event_enable");
3f47be5c 498 td_thr_tls_get_addr_p = dlsym (handle, "td_thr_tls_get_addr");
fb0e1ba7
MK
499
500 return 1;
501}
502
cdbc0b18 503static td_err_e
24557e30
AC
504enable_thread_event (td_thragent_t *thread_agent, int event, CORE_ADDR *bp)
505{
506 td_notify_t notify;
cdbc0b18 507 td_err_e err;
24557e30
AC
508
509 /* Get the breakpoint address for thread EVENT. */
510 err = td_ta_event_addr_p (thread_agent, event, &notify);
511 if (err != TD_OK)
cdbc0b18 512 return err;
24557e30
AC
513
514 /* Set up the breakpoint. */
515 (*bp) = gdbarch_convert_from_func_ptr_addr (current_gdbarch,
516 (CORE_ADDR) notify.u.bptaddr,
517 &current_target);
518 create_thread_event_breakpoint ((*bp));
519
cdbc0b18 520 return TD_OK;
24557e30
AC
521}
522
fb0e1ba7
MK
523static void
524enable_thread_event_reporting (void)
525{
526 td_thr_events_t events;
527 td_notify_t notify;
528 td_err_e err;
a2f23071
DJ
529#ifdef HAVE_GNU_LIBC_VERSION_H
530 const char *libc_version;
531 int libc_major, libc_minor;
532#endif
fb0e1ba7
MK
533
534 /* We cannot use the thread event reporting facility if these
535 functions aren't available. */
536 if (td_ta_event_addr_p == NULL || td_ta_set_event_p == NULL
537 || td_ta_event_getmsg_p == NULL || td_thr_event_enable_p == NULL)
538 return;
539
540 /* Set the process wide mask saying which events we're interested in. */
541 td_event_emptyset (&events);
542 td_event_addset (&events, TD_CREATE);
a2f23071
DJ
543
544#ifdef HAVE_GNU_LIBC_VERSION_H
fb0e1ba7
MK
545 /* FIXME: kettenis/2000-04-23: The event reporting facility is
546 broken for TD_DEATH events in glibc 2.1.3, so don't enable it for
547 now. */
a2f23071
DJ
548 libc_version = gnu_get_libc_version ();
549 if (sscanf (libc_version, "%d.%d", &libc_major, &libc_minor) == 2
550 && (libc_major > 2 || (libc_major == 2 && libc_minor > 1)))
fb0e1ba7 551#endif
a2f23071 552 td_event_addset (&events, TD_DEATH);
fb0e1ba7
MK
553
554 err = td_ta_set_event_p (thread_agent, &events);
555 if (err != TD_OK)
556 {
557 warning ("Unable to set global thread event mask: %s",
558 thread_db_err_str (err));
559 return;
560 }
561
562 /* Delete previous thread event breakpoints, if any. */
563 remove_thread_event_breakpoints ();
24557e30
AC
564 td_create_bp_addr = 0;
565 td_death_bp_addr = 0;
fb0e1ba7 566
24557e30 567 /* Set up the thread creation event. */
cdbc0b18
RM
568 err = enable_thread_event (thread_agent, TD_CREATE, &td_create_bp_addr);
569 if (err != TD_OK)
fb0e1ba7
MK
570 {
571 warning ("Unable to get location for thread creation breakpoint: %s",
572 thread_db_err_str (err));
573 return;
574 }
575
24557e30 576 /* Set up the thread death event. */
cdbc0b18
RM
577 err = enable_thread_event (thread_agent, TD_DEATH, &td_death_bp_addr);
578 if (err != TD_OK)
fb0e1ba7 579 {
936742ab 580 warning ("Unable to get location for thread death breakpoint: %s",
fb0e1ba7
MK
581 thread_db_err_str (err));
582 return;
583 }
fb0e1ba7
MK
584}
585
586static void
587disable_thread_event_reporting (void)
588{
589 td_thr_events_t events;
590
591 /* Set the process wide mask saying we aren't interested in any
592 events anymore. */
593 td_event_emptyset (&events);
594 td_ta_set_event_p (thread_agent, &events);
595
596 /* Delete thread event breakpoints, if any. */
597 remove_thread_event_breakpoints ();
598 td_create_bp_addr = 0;
599 td_death_bp_addr = 0;
600}
601
602static void
603check_thread_signals (void)
604{
605#ifdef GET_THREAD_SIGNALS
21bf60fe 606 if (!thread_signals)
fb0e1ba7
MK
607 {
608 sigset_t mask;
609 int i;
610
611 GET_THREAD_SIGNALS (&mask);
612 sigemptyset (&thread_stop_set);
613 sigemptyset (&thread_print_set);
614
b9569773 615 for (i = 1; i < NSIG; i++)
fb0e1ba7
MK
616 {
617 if (sigismember (&mask, i))
618 {
619 if (signal_stop_update (target_signal_from_host (i), 0))
620 sigaddset (&thread_stop_set, i);
621 if (signal_print_update (target_signal_from_host (i), 0))
622 sigaddset (&thread_print_set, i);
623 thread_signals = 1;
624 }
625 }
626 }
627#endif
628}
629
fb0e1ba7
MK
630static void
631thread_db_new_objfile (struct objfile *objfile)
632{
633 td_err_e err;
634
5220ea4c
AC
635 /* First time through, report that libthread_db was successfuly
636 loaded. Can't print this in in thread_db_load as, at that stage,
637 the interpreter and it's console haven't started. The real
638 problem here is that libthread_db is loaded too early - it should
639 only be loaded when there is a program to debug. */
640 {
641 static int dejavu;
642 if (!dejavu)
643 {
644 Dl_info info;
645 const char *library = NULL;
646 /* Try dladdr. */
647 if (dladdr ((*td_ta_new_p), &info) != 0)
648 library = info.dli_fname;
649 /* Try dlinfo? */
650 if (library == NULL)
651 /* Paranoid - don't let a NULL path slip through. */
652 library = LIBTHREAD_DB_SO;
653 printf_unfiltered ("Using host libthread_db library \"%s\".\n",
654 library);
655 dejavu = 1;
656 }
657 }
658
5bbd998e
MS
659 /* Don't attempt to use thread_db on targets which can not run
660 (core files). */
661 if (objfile == NULL || !target_has_execution)
bda9cb72
MK
662 {
663 /* All symbols have been discarded. If the thread_db target is
c194fbe1 664 active, deactivate it now. */
bda9cb72 665 if (using_thread_db)
c194fbe1
MK
666 {
667 gdb_assert (proc_handle.pid == 0);
668 unpush_target (&thread_db_ops);
669 using_thread_db = 0;
670 }
671
bda9cb72
MK
672 goto quit;
673 }
674
fb0e1ba7
MK
675 if (using_thread_db)
676 /* Nothing to do. The thread library was already detected and the
677 target vector was already activated. */
678 goto quit;
679
bda9cb72
MK
680 /* Initialize the structure that identifies the child process. Note
681 that at this point there is no guarantee that we actually have a
682 child process. */
39f77062 683 proc_handle.pid = GET_PID (inferior_ptid);
fb0e1ba7 684
bda9cb72 685 /* Now attempt to open a connection to the thread library. */
fb0e1ba7
MK
686 err = td_ta_new_p (&proc_handle, &thread_agent);
687 switch (err)
688 {
689 case TD_NOLIBTHREAD:
bda9cb72 690 /* No thread library was detected. */
fb0e1ba7
MK
691 break;
692
693 case TD_OK:
5220ea4c
AC
694 printf_unfiltered ("[Thread debugging using libthread_db enabled]\n");
695
bda9cb72
MK
696 /* The thread library was detected. Activate the thread_db target. */
697 push_target (&thread_db_ops);
698 using_thread_db = 1;
699
bda9cb72
MK
700 /* We can only poke around if there actually is a child process.
701 If there is no child process alive, postpone the steps below
702 until one has been created. */
703 if (proc_handle.pid != 0)
704 {
705 enable_thread_event_reporting ();
706 thread_db_find_new_threads ();
707 }
fb0e1ba7
MK
708 break;
709
710 default:
711 warning ("Cannot initialize thread debugging library: %s",
712 thread_db_err_str (err));
713 break;
714 }
715
b4acd559 716quit:
540af400
MS
717 if (target_new_objfile_chain)
718 target_new_objfile_chain (objfile);
fb0e1ba7
MK
719}
720
a2f23071
DJ
721/* Attach to a new thread. This function is called when we receive a
722 TD_CREATE event or when we iterate over all threads and find one
723 that wasn't already in our list. */
724
fb0e1ba7 725static void
39f77062 726attach_thread (ptid_t ptid, const td_thrhandle_t *th_p,
fb0e1ba7
MK
727 const td_thrinfo_t *ti_p, int verbose)
728{
729 struct thread_info *tp;
730 td_err_e err;
731
a2f23071
DJ
732 /* If we're being called after a TD_CREATE event, we may already
733 know about this thread. There are two ways this can happen. We
734 may have iterated over all threads between the thread creation
735 and the TD_CREATE event, for instance when the user has issued
736 the `info threads' command before the SIGTRAP for hitting the
737 thread creation breakpoint was reported. Alternatively, the
738 thread may have exited and a new one been created with the same
739 thread ID. In the first case we don't need to do anything; in
740 the second case we should discard information about the dead
741 thread and attach to the new one. */
742 if (in_thread_list (ptid))
743 {
744 tp = find_thread_pid (ptid);
745 gdb_assert (tp != NULL);
746
747 if (!tp->private->dying)
748 return;
749
750 delete_thread (ptid);
751 }
752
fb0e1ba7
MK
753 check_thread_signals ();
754
fb0e1ba7 755 /* Add the thread to GDB's thread list. */
39f77062 756 tp = add_thread (ptid);
fb0e1ba7 757 tp->private = xmalloc (sizeof (struct private_thread_info));
5365276c
DJ
758 memset (tp->private, 0, sizeof (struct private_thread_info));
759
760 if (verbose)
761 printf_unfiltered ("[New %s]\n", target_pid_to_str (ptid));
fb0e1ba7 762
21bf60fe
MK
763 if (ti_p->ti_state == TD_THR_UNKNOWN || ti_p->ti_state == TD_THR_ZOMBIE)
764 return; /* A zombie thread -- do not attach. */
5fd913cc 765
8605d56e 766 /* Under GNU/Linux, we have to attach to each and every thread. */
fb0e1ba7 767#ifdef ATTACH_LWP
c194fbe1 768 ATTACH_LWP (BUILD_LWP (ti_p->ti_lid, GET_PID (ptid)), 0);
fb0e1ba7
MK
769#endif
770
771 /* Enable thread event reporting for this thread. */
772 err = td_thr_event_enable_p (th_p, 1);
773 if (err != TD_OK)
774 error ("Cannot enable thread event reporting for %s: %s",
39f77062 775 target_pid_to_str (ptid), thread_db_err_str (err));
fb0e1ba7
MK
776}
777
c194fbe1
MK
778static void
779thread_db_attach (char *args, int from_tty)
780{
781 target_beneath->to_attach (args, from_tty);
782
783 /* Destroy thread info; it's no longer valid. */
784 init_thread_list ();
785
786 /* The child process is now the actual multi-threaded
787 program. Snatch its process ID... */
788 proc_handle.pid = GET_PID (inferior_ptid);
789
790 /* ...and perform the remaining initialization steps. */
791 enable_thread_event_reporting ();
b4acd559 792 thread_db_find_new_threads ();
c194fbe1
MK
793}
794
fb0e1ba7 795static void
39f77062 796detach_thread (ptid_t ptid, int verbose)
fb0e1ba7 797{
a2f23071
DJ
798 struct thread_info *thread_info;
799
fb0e1ba7 800 if (verbose)
39f77062 801 printf_unfiltered ("[%s exited]\n", target_pid_to_str (ptid));
a2f23071
DJ
802
803 /* Don't delete the thread now, because it still reports as active
804 until it has executed a few instructions after the event
805 breakpoint - if we deleted it now, "info threads" would cause us
806 to re-attach to it. Just mark it as having had a TD_DEATH
807 event. This means that we won't delete it from our thread list
808 until we notice that it's dead (via prune_threads), or until
809 something re-uses its thread ID. */
810 thread_info = find_thread_pid (ptid);
811 gdb_assert (thread_info != NULL);
812 thread_info->private->dying = 1;
fb0e1ba7
MK
813}
814
815static void
816thread_db_detach (char *args, int from_tty)
817{
818 disable_thread_event_reporting ();
c194fbe1
MK
819
820 /* There's no need to save & restore inferior_ptid here, since the
821 inferior is supposed to be survive this function call. */
822 inferior_ptid = lwp_from_thread (inferior_ptid);
823
824 /* Forget about the child's process ID. We shouldn't need it
825 anymore. */
826 proc_handle.pid = 0;
fb0e1ba7
MK
827
828 target_beneath->to_detach (args, from_tty);
829}
830
5365276c
DJ
831static int
832clear_lwpid_callback (struct thread_info *thread, void *dummy)
833{
834 /* If we know that our thread implementation is 1-to-1, we could save
835 a certain amount of information; it's not clear how much, so we
836 are always conservative. */
837
838 thread->private->th_valid = 0;
839 thread->private->ti_valid = 0;
840
841 return 0;
842}
843
fb0e1ba7 844static void
39f77062 845thread_db_resume (ptid_t ptid, int step, enum target_signal signo)
fb0e1ba7 846{
39f77062 847 struct cleanup *old_chain = save_inferior_ptid ();
fb0e1ba7 848
39f77062
KB
849 if (GET_PID (ptid) == -1)
850 inferior_ptid = lwp_from_thread (inferior_ptid);
851 else if (is_thread (ptid))
852 ptid = lwp_from_thread (ptid);
fb0e1ba7 853
5365276c
DJ
854 /* Clear cached data which may not be valid after the resume. */
855 iterate_over_threads (clear_lwpid_callback, NULL);
856
39f77062 857 target_beneath->to_resume (ptid, step, signo);
fb0e1ba7
MK
858
859 do_cleanups (old_chain);
860}
861
862/* Check if PID is currently stopped at the location of a thread event
863 breakpoint location. If it is, read the event message and act upon
864 the event. */
865
866static void
39f77062 867check_event (ptid_t ptid)
fb0e1ba7
MK
868{
869 td_event_msg_t msg;
870 td_thrinfo_t ti;
871 td_err_e err;
872 CORE_ADDR stop_pc;
4d9850d3 873 int loop = 0;
fb0e1ba7
MK
874
875 /* Bail out early if we're not at a thread event breakpoint. */
39f77062 876 stop_pc = read_pc_pid (ptid) - DECR_PC_AFTER_BREAK;
fb0e1ba7
MK
877 if (stop_pc != td_create_bp_addr && stop_pc != td_death_bp_addr)
878 return;
879
4d9850d3
JJ
880 /* If we are at a create breakpoint, we do not know what new lwp
881 was created and cannot specifically locate the event message for it.
882 We have to call td_ta_event_getmsg() to get
883 the latest message. Since we have no way of correlating whether
cdbc0b18 884 the event message we get back corresponds to our breakpoint, we must
4d9850d3 885 loop and read all event messages, processing them appropriately.
cdbc0b18
RM
886 This guarantees we will process the correct message before continuing
887 from the breakpoint.
4d9850d3
JJ
888
889 Currently, death events are not enabled. If they are enabled,
890 the death event can use the td_thr_event_getmsg() interface to
891 get the message specifically for that lwp and avoid looping
892 below. */
893
894 loop = 1;
895
896 do
fb0e1ba7 897 {
4d9850d3
JJ
898 err = td_ta_event_getmsg_p (thread_agent, &msg);
899 if (err != TD_OK)
900 {
901 if (err == TD_NOMSG)
902 return;
fb0e1ba7 903
4d9850d3
JJ
904 error ("Cannot get thread event message: %s",
905 thread_db_err_str (err));
906 }
fb0e1ba7 907
4d9850d3
JJ
908 err = td_thr_get_info_p (msg.th_p, &ti);
909 if (err != TD_OK)
910 error ("Cannot get thread info: %s", thread_db_err_str (err));
fb0e1ba7 911
4d9850d3 912 ptid = BUILD_THREAD (ti.ti_tid, GET_PID (ptid));
fb0e1ba7 913
4d9850d3
JJ
914 switch (msg.event)
915 {
916 case TD_CREATE:
a2f23071
DJ
917 /* Call attach_thread whether or not we already know about a
918 thread with this thread ID. */
919 attach_thread (ptid, msg.th_p, &ti, 1);
fb0e1ba7 920
4d9850d3 921 break;
fb0e1ba7 922
4d9850d3 923 case TD_DEATH:
fb0e1ba7 924
4d9850d3
JJ
925 if (!in_thread_list (ptid))
926 error ("Spurious thread death event.");
fb0e1ba7 927
4d9850d3 928 detach_thread (ptid, 1);
fb0e1ba7 929
4d9850d3 930 break;
fb0e1ba7 931
4d9850d3
JJ
932 default:
933 error ("Spurious thread event.");
934 }
fb0e1ba7 935 }
4d9850d3 936 while (loop);
fb0e1ba7
MK
937}
938
39f77062
KB
939static ptid_t
940thread_db_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
fb0e1ba7 941{
39f77062 942 extern ptid_t trap_ptid;
fb0e1ba7 943
39f77062
KB
944 if (GET_PID (ptid) != -1 && is_thread (ptid))
945 ptid = lwp_from_thread (ptid);
fb0e1ba7 946
39f77062 947 ptid = target_beneath->to_wait (ptid, ourstatus);
fb0e1ba7 948
bda9cb72
MK
949 if (proc_handle.pid == 0)
950 /* The current child process isn't the actual multi-threaded
951 program yet, so don't try to do any special thread-specific
952 post-processing and bail out early. */
39f77062 953 return ptid;
bda9cb72 954
fb0e1ba7 955 if (ourstatus->kind == TARGET_WAITKIND_EXITED)
39f77062 956 return pid_to_ptid (-1);
fb0e1ba7
MK
957
958 if (ourstatus->kind == TARGET_WAITKIND_STOPPED
959 && ourstatus->value.sig == TARGET_SIGNAL_TRAP)
960 /* Check for a thread event. */
39f77062 961 check_event (ptid);
fb0e1ba7 962
39f77062
KB
963 if (!ptid_equal (trap_ptid, null_ptid))
964 trap_ptid = thread_from_lwp (trap_ptid);
fb0e1ba7 965
b9b5d7ea
JJ
966 /* Change the ptid back into the higher level PID + TID format.
967 If the thread is dead and no longer on the thread list, we will
968 get back a dead ptid. This can occur if the thread death event
969 gets postponed by other simultaneous events. In such a case,
970 we want to just ignore the event and continue on. */
971 ptid = thread_from_lwp (ptid);
972 if (GET_PID (ptid) == -1)
973 ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
974
975 return ptid;
fb0e1ba7
MK
976}
977
978static int
979thread_db_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
b4acd559 980 struct mem_attrib *attrib, struct target_ops *target)
fb0e1ba7 981{
39f77062 982 struct cleanup *old_chain = save_inferior_ptid ();
fb0e1ba7
MK
983 int xfer;
984
39f77062 985 if (is_thread (inferior_ptid))
fb0e1ba7
MK
986 {
987 /* FIXME: This seems to be necessary to make sure breakpoints
988 are removed. */
21bf60fe 989 if (!target_thread_alive (inferior_ptid))
39f77062 990 inferior_ptid = pid_to_ptid (GET_PID (inferior_ptid));
fb0e1ba7 991 else
39f77062 992 inferior_ptid = lwp_from_thread (inferior_ptid);
fb0e1ba7
MK
993 }
994
b4acd559
JJ
995 xfer =
996 target_beneath->to_xfer_memory (memaddr, myaddr, len, write, attrib,
997 target);
fb0e1ba7
MK
998
999 do_cleanups (old_chain);
1000 return xfer;
1001}
1002
1003static void
1004thread_db_fetch_registers (int regno)
1005{
5365276c 1006 struct thread_info *thread_info;
fb0e1ba7
MK
1007 prgregset_t gregset;
1008 gdb_prfpregset_t fpregset;
1009 td_err_e err;
1010
21bf60fe 1011 if (!is_thread (inferior_ptid))
fb0e1ba7
MK
1012 {
1013 /* Pass the request to the target beneath us. */
1014 target_beneath->to_fetch_registers (regno);
1015 return;
1016 }
1017
5365276c
DJ
1018 thread_info = find_thread_pid (inferior_ptid);
1019 thread_db_map_id2thr (thread_info, 1);
fb0e1ba7 1020
5365276c 1021 err = td_thr_getgregs_p (&thread_info->private->th, gregset);
fb0e1ba7
MK
1022 if (err != TD_OK)
1023 error ("Cannot fetch general-purpose registers for thread %ld: %s",
39f77062 1024 (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));
fb0e1ba7 1025
5365276c 1026 err = td_thr_getfpregs_p (&thread_info->private->th, &fpregset);
fb0e1ba7
MK
1027 if (err != TD_OK)
1028 error ("Cannot get floating-point registers for thread %ld: %s",
39f77062 1029 (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));
fb0e1ba7
MK
1030
1031 /* Note that we must call supply_gregset after calling the thread_db
1032 routines because the thread_db routines call ps_lgetgregs and
1033 friends which clobber GDB's register cache. */
1034 supply_gregset ((gdb_gregset_t *) gregset);
1035 supply_fpregset (&fpregset);
1036}
1037
1038static void
1039thread_db_store_registers (int regno)
1040{
fb0e1ba7
MK
1041 prgregset_t gregset;
1042 gdb_prfpregset_t fpregset;
1043 td_err_e err;
5365276c 1044 struct thread_info *thread_info;
fb0e1ba7 1045
21bf60fe 1046 if (!is_thread (inferior_ptid))
fb0e1ba7
MK
1047 {
1048 /* Pass the request to the target beneath us. */
1049 target_beneath->to_store_registers (regno);
1050 return;
1051 }
1052
5365276c
DJ
1053 thread_info = find_thread_pid (inferior_ptid);
1054 thread_db_map_id2thr (thread_info, 1);
fb0e1ba7
MK
1055
1056 if (regno != -1)
1057 {
123a958e 1058 char raw[MAX_REGISTER_SIZE];
fb0e1ba7 1059
4caf0990 1060 deprecated_read_register_gen (regno, raw);
fb0e1ba7 1061 thread_db_fetch_registers (-1);
23a6d369 1062 regcache_raw_supply (current_regcache, regno, raw);
fb0e1ba7
MK
1063 }
1064
1065 fill_gregset ((gdb_gregset_t *) gregset, -1);
1066 fill_fpregset (&fpregset, -1);
1067
5365276c 1068 err = td_thr_setgregs_p (&thread_info->private->th, gregset);
fb0e1ba7
MK
1069 if (err != TD_OK)
1070 error ("Cannot store general-purpose registers for thread %ld: %s",
39f77062 1071 (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));
5365276c 1072 err = td_thr_setfpregs_p (&thread_info->private->th, &fpregset);
fb0e1ba7
MK
1073 if (err != TD_OK)
1074 error ("Cannot store floating-point registers for thread %ld: %s",
39f77062 1075 (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));
fb0e1ba7
MK
1076}
1077
1078static void
1079thread_db_kill (void)
1080{
c194fbe1
MK
1081 /* There's no need to save & restore inferior_ptid here, since the
1082 inferior isn't supposed to survive this function call. */
1083 inferior_ptid = lwp_from_thread (inferior_ptid);
fb0e1ba7
MK
1084 target_beneath->to_kill ();
1085}
1086
1087static void
c27cda74
AC
1088thread_db_create_inferior (char *exec_file, char *allargs, char **env,
1089 int from_tty)
fb0e1ba7 1090{
b26a6851
AC
1091 unpush_target (&thread_db_ops);
1092 using_thread_db = 0;
c27cda74 1093 target_beneath->to_create_inferior (exec_file, allargs, env, from_tty);
bda9cb72 1094}
fb0e1ba7 1095
bda9cb72 1096static void
39f77062 1097thread_db_post_startup_inferior (ptid_t ptid)
bda9cb72
MK
1098{
1099 if (proc_handle.pid == 0)
1100 {
1101 /* The child process is now the actual multi-threaded
1102 program. Snatch its process ID... */
39f77062 1103 proc_handle.pid = GET_PID (ptid);
fb0e1ba7 1104
bda9cb72
MK
1105 /* ...and perform the remaining initialization steps. */
1106 enable_thread_event_reporting ();
21bf60fe 1107 thread_db_find_new_threads ();
bda9cb72 1108 }
fb0e1ba7
MK
1109}
1110
1111static void
1112thread_db_mourn_inferior (void)
1113{
1114 remove_thread_event_breakpoints ();
c194fbe1
MK
1115
1116 /* Forget about the child's process ID. We shouldn't need it
1117 anymore. */
1118 proc_handle.pid = 0;
fb0e1ba7
MK
1119
1120 target_beneath->to_mourn_inferior ();
043b2f77 1121
b26a6851
AC
1122 /* Detach thread_db target ops. */
1123 unpush_target (&thread_db_ops);
1124 using_thread_db = 0;
fb0e1ba7
MK
1125}
1126
1127static int
39f77062 1128thread_db_thread_alive (ptid_t ptid)
fb0e1ba7 1129{
5fd913cc 1130 td_thrhandle_t th;
21bf60fe 1131 td_err_e err;
5fd913cc 1132
39f77062 1133 if (is_thread (ptid))
fb0e1ba7 1134 {
5365276c
DJ
1135 struct thread_info *thread_info;
1136 thread_info = find_thread_pid (ptid);
fb0e1ba7 1137
5365276c 1138 thread_db_map_id2thr (thread_info, 0);
b4acd559 1139 if (!thread_info->private->th_valid)
fb0e1ba7
MK
1140 return 0;
1141
5365276c 1142 err = td_thr_validate_p (&thread_info->private->th);
5fd913cc
MS
1143 if (err != TD_OK)
1144 return 0;
1145
b4acd559 1146 if (!thread_info->private->ti_valid)
5365276c 1147 {
b4acd559
JJ
1148 err =
1149 td_thr_get_info_p (&thread_info->private->th,
1150 &thread_info->private->ti);
5365276c
DJ
1151 if (err != TD_OK)
1152 return 0;
1153 thread_info->private->ti_valid = 1;
1154 }
1155
1156 if (thread_info->private->ti.ti_state == TD_THR_UNKNOWN
1157 || thread_info->private->ti.ti_state == TD_THR_ZOMBIE)
21bf60fe 1158 return 0; /* A zombie thread. */
5fd913cc 1159
fb0e1ba7
MK
1160 return 1;
1161 }
1162
1163 if (target_beneath->to_thread_alive)
39f77062 1164 return target_beneath->to_thread_alive (ptid);
fb0e1ba7
MK
1165
1166 return 0;
1167}
1168
1169static int
1170find_new_threads_callback (const td_thrhandle_t *th_p, void *data)
1171{
1172 td_thrinfo_t ti;
1173 td_err_e err;
39f77062 1174 ptid_t ptid;
fb0e1ba7
MK
1175
1176 err = td_thr_get_info_p (th_p, &ti);
1177 if (err != TD_OK)
b4acd559 1178 error ("find_new_threads_callback: cannot get thread info: %s",
3197744f 1179 thread_db_err_str (err));
fb0e1ba7 1180
21bf60fe
MK
1181 if (ti.ti_state == TD_THR_UNKNOWN || ti.ti_state == TD_THR_ZOMBIE)
1182 return 0; /* A zombie -- ignore. */
5fd913cc 1183
39f77062 1184 ptid = BUILD_THREAD (ti.ti_tid, GET_PID (inferior_ptid));
fb0e1ba7 1185
21bf60fe 1186 if (!in_thread_list (ptid))
39f77062 1187 attach_thread (ptid, th_p, &ti, 1);
fb0e1ba7
MK
1188
1189 return 0;
1190}
1191
1192static void
1193thread_db_find_new_threads (void)
1194{
1195 td_err_e err;
1196
1197 /* Iterate over all user-space threads to discover new threads. */
1198 err = td_ta_thr_iter_p (thread_agent, find_new_threads_callback, NULL,
1199 TD_THR_ANY_STATE, TD_THR_LOWEST_PRIORITY,
1200 TD_SIGNO_MASK, TD_THR_ANY_USER_FLAGS);
1201 if (err != TD_OK)
1202 error ("Cannot find new threads: %s", thread_db_err_str (err));
1203}
1204
1205static char *
39f77062 1206thread_db_pid_to_str (ptid_t ptid)
fb0e1ba7 1207{
39f77062 1208 if (is_thread (ptid))
fb0e1ba7
MK
1209 {
1210 static char buf[64];
5365276c 1211 td_thrinfo_t *ti_p;
fb0e1ba7 1212 td_err_e err;
5365276c 1213 struct thread_info *thread_info;
fb0e1ba7 1214
5365276c
DJ
1215 thread_info = find_thread_pid (ptid);
1216 thread_db_map_id2thr (thread_info, 0);
b4acd559 1217 if (!thread_info->private->th_valid)
5365276c 1218 {
b4acd559
JJ
1219 snprintf (buf, sizeof (buf), "Thread %ld (Missing)",
1220 GET_THREAD (ptid));
5365276c
DJ
1221 return buf;
1222 }
fb0e1ba7 1223
5365276c 1224 ti_p = thread_db_get_info (thread_info);
fb0e1ba7 1225
5365276c 1226 if (ti_p->ti_state == TD_THR_ACTIVE && ti_p->ti_lid != 0)
fb0e1ba7
MK
1227 {
1228 snprintf (buf, sizeof (buf), "Thread %ld (LWP %d)",
5365276c 1229 (long) ti_p->ti_tid, ti_p->ti_lid);
fb0e1ba7
MK
1230 }
1231 else
1232 {
1233 snprintf (buf, sizeof (buf), "Thread %ld (%s)",
b4acd559
JJ
1234 (long) ti_p->ti_tid,
1235 thread_db_state_str (ti_p->ti_state));
fb0e1ba7
MK
1236 }
1237
1238 return buf;
1239 }
1240
39f77062
KB
1241 if (target_beneath->to_pid_to_str (ptid))
1242 return target_beneath->to_pid_to_str (ptid);
fb0e1ba7 1243
39f77062 1244 return normal_pid_to_str (ptid);
fb0e1ba7
MK
1245}
1246
3f47be5c
EZ
1247/* Get the address of the thread local variable in OBJFILE which is
1248 stored at OFFSET within the thread local storage for thread PTID. */
1249
1250static CORE_ADDR
1251thread_db_get_thread_local_address (ptid_t ptid, struct objfile *objfile,
b4acd559 1252 CORE_ADDR offset)
3f47be5c
EZ
1253{
1254 if (is_thread (ptid))
1255 {
1256 int objfile_is_library = (objfile->flags & OBJF_SHARED);
1257 td_err_e err;
3f47be5c
EZ
1258 void *address;
1259 CORE_ADDR lm;
5365276c 1260 struct thread_info *thread_info;
3f47be5c
EZ
1261
1262 /* glibc doesn't provide the needed interface. */
b4acd559
JJ
1263 if (!td_thr_tls_get_addr_p)
1264 error ("Cannot find thread-local variables in this thread library.");
3f47be5c
EZ
1265
1266 /* Get the address of the link map for this objfile. */
1267 lm = svr4_fetch_objfile_link_map (objfile);
1268
1269 /* Whoops, we couldn't find one. Bail out. */
1270 if (!lm)
b4acd559
JJ
1271 {
1272 if (objfile_is_library)
1273 error ("Cannot find shared library `%s' link_map in dynamic"
3f47be5c
EZ
1274 " linker's module list", objfile->name);
1275 else
b4acd559 1276 error ("Cannot find executable file `%s' link_map in dynamic"
3f47be5c
EZ
1277 " linker's module list", objfile->name);
1278 }
1279
1280 /* Get info about the thread. */
5365276c
DJ
1281 thread_info = find_thread_pid (ptid);
1282 thread_db_map_id2thr (thread_info, 1);
1283
3f47be5c 1284 /* Finally, get the address of the variable. */
5365276c
DJ
1285 err = td_thr_tls_get_addr_p (&thread_info->private->th, (void *) lm,
1286 offset, &address);
3f47be5c
EZ
1287
1288#ifdef THREAD_DB_HAS_TD_NOTALLOC
1289 /* The memory hasn't been allocated, yet. */
1290 if (err == TD_NOTALLOC)
b4acd559
JJ
1291 {
1292 /* Now, if libthread_db provided the initialization image's
1293 address, we *could* try to build a non-lvalue value from
1294 the initialization image. */
1295 if (objfile_is_library)
1296 error ("The inferior has not yet allocated storage for"
1297 " thread-local variables in\n"
1298 "the shared library `%s'\n"
1299 "for the thread %ld",
3f47be5c 1300 objfile->name, (long) GET_THREAD (ptid));
b4acd559
JJ
1301 else
1302 error ("The inferior has not yet allocated storage for"
1303 " thread-local variables in\n"
1304 "the executable `%s'\n"
1305 "for the thread %ld",
3f47be5c
EZ
1306 objfile->name, (long) GET_THREAD (ptid));
1307 }
1308#endif
1309
1310 /* Something else went wrong. */
1311 if (err != TD_OK)
1312 {
1313 if (objfile_is_library)
1314 error ("Cannot find thread-local storage for thread %ld, "
1315 "shared library %s:\n%s",
1316 (long) GET_THREAD (ptid),
b4acd559 1317 objfile->name, thread_db_err_str (err));
3f47be5c
EZ
1318 else
1319 error ("Cannot find thread-local storage for thread %ld, "
1320 "executable file %s:\n%s",
1321 (long) GET_THREAD (ptid),
b4acd559 1322 objfile->name, thread_db_err_str (err));
3f47be5c
EZ
1323 }
1324
1325 /* Cast assuming host == target. Joy. */
1326 return (CORE_ADDR) address;
1327 }
1328
1329 if (target_beneath->to_get_thread_local_address)
b4acd559
JJ
1330 return target_beneath->to_get_thread_local_address (ptid, objfile,
1331 offset);
3f47be5c
EZ
1332
1333 error ("Cannot find thread-local values on this target.");
1334}
1335
fb0e1ba7
MK
1336static void
1337init_thread_db_ops (void)
1338{
1339 thread_db_ops.to_shortname = "multi-thread";
1340 thread_db_ops.to_longname = "multi-threaded child process.";
1341 thread_db_ops.to_doc = "Threads and pthreads support.";
c194fbe1 1342 thread_db_ops.to_attach = thread_db_attach;
fb0e1ba7
MK
1343 thread_db_ops.to_detach = thread_db_detach;
1344 thread_db_ops.to_resume = thread_db_resume;
1345 thread_db_ops.to_wait = thread_db_wait;
1346 thread_db_ops.to_fetch_registers = thread_db_fetch_registers;
1347 thread_db_ops.to_store_registers = thread_db_store_registers;
1348 thread_db_ops.to_xfer_memory = thread_db_xfer_memory;
1349 thread_db_ops.to_kill = thread_db_kill;
1350 thread_db_ops.to_create_inferior = thread_db_create_inferior;
bda9cb72 1351 thread_db_ops.to_post_startup_inferior = thread_db_post_startup_inferior;
fb0e1ba7
MK
1352 thread_db_ops.to_mourn_inferior = thread_db_mourn_inferior;
1353 thread_db_ops.to_thread_alive = thread_db_thread_alive;
1354 thread_db_ops.to_find_new_threads = thread_db_find_new_threads;
1355 thread_db_ops.to_pid_to_str = thread_db_pid_to_str;
1356 thread_db_ops.to_stratum = thread_stratum;
1357 thread_db_ops.to_has_thread_control = tc_schedlock;
3f47be5c
EZ
1358 thread_db_ops.to_get_thread_local_address
1359 = thread_db_get_thread_local_address;
fb0e1ba7
MK
1360 thread_db_ops.to_magic = OPS_MAGIC;
1361}
1362
1363void
1364_initialize_thread_db (void)
1365{
1366 /* Only initialize the module if we can load libthread_db. */
1367 if (thread_db_load ())
1368 {
1369 init_thread_db_ops ();
1370 add_target (&thread_db_ops);
1371
1372 /* Add ourselves to objfile event chain. */
9a4105ab
AC
1373 target_new_objfile_chain = deprecated_target_new_objfile_hook;
1374 deprecated_target_new_objfile_hook = thread_db_new_objfile;
fb0e1ba7
MK
1375 }
1376}
This page took 0.507283 seconds and 4 git commands to generate.