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