2006-03-26 Randolph Chung * hppa-tdep.h (gdbarch_tdep): Make solib_thread_start_addr take an objfile argument instead of a so_list one. (hppa_objfile_private): Remove unusued so_info argument. * hpread.c (hpread_process_one_debug_symbol): Use objfile to call into solib_thread_start_addr method to get TLS address. Cleanup comments. * solib-pa64.c (pa64_solib_thread_start_addr): Take objfile argument; return TLS address from corresponding so_list object. * solib-som.c (som_solib_thread_start_addr): Likewise. Index: hppa-tdep.h =================================================================== RCS file: /cvs/src/src/gdb/hppa-tdep.h,v retrieving revision 1.26 diff -u -p -r1.26 hppa-tdep.h --- hppa-tdep.h 1 Mar 2006 05:43:03 -0000 1.26 +++ hppa-tdep.h 26 Mar 2006 08:22:26 -0000 @@ -110,7 +110,7 @@ struct gdbarch_tdep /* These are solib-dependent methods. They are really HPUX only, but we don't have a HPUX-specific tdep vector at the moment. */ - CORE_ADDR (*solib_thread_start_addr) (struct so_list *so); + CORE_ADDR (*solib_thread_start_addr) (struct objfile *objfile); CORE_ADDR (*solib_get_got_by_pc) (CORE_ADDR addr); CORE_ADDR (*solib_get_solib_by_pc) (CORE_ADDR addr); CORE_ADDR (*solib_get_text_base) (struct objfile *objfile); @@ -211,7 +211,6 @@ struct hppa_unwind_info struct hppa_objfile_private { struct hppa_unwind_info *unwind_info; /* a pointer */ - struct so_list *so_info; /* a pointer */ CORE_ADDR dp; int dummy_call_sequence_reg; Index: hpread.c =================================================================== RCS file: /cvs/src/src/gdb/hpread.c,v retrieving revision 1.58 diff -u -p -r1.58 hpread.c --- hpread.c 17 Dec 2005 22:34:01 -0000 1.58 +++ hpread.c 26 Mar 2006 08:22:27 -0000 @@ -5759,28 +5758,13 @@ hpread_process_one_debug_symbol (union d * This variable is not only thread local but * in a shared library. * - * Alas, the shared lib structures are private - * to "somsolib.c". But C lets us point to one. - */ - struct so_list *so; - struct hppa_objfile_private *priv; - - priv = (struct hppa_objfile_private *) - objfile_data (objfile, hppa_objfile_priv_data); - if (priv == NULL) - error (_("Internal error in reading shared library information.")); - - so = ((struct hppa_objfile_private *) priv)->so_info; - if (so == NULL) - error (_("Internal error in reading shared library information.")); - - /* Thread-locals in shared libraries do NOT have the + * Thread-locals in shared libraries do NOT have the * standard offset ("data_offset"), so we re-calculate * where to look for this variable, using a call-back * to interpret the private shared-library data. */ SYMBOL_VALUE_ADDRESS (sym) = dn_bufp->dsvar.location + - gdbarch_tdep (current_gdbarch)->solib_thread_start_addr (so); + gdbarch_tdep (current_gdbarch)->solib_thread_start_addr (objfile); } } break; Index: solib-pa64.c =================================================================== RCS file: /cvs/src/src/gdb/solib-pa64.c,v retrieving revision 1.5 diff -u -p -r1.5 solib-pa64.c --- solib-pa64.c 17 Dec 2005 22:34:02 -0000 1.5 +++ solib-pa64.c 26 Mar 2006 08:22:27 -0000 @@ -594,9 +595,15 @@ pa64_solib_get_got_by_pc (CORE_ADDR addr /* Get some HPUX-specific data from a shared lib. */ static CORE_ADDR -pa64_solib_thread_start_addr (struct so_list *so) +pa64_solib_thread_start_addr (struct objfile *objfile) { - return so->lm_info->desc.tls_start_addr; + struct so_list *so; + + for (so = master_so_list (); so; so = so->next) + if (so->objfile == objfile) + return so->lm_info->desc.tls_start_addr; + + return 0; } Index: solib-som.c =================================================================== RCS file: /cvs/src/src/gdb/solib-som.c,v retrieving revision 1.9 diff -u -p -r1.9 solib-som.c --- solib-som.c 24 Mar 2006 23:49:56 -0000 1.9 +++ solib-som.c 26 Mar 2006 08:22:27 -0000 @@ -695,9 +698,15 @@ som_free_so (struct so_list *so) } static CORE_ADDR -som_solib_thread_start_addr (struct so_list *so) +som_solib_thread_start_addr (struct objfile *objfile) { - return so->lm_info->tsd_start_addr; + struct so_list *so; + + for (so = master_so_list (); so; so = so->next) + if (so->objfile == objfile) + return so->lm_info->tsd_start_addr; + + return 0; } /* Return the GOT value for the shared library in which ADDR belongs. If