Typo fix.
[deliverable/binutils-gdb.git] / gdb / linux-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"
93ad78a7 30#include "exceptions.h"
fb0e1ba7
MK
31#include "gdbthread.h"
32#include "inferior.h"
bda9cb72
MK
33#include "symfile.h"
34#include "objfiles.h"
fb0e1ba7 35#include "target.h"
4e052eda 36#include "regcache.h"
3f47be5c 37#include "solib-svr4.h"
fb0e1ba7 38
a2f23071
DJ
39#ifdef HAVE_GNU_LIBC_VERSION_H
40#include <gnu/libc-version.h>
41#endif
42
fb0e1ba7
MK
43#ifndef LIBTHREAD_DB_SO
44#define LIBTHREAD_DB_SO "libthread_db.so.1"
45#endif
46
8605d56e
AC
47/* If we're running on GNU/Linux, we must explicitly attach to any new
48 threads. */
fb0e1ba7
MK
49
50/* FIXME: There is certainly some room for improvements:
51 - Cache LWP ids.
52 - Bypass libthread_db when fetching or storing registers for
53 threads bound to a LWP. */
54
55/* This module's target vector. */
56static struct target_ops thread_db_ops;
57
58/* The target vector that we call for things this module can't handle. */
59static struct target_ops *target_beneath;
60
61/* Pointer to the next function on the objfile event chain. */
b4acd559 62static void (*target_new_objfile_chain) (struct objfile * objfile);
fb0e1ba7
MK
63
64/* Non-zero if we're using this module's target vector. */
65static int using_thread_db;
66
67/* Non-zero if we have determined the signals used by the threads
68 library. */
69static int thread_signals;
70static sigset_t thread_stop_set;
71static sigset_t thread_print_set;
72
73/* Structure that identifies the child process for the
74 <proc_service.h> interface. */
75static struct ps_prochandle proc_handle;
76
77/* Connection to the libthread_db library. */
78static td_thragent_t *thread_agent;
79
80/* Pointers to the libthread_db functions. */
81
82static td_err_e (*td_init_p) (void);
83
b4acd559
JJ
84static td_err_e (*td_ta_new_p) (struct ps_prochandle * ps,
85 td_thragent_t **ta);
fb0e1ba7
MK
86static td_err_e (*td_ta_map_id2thr_p) (const td_thragent_t *ta, thread_t pt,
87 td_thrhandle_t *__th);
b4acd559
JJ
88static td_err_e (*td_ta_map_lwp2thr_p) (const td_thragent_t *ta,
89 lwpid_t lwpid, td_thrhandle_t *th);
fb0e1ba7 90static td_err_e (*td_ta_thr_iter_p) (const td_thragent_t *ta,
b4acd559
JJ
91 td_thr_iter_f *callback, void *cbdata_p,
92 td_thr_state_e state, int ti_pri,
93 sigset_t *ti_sigmask_p,
fb0e1ba7
MK
94 unsigned int ti_user_flags);
95static td_err_e (*td_ta_event_addr_p) (const td_thragent_t *ta,
96 td_event_e event, td_notify_t *ptr);
97static td_err_e (*td_ta_set_event_p) (const td_thragent_t *ta,
98 td_thr_events_t *event);
99static td_err_e (*td_ta_event_getmsg_p) (const td_thragent_t *ta,
100 td_event_msg_t *msg);
101
102static td_err_e (*td_thr_validate_p) (const td_thrhandle_t *th);
103static td_err_e (*td_thr_get_info_p) (const td_thrhandle_t *th,
104 td_thrinfo_t *infop);
105static td_err_e (*td_thr_getfpregs_p) (const td_thrhandle_t *th,
106 gdb_prfpregset_t *regset);
107static td_err_e (*td_thr_getgregs_p) (const td_thrhandle_t *th,
108 prgregset_t gregs);
109static td_err_e (*td_thr_setfpregs_p) (const td_thrhandle_t *th,
110 const gdb_prfpregset_t *fpregs);
111static td_err_e (*td_thr_setgregs_p) (const td_thrhandle_t *th,
112 prgregset_t gregs);
b4acd559
JJ
113static td_err_e (*td_thr_event_enable_p) (const td_thrhandle_t *th,
114 int event);
fb0e1ba7 115
3f47be5c 116static td_err_e (*td_thr_tls_get_addr_p) (const td_thrhandle_t *th,
b4acd559
JJ
117 void *map_address,
118 size_t offset, void **address);
3f47be5c 119
fb0e1ba7
MK
120/* Location of the thread creation event breakpoint. The code at this
121 location in the child process will be called by the pthread library
122 whenever a new thread is created. By setting a special breakpoint
123 at this location, GDB can detect when a new thread is created. We
124 obtain this location via the td_ta_event_addr call. */
125static CORE_ADDR td_create_bp_addr;
126
127/* Location of the thread death event breakpoint. */
128static CORE_ADDR td_death_bp_addr;
129
130/* Prototypes for local functions. */
bda9cb72 131static void thread_db_find_new_threads (void);
5365276c
DJ
132static void attach_thread (ptid_t ptid, const td_thrhandle_t *th_p,
133 const td_thrinfo_t *ti_p, int verbose);
a2f23071 134static void detach_thread (ptid_t ptid, int verbose);
fb0e1ba7
MK
135\f
136
137/* Building process ids. */
138
ca6724c1
KB
139#define GET_PID(ptid) ptid_get_pid (ptid)
140#define GET_LWP(ptid) ptid_get_lwp (ptid)
141#define GET_THREAD(ptid) ptid_get_tid (ptid)
fb0e1ba7 142
ca6724c1
KB
143#define is_lwp(ptid) (GET_LWP (ptid) != 0)
144#define is_thread(ptid) (GET_THREAD (ptid) != 0)
fb0e1ba7 145
ca6724c1 146#define BUILD_LWP(lwp, pid) ptid_build (pid, lwp, 0)
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)
8a3fe4f8 266 error (_("thread_get_info_callback: cannot get thread info: %s"),
5365276c
DJ
267 thread_db_err_str (err));
268
269 /* Fill the cache. */
1bac0d4d 270 thread_ptid = ptid_build (GET_PID (inferior_ptid), ti.ti_lid, ti.ti_tid);
5365276c
DJ
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)
8a3fe4f8 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)
8a3fe4f8 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)
8a3fe4f8 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
1bac0d4d
DJ
388 return ptid_build (GET_PID (ptid), GET_LWP (ptid),
389 thread_info->private->ti.ti_tid);
fb0e1ba7
MK
390}
391
39f77062
KB
392static ptid_t
393lwp_from_thread (ptid_t ptid)
fb0e1ba7 394{
1bac0d4d 395 return BUILD_LWP (GET_LWP (ptid), GET_PID (ptid));
fb0e1ba7
MK
396}
397\f
398
399void
400thread_db_init (struct target_ops *target)
401{
402 target_beneath = target;
403}
404
5220ea4c
AC
405static void *
406verbose_dlsym (void *handle, const char *name)
407{
408 void *sym = dlsym (handle, name);
409 if (sym == NULL)
8a3fe4f8 410 warning (_("Symbol \"%s\" not found in libthread_db: %s"), name, dlerror ());
5220ea4c
AC
411 return sym;
412}
413
fb0e1ba7
MK
414static int
415thread_db_load (void)
416{
417 void *handle;
418 td_err_e err;
419
420 handle = dlopen (LIBTHREAD_DB_SO, RTLD_NOW);
421 if (handle == NULL)
f7c1e0f3 422 {
b4acd559 423 fprintf_filtered (gdb_stderr, "\n\ndlopen failed on '%s' - %s\n",
f7c1e0f3 424 LIBTHREAD_DB_SO, dlerror ());
b4acd559 425 fprintf_filtered (gdb_stderr,
f7c1e0f3
MS
426 "GDB will not be able to debug pthreads.\n\n");
427 return 0;
428 }
fb0e1ba7
MK
429
430 /* Initialize pointers to the dynamic library functions we will use.
431 Essential functions first. */
432
5220ea4c 433 td_init_p = verbose_dlsym (handle, "td_init");
fb0e1ba7
MK
434 if (td_init_p == NULL)
435 return 0;
436
5220ea4c 437 td_ta_new_p = verbose_dlsym (handle, "td_ta_new");
fb0e1ba7
MK
438 if (td_ta_new_p == NULL)
439 return 0;
440
5220ea4c 441 td_ta_map_id2thr_p = verbose_dlsym (handle, "td_ta_map_id2thr");
fb0e1ba7
MK
442 if (td_ta_map_id2thr_p == NULL)
443 return 0;
444
5220ea4c 445 td_ta_map_lwp2thr_p = verbose_dlsym (handle, "td_ta_map_lwp2thr");
fb0e1ba7
MK
446 if (td_ta_map_lwp2thr_p == NULL)
447 return 0;
448
5220ea4c 449 td_ta_thr_iter_p = verbose_dlsym (handle, "td_ta_thr_iter");
fb0e1ba7
MK
450 if (td_ta_thr_iter_p == NULL)
451 return 0;
452
5220ea4c 453 td_thr_validate_p = verbose_dlsym (handle, "td_thr_validate");
fb0e1ba7
MK
454 if (td_thr_validate_p == NULL)
455 return 0;
456
5220ea4c 457 td_thr_get_info_p = verbose_dlsym (handle, "td_thr_get_info");
fb0e1ba7
MK
458 if (td_thr_get_info_p == NULL)
459 return 0;
460
5220ea4c 461 td_thr_getfpregs_p = verbose_dlsym (handle, "td_thr_getfpregs");
fb0e1ba7
MK
462 if (td_thr_getfpregs_p == NULL)
463 return 0;
464
5220ea4c 465 td_thr_getgregs_p = verbose_dlsym (handle, "td_thr_getgregs");
fb0e1ba7
MK
466 if (td_thr_getgregs_p == NULL)
467 return 0;
468
5220ea4c 469 td_thr_setfpregs_p = verbose_dlsym (handle, "td_thr_setfpregs");
fb0e1ba7
MK
470 if (td_thr_setfpregs_p == NULL)
471 return 0;
472
5220ea4c 473 td_thr_setgregs_p = verbose_dlsym (handle, "td_thr_setgregs");
fb0e1ba7
MK
474 if (td_thr_setgregs_p == NULL)
475 return 0;
476
477 /* Initialize the library. */
478 err = td_init_p ();
479 if (err != TD_OK)
480 {
8a3fe4f8 481 warning (_("Cannot initialize libthread_db: %s"), thread_db_err_str (err));
fb0e1ba7
MK
482 return 0;
483 }
484
485 /* These are not essential. */
486 td_ta_event_addr_p = dlsym (handle, "td_ta_event_addr");
487 td_ta_set_event_p = dlsym (handle, "td_ta_set_event");
488 td_ta_event_getmsg_p = dlsym (handle, "td_ta_event_getmsg");
489 td_thr_event_enable_p = dlsym (handle, "td_thr_event_enable");
3f47be5c 490 td_thr_tls_get_addr_p = dlsym (handle, "td_thr_tls_get_addr");
fb0e1ba7
MK
491
492 return 1;
493}
494
cdbc0b18 495static td_err_e
24557e30
AC
496enable_thread_event (td_thragent_t *thread_agent, int event, CORE_ADDR *bp)
497{
498 td_notify_t notify;
cdbc0b18 499 td_err_e err;
24557e30
AC
500
501 /* Get the breakpoint address for thread EVENT. */
502 err = td_ta_event_addr_p (thread_agent, event, &notify);
503 if (err != TD_OK)
cdbc0b18 504 return err;
24557e30
AC
505
506 /* Set up the breakpoint. */
507 (*bp) = gdbarch_convert_from_func_ptr_addr (current_gdbarch,
508 (CORE_ADDR) notify.u.bptaddr,
509 &current_target);
510 create_thread_event_breakpoint ((*bp));
511
cdbc0b18 512 return TD_OK;
24557e30
AC
513}
514
fb0e1ba7
MK
515static void
516enable_thread_event_reporting (void)
517{
518 td_thr_events_t events;
519 td_notify_t notify;
520 td_err_e err;
a2f23071
DJ
521#ifdef HAVE_GNU_LIBC_VERSION_H
522 const char *libc_version;
523 int libc_major, libc_minor;
524#endif
fb0e1ba7
MK
525
526 /* We cannot use the thread event reporting facility if these
527 functions aren't available. */
528 if (td_ta_event_addr_p == NULL || td_ta_set_event_p == NULL
529 || td_ta_event_getmsg_p == NULL || td_thr_event_enable_p == NULL)
530 return;
531
532 /* Set the process wide mask saying which events we're interested in. */
533 td_event_emptyset (&events);
534 td_event_addset (&events, TD_CREATE);
a2f23071
DJ
535
536#ifdef HAVE_GNU_LIBC_VERSION_H
fb0e1ba7
MK
537 /* FIXME: kettenis/2000-04-23: The event reporting facility is
538 broken for TD_DEATH events in glibc 2.1.3, so don't enable it for
539 now. */
a2f23071
DJ
540 libc_version = gnu_get_libc_version ();
541 if (sscanf (libc_version, "%d.%d", &libc_major, &libc_minor) == 2
542 && (libc_major > 2 || (libc_major == 2 && libc_minor > 1)))
fb0e1ba7 543#endif
a2f23071 544 td_event_addset (&events, TD_DEATH);
fb0e1ba7
MK
545
546 err = td_ta_set_event_p (thread_agent, &events);
547 if (err != TD_OK)
548 {
8a3fe4f8 549 warning (_("Unable to set global thread event mask: %s"),
fb0e1ba7
MK
550 thread_db_err_str (err));
551 return;
552 }
553
554 /* Delete previous thread event breakpoints, if any. */
555 remove_thread_event_breakpoints ();
24557e30
AC
556 td_create_bp_addr = 0;
557 td_death_bp_addr = 0;
fb0e1ba7 558
24557e30 559 /* Set up the thread creation event. */
cdbc0b18
RM
560 err = enable_thread_event (thread_agent, TD_CREATE, &td_create_bp_addr);
561 if (err != TD_OK)
fb0e1ba7 562 {
8a3fe4f8 563 warning (_("Unable to get location for thread creation breakpoint: %s"),
fb0e1ba7
MK
564 thread_db_err_str (err));
565 return;
566 }
567
24557e30 568 /* Set up the thread death event. */
cdbc0b18
RM
569 err = enable_thread_event (thread_agent, TD_DEATH, &td_death_bp_addr);
570 if (err != TD_OK)
fb0e1ba7 571 {
8a3fe4f8 572 warning (_("Unable to get location for thread death breakpoint: %s"),
fb0e1ba7
MK
573 thread_db_err_str (err));
574 return;
575 }
fb0e1ba7
MK
576}
577
578static void
579disable_thread_event_reporting (void)
580{
581 td_thr_events_t events;
582
583 /* Set the process wide mask saying we aren't interested in any
584 events anymore. */
585 td_event_emptyset (&events);
586 td_ta_set_event_p (thread_agent, &events);
587
588 /* Delete thread event breakpoints, if any. */
589 remove_thread_event_breakpoints ();
590 td_create_bp_addr = 0;
591 td_death_bp_addr = 0;
592}
593
594static void
595check_thread_signals (void)
596{
597#ifdef GET_THREAD_SIGNALS
21bf60fe 598 if (!thread_signals)
fb0e1ba7
MK
599 {
600 sigset_t mask;
601 int i;
602
603 GET_THREAD_SIGNALS (&mask);
604 sigemptyset (&thread_stop_set);
605 sigemptyset (&thread_print_set);
606
b9569773 607 for (i = 1; i < NSIG; i++)
fb0e1ba7
MK
608 {
609 if (sigismember (&mask, i))
610 {
611 if (signal_stop_update (target_signal_from_host (i), 0))
612 sigaddset (&thread_stop_set, i);
613 if (signal_print_update (target_signal_from_host (i), 0))
614 sigaddset (&thread_print_set, i);
615 thread_signals = 1;
616 }
617 }
618 }
619#endif
620}
621
fb0e1ba7
MK
622static void
623thread_db_new_objfile (struct objfile *objfile)
624{
625 td_err_e err;
626
5220ea4c
AC
627 /* First time through, report that libthread_db was successfuly
628 loaded. Can't print this in in thread_db_load as, at that stage,
629 the interpreter and it's console haven't started. The real
630 problem here is that libthread_db is loaded too early - it should
631 only be loaded when there is a program to debug. */
632 {
633 static int dejavu;
634 if (!dejavu)
635 {
636 Dl_info info;
637 const char *library = NULL;
638 /* Try dladdr. */
639 if (dladdr ((*td_ta_new_p), &info) != 0)
640 library = info.dli_fname;
641 /* Try dlinfo? */
642 if (library == NULL)
643 /* Paranoid - don't let a NULL path slip through. */
644 library = LIBTHREAD_DB_SO;
a3f17187 645 printf_unfiltered (_("Using host libthread_db library \"%s\".\n"),
5220ea4c
AC
646 library);
647 dejavu = 1;
648 }
649 }
650
5bbd998e
MS
651 /* Don't attempt to use thread_db on targets which can not run
652 (core files). */
653 if (objfile == NULL || !target_has_execution)
bda9cb72
MK
654 {
655 /* All symbols have been discarded. If the thread_db target is
c194fbe1 656 active, deactivate it now. */
bda9cb72 657 if (using_thread_db)
c194fbe1
MK
658 {
659 gdb_assert (proc_handle.pid == 0);
660 unpush_target (&thread_db_ops);
661 using_thread_db = 0;
662 }
663
bda9cb72
MK
664 goto quit;
665 }
666
fb0e1ba7
MK
667 if (using_thread_db)
668 /* Nothing to do. The thread library was already detected and the
669 target vector was already activated. */
670 goto quit;
671
bda9cb72
MK
672 /* Initialize the structure that identifies the child process. Note
673 that at this point there is no guarantee that we actually have a
674 child process. */
39f77062 675 proc_handle.pid = GET_PID (inferior_ptid);
fb0e1ba7 676
bda9cb72 677 /* Now attempt to open a connection to the thread library. */
fb0e1ba7
MK
678 err = td_ta_new_p (&proc_handle, &thread_agent);
679 switch (err)
680 {
681 case TD_NOLIBTHREAD:
bda9cb72 682 /* No thread library was detected. */
fb0e1ba7
MK
683 break;
684
685 case TD_OK:
a3f17187 686 printf_unfiltered (_("[Thread debugging using libthread_db enabled]\n"));
5220ea4c 687
bda9cb72
MK
688 /* The thread library was detected. Activate the thread_db target. */
689 push_target (&thread_db_ops);
690 using_thread_db = 1;
691
95575b2e
AC
692 enable_thread_event_reporting ();
693 thread_db_find_new_threads ();
fb0e1ba7
MK
694 break;
695
696 default:
8a3fe4f8 697 warning (_("Cannot initialize thread debugging library: %s"),
fb0e1ba7
MK
698 thread_db_err_str (err));
699 break;
700 }
701
b4acd559 702quit:
540af400
MS
703 if (target_new_objfile_chain)
704 target_new_objfile_chain (objfile);
fb0e1ba7
MK
705}
706
a2f23071
DJ
707/* Attach to a new thread. This function is called when we receive a
708 TD_CREATE event or when we iterate over all threads and find one
709 that wasn't already in our list. */
710
fb0e1ba7 711static void
39f77062 712attach_thread (ptid_t ptid, const td_thrhandle_t *th_p,
fb0e1ba7
MK
713 const td_thrinfo_t *ti_p, int verbose)
714{
715 struct thread_info *tp;
716 td_err_e err;
717
a2f23071
DJ
718 /* If we're being called after a TD_CREATE event, we may already
719 know about this thread. There are two ways this can happen. We
720 may have iterated over all threads between the thread creation
721 and the TD_CREATE event, for instance when the user has issued
722 the `info threads' command before the SIGTRAP for hitting the
723 thread creation breakpoint was reported. Alternatively, the
724 thread may have exited and a new one been created with the same
725 thread ID. In the first case we don't need to do anything; in
726 the second case we should discard information about the dead
727 thread and attach to the new one. */
728 if (in_thread_list (ptid))
729 {
730 tp = find_thread_pid (ptid);
731 gdb_assert (tp != NULL);
732
733 if (!tp->private->dying)
734 return;
735
736 delete_thread (ptid);
737 }
738
fb0e1ba7
MK
739 check_thread_signals ();
740
fb0e1ba7 741 /* Add the thread to GDB's thread list. */
39f77062 742 tp = add_thread (ptid);
fb0e1ba7 743 tp->private = xmalloc (sizeof (struct private_thread_info));
5365276c
DJ
744 memset (tp->private, 0, sizeof (struct private_thread_info));
745
746 if (verbose)
a3f17187 747 printf_unfiltered (_("[New %s]\n"), target_pid_to_str (ptid));
fb0e1ba7 748
21bf60fe
MK
749 if (ti_p->ti_state == TD_THR_UNKNOWN || ti_p->ti_state == TD_THR_ZOMBIE)
750 return; /* A zombie thread -- do not attach. */
5fd913cc 751
8605d56e 752 /* Under GNU/Linux, we have to attach to each and every thread. */
fb0e1ba7 753#ifdef ATTACH_LWP
c194fbe1 754 ATTACH_LWP (BUILD_LWP (ti_p->ti_lid, GET_PID (ptid)), 0);
fb0e1ba7
MK
755#endif
756
757 /* Enable thread event reporting for this thread. */
758 err = td_thr_event_enable_p (th_p, 1);
759 if (err != TD_OK)
8a3fe4f8 760 error (_("Cannot enable thread event reporting for %s: %s"),
39f77062 761 target_pid_to_str (ptid), thread_db_err_str (err));
fb0e1ba7
MK
762}
763
c194fbe1
MK
764static void
765thread_db_attach (char *args, int from_tty)
766{
767 target_beneath->to_attach (args, from_tty);
768
769 /* Destroy thread info; it's no longer valid. */
770 init_thread_list ();
771
772 /* The child process is now the actual multi-threaded
773 program. Snatch its process ID... */
774 proc_handle.pid = GET_PID (inferior_ptid);
775
776 /* ...and perform the remaining initialization steps. */
777 enable_thread_event_reporting ();
b4acd559 778 thread_db_find_new_threads ();
c194fbe1
MK
779}
780
fb0e1ba7 781static void
39f77062 782detach_thread (ptid_t ptid, int verbose)
fb0e1ba7 783{
a2f23071
DJ
784 struct thread_info *thread_info;
785
fb0e1ba7 786 if (verbose)
a3f17187 787 printf_unfiltered (_("[%s exited]\n"), target_pid_to_str (ptid));
a2f23071
DJ
788
789 /* Don't delete the thread now, because it still reports as active
790 until it has executed a few instructions after the event
791 breakpoint - if we deleted it now, "info threads" would cause us
792 to re-attach to it. Just mark it as having had a TD_DEATH
793 event. This means that we won't delete it from our thread list
794 until we notice that it's dead (via prune_threads), or until
795 something re-uses its thread ID. */
796 thread_info = find_thread_pid (ptid);
797 gdb_assert (thread_info != NULL);
798 thread_info->private->dying = 1;
fb0e1ba7
MK
799}
800
801static void
802thread_db_detach (char *args, int from_tty)
803{
804 disable_thread_event_reporting ();
c194fbe1
MK
805
806 /* There's no need to save & restore inferior_ptid here, since the
807 inferior is supposed to be survive this function call. */
808 inferior_ptid = lwp_from_thread (inferior_ptid);
809
810 /* Forget about the child's process ID. We shouldn't need it
811 anymore. */
812 proc_handle.pid = 0;
fb0e1ba7
MK
813
814 target_beneath->to_detach (args, from_tty);
815}
816
5365276c
DJ
817static int
818clear_lwpid_callback (struct thread_info *thread, void *dummy)
819{
820 /* If we know that our thread implementation is 1-to-1, we could save
821 a certain amount of information; it's not clear how much, so we
822 are always conservative. */
823
824 thread->private->th_valid = 0;
825 thread->private->ti_valid = 0;
826
827 return 0;
828}
829
fb0e1ba7 830static void
39f77062 831thread_db_resume (ptid_t ptid, int step, enum target_signal signo)
fb0e1ba7 832{
39f77062 833 struct cleanup *old_chain = save_inferior_ptid ();
fb0e1ba7 834
39f77062
KB
835 if (GET_PID (ptid) == -1)
836 inferior_ptid = lwp_from_thread (inferior_ptid);
837 else if (is_thread (ptid))
838 ptid = lwp_from_thread (ptid);
fb0e1ba7 839
5365276c
DJ
840 /* Clear cached data which may not be valid after the resume. */
841 iterate_over_threads (clear_lwpid_callback, NULL);
842
39f77062 843 target_beneath->to_resume (ptid, step, signo);
fb0e1ba7
MK
844
845 do_cleanups (old_chain);
846}
847
848/* Check if PID is currently stopped at the location of a thread event
849 breakpoint location. If it is, read the event message and act upon
850 the event. */
851
852static void
39f77062 853check_event (ptid_t ptid)
fb0e1ba7
MK
854{
855 td_event_msg_t msg;
856 td_thrinfo_t ti;
857 td_err_e err;
858 CORE_ADDR stop_pc;
4d9850d3 859 int loop = 0;
fb0e1ba7
MK
860
861 /* Bail out early if we're not at a thread event breakpoint. */
39f77062 862 stop_pc = read_pc_pid (ptid) - DECR_PC_AFTER_BREAK;
fb0e1ba7
MK
863 if (stop_pc != td_create_bp_addr && stop_pc != td_death_bp_addr)
864 return;
865
4d9850d3
JJ
866 /* If we are at a create breakpoint, we do not know what new lwp
867 was created and cannot specifically locate the event message for it.
868 We have to call td_ta_event_getmsg() to get
869 the latest message. Since we have no way of correlating whether
cdbc0b18 870 the event message we get back corresponds to our breakpoint, we must
4d9850d3 871 loop and read all event messages, processing them appropriately.
cdbc0b18
RM
872 This guarantees we will process the correct message before continuing
873 from the breakpoint.
4d9850d3
JJ
874
875 Currently, death events are not enabled. If they are enabled,
876 the death event can use the td_thr_event_getmsg() interface to
877 get the message specifically for that lwp and avoid looping
878 below. */
879
880 loop = 1;
881
882 do
fb0e1ba7 883 {
4d9850d3
JJ
884 err = td_ta_event_getmsg_p (thread_agent, &msg);
885 if (err != TD_OK)
886 {
887 if (err == TD_NOMSG)
888 return;
fb0e1ba7 889
8a3fe4f8 890 error (_("Cannot get thread event message: %s"),
4d9850d3
JJ
891 thread_db_err_str (err));
892 }
fb0e1ba7 893
4d9850d3
JJ
894 err = td_thr_get_info_p (msg.th_p, &ti);
895 if (err != TD_OK)
8a3fe4f8 896 error (_("Cannot get thread info: %s"), thread_db_err_str (err));
fb0e1ba7 897
1bac0d4d 898 ptid = ptid_build (GET_PID (ptid), ti.ti_lid, ti.ti_tid);
fb0e1ba7 899
4d9850d3
JJ
900 switch (msg.event)
901 {
902 case TD_CREATE:
a2f23071
DJ
903 /* Call attach_thread whether or not we already know about a
904 thread with this thread ID. */
905 attach_thread (ptid, msg.th_p, &ti, 1);
fb0e1ba7 906
4d9850d3 907 break;
fb0e1ba7 908
4d9850d3 909 case TD_DEATH:
fb0e1ba7 910
4d9850d3 911 if (!in_thread_list (ptid))
8a3fe4f8 912 error (_("Spurious thread death event."));
fb0e1ba7 913
4d9850d3 914 detach_thread (ptid, 1);
fb0e1ba7 915
4d9850d3 916 break;
fb0e1ba7 917
4d9850d3 918 default:
8a3fe4f8 919 error (_("Spurious thread event."));
4d9850d3 920 }
fb0e1ba7 921 }
4d9850d3 922 while (loop);
fb0e1ba7
MK
923}
924
39f77062
KB
925static ptid_t
926thread_db_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
fb0e1ba7 927{
39f77062 928 extern ptid_t trap_ptid;
fb0e1ba7 929
39f77062
KB
930 if (GET_PID (ptid) != -1 && is_thread (ptid))
931 ptid = lwp_from_thread (ptid);
fb0e1ba7 932
39f77062 933 ptid = target_beneath->to_wait (ptid, ourstatus);
fb0e1ba7 934
bda9cb72
MK
935 if (proc_handle.pid == 0)
936 /* The current child process isn't the actual multi-threaded
937 program yet, so don't try to do any special thread-specific
938 post-processing and bail out early. */
39f77062 939 return ptid;
bda9cb72 940
fb0e1ba7 941 if (ourstatus->kind == TARGET_WAITKIND_EXITED)
39f77062 942 return pid_to_ptid (-1);
fb0e1ba7
MK
943
944 if (ourstatus->kind == TARGET_WAITKIND_STOPPED
945 && ourstatus->value.sig == TARGET_SIGNAL_TRAP)
946 /* Check for a thread event. */
39f77062 947 check_event (ptid);
fb0e1ba7 948
39f77062
KB
949 if (!ptid_equal (trap_ptid, null_ptid))
950 trap_ptid = thread_from_lwp (trap_ptid);
fb0e1ba7 951
b9b5d7ea
JJ
952 /* Change the ptid back into the higher level PID + TID format.
953 If the thread is dead and no longer on the thread list, we will
954 get back a dead ptid. This can occur if the thread death event
955 gets postponed by other simultaneous events. In such a case,
956 we want to just ignore the event and continue on. */
957 ptid = thread_from_lwp (ptid);
958 if (GET_PID (ptid) == -1)
959 ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
960
961 return ptid;
fb0e1ba7
MK
962}
963
964static int
965thread_db_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
b4acd559 966 struct mem_attrib *attrib, struct target_ops *target)
fb0e1ba7 967{
39f77062 968 struct cleanup *old_chain = save_inferior_ptid ();
fb0e1ba7
MK
969 int xfer;
970
39f77062 971 if (is_thread (inferior_ptid))
fb0e1ba7
MK
972 {
973 /* FIXME: This seems to be necessary to make sure breakpoints
974 are removed. */
21bf60fe 975 if (!target_thread_alive (inferior_ptid))
39f77062 976 inferior_ptid = pid_to_ptid (GET_PID (inferior_ptid));
fb0e1ba7 977 else
39f77062 978 inferior_ptid = lwp_from_thread (inferior_ptid);
fb0e1ba7
MK
979 }
980
b4acd559 981 xfer =
c8e73a31
AC
982 target_beneath->deprecated_xfer_memory (memaddr, myaddr, len, write,
983 attrib, target);
fb0e1ba7
MK
984
985 do_cleanups (old_chain);
986 return xfer;
987}
988
989static void
990thread_db_fetch_registers (int regno)
991{
5365276c 992 struct thread_info *thread_info;
fb0e1ba7
MK
993 prgregset_t gregset;
994 gdb_prfpregset_t fpregset;
995 td_err_e err;
996
21bf60fe 997 if (!is_thread (inferior_ptid))
fb0e1ba7
MK
998 {
999 /* Pass the request to the target beneath us. */
1000 target_beneath->to_fetch_registers (regno);
1001 return;
1002 }
1003
5365276c
DJ
1004 thread_info = find_thread_pid (inferior_ptid);
1005 thread_db_map_id2thr (thread_info, 1);
fb0e1ba7 1006
5365276c 1007 err = td_thr_getgregs_p (&thread_info->private->th, gregset);
fb0e1ba7 1008 if (err != TD_OK)
8a3fe4f8 1009 error (_("Cannot fetch general-purpose registers for thread %ld: %s"),
39f77062 1010 (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));
fb0e1ba7 1011
5365276c 1012 err = td_thr_getfpregs_p (&thread_info->private->th, &fpregset);
fb0e1ba7 1013 if (err != TD_OK)
8a3fe4f8 1014 error (_("Cannot get floating-point registers for thread %ld: %s"),
39f77062 1015 (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));
fb0e1ba7
MK
1016
1017 /* Note that we must call supply_gregset after calling the thread_db
1018 routines because the thread_db routines call ps_lgetgregs and
1019 friends which clobber GDB's register cache. */
1020 supply_gregset ((gdb_gregset_t *) gregset);
1021 supply_fpregset (&fpregset);
1022}
1023
1024static void
1025thread_db_store_registers (int regno)
1026{
fb0e1ba7
MK
1027 prgregset_t gregset;
1028 gdb_prfpregset_t fpregset;
1029 td_err_e err;
5365276c 1030 struct thread_info *thread_info;
fb0e1ba7 1031
21bf60fe 1032 if (!is_thread (inferior_ptid))
fb0e1ba7
MK
1033 {
1034 /* Pass the request to the target beneath us. */
1035 target_beneath->to_store_registers (regno);
1036 return;
1037 }
1038
5365276c
DJ
1039 thread_info = find_thread_pid (inferior_ptid);
1040 thread_db_map_id2thr (thread_info, 1);
fb0e1ba7
MK
1041
1042 if (regno != -1)
1043 {
123a958e 1044 char raw[MAX_REGISTER_SIZE];
fb0e1ba7 1045
4caf0990 1046 deprecated_read_register_gen (regno, raw);
fb0e1ba7 1047 thread_db_fetch_registers (-1);
23a6d369 1048 regcache_raw_supply (current_regcache, regno, raw);
fb0e1ba7
MK
1049 }
1050
1051 fill_gregset ((gdb_gregset_t *) gregset, -1);
1052 fill_fpregset (&fpregset, -1);
1053
5365276c 1054 err = td_thr_setgregs_p (&thread_info->private->th, gregset);
fb0e1ba7 1055 if (err != TD_OK)
8a3fe4f8 1056 error (_("Cannot store general-purpose registers for thread %ld: %s"),
39f77062 1057 (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));
5365276c 1058 err = td_thr_setfpregs_p (&thread_info->private->th, &fpregset);
fb0e1ba7 1059 if (err != TD_OK)
8a3fe4f8 1060 error (_("Cannot store floating-point registers for thread %ld: %s"),
39f77062 1061 (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));
fb0e1ba7
MK
1062}
1063
1064static void
1065thread_db_kill (void)
1066{
c194fbe1
MK
1067 /* There's no need to save & restore inferior_ptid here, since the
1068 inferior isn't supposed to survive this function call. */
1069 inferior_ptid = lwp_from_thread (inferior_ptid);
fb0e1ba7
MK
1070 target_beneath->to_kill ();
1071}
1072
1073static void
c27cda74
AC
1074thread_db_create_inferior (char *exec_file, char *allargs, char **env,
1075 int from_tty)
fb0e1ba7 1076{
b26a6851
AC
1077 unpush_target (&thread_db_ops);
1078 using_thread_db = 0;
c27cda74 1079 target_beneath->to_create_inferior (exec_file, allargs, env, from_tty);
bda9cb72 1080}
fb0e1ba7 1081
bda9cb72 1082static void
39f77062 1083thread_db_post_startup_inferior (ptid_t ptid)
bda9cb72
MK
1084{
1085 if (proc_handle.pid == 0)
1086 {
1087 /* The child process is now the actual multi-threaded
1088 program. Snatch its process ID... */
39f77062 1089 proc_handle.pid = GET_PID (ptid);
fb0e1ba7 1090
bda9cb72
MK
1091 /* ...and perform the remaining initialization steps. */
1092 enable_thread_event_reporting ();
21bf60fe 1093 thread_db_find_new_threads ();
bda9cb72 1094 }
fb0e1ba7
MK
1095}
1096
1097static void
1098thread_db_mourn_inferior (void)
1099{
1100 remove_thread_event_breakpoints ();
c194fbe1
MK
1101
1102 /* Forget about the child's process ID. We shouldn't need it
1103 anymore. */
1104 proc_handle.pid = 0;
fb0e1ba7
MK
1105
1106 target_beneath->to_mourn_inferior ();
043b2f77 1107
b26a6851
AC
1108 /* Detach thread_db target ops. */
1109 unpush_target (&thread_db_ops);
1110 using_thread_db = 0;
fb0e1ba7
MK
1111}
1112
1113static int
39f77062 1114thread_db_thread_alive (ptid_t ptid)
fb0e1ba7 1115{
5fd913cc 1116 td_thrhandle_t th;
21bf60fe 1117 td_err_e err;
5fd913cc 1118
39f77062 1119 if (is_thread (ptid))
fb0e1ba7 1120 {
5365276c
DJ
1121 struct thread_info *thread_info;
1122 thread_info = find_thread_pid (ptid);
fb0e1ba7 1123
5365276c 1124 thread_db_map_id2thr (thread_info, 0);
b4acd559 1125 if (!thread_info->private->th_valid)
fb0e1ba7
MK
1126 return 0;
1127
5365276c 1128 err = td_thr_validate_p (&thread_info->private->th);
5fd913cc
MS
1129 if (err != TD_OK)
1130 return 0;
1131
b4acd559 1132 if (!thread_info->private->ti_valid)
5365276c 1133 {
b4acd559
JJ
1134 err =
1135 td_thr_get_info_p (&thread_info->private->th,
1136 &thread_info->private->ti);
5365276c
DJ
1137 if (err != TD_OK)
1138 return 0;
1139 thread_info->private->ti_valid = 1;
1140 }
1141
1142 if (thread_info->private->ti.ti_state == TD_THR_UNKNOWN
1143 || thread_info->private->ti.ti_state == TD_THR_ZOMBIE)
21bf60fe 1144 return 0; /* A zombie thread. */
5fd913cc 1145
fb0e1ba7
MK
1146 return 1;
1147 }
1148
1149 if (target_beneath->to_thread_alive)
39f77062 1150 return target_beneath->to_thread_alive (ptid);
fb0e1ba7
MK
1151
1152 return 0;
1153}
1154
1155static int
1156find_new_threads_callback (const td_thrhandle_t *th_p, void *data)
1157{
1158 td_thrinfo_t ti;
1159 td_err_e err;
39f77062 1160 ptid_t ptid;
fb0e1ba7
MK
1161
1162 err = td_thr_get_info_p (th_p, &ti);
1163 if (err != TD_OK)
8a3fe4f8 1164 error (_("find_new_threads_callback: cannot get thread info: %s"),
3197744f 1165 thread_db_err_str (err));
fb0e1ba7 1166
21bf60fe
MK
1167 if (ti.ti_state == TD_THR_UNKNOWN || ti.ti_state == TD_THR_ZOMBIE)
1168 return 0; /* A zombie -- ignore. */
5fd913cc 1169
1bac0d4d 1170 ptid = ptid_build (GET_PID (inferior_ptid), ti.ti_lid, ti.ti_tid);
fb0e1ba7 1171
21bf60fe 1172 if (!in_thread_list (ptid))
39f77062 1173 attach_thread (ptid, th_p, &ti, 1);
fb0e1ba7
MK
1174
1175 return 0;
1176}
1177
1178static void
1179thread_db_find_new_threads (void)
1180{
1181 td_err_e err;
1182
1183 /* Iterate over all user-space threads to discover new threads. */
1184 err = td_ta_thr_iter_p (thread_agent, find_new_threads_callback, NULL,
1185 TD_THR_ANY_STATE, TD_THR_LOWEST_PRIORITY,
1186 TD_SIGNO_MASK, TD_THR_ANY_USER_FLAGS);
1187 if (err != TD_OK)
8a3fe4f8 1188 error (_("Cannot find new threads: %s"), thread_db_err_str (err));
fb0e1ba7
MK
1189}
1190
1191static char *
39f77062 1192thread_db_pid_to_str (ptid_t ptid)
fb0e1ba7 1193{
39f77062 1194 if (is_thread (ptid))
fb0e1ba7
MK
1195 {
1196 static char buf[64];
5365276c 1197 td_thrinfo_t *ti_p;
fb0e1ba7 1198 td_err_e err;
5365276c 1199 struct thread_info *thread_info;
fb0e1ba7 1200
5365276c
DJ
1201 thread_info = find_thread_pid (ptid);
1202 thread_db_map_id2thr (thread_info, 0);
b4acd559 1203 if (!thread_info->private->th_valid)
5365276c 1204 {
b4acd559
JJ
1205 snprintf (buf, sizeof (buf), "Thread %ld (Missing)",
1206 GET_THREAD (ptid));
5365276c
DJ
1207 return buf;
1208 }
fb0e1ba7 1209
5365276c 1210 ti_p = thread_db_get_info (thread_info);
fb0e1ba7 1211
5365276c 1212 if (ti_p->ti_state == TD_THR_ACTIVE && ti_p->ti_lid != 0)
fb0e1ba7
MK
1213 {
1214 snprintf (buf, sizeof (buf), "Thread %ld (LWP %d)",
5365276c 1215 (long) ti_p->ti_tid, ti_p->ti_lid);
fb0e1ba7
MK
1216 }
1217 else
1218 {
1219 snprintf (buf, sizeof (buf), "Thread %ld (%s)",
b4acd559
JJ
1220 (long) ti_p->ti_tid,
1221 thread_db_state_str (ti_p->ti_state));
fb0e1ba7
MK
1222 }
1223
1224 return buf;
1225 }
1226
39f77062
KB
1227 if (target_beneath->to_pid_to_str (ptid))
1228 return target_beneath->to_pid_to_str (ptid);
fb0e1ba7 1229
39f77062 1230 return normal_pid_to_str (ptid);
fb0e1ba7
MK
1231}
1232
b2756930
KB
1233/* Get the address of the thread local variable in load module LM which
1234 is stored at OFFSET within the thread local storage for thread PTID. */
3f47be5c
EZ
1235
1236static CORE_ADDR
b2756930
KB
1237thread_db_get_thread_local_address (ptid_t ptid,
1238 CORE_ADDR lm,
b4acd559 1239 CORE_ADDR offset)
3f47be5c
EZ
1240{
1241 if (is_thread (ptid))
1242 {
3f47be5c 1243 td_err_e err;
3f47be5c 1244 void *address;
5365276c 1245 struct thread_info *thread_info;
3f47be5c
EZ
1246
1247 /* glibc doesn't provide the needed interface. */
b4acd559 1248 if (!td_thr_tls_get_addr_p)
109c3e39
AC
1249 throw_error (TLS_NO_LIBRARY_SUPPORT_ERROR,
1250 _("No TLS library support"));
3f47be5c 1251
b2756930
KB
1252 /* Caller should have verified that lm != 0. */
1253 gdb_assert (lm != 0);
3f47be5c
EZ
1254
1255 /* Get info about the thread. */
5365276c
DJ
1256 thread_info = find_thread_pid (ptid);
1257 thread_db_map_id2thr (thread_info, 1);
1258
3f47be5c 1259 /* Finally, get the address of the variable. */
5365276c
DJ
1260 err = td_thr_tls_get_addr_p (&thread_info->private->th, (void *) lm,
1261 offset, &address);
3f47be5c
EZ
1262
1263#ifdef THREAD_DB_HAS_TD_NOTALLOC
1264 /* The memory hasn't been allocated, yet. */
1265 if (err == TD_NOTALLOC)
b4acd559
JJ
1266 /* Now, if libthread_db provided the initialization image's
1267 address, we *could* try to build a non-lvalue value from
1268 the initialization image. */
109c3e39
AC
1269 throw_error (TLS_NOT_ALLOCATED_YET_ERROR,
1270 _("TLS not allocated yet"));
3f47be5c
EZ
1271#endif
1272
1273 /* Something else went wrong. */
1274 if (err != TD_OK)
109c3e39
AC
1275 throw_error (TLS_GENERIC_ERROR,
1276 (("%s")), thread_db_err_str (err));
3f47be5c
EZ
1277
1278 /* Cast assuming host == target. Joy. */
1279 return (CORE_ADDR) address;
1280 }
1281
1282 if (target_beneath->to_get_thread_local_address)
b2756930 1283 return target_beneath->to_get_thread_local_address (ptid, lm, offset);
93ad78a7 1284 else
109c3e39
AC
1285 throw_error (TLS_GENERIC_ERROR,
1286 _("TLS not supported on this target"));
3f47be5c
EZ
1287}
1288
fb0e1ba7
MK
1289static void
1290init_thread_db_ops (void)
1291{
1292 thread_db_ops.to_shortname = "multi-thread";
1293 thread_db_ops.to_longname = "multi-threaded child process.";
1294 thread_db_ops.to_doc = "Threads and pthreads support.";
c194fbe1 1295 thread_db_ops.to_attach = thread_db_attach;
fb0e1ba7
MK
1296 thread_db_ops.to_detach = thread_db_detach;
1297 thread_db_ops.to_resume = thread_db_resume;
1298 thread_db_ops.to_wait = thread_db_wait;
1299 thread_db_ops.to_fetch_registers = thread_db_fetch_registers;
1300 thread_db_ops.to_store_registers = thread_db_store_registers;
c8e73a31 1301 thread_db_ops.deprecated_xfer_memory = thread_db_xfer_memory;
fb0e1ba7
MK
1302 thread_db_ops.to_kill = thread_db_kill;
1303 thread_db_ops.to_create_inferior = thread_db_create_inferior;
bda9cb72 1304 thread_db_ops.to_post_startup_inferior = thread_db_post_startup_inferior;
fb0e1ba7
MK
1305 thread_db_ops.to_mourn_inferior = thread_db_mourn_inferior;
1306 thread_db_ops.to_thread_alive = thread_db_thread_alive;
1307 thread_db_ops.to_find_new_threads = thread_db_find_new_threads;
1308 thread_db_ops.to_pid_to_str = thread_db_pid_to_str;
1309 thread_db_ops.to_stratum = thread_stratum;
1310 thread_db_ops.to_has_thread_control = tc_schedlock;
3f47be5c
EZ
1311 thread_db_ops.to_get_thread_local_address
1312 = thread_db_get_thread_local_address;
fb0e1ba7
MK
1313 thread_db_ops.to_magic = OPS_MAGIC;
1314}
1315
1316void
1317_initialize_thread_db (void)
1318{
1319 /* Only initialize the module if we can load libthread_db. */
1320 if (thread_db_load ())
1321 {
1322 init_thread_db_ops ();
1323 add_target (&thread_db_ops);
1324
1325 /* Add ourselves to objfile event chain. */
9a4105ab
AC
1326 target_new_objfile_chain = deprecated_target_new_objfile_hook;
1327 deprecated_target_new_objfile_hook = thread_db_new_objfile;
fb0e1ba7
MK
1328 }
1329}
This page took 0.655071 seconds and 4 git commands to generate.