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