undefined newexpr->gdbarch field in ada-lang.c:replace_operator_with_call
[deliverable/binutils-gdb.git] / gdb / solib-sunos.c
index 79ae9cc02a5e31e0956b223b6b71a9971506a156..dc7d31a073d6de95d2dbd68a64a1d2451d54bbda 100644 (file)
@@ -1,13 +1,13 @@
 /* Handle SunOS shared libraries for GDB, the GNU Debugger.
 
-   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999,
-   2000, 2001, 2004 Free Software Foundation, Inc.
+   Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000,
+   2001, 2004, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -16,9 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 
@@ -38,6 +36,7 @@
 #include "objfiles.h"
 #include "gdbcore.h"
 #include "inferior.h"
+#include "gdbthread.h"
 #include "solist.h"
 #include "bcache.h"
 #include "regcache.h"
@@ -86,7 +85,7 @@
 
 #endif
 
-/* Link map info to include in an allocated so_list entry */
+/* Link map info to include in an allocated so_list entry */
 
 struct lm_info
   {
@@ -97,7 +96,7 @@ struct lm_info
   };
 
 
-/* Symbols which are used to locate the base of the link map structures. */
+/* Symbols which are used to locate the base of the link map structures.  */
 
 static char *debug_base_symbols[] =
 {
@@ -121,7 +120,8 @@ static char *main_name_list[] =
    Assume that the address is unsigned.  */
 
 #define SOLIB_EXTRACT_ADDRESS(MEMBER) \
-       extract_unsigned_integer (&(MEMBER), sizeof (MEMBER))
+       extract_unsigned_integer (&(MEMBER), sizeof (MEMBER), \
+                                 gdbarch_byte_order (target_gdbarch))
 
 /* local data declarations */
 
@@ -141,36 +141,39 @@ static CORE_ADDR flag_addr;
 static CORE_ADDR
 LM_ADDR (struct so_list *so)
 {
+  enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch);
   int lm_addr_offset = offsetof (struct link_map, lm_addr);
   int lm_addr_size = fieldsize (struct link_map, lm_addr);
 
   return (CORE_ADDR) extract_signed_integer (so->lm_info->lm + lm_addr_offset, 
-                                            lm_addr_size);
+                                            lm_addr_size, byte_order);
 }
 
 static CORE_ADDR
 LM_NEXT (struct so_list *so)
 {
+  enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch);
   int lm_next_offset = offsetof (struct link_map, lm_next);
   int lm_next_size = fieldsize (struct link_map, lm_next);
 
   /* Assume that the address is unsigned.  */
   return extract_unsigned_integer (so->lm_info->lm + lm_next_offset,
-                                  lm_next_size);
+                                  lm_next_size, byte_order);
 }
 
 static CORE_ADDR
 LM_NAME (struct so_list *so)
 {
+  enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch);
   int lm_name_offset = offsetof (struct link_map, lm_name);
   int lm_name_size = fieldsize (struct link_map, lm_name);
 
   /* Assume that the address is unsigned.  */
   return extract_unsigned_integer (so->lm_info->lm + lm_name_offset,
-                                  lm_name_size);
+                                  lm_name_size, byte_order);
 }
 
-static CORE_ADDR debug_base;   /* Base of dynamic linker structures */
+static CORE_ADDR debug_base;   /* Base of dynamic linker structures */
 
 /* Local function prototypes */
 
@@ -186,13 +189,13 @@ allocate_rt_common_objfile (void)
 
   objfile = (struct objfile *) xmalloc (sizeof (struct objfile));
   memset (objfile, 0, sizeof (struct objfile));
-  objfile->md = NULL;
   objfile->psymbol_cache = bcache_xmalloc ();
   objfile->macro_cache = bcache_xmalloc ();
+  objfile->filename_cache = bcache_xmalloc ();
   obstack_init (&objfile->objfile_obstack);
   objfile->name = xstrdup ("rt_common");
 
-  /* Add this file onto the tail of the linked list of other such files. */
+  /* Add this file onto the tail of the linked list of other such files.  */
 
   objfile->next = NULL;
   if (object_files == NULL)
@@ -246,14 +249,14 @@ solib_add_common_symbols (CORE_ADDR rtc_symp)
        {
          /* FIXME: The length of the symbol name is not available, but in the
             current implementation the common symbol is allocated immediately
-            behind the name of the symbol. */
+            behind the name of the symbol.  */
          len = inferior_rtc_nlist.n_value - inferior_rtc_nlist.n_un.n_strx;
 
          name = xmalloc (len);
          read_memory (SOLIB_EXTRACT_ADDRESS (inferior_rtc_nlist.n_un.n_name),
                       name, len);
 
-         /* Allocate the runtime common objfile if necessary. */
+         /* Allocate the runtime common objfile if necessary.  */
          if (rt_common_objfile == NULL)
            allocate_rt_common_objfile ();
 
@@ -317,7 +320,7 @@ locate_base (void)
 
   /* For SunOS, we want to limit the search for the debug base symbol to the
      executable being debugged, since there is a duplicate named symbol in the
-     shared library.  We don't want the shared library versions. */
+     shared library.  We don't want the shared library versions.  */
 
   for (symbolp = debug_base_symbols; *symbolp != NULL; symbolp++)
     {
@@ -357,7 +360,7 @@ first_link_map_member (void)
   if (dynamic_copy.ld_version >= 2)
     {
       /* It is a version that we can deal with, so read in the secondary
-         structure and find the address of the link map list from it. */
+         structure and find the address of the link map list from it.  */
       read_memory (SOLIB_EXTRACT_ADDRESS (dynamic_copy.ld_un.ld_2),
                   (char *) &ld_2_copy, sizeof (struct link_dynamic_2));
       lm = SOLIB_EXTRACT_ADDRESS (ld_2_copy.ld_loaded);
@@ -512,18 +515,18 @@ sunos_in_dynsym_resolve_code (CORE_ADDR pc)
 static int
 disable_break (void)
 {
-  CORE_ADDR breakpoint_addr;   /* Address where end bkpt is set */
+  CORE_ADDR breakpoint_addr;   /* Address where end bkpt is set */
 
   int in_debugger = 0;
 
   /* Read the debugger structure from the inferior to retrieve the
      address of the breakpoint and the original contents of the
      breakpoint address.  Remove the breakpoint by writing the original
-     contents back. */
+     contents back.  */
 
   read_memory (debug_addr, (char *) &debug_copy, sizeof (debug_copy));
 
-  /* Set `in_debugger' to zero now. */
+  /* Set `in_debugger' to zero now.  */
 
   write_memory (flag_addr, (char *) &in_debugger, sizeof (in_debugger));
 
@@ -533,11 +536,12 @@ disable_break (void)
 
   /* For the SVR4 version, we always know the breakpoint address.  For the
      SunOS version we don't know it until the above code is executed.
-     Grumble if we are stopped anywhere besides the breakpoint address. */
+     Grumble if we are stopped anywhere besides the breakpoint address.  */
 
   if (stop_pc != breakpoint_addr)
     {
-      warning (_("stopped at unknown breakpoint while handling shared libraries"));
+      warning (_("stopped at unknown breakpoint "
+                "while handling shared libraries"));
     }
 
   return 1;
@@ -594,7 +598,7 @@ enable_break (void)
   int j;
   int in_debugger;
 
-  /* Get link_dynamic structure */
+  /* Get link_dynamic structure */
 
   j = target_read_memory (debug_base, (char *) &dynamic_copy,
                          sizeof (dynamic_copy));
@@ -604,11 +608,11 @@ enable_break (void)
       return (0);
     }
 
-  /* Calc address of debugger interface structure */
+  /* Calc address of debugger interface structure */
 
   debug_addr = SOLIB_EXTRACT_ADDRESS (dynamic_copy.ldd);
 
-  /* Calc address of `in_debugger' member of debugger interface structure */
+  /* Calc address of `in_debugger' member of debugger interface structure */
 
   flag_addr = debug_addr + (CORE_ADDR) ((char *) &debug_copy.ldd_in_debugger -
                                        (char *) &debug_copy);
@@ -652,7 +656,7 @@ sunos_special_symbol_handling (void)
 
   if (debug_addr == 0)
     {
-      /* Get link_dynamic structure */
+      /* Get link_dynamic structure */
 
       j = target_read_memory (debug_base, (char *) &dynamic_copy,
                              sizeof (dynamic_copy));
@@ -662,7 +666,7 @@ sunos_special_symbol_handling (void)
          return;
        }
 
-      /* Calc address of debugger interface structure */
+      /* Calc address of debugger interface structure */
       /* FIXME, this needs work for cross-debugging of core files
          (byteorder, size, alignment, etc).  */
 
@@ -670,14 +674,14 @@ sunos_special_symbol_handling (void)
     }
 
   /* Read the debugger structure from the inferior, just to make sure
-     we have a current copy. */
+     we have a current copy.  */
 
   j = target_read_memory (debug_addr, (char *) &debug_copy,
                          sizeof (debug_copy));
   if (j)
     return;                    /* unreadable */
 
-  /* Get common symbol definitions for the loaded object. */
+  /* Get common symbol definitions for the loaded object.  */
 
   if (debug_copy.ldd_cp)
     {
@@ -738,11 +742,14 @@ sunos_special_symbol_handling (void)
  */
 
 static void
-sunos_solib_create_inferior_hook (void)
+sunos_solib_create_inferior_hook (int from_tty)
 {
+  struct thread_info *tp;
+  struct inferior *inf;
+
   if ((debug_base = locate_base ()) == 0)
     {
-      /* Can't find the symbol or the executable is statically linked. */
+      /* Can't find the symbol or the executable is statically linked.  */
       return;
     }
 
@@ -759,28 +766,38 @@ sunos_solib_create_inferior_hook (void)
      Now run the target.  It will eventually hit the breakpoint, at
      which point all of the libraries will have been mapped in and we
      can go groveling around in the dynamic linker structures to find
-     out what we need to know about them. */
+     out what we need to know about them.  */
+
+  inf = current_inferior ();
+  tp = inferior_thread ();
 
   clear_proceed_status ();
-  stop_soon = STOP_QUIETLY;
-  stop_signal = TARGET_SIGNAL_0;
+
+  inf->control.stop_soon = STOP_QUIETLY;
+  tp->suspend.stop_signal = TARGET_SIGNAL_0;
   do
     {
-      target_resume (pid_to_ptid (-1), 0, stop_signal);
-      wait_for_inferior ();
+      target_resume (pid_to_ptid (-1), 0, tp->suspend.stop_signal);
+      wait_for_inferior (0);
     }
-  while (stop_signal != TARGET_SIGNAL_TRAP);
-  stop_soon = NO_STOP_QUIETLY;
+  while (tp->suspend.stop_signal != TARGET_SIGNAL_TRAP);
+  inf->control.stop_soon = NO_STOP_QUIETLY;
 
   /* We are now either at the "mapping complete" breakpoint (or somewhere
      else, a condition we aren't prepared to deal with anyway), so adjust
      the PC as necessary after a breakpoint, disable the breakpoint, and
-     add any shared libraries that were mapped in. */
+     add any shared libraries that were mapped in.
+
+     Note that adjust_pc_after_break did not perform any PC adjustment,
+     as the breakpoint the inferior just hit was not inserted by GDB,
+     but by the dynamic loader itself, and is therefore not found on
+     the GDB software break point list.  Thus we have to adjust the
+     PC here.  */
 
-  if (DECR_PC_AFTER_BREAK)
+  if (gdbarch_decr_pc_after_break (target_gdbarch))
     {
-      stop_pc -= DECR_PC_AFTER_BREAK;
-      write_register (PC_REGNUM, stop_pc);
+      stop_pc -= gdbarch_decr_pc_after_break (target_gdbarch);
+      regcache_write_pc (get_current_regcache (), stop_pc);
     }
 
   if (!disable_break ())
@@ -806,7 +823,7 @@ sunos_free_so (struct so_list *so)
 
 static void
 sunos_relocate_section_addresses (struct so_list *so,
-                                 struct section_table *sec)
+                                 struct target_section *sec)
 {
   sec->addr += LM_ADDR (so);
   sec->endaddr += LM_ADDR (so);
@@ -825,7 +842,8 @@ _initialize_sunos_solib (void)
   sunos_so_ops.current_sos = sunos_current_sos;
   sunos_so_ops.open_symbol_file_object = open_symbol_file_object;
   sunos_so_ops.in_dynsym_resolve_code = sunos_in_dynsym_resolve_code;
+  sunos_so_ops.bfd_open = solib_bfd_open;
 
-  /* FIXME: Don't do this here.  *_gdbarch_init() should set so_ops. */
+  /* FIXME: Don't do this here.  *_gdbarch_init() should set so_ops.  */
   current_target_so_ops = &sunos_so_ops;
 }
This page took 0.028014 seconds and 4 git commands to generate.