* dwarf2dbg.c (dwarf2_directive_file): Avoid signed/unsigned warning.
[deliverable/binutils-gdb.git] / gdb / somsolib.c
index 924fa5252c3e0969df90fb0654384be045e5bc64..4b93fdecf38392875ead0d11378b93cc7f75813a 100644 (file)
@@ -1,5 +1,6 @@
 /* Handle HP SOM shared libraries for GDB, the GNU Debugger.
-   Copyright 1993, 1996, 1999 Free Software Foundation, Inc.
+   Copyright 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -39,6 +40,7 @@
 #include "gdbcmd.h"
 #include "assert.h"
 #include "language.h"
+#include "regcache.h"
 
 #include <fcntl.h>
 
@@ -57,7 +59,7 @@
 extern struct target_ops exec_ops;
 
 /* This lives in hppa-tdep.c. */
-extern struct unwind_table_entry *find_unwind_entry PARAMS ((CORE_ADDR pc));
+extern struct unwind_table_entry *find_unwind_entry (CORE_ADDR pc);
 
 /* These ought to be defined in some public interface, but aren't.  They
    define the meaning of the various bits in the distinguished __dld_flags
@@ -203,13 +205,12 @@ dld_cache;
 
 
 
-static void som_sharedlibrary_info_command PARAMS ((char *, int));
+static void som_sharedlibrary_info_command (char *, int);
 
-static void som_solib_sharedlibrary_command PARAMS ((char *, int));
+static void som_solib_sharedlibrary_command (char *, int);
 
 static LONGEST
-som_solib_sizeof_symbol_table (filename)
-     char *filename;
+som_solib_sizeof_symbol_table (char *filename)
 {
   bfd *abfd;
   int desc;
@@ -231,7 +232,7 @@ som_solib_sizeof_symbol_table (filename)
   if (!abfd)
     {
       close (desc);
-      make_cleanup (free, filename);
+      make_cleanup (xfree, filename);
       error ("\"%s\": can't open to read symbols: %s.", filename,
             bfd_errmsg (bfd_get_error ()));
     }
@@ -239,7 +240,7 @@ som_solib_sizeof_symbol_table (filename)
   if (!bfd_check_format (abfd, bfd_object))    /* Reads in section info */
     {
       bfd_close (abfd);                /* This also closes desc */
-      make_cleanup (free, filename);
+      make_cleanup (xfree, filename);
       error ("\"%s\": can't read symbols: %s.", filename,
             bfd_errmsg (bfd_get_error ()));
     }
@@ -257,7 +258,7 @@ som_solib_sizeof_symbol_table (filename)
     st_size += (LONGEST) bfd_section_size (abfd, sect);
 
   bfd_close (abfd);            /* This also closes desc */
-  free (filename);
+  xfree (filename);
 
   /* Unfortunately, just summing the sizes of various debug info
      sections isn't a very accurate measurement of how much heap
@@ -280,17 +281,34 @@ som_solib_sizeof_symbol_table (filename)
 
 
 static void
-som_solib_add_solib_objfile (so, name, from_tty, text_addr)
-     struct so_list *so;
-     char *name;
-     int from_tty;
-     CORE_ADDR text_addr;
+som_solib_add_solib_objfile (struct so_list *so, char *name, int from_tty,
+                            CORE_ADDR text_addr)
 {
   obj_private_data_t *obj_private;
+  struct obj_section *s;
 
-  so->objfile = symbol_file_add (name, from_tty, text_addr, 0, 0, 0, 0, 1);
+  so->objfile = symbol_file_add (name, from_tty, NULL, 0, OBJF_SHARED);
   so->abfd = so->objfile->obfd;
 
+  /* syms_from_objfile has bizarre section offset code,
+     so I do my own right here.  */
+  for (s = so->objfile->sections; s < so->objfile->sections_end; s++)
+    {
+      flagword aflag = bfd_get_section_flags(so->abfd, s->the_bfd_section);
+      if (aflag & SEC_CODE)
+       {
+         s->addr    += so->som_solib.text_addr - so->som_solib.text_link_addr;
+         s->endaddr += so->som_solib.text_addr - so->som_solib.text_link_addr;
+       }
+      else if (aflag & SEC_DATA)
+       {
+         s->addr    += so->som_solib.data_start;
+         s->endaddr += so->som_solib.data_start;
+       }
+      else
+       ;
+    }
+   
   /* Mark this as a shared library and save private data.
    */
   so->objfile->flags |= OBJF_SHARED;
@@ -317,12 +335,8 @@ som_solib_add_solib_objfile (so, name, from_tty, text_addr)
 
 
 static void
-som_solib_load_symbols (so, name, from_tty, text_addr, target)
-     struct so_list *so;
-     char *name;
-     int from_tty;
-     CORE_ADDR text_addr;
-     struct target_ops *target;
+som_solib_load_symbols (struct so_list *so, char *name, int from_tty,
+                       CORE_ADDR text_addr, struct target_ops *target)
 {
   struct section_table *p;
   int status;
@@ -351,13 +365,13 @@ som_solib_load_symbols (so, name, from_tty, text_addr, target)
     {
       if (p->the_bfd_section->flags & SEC_CODE)
        {
-         p->addr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_TEXT);
-         p->endaddr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_TEXT);
+         p->addr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_TEXT (so->objfile));
+         p->endaddr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_TEXT (so->objfile));
        }
       else if (p->the_bfd_section->flags & SEC_DATA)
        {
-         p->addr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_DATA);
-         p->endaddr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_DATA);
+         p->addr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_DATA (so->objfile));
+         p->endaddr += ANOFFSET (so->objfile->section_offsets, SECT_OFF_DATA (so->objfile));
        }
     }
 
@@ -375,49 +389,11 @@ som_solib_load_symbols (so, name, from_tty, text_addr, target)
   if (status != 0)
     {
       int old, new;
-      int update_coreops;
-      int update_execops;
-
-      /* We must update the to_sections field in the core_ops structure
-         here, otherwise we dereference a potential dangling pointer
-         for each call to target_read/write_memory within this routine.  */
-      update_coreops = core_ops.to_sections == target->to_sections;
-
-      /* Ditto exec_ops (this was a bug).
-       */
-      update_execops = exec_ops.to_sections == target->to_sections;
 
       new = so->sections_end - so->sections;
-      /* Add sections from the shared library to the core target.  */
-      if (target->to_sections)
-       {
-         old = target->to_sections_end - target->to_sections;
-         target->to_sections = (struct section_table *)
-           xrealloc ((char *) target->to_sections,
-                     ((sizeof (struct section_table)) * (old + new)));
-       }
-      else
-       {
-         old = 0;
-         target->to_sections = (struct section_table *)
-           xmalloc ((sizeof (struct section_table)) * new);
-       }
-      target->to_sections_end = (target->to_sections + old + new);
-
-      /* Update the to_sections field in the core_ops structure
-         if needed, ditto exec_ops.  */
-      if (update_coreops)
-       {
-         core_ops.to_sections = target->to_sections;
-         core_ops.to_sections_end = target->to_sections_end;
-       }
-
-      if (update_execops)
-       {
-         exec_ops.to_sections = target->to_sections;
-         exec_ops.to_sections_end = target->to_sections_end;
-       }
-
+      
+      old = target_resize_to_sections (target, new);
+      
       /* Copy over the old data before it gets clobbered.  */
       memcpy ((char *) (target->to_sections + old),
              so->sections,
@@ -431,10 +407,7 @@ som_solib_load_symbols (so, name, from_tty, text_addr, target)
    be exceeded.  */
 
 void
-som_solib_add (arg_string, from_tty, target)
-     char *arg_string;
-     int from_tty;
-     struct target_ops *target;
+som_solib_add (char *arg_string, int from_tty, struct target_ops *target)
 {
   struct minimal_symbol *msymbol;
   struct so_list *so_list_tail;
@@ -868,7 +841,7 @@ err:
    means running until the "_start" is called.  */
 
 void
-som_solib_create_inferior_hook ()
+som_solib_create_inferior_hook (void)
 {
   struct minimal_symbol *msymbol;
   unsigned int dld_flags, status, have_endo;
@@ -905,7 +878,7 @@ som_solib_create_inferior_hook ()
     }
 
   anaddr = SYMBOL_VALUE_ADDRESS (msymbol);
-  store_unsigned_integer (buf, 4, inferior_pid);
+  store_unsigned_integer (buf, 4, PIDGET (inferior_ptid));
   status = target_write_memory (anaddr, buf, 4);
   if (status != 0)
     {
@@ -1052,21 +1025,12 @@ keep_going:
       struct so_list *temp;
 
       temp = so_list_head;
-      free (so_list_head);
+      xfree (so_list_head);
       so_list_head = temp->next;
     }
   clear_symtab_users ();
 }
 
-
-static void
-reset_inferior_pid (saved_inferior_pid)
-     int saved_inferior_pid;
-{
-  inferior_pid = saved_inferior_pid;
-}
-
-
 /* This operation removes the "hook" between GDB and the dynamic linker,
    which causes the dld to notify GDB of shared library events.
 
@@ -1078,19 +1042,17 @@ reset_inferior_pid (saved_inferior_pid)
    GDB may already have been notified of.
  */
 void
-som_solib_remove_inferior_hook (pid)
-     int pid;
+som_solib_remove_inferior_hook (int pid)
 {
   CORE_ADDR addr;
   struct minimal_symbol *msymbol;
   int status;
   char dld_flags_buffer[TARGET_INT_BIT / TARGET_CHAR_BIT];
   unsigned int dld_flags_value;
-  int saved_inferior_pid = inferior_pid;
-  struct cleanup *old_cleanups = make_cleanup (reset_inferior_pid, saved_inferior_pid);
+  struct cleanup *old_cleanups = save_inferior_ptid ();
 
   /* Ensure that we're really operating on the specified process. */
-  inferior_pid = pid;
+  inferior_ptid = pid_to_ptid (pid);
 
   /* We won't bother to remove the solib breakpoints from this process.
 
@@ -1129,11 +1091,8 @@ som_solib_remove_inferior_hook (pid)
    som_solib_create_inferior_hook.
  */
 void
-som_solib_create_catch_load_hook (pid, tempflag, filename, cond_string)
-     int pid;
-     int tempflag;
-     char *filename;
-     char *cond_string;
+som_solib_create_catch_load_hook (int pid, int tempflag, char *filename,
+                                 char *cond_string)
 {
   create_solib_load_event_breakpoint ("__d_trap", tempflag, filename, cond_string);
 }
@@ -1150,18 +1109,14 @@ som_solib_create_catch_load_hook (pid, tempflag, filename, cond_string)
    som_solib_create_inferior_hook.
  */
 void
-som_solib_create_catch_unload_hook (pid, tempflag, filename, cond_string)
-     int pid;
-     int tempflag;
-     char *filename;
-     char *cond_string;
+som_solib_create_catch_unload_hook (int pid, int tempflag, char *filename,
+                                   char *cond_string)
 {
   create_solib_unload_event_breakpoint ("__d_trap", tempflag, filename, cond_string);
 }
 
 int
-som_solib_have_load_event (pid)
-     int pid;
+som_solib_have_load_event (int pid)
 {
   CORE_ADDR event_kind;
 
@@ -1170,8 +1125,7 @@ som_solib_have_load_event (pid)
 }
 
 int
-som_solib_have_unload_event (pid)
-     int pid;
+som_solib_have_unload_event (int pid)
 {
   CORE_ADDR event_kind;
 
@@ -1180,8 +1134,7 @@ som_solib_have_unload_event (pid)
 }
 
 static char *
-som_solib_library_pathname (pid)
-     int pid;
+som_solib_library_pathname (int pid)
 {
   CORE_ADDR dll_handle_address;
   CORE_ADDR dll_pathname_address;
@@ -1211,8 +1164,7 @@ som_solib_library_pathname (pid)
 }
 
 char *
-som_solib_loaded_library_pathname (pid)
-     int pid;
+som_solib_loaded_library_pathname (int pid)
 {
   if (!som_solib_have_load_event (pid))
     error ("Must have a load event to use this query");
@@ -1221,8 +1173,7 @@ som_solib_loaded_library_pathname (pid)
 }
 
 char *
-som_solib_unloaded_library_pathname (pid)
-     int pid;
+som_solib_unloaded_library_pathname (int pid)
 {
   if (!som_solib_have_unload_event (pid))
     error ("Must have an unload event to use this query");
@@ -1231,7 +1182,7 @@ som_solib_unloaded_library_pathname (pid)
 }
 
 static void
-som_solib_desire_dynamic_linker_symbols ()
+som_solib_desire_dynamic_linker_symbols (void)
 {
   struct objfile *objfile;
   struct unwind_table_entry *u;
@@ -1329,9 +1280,7 @@ som_solib_desire_dynamic_linker_symbols ()
 }
 
 int
-som_solib_in_dynamic_linker (pid, pc)
-     int pid;
-     CORE_ADDR pc;
+som_solib_in_dynamic_linker (int pid, CORE_ADDR pc)
 {
   struct unwind_table_entry *u_pc;
 
@@ -1378,8 +1327,7 @@ som_solib_in_dynamic_linker (pid, pc)
    ADDR isn't in any known shared library, return zero.  */
 
 CORE_ADDR
-som_solib_get_got_by_pc (addr)
-     CORE_ADDR addr;
+som_solib_get_got_by_pc (CORE_ADDR addr)
 {
   struct so_list *so_list = so_list_head;
   CORE_ADDR got_value = 0;
@@ -1404,8 +1352,7 @@ som_solib_get_got_by_pc (addr)
 /* this function is used in hppa_fix_call_dummy in hppa-tdep.c */
 
 CORE_ADDR
-som_solib_get_solib_by_pc (addr)
-     CORE_ADDR addr;
+som_solib_get_solib_by_pc (CORE_ADDR addr)
 {
   struct so_list *so_list = so_list_head;
 
@@ -1426,9 +1373,8 @@ som_solib_get_solib_by_pc (addr)
 
 
 int
-som_solib_section_offsets (objfile, offsets)
-     struct objfile *objfile;
-     struct section_offsets *offsets;
+som_solib_section_offsets (struct objfile *objfile,
+                          struct section_offsets *offsets)
 {
   struct so_list *so_list = so_list_head;
 
@@ -1441,11 +1387,11 @@ som_solib_section_offsets (objfile, offsets)
          asection *private_section;
 
          /* The text offset is easy.  */
-         ANOFFSET (offsets, SECT_OFF_TEXT)
+         offsets->offsets[SECT_OFF_TEXT (objfile)]
            = (so_list->som_solib.text_addr
               - so_list->som_solib.text_link_addr);
-         ANOFFSET (offsets, SECT_OFF_RODATA)
-           = ANOFFSET (offsets, SECT_OFF_TEXT);
+         offsets->offsets[SECT_OFF_RODATA (objfile)]
+           = ANOFFSET (offsets, SECT_OFF_TEXT (objfile));
 
          /* We should look at presumed_dp in the SOM header, but
             that's not easily available.  This should be OK though.  */
@@ -1454,14 +1400,14 @@ som_solib_section_offsets (objfile, offsets)
          if (!private_section)
            {
              warning ("Unable to find $PRIVATE$ in shared library!");
-             ANOFFSET (offsets, SECT_OFF_DATA) = 0;
-             ANOFFSET (offsets, SECT_OFF_BSS) = 0;
+             offsets->offsets[SECT_OFF_DATA (objfile)] = 0;
+             offsets->offsets[SECT_OFF_BSS (objfile)] = 0;
              return 1;
            }
-         ANOFFSET (offsets, SECT_OFF_DATA)
+         offsets->offsets[SECT_OFF_DATA (objfile)]
            = (so_list->som_solib.data_start - private_section->vma);
-         ANOFFSET (offsets, SECT_OFF_BSS)
-           = ANOFFSET (offsets, SECT_OFF_DATA);
+         offsets->offsets[SECT_OFF_BSS (objfile)]
+           = ANOFFSET (offsets, SECT_OFF_DATA (objfile));
          return 1;
        }
       so_list = so_list->next;
@@ -1472,15 +1418,13 @@ som_solib_section_offsets (objfile, offsets)
 /* Dump information about all the currently loaded shared libraries.  */
 
 static void
-som_sharedlibrary_info_command (ignore, from_tty)
-     char *ignore;
-     int from_tty;
+som_sharedlibrary_info_command (char *ignore, int from_tty)
 {
   struct so_list *so_list = so_list_head;
 
   if (exec_bfd == NULL)
     {
-      printf_unfiltered ("no exec file.\n");
+      printf_unfiltered ("No executable file.\n");
       return;
     }
 
@@ -1520,9 +1464,7 @@ som_sharedlibrary_info_command (ignore, from_tty)
 }
 
 static void
-som_solib_sharedlibrary_command (args, from_tty)
-     char *args;
-     int from_tty;
+som_solib_sharedlibrary_command (char *args, int from_tty)
 {
   dont_repeat ();
   som_solib_add (args, from_tty, (struct target_ops *) 0);
@@ -1531,8 +1473,7 @@ som_solib_sharedlibrary_command (args, from_tty)
 
 
 char *
-som_solib_address (addr)
-     CORE_ADDR addr;
+som_solib_address (CORE_ADDR addr)
 {
   struct so_list *so = so_list_head;
 
@@ -1554,7 +1495,7 @@ som_solib_address (addr)
 
 
 void
-som_solib_restart ()
+som_solib_restart (void)
 {
   struct so_list *sl = so_list_head;
 
@@ -1568,7 +1509,7 @@ som_solib_restart ()
   while (sl)
     {
       struct so_list *next_sl = sl->next;
-      free (sl);
+      xfree (sl);
       sl = next_sl;
     }
   so_list_head = NULL;
@@ -1601,9 +1542,27 @@ som_solib_restart ()
 }
 
 
+/* LOCAL FUNCTION
+
+   no_shared_libraries -- handle command to explicitly discard symbols
+   from shared libraries.
+
+   DESCRIPTION
+
+   Implements the command "nosharedlibrary", which discards symbols
+   that have been auto-loaded from shared libraries.  Symbols from
+   shared libraries that were added by explicit request of the user
+   are not discarded.  Also called from remote.c.  */
+
+void
+no_shared_libraries (char *ignored, int from_tty)
+{
+  /* FIXME */
+}
+
 
 void
-_initialize_som_solib ()
+_initialize_som_solib (void)
 {
   add_com ("sharedlibrary", class_files, som_solib_sharedlibrary_command,
           "Load shared object library symbols for files matching REGEXP.");
@@ -1638,8 +1597,7 @@ Otherwise, symbols must be loaded manually, using `sharedlibrary'.",
 /* Get some HPUX-specific data from a shared lib.
  */
 CORE_ADDR
-so_lib_thread_start_addr (so)
-     struct so_list *so;
+so_lib_thread_start_addr (struct so_list *so)
 {
   return so->som_solib.tsd_start_addr;
 }
This page took 0.030582 seconds and 4 git commands to generate.