1 /* libthread_db assisted debugging support, generic parts.
2 
3    Copyright 1999, 2000, 2001, 2003, 2004 Free Software Foundation, Inc.
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 
29 #include "bfd.h"
30 #include "exceptions.h"
31 #include "gdbthread.h"
32 #include "inferior.h"
33 #include "symfile.h"
34 #include "objfiles.h"
35 #include "target.h"
36 #include "regcache.h"
37 #include "solib-svr4.h"
38 
39 #ifdef HAVE_GNU_LIBC_VERSION_H
40 #include <gnu/libc-version.h>
41 #endif
42 
43 #ifndef LIBTHREAD_DB_SO
44 #define LIBTHREAD_DB_SO "libthread_db.so.1"
45 #endif
46 
47 /* If we're running on GNU/Linux, we must explicitly attach to any new
48    threads.  */
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.  */
56 static struct target_ops thread_db_ops;
57 
58 /* The target vector that we call for things this module can't handle.  */
59 static struct target_ops *target_beneath;
60 
61 /* Pointer to the next function on the objfile event chain.  */
62 static void (*target_new_objfile_chain) (struct objfile * objfile);
63 
64 /* Non-zero if we're using this module's target vector.  */
65 static int using_thread_db;
66 
67 /* Non-zero if we have determined the signals used by the threads
68    library.  */
69 static int thread_signals;
70 static sigset_t thread_stop_set;
71 static sigset_t thread_print_set;
72 
73 /* Structure that identifies the child process for the
74    <proc_service.h> interface.  */
75 static struct ps_prochandle proc_handle;
76 
77 /* Connection to the libthread_db library.  */
78 static td_thragent_t *thread_agent;
79 
80 /* Pointers to the libthread_db functions.  */
81 
82 static td_err_e (*td_init_p) (void);
83 
84 static td_err_e (*td_ta_new_p) (struct ps_prochandle * ps,
85 				td_thragent_t **ta);
86 static td_err_e (*td_ta_map_id2thr_p) (const td_thragent_t *ta, thread_t pt,
87 				       td_thrhandle_t *__th);
88 static td_err_e (*td_ta_map_lwp2thr_p) (const td_thragent_t *ta,
89 					lwpid_t lwpid, td_thrhandle_t *th);
90 static td_err_e (*td_ta_thr_iter_p) (const td_thragent_t *ta,
91 				     td_thr_iter_f *callback, void *cbdata_p,
92 				     td_thr_state_e state, int ti_pri,
93 				     sigset_t *ti_sigmask_p,
94 				     unsigned int ti_user_flags);
95 static td_err_e (*td_ta_event_addr_p) (const td_thragent_t *ta,
96 				       td_event_e event, td_notify_t *ptr);
97 static td_err_e (*td_ta_set_event_p) (const td_thragent_t *ta,
98 				      td_thr_events_t *event);
99 static td_err_e (*td_ta_event_getmsg_p) (const td_thragent_t *ta,
100 					 td_event_msg_t *msg);
101 
102 static td_err_e (*td_thr_validate_p) (const td_thrhandle_t *th);
103 static td_err_e (*td_thr_get_info_p) (const td_thrhandle_t *th,
104 				      td_thrinfo_t *infop);
105 static td_err_e (*td_thr_getfpregs_p) (const td_thrhandle_t *th,
106 				       gdb_prfpregset_t *regset);
107 static td_err_e (*td_thr_getgregs_p) (const td_thrhandle_t *th,
108 				      prgregset_t gregs);
109 static td_err_e (*td_thr_setfpregs_p) (const td_thrhandle_t *th,
110 				       const gdb_prfpregset_t *fpregs);
111 static td_err_e (*td_thr_setgregs_p) (const td_thrhandle_t *th,
112 				      prgregset_t gregs);
113 static td_err_e (*td_thr_event_enable_p) (const td_thrhandle_t *th,
114 					  int event);
115 
116 static td_err_e (*td_thr_tls_get_addr_p) (const td_thrhandle_t *th,
117 					  void *map_address,
118 					  size_t offset, void **address);
119 
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.  */
125 static CORE_ADDR td_create_bp_addr;
126 
127 /* Location of the thread death event breakpoint.  */
128 static CORE_ADDR td_death_bp_addr;
129 
130 /* Prototypes for local functions.  */
131 static void thread_db_find_new_threads (void);
132 static void attach_thread (ptid_t ptid, const td_thrhandle_t *th_p,
133 			   const td_thrinfo_t *ti_p, int verbose);
134 static void detach_thread (ptid_t ptid, int verbose);
135 
136 
137 /* Building process ids.  */
138 
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)
142 
143 #define is_lwp(ptid)		(GET_LWP (ptid) != 0)
144 #define is_thread(ptid)		(GET_THREAD (ptid) != 0)
145 
146 #define BUILD_LWP(lwp, pid)	ptid_build (pid, lwp, 0)
147 
148 
149 /* Use "struct private_thread_info" to cache thread state.  This is
150    a substantial optimization.  */
151 
152 struct private_thread_info
153 {
154   /* Flag set when we see a TD_DEATH event for this thread.  */
155   unsigned int dying:1;
156 
157   /* Cached thread state.  */
158   unsigned int th_valid:1;
159   unsigned int ti_valid:1;
160 
161   td_thrhandle_t th;
162   td_thrinfo_t ti;
163 };
164 
165 
166 static char *
thread_db_err_str(td_err_e err)167 thread_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 
221 static char *
thread_db_state_str(td_thr_state_e state)222 thread_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 
246 /* A callback function for td_ta_thr_iter, which we use to map all
247    threads to LWPs.
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
251    *INFOP.
252 
253    If the thread is a zombie, TD_THR_ZOMBIE is returned.  Otherwise,
254    zero is returned to indicate success.  */
255 
256 static int
thread_get_info_callback(const td_thrhandle_t * thp,void * infop)257 thread_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)
266     error (_("thread_get_info_callback: cannot get thread info: %s"),
267 	   thread_db_err_str (err));
268 
269   /* Fill the cache.  */
270   thread_ptid = ptid_build (GET_PID (inferior_ptid), ti.ti_lid, ti.ti_tid);
271   thread_info = find_thread_pid (thread_ptid);
272 
273   /* In the case of a zombie thread, don't continue.  We don't want to
274      attach to it thinking it is a new thread.  */
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;
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 	}
286       return TD_THR_ZOMBIE;
287     }
288 
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.  */
309 
310 static void
thread_db_map_id2thr(struct thread_info * thread_info,int fatal)311 thread_db_map_id2thr (struct thread_info *thread_info, int fatal)
312 {
313   td_err_e err;
314 
315   if (thread_info->private->th_valid)
316     return;
317 
318   err = td_ta_map_id2thr_p (thread_agent, GET_THREAD (thread_info->ptid),
319 			    &thread_info->private->th);
320   if (err != TD_OK)
321     {
322       if (fatal)
323 	error (_("Cannot find thread %ld: %s"),
324 	       (long) GET_THREAD (thread_info->ptid),
325 	       thread_db_err_str (err));
326     }
327   else
328     thread_info->private->th_valid = 1;
329 }
330 
331 static td_thrinfo_t *
thread_db_get_info(struct thread_info * thread_info)332 thread_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 
339   if (!thread_info->private->th_valid)
340     thread_db_map_id2thr (thread_info, 1);
341 
342   err =
343     td_thr_get_info_p (&thread_info->private->th, &thread_info->private->ti);
344   if (err != TD_OK)
345     error (_("thread_db_get_info: cannot get thread info: %s"),
346 	   thread_db_err_str (err));
347 
348   thread_info->private->ti_valid = 1;
349   return &thread_info->private->ti;
350 }
351 
352 /* Convert between user-level thread ids and LWP ids.  */
353 
354 static ptid_t
thread_from_lwp(ptid_t ptid)355 thread_from_lwp (ptid_t ptid)
356 {
357   td_thrhandle_t th;
358   td_err_e err;
359   struct thread_info *thread_info;
360   ptid_t thread_ptid;
361 
362   if (GET_LWP (ptid) == 0)
363     ptid = BUILD_LWP (GET_PID (ptid), GET_PID (ptid));
364 
365   gdb_assert (is_lwp (ptid));
366 
367   err = td_ta_map_lwp2thr_p (thread_agent, GET_LWP (ptid), &th);
368   if (err != TD_OK)
369     error (_("Cannot find user-level thread for LWP %ld: %s"),
370 	   GET_LWP (ptid), thread_db_err_str (err));
371 
372   thread_info = NULL;
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 
386   gdb_assert (thread_info && thread_info->private->ti_valid);
387 
388   return ptid_build (GET_PID (ptid), GET_LWP (ptid),
389 		     thread_info->private->ti.ti_tid);
390 }
391 
392 static ptid_t
lwp_from_thread(ptid_t ptid)393 lwp_from_thread (ptid_t ptid)
394 {
395   return BUILD_LWP (GET_LWP (ptid), GET_PID (ptid));
396 }
397 
398 
399 void
thread_db_init(struct target_ops * target)400 thread_db_init (struct target_ops *target)
401 {
402   target_beneath = target;
403 }
404 
405 static void *
verbose_dlsym(void * handle,const char * name)406 verbose_dlsym (void *handle, const char *name)
407 {
408   void *sym = dlsym (handle, name);
409   if (sym == NULL)
410     warning (_("Symbol \"%s\" not found in libthread_db: %s"), name, dlerror ());
411   return sym;
412 }
413 
414 static int
thread_db_load(void)415 thread_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)
422     {
423       fprintf_filtered (gdb_stderr, "\n\ndlopen failed on '%s' - %s\n",
424 			LIBTHREAD_DB_SO, dlerror ());
425       fprintf_filtered (gdb_stderr,
426 			"GDB will not be able to debug pthreads.\n\n");
427       return 0;
428     }
429 
430   /* Initialize pointers to the dynamic library functions we will use.
431      Essential functions first.  */
432 
433   td_init_p = verbose_dlsym (handle, "td_init");
434   if (td_init_p == NULL)
435     return 0;
436 
437   td_ta_new_p = verbose_dlsym (handle, "td_ta_new");
438   if (td_ta_new_p == NULL)
439     return 0;
440 
441   td_ta_map_id2thr_p = verbose_dlsym (handle, "td_ta_map_id2thr");
442   if (td_ta_map_id2thr_p == NULL)
443     return 0;
444 
445   td_ta_map_lwp2thr_p = verbose_dlsym (handle, "td_ta_map_lwp2thr");
446   if (td_ta_map_lwp2thr_p == NULL)
447     return 0;
448 
449   td_ta_thr_iter_p = verbose_dlsym (handle, "td_ta_thr_iter");
450   if (td_ta_thr_iter_p == NULL)
451     return 0;
452 
453   td_thr_validate_p = verbose_dlsym (handle, "td_thr_validate");
454   if (td_thr_validate_p == NULL)
455     return 0;
456 
457   td_thr_get_info_p = verbose_dlsym (handle, "td_thr_get_info");
458   if (td_thr_get_info_p == NULL)
459     return 0;
460 
461   td_thr_getfpregs_p = verbose_dlsym (handle, "td_thr_getfpregs");
462   if (td_thr_getfpregs_p == NULL)
463     return 0;
464 
465   td_thr_getgregs_p = verbose_dlsym (handle, "td_thr_getgregs");
466   if (td_thr_getgregs_p == NULL)
467     return 0;
468 
469   td_thr_setfpregs_p = verbose_dlsym (handle, "td_thr_setfpregs");
470   if (td_thr_setfpregs_p == NULL)
471     return 0;
472 
473   td_thr_setgregs_p = verbose_dlsym (handle, "td_thr_setgregs");
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     {
481       warning (_("Cannot initialize libthread_db: %s"), thread_db_err_str (err));
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");
490   td_thr_tls_get_addr_p = dlsym (handle, "td_thr_tls_get_addr");
491 
492   return 1;
493 }
494 
495 static td_err_e
enable_thread_event(td_thragent_t * thread_agent,int event,CORE_ADDR * bp)496 enable_thread_event (td_thragent_t *thread_agent, int event, CORE_ADDR *bp)
497 {
498   td_notify_t notify;
499   td_err_e err;
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)
504     return err;
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 
512   return TD_OK;
513 }
514 
515 static void
enable_thread_event_reporting(void)516 enable_thread_event_reporting (void)
517 {
518   td_thr_events_t events;
519   td_notify_t notify;
520   td_err_e err;
521 #ifdef HAVE_GNU_LIBC_VERSION_H
522   const char *libc_version;
523   int libc_major, libc_minor;
524 #endif
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);
535 
536 #ifdef HAVE_GNU_LIBC_VERSION_H
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.  */
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)))
543 #endif
544     td_event_addset (&events, TD_DEATH);
545 
546   err = td_ta_set_event_p (thread_agent, &events);
547   if (err != TD_OK)
548     {
549       warning (_("Unable to set global thread event mask: %s"),
550 	       thread_db_err_str (err));
551       return;
552     }
553 
554   /* Delete previous thread event breakpoints, if any.  */
555   remove_thread_event_breakpoints ();
556   td_create_bp_addr = 0;
557   td_death_bp_addr = 0;
558 
559   /* Set up the thread creation event.  */
560   err = enable_thread_event (thread_agent, TD_CREATE, &td_create_bp_addr);
561   if (err != TD_OK)
562     {
563       warning (_("Unable to get location for thread creation breakpoint: %s"),
564 	       thread_db_err_str (err));
565       return;
566     }
567 
568   /* Set up the thread death event.  */
569   err = enable_thread_event (thread_agent, TD_DEATH, &td_death_bp_addr);
570   if (err != TD_OK)
571     {
572       warning (_("Unable to get location for thread death breakpoint: %s"),
573 	       thread_db_err_str (err));
574       return;
575     }
576 }
577 
578 static void
disable_thread_event_reporting(void)579 disable_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 
594 static void
check_thread_signals(void)595 check_thread_signals (void)
596 {
597 #ifdef GET_THREAD_SIGNALS
598   if (!thread_signals)
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 
607       for (i = 1; i < NSIG; i++)
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 
622 static void
thread_db_new_objfile(struct objfile * objfile)623 thread_db_new_objfile (struct objfile *objfile)
624 {
625   td_err_e err;
626 
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;
645 	printf_unfiltered (_("Using host libthread_db library \"%s\".\n"),
646 			   library);
647 	dejavu = 1;
648       }
649   }
650 
651   /* Don't attempt to use thread_db on targets which can not run
652      (core files).  */
653   if (objfile == NULL || !target_has_execution)
654     {
655       /* All symbols have been discarded.  If the thread_db target is
656          active, deactivate it now.  */
657       if (using_thread_db)
658 	{
659 	  gdb_assert (proc_handle.pid == 0);
660 	  unpush_target (&thread_db_ops);
661 	  using_thread_db = 0;
662 	}
663 
664       goto quit;
665     }
666 
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 
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.  */
675   proc_handle.pid = GET_PID (inferior_ptid);
676 
677   /* Now attempt to open a connection to the thread library.  */
678   err = td_ta_new_p (&proc_handle, &thread_agent);
679   switch (err)
680     {
681     case TD_NOLIBTHREAD:
682       /* No thread library was detected.  */
683       break;
684 
685     case TD_OK:
686       printf_unfiltered (_("[Thread debugging using libthread_db enabled]\n"));
687 
688       /* The thread library was detected.  Activate the thread_db target.  */
689       push_target (&thread_db_ops);
690       using_thread_db = 1;
691 
692       enable_thread_event_reporting ();
693       thread_db_find_new_threads ();
694       break;
695 
696     default:
697       warning (_("Cannot initialize thread debugging library: %s"),
698 	       thread_db_err_str (err));
699       break;
700     }
701 
702 quit:
703   if (target_new_objfile_chain)
704     target_new_objfile_chain (objfile);
705 }
706 
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 
711 static void
attach_thread(ptid_t ptid,const td_thrhandle_t * th_p,const td_thrinfo_t * ti_p,int verbose)712 attach_thread (ptid_t ptid, const td_thrhandle_t *th_p,
713 	       const td_thrinfo_t *ti_p, int verbose)
714 {
715   struct thread_info *tp;
716   td_err_e err;
717 
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 
739   check_thread_signals ();
740 
741   /* Add the thread to GDB's thread list.  */
742   tp = add_thread (ptid);
743   tp->private = xmalloc (sizeof (struct private_thread_info));
744   memset (tp->private, 0, sizeof (struct private_thread_info));
745 
746   if (verbose)
747     printf_unfiltered (_("[New %s]\n"), target_pid_to_str (ptid));
748 
749   if (ti_p->ti_state == TD_THR_UNKNOWN || ti_p->ti_state == TD_THR_ZOMBIE)
750     return;			/* A zombie thread -- do not attach.  */
751 
752   /* Under GNU/Linux, we have to attach to each and every thread.  */
753 #ifdef ATTACH_LWP
754   ATTACH_LWP (BUILD_LWP (ti_p->ti_lid, GET_PID (ptid)), 0);
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)
760     error (_("Cannot enable thread event reporting for %s: %s"),
761 	   target_pid_to_str (ptid), thread_db_err_str (err));
762 }
763 
764 static void
thread_db_attach(char * args,int from_tty)765 thread_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 ();
778   thread_db_find_new_threads ();
779 }
780 
781 static void
detach_thread(ptid_t ptid,int verbose)782 detach_thread (ptid_t ptid, int verbose)
783 {
784   struct thread_info *thread_info;
785 
786   if (verbose)
787     printf_unfiltered (_("[%s exited]\n"), target_pid_to_str (ptid));
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;
799 }
800 
801 static void
thread_db_detach(char * args,int from_tty)802 thread_db_detach (char *args, int from_tty)
803 {
804   disable_thread_event_reporting ();
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;
813 
814   target_beneath->to_detach (args, from_tty);
815 }
816 
817 static int
clear_lwpid_callback(struct thread_info * thread,void * dummy)818 clear_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 
830 static void
thread_db_resume(ptid_t ptid,int step,enum target_signal signo)831 thread_db_resume (ptid_t ptid, int step, enum target_signal signo)
832 {
833   struct cleanup *old_chain = save_inferior_ptid ();
834 
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);
839 
840   /* Clear cached data which may not be valid after the resume.  */
841   iterate_over_threads (clear_lwpid_callback, NULL);
842 
843   target_beneath->to_resume (ptid, step, signo);
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 
852 static void
check_event(ptid_t ptid)853 check_event (ptid_t ptid)
854 {
855   td_event_msg_t msg;
856   td_thrinfo_t ti;
857   td_err_e err;
858   CORE_ADDR stop_pc;
859   int loop = 0;
860 
861   /* Bail out early if we're not at a thread event breakpoint.  */
862   stop_pc = read_pc_pid (ptid) - DECR_PC_AFTER_BREAK;
863   if (stop_pc != td_create_bp_addr && stop_pc != td_death_bp_addr)
864     return;
865 
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
870      the event message we get back corresponds to our breakpoint, we must
871      loop and read all event messages, processing them appropriately.
872      This guarantees we will process the correct message before continuing
873      from the breakpoint.
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
883     {
884       err = td_ta_event_getmsg_p (thread_agent, &msg);
885       if (err != TD_OK)
886 	{
887 	  if (err == TD_NOMSG)
888 	    return;
889 
890 	  error (_("Cannot get thread event message: %s"),
891 		 thread_db_err_str (err));
892 	}
893 
894       err = td_thr_get_info_p (msg.th_p, &ti);
895       if (err != TD_OK)
896 	error (_("Cannot get thread info: %s"), thread_db_err_str (err));
897 
898       ptid = ptid_build (GET_PID (ptid), ti.ti_lid, ti.ti_tid);
899 
900       switch (msg.event)
901 	{
902 	case TD_CREATE:
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);
906 
907 	  break;
908 
909 	case TD_DEATH:
910 
911 	  if (!in_thread_list (ptid))
912 	    error (_("Spurious thread death event."));
913 
914 	  detach_thread (ptid, 1);
915 
916 	  break;
917 
918 	default:
919 	  error (_("Spurious thread event."));
920 	}
921     }
922   while (loop);
923 }
924 
925 static ptid_t
thread_db_wait(ptid_t ptid,struct target_waitstatus * ourstatus)926 thread_db_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
927 {
928   extern ptid_t trap_ptid;
929 
930   if (GET_PID (ptid) != -1 && is_thread (ptid))
931     ptid = lwp_from_thread (ptid);
932 
933   ptid = target_beneath->to_wait (ptid, ourstatus);
934 
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.  */
939     return ptid;
940 
941   if (ourstatus->kind == TARGET_WAITKIND_EXITED)
942     return pid_to_ptid (-1);
943 
944   if (ourstatus->kind == TARGET_WAITKIND_STOPPED
945       && ourstatus->value.sig == TARGET_SIGNAL_TRAP)
946     /* Check for a thread event.  */
947     check_event (ptid);
948 
949   if (!ptid_equal (trap_ptid, null_ptid))
950     trap_ptid = thread_from_lwp (trap_ptid);
951 
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;
962 }
963 
964 static int
thread_db_xfer_memory(CORE_ADDR memaddr,gdb_byte * myaddr,int len,int write,struct mem_attrib * attrib,struct target_ops * target)965 thread_db_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write,
966 		       struct mem_attrib *attrib, struct target_ops *target)
967 {
968   struct cleanup *old_chain = save_inferior_ptid ();
969   int xfer;
970 
971   if (is_thread (inferior_ptid))
972     {
973       /* FIXME: This seems to be necessary to make sure breakpoints
974          are removed.  */
975       if (!target_thread_alive (inferior_ptid))
976 	inferior_ptid = pid_to_ptid (GET_PID (inferior_ptid));
977       else
978 	inferior_ptid = lwp_from_thread (inferior_ptid);
979     }
980 
981   xfer =
982     target_beneath->deprecated_xfer_memory (memaddr, myaddr, len, write,
983 					    attrib, target);
984 
985   do_cleanups (old_chain);
986   return xfer;
987 }
988 
989 static void
thread_db_fetch_registers(int regno)990 thread_db_fetch_registers (int regno)
991 {
992   struct thread_info *thread_info;
993   prgregset_t gregset;
994   gdb_prfpregset_t fpregset;
995   td_err_e err;
996 
997   if (!is_thread (inferior_ptid))
998     {
999       /* Pass the request to the target beneath us.  */
1000       target_beneath->to_fetch_registers (regno);
1001       return;
1002     }
1003 
1004   thread_info = find_thread_pid (inferior_ptid);
1005   thread_db_map_id2thr (thread_info, 1);
1006 
1007   err = td_thr_getgregs_p (&thread_info->private->th, gregset);
1008   if (err != TD_OK)
1009     error (_("Cannot fetch general-purpose registers for thread %ld: %s"),
1010 	   (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));
1011 
1012   err = td_thr_getfpregs_p (&thread_info->private->th, &fpregset);
1013   if (err != TD_OK)
1014     error (_("Cannot get floating-point registers for thread %ld: %s"),
1015 	   (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));
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 
1024 static void
thread_db_store_registers(int regno)1025 thread_db_store_registers (int regno)
1026 {
1027   prgregset_t gregset;
1028   gdb_prfpregset_t fpregset;
1029   td_err_e err;
1030   struct thread_info *thread_info;
1031 
1032   if (!is_thread (inferior_ptid))
1033     {
1034       /* Pass the request to the target beneath us.  */
1035       target_beneath->to_store_registers (regno);
1036       return;
1037     }
1038 
1039   thread_info = find_thread_pid (inferior_ptid);
1040   thread_db_map_id2thr (thread_info, 1);
1041 
1042   if (regno != -1)
1043     {
1044       char raw[MAX_REGISTER_SIZE];
1045 
1046       deprecated_read_register_gen (regno, raw);
1047       thread_db_fetch_registers (-1);
1048       regcache_raw_supply (current_regcache, regno, raw);
1049     }
1050 
1051   fill_gregset ((gdb_gregset_t *) gregset, -1);
1052   fill_fpregset (&fpregset, -1);
1053 
1054   err = td_thr_setgregs_p (&thread_info->private->th, gregset);
1055   if (err != TD_OK)
1056     error (_("Cannot store general-purpose registers for thread %ld: %s"),
1057 	   (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));
1058   err = td_thr_setfpregs_p (&thread_info->private->th, &fpregset);
1059   if (err != TD_OK)
1060     error (_("Cannot store floating-point registers  for thread %ld: %s"),
1061 	   (long) GET_THREAD (inferior_ptid), thread_db_err_str (err));
1062 }
1063 
1064 static void
thread_db_kill(void)1065 thread_db_kill (void)
1066 {
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);
1070   target_beneath->to_kill ();
1071 }
1072 
1073 static void
thread_db_create_inferior(char * exec_file,char * allargs,char ** env,int from_tty)1074 thread_db_create_inferior (char *exec_file, char *allargs, char **env,
1075 			   int from_tty)
1076 {
1077   unpush_target (&thread_db_ops);
1078   using_thread_db = 0;
1079   target_beneath->to_create_inferior (exec_file, allargs, env, from_tty);
1080 }
1081 
1082 static void
thread_db_post_startup_inferior(ptid_t ptid)1083 thread_db_post_startup_inferior (ptid_t ptid)
1084 {
1085   if (proc_handle.pid == 0)
1086     {
1087       /* The child process is now the actual multi-threaded
1088          program.  Snatch its process ID...  */
1089       proc_handle.pid = GET_PID (ptid);
1090 
1091       /* ...and perform the remaining initialization steps.  */
1092       enable_thread_event_reporting ();
1093       thread_db_find_new_threads ();
1094     }
1095 }
1096 
1097 static void
thread_db_mourn_inferior(void)1098 thread_db_mourn_inferior (void)
1099 {
1100   remove_thread_event_breakpoints ();
1101 
1102   /* Forget about the child's process ID.  We shouldn't need it
1103      anymore.  */
1104   proc_handle.pid = 0;
1105 
1106   target_beneath->to_mourn_inferior ();
1107 
1108   /* Detach thread_db target ops.  */
1109   unpush_target (&thread_db_ops);
1110   using_thread_db = 0;
1111 }
1112 
1113 static int
thread_db_thread_alive(ptid_t ptid)1114 thread_db_thread_alive (ptid_t ptid)
1115 {
1116   td_thrhandle_t th;
1117   td_err_e err;
1118 
1119   if (is_thread (ptid))
1120     {
1121       struct thread_info *thread_info;
1122       thread_info = find_thread_pid (ptid);
1123 
1124       thread_db_map_id2thr (thread_info, 0);
1125       if (!thread_info->private->th_valid)
1126 	return 0;
1127 
1128       err = td_thr_validate_p (&thread_info->private->th);
1129       if (err != TD_OK)
1130 	return 0;
1131 
1132       if (!thread_info->private->ti_valid)
1133 	{
1134 	  err =
1135 	    td_thr_get_info_p (&thread_info->private->th,
1136 			       &thread_info->private->ti);
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)
1144 	return 0;		/* A zombie thread.  */
1145 
1146       return 1;
1147     }
1148 
1149   if (target_beneath->to_thread_alive)
1150     return target_beneath->to_thread_alive (ptid);
1151 
1152   return 0;
1153 }
1154 
1155 static int
find_new_threads_callback(const td_thrhandle_t * th_p,void * data)1156 find_new_threads_callback (const td_thrhandle_t *th_p, void *data)
1157 {
1158   td_thrinfo_t ti;
1159   td_err_e err;
1160   ptid_t ptid;
1161 
1162   err = td_thr_get_info_p (th_p, &ti);
1163   if (err != TD_OK)
1164     error (_("find_new_threads_callback: cannot get thread info: %s"),
1165 	   thread_db_err_str (err));
1166 
1167   if (ti.ti_state == TD_THR_UNKNOWN || ti.ti_state == TD_THR_ZOMBIE)
1168     return 0;			/* A zombie -- ignore.  */
1169 
1170   ptid = ptid_build (GET_PID (inferior_ptid), ti.ti_lid, ti.ti_tid);
1171 
1172   if (!in_thread_list (ptid))
1173     attach_thread (ptid, th_p, &ti, 1);
1174 
1175   return 0;
1176 }
1177 
1178 static void
thread_db_find_new_threads(void)1179 thread_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)
1188     error (_("Cannot find new threads: %s"), thread_db_err_str (err));
1189 }
1190 
1191 static char *
thread_db_pid_to_str(ptid_t ptid)1192 thread_db_pid_to_str (ptid_t ptid)
1193 {
1194   if (is_thread (ptid))
1195     {
1196       static char buf[64];
1197       td_thrinfo_t *ti_p;
1198       td_err_e err;
1199       struct thread_info *thread_info;
1200 
1201       thread_info = find_thread_pid (ptid);
1202       thread_db_map_id2thr (thread_info, 0);
1203       if (!thread_info->private->th_valid)
1204 	{
1205 	  snprintf (buf, sizeof (buf), "Thread %ld (Missing)",
1206 		    GET_THREAD (ptid));
1207 	  return buf;
1208 	}
1209 
1210       ti_p = thread_db_get_info (thread_info);
1211 
1212       if (ti_p->ti_state == TD_THR_ACTIVE && ti_p->ti_lid != 0)
1213 	{
1214 	  snprintf (buf, sizeof (buf), "Thread %ld (LWP %d)",
1215 		    (long) ti_p->ti_tid, ti_p->ti_lid);
1216 	}
1217       else
1218 	{
1219 	  snprintf (buf, sizeof (buf), "Thread %ld (%s)",
1220 		    (long) ti_p->ti_tid,
1221 		    thread_db_state_str (ti_p->ti_state));
1222 	}
1223 
1224       return buf;
1225     }
1226 
1227   if (target_beneath->to_pid_to_str (ptid))
1228     return target_beneath->to_pid_to_str (ptid);
1229 
1230   return normal_pid_to_str (ptid);
1231 }
1232 
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.  */
1235 
1236 static CORE_ADDR
thread_db_get_thread_local_address(ptid_t ptid,CORE_ADDR lm,CORE_ADDR offset)1237 thread_db_get_thread_local_address (ptid_t ptid,
1238 				    CORE_ADDR lm,
1239 				    CORE_ADDR offset)
1240 {
1241   if (is_thread (ptid))
1242     {
1243       td_err_e err;
1244       void *address;
1245       struct thread_info *thread_info;
1246 
1247       /* glibc doesn't provide the needed interface.  */
1248       if (!td_thr_tls_get_addr_p)
1249 	throw_error (TLS_NO_LIBRARY_SUPPORT_ERROR,
1250 		     _("No TLS library support"));
1251 
1252       /* Caller should have verified that lm != 0.  */
1253       gdb_assert (lm != 0);
1254 
1255       /* Get info about the thread.  */
1256       thread_info = find_thread_pid (ptid);
1257       thread_db_map_id2thr (thread_info, 1);
1258 
1259       /* Finally, get the address of the variable.  */
1260       err = td_thr_tls_get_addr_p (&thread_info->private->th, (void *) lm,
1261 				   offset, &address);
1262 
1263 #ifdef THREAD_DB_HAS_TD_NOTALLOC
1264       /* The memory hasn't been allocated, yet.  */
1265       if (err == TD_NOTALLOC)
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.  */
1269         throw_error (TLS_NOT_ALLOCATED_YET_ERROR,
1270                      _("TLS not allocated yet"));
1271 #endif
1272 
1273       /* Something else went wrong.  */
1274       if (err != TD_OK)
1275         throw_error (TLS_GENERIC_ERROR,
1276                      (("%s")), thread_db_err_str (err));
1277 
1278       /* Cast assuming host == target.  Joy.  */
1279       return (CORE_ADDR) address;
1280     }
1281 
1282   if (target_beneath->to_get_thread_local_address)
1283     return target_beneath->to_get_thread_local_address (ptid, lm, offset);
1284   else
1285     throw_error (TLS_GENERIC_ERROR,
1286 	         _("TLS not supported on this target"));
1287 }
1288 
1289 static void
init_thread_db_ops(void)1290 init_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.";
1295   thread_db_ops.to_attach = thread_db_attach;
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;
1301   thread_db_ops.deprecated_xfer_memory = thread_db_xfer_memory;
1302   thread_db_ops.to_kill = thread_db_kill;
1303   thread_db_ops.to_create_inferior = thread_db_create_inferior;
1304   thread_db_ops.to_post_startup_inferior = thread_db_post_startup_inferior;
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;
1311   thread_db_ops.to_get_thread_local_address
1312     = thread_db_get_thread_local_address;
1313   thread_db_ops.to_magic = OPS_MAGIC;
1314 }
1315 
1316 void
_initialize_thread_db(void)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.  */
1326       target_new_objfile_chain = deprecated_target_new_objfile_hook;
1327       deprecated_target_new_objfile_hook = thread_db_new_objfile;
1328     }
1329 }
1330