2009-06-16 Paul Pluzhnikov <ppluzhnikov@google.com>
authorPaul Pluzhnikov <ppluzhnikov@google.com>
Tue, 16 Jun 2009 18:49:25 +0000 (18:49 +0000)
committerPaul Pluzhnikov <ppluzhnikov@google.com>
Tue, 16 Jun 2009 18:49:25 +0000 (18:49 +0000)
* solib.c (symbol_add_stub): New FLAGS parameter.
(solib_read_symbols): FROM_TTY -> FLAGS, call symbol_add_stub
directly.
(solib_add): Defer breakpoint_re_set until after all solibs.
* bsd-uthread.c (bsd_uthread_solib_loaded): Adjust.
* rs6000-nat.c (objfile_symbol_add): Adjust.
* symfile.c (syms_from_objfile): Merge parameters into ADD_FLAGS.
(new_symfile_objfile): Likewise.
(symbol_file_add_with_addrs_or_offsets): Likewise.
(symbol_file_add_from_bfd): Likewise.
(symbol_file_add): Likewise.
* symfile.h (enum symfile_add_flags): New. Adjust prototypes.
* symfile-mem.c (symbol_file_add_from_memory): Adjust.
* windows-nat.c (safe_symbol_file_add_stub): Adjust.
* machoread.c (macho_oso_symfile, macho_symfile_read): Adjust.

gdb/ChangeLog
gdb/bsd-uthread.c
gdb/machoread.c
gdb/rs6000-nat.c
gdb/solib.c
gdb/spu-linux-nat.c
gdb/symfile-mem.c
gdb/symfile.c
gdb/symfile.h
gdb/windows-nat.c

index 1cc0cb287e8a8561f8c270d932f733e2a2daeeed..2ef059bf447f08bbedb490f5be3c5a2f55b4576d 100644 (file)
@@ -1,3 +1,21 @@
+2009-06-16  Paul Pluzhnikov  <ppluzhnikov@google.com>
+
+       * solib.c (symbol_add_stub): New FLAGS parameter.
+       (solib_read_symbols): FROM_TTY -> FLAGS, call symbol_add_stub
+       directly.
+       (solib_add): Defer breakpoint_re_set until after all solibs.
+       * bsd-uthread.c (bsd_uthread_solib_loaded): Adjust.
+       * rs6000-nat.c (objfile_symbol_add): Adjust.
+       * symfile.c (syms_from_objfile): Merge parameters into ADD_FLAGS.
+       (new_symfile_objfile): Likewise.
+       (symbol_file_add_with_addrs_or_offsets): Likewise.
+       (symbol_file_add_from_bfd): Likewise.
+       (symbol_file_add): Likewise.
+       * symfile.h (enum symfile_add_flags): New. Adjust prototypes.
+       * symfile-mem.c (symbol_file_add_from_memory): Adjust.
+       * windows-nat.c (safe_symbol_file_add_stub): Adjust.
+       * machoread.c (macho_oso_symfile, macho_symfile_read): Adjust.
+       
 2009-06-16  Keith Seitz  <keiths@redhat.com>
 
        * linespec.c (collect_methods): Delete.
index 18287af9e8c149ca0a9c53865f1fdd38f458459e..e84e0f088493a890896eac60b53a76c320572dcb 100644 (file)
@@ -248,7 +248,7 @@ bsd_uthread_solib_loaded (struct so_list *so)
     {
       if (strncmp (so->so_original_name, *names, strlen (*names)) == 0)
        {
-         solib_read_symbols (so, so->from_tty);
+         solib_read_symbols (so, so->from_tty ? SYMFILE_VERBOSE : 0);
 
          if (bsd_uthread_activate (so->objfile))
            {
index d8d3bd2285c20b36df6ab9faddfde13cf0cae8ca..78daa7533d3a854f7055c88912833753fbdbb204 100644 (file)
@@ -406,7 +406,7 @@ macho_oso_symfile (struct objfile *main_objfile)
              bfd_close (member_bfd);
            }
            else
-             symbol_file_add_from_bfd (member_bfd, 0, addrs, 0, 0);
+             symbol_file_add_from_bfd (member_bfd, 0, addrs, 0);
        }
       else
        {
@@ -429,7 +429,7 @@ macho_oso_symfile (struct objfile *main_objfile)
              continue;
            }
   
-         symbol_file_add_from_bfd (abfd, 0, addrs, 0, 0);
+         symbol_file_add_from_bfd (abfd, 0, addrs, 0);
        }
       xfree (oso->symbols);
       xfree (oso->offsets);
@@ -592,7 +592,7 @@ macho_symfile_read (struct objfile *objfile, int mainline)
          oso_vector = NULL;
 
          /* Now recurse: read dwarf from dsym.  */
-         symbol_file_add_from_bfd (dsym_bfd, 0, NULL, 0, 0);
+         symbol_file_add_from_bfd (dsym_bfd, 0, NULL, 0);
       
          /* Don't try to read dwarf2 from main file or shared libraries.  */
          return;
index a7866574daa0349574b4d5f54bb90ad7bc6fc0b5..3849ce3590a069ea4af92d6d61675e1c1fbee1be 100644 (file)
@@ -691,8 +691,8 @@ objfile_symbol_add (void *arg)
 {
   struct objfile *obj = (struct objfile *) arg;
 
-  syms_from_objfile (obj, NULL, 0, 0, 0, 0);
-  new_symfile_objfile (obj, 0, 0);
+  syms_from_objfile (obj, NULL, 0, 0, 0);
+  new_symfile_objfile (obj, 0);
   return 1;
 }
 
index a434ececb52bd54a09e5bd1e6ec775f6384fd4b4..d194ac78f962eedf0009fb23f51cb213e1230552 100644 (file)
@@ -448,39 +448,37 @@ master_so_list (void)
   return so_list_head;
 }
 
-
-/* A small stub to get us past the arg-passing pinhole of catch_errors.  */
-
-static int
-symbol_add_stub (void *arg)
+static void
+symbol_add_stub (struct so_list *so, int flags)
 {
-  struct so_list *so = (struct so_list *) arg;  /* catch_errs bogon */
   struct section_addr_info *sap;
 
   /* Have we already loaded this shared object?  */
   ALL_OBJFILES (so->objfile)
     {
       if (strcmp (so->objfile->name, so->so_name) == 0)
-       return 1;
+       return;
     }
 
   sap = build_section_addr_info_from_section_table (so->sections,
                                                     so->sections_end);
 
-  so->objfile = symbol_file_add_from_bfd (so->abfd, so->from_tty,
-                                         sap, 0, OBJF_SHARED | OBJF_KEEPBFD);
+  so->objfile = symbol_file_add_from_bfd (so->abfd, flags,
+                                         sap, OBJF_SHARED | OBJF_KEEPBFD);
   free_section_addr_info (sap);
 
-  return (1);
+  return;
 }
 
-/* Read in symbols for shared object SO.  If FROM_TTY is non-zero, be
-   chatty about it.  Return non-zero if any symbols were actually
+/* Read in symbols for shared object SO.  If SYMFILE_VERBOSE is set in FLAGS,
+   be chatty about it.  Return non-zero if any symbols were actually
    loaded.  */
 
 int
-solib_read_symbols (struct so_list *so, int from_tty)
+solib_read_symbols (struct so_list *so, int flags)
 {
+  const int from_tty = flags & SYMFILE_VERBOSE;
+
   if (so->symbols_loaded)
     {
       if (from_tty)
@@ -493,15 +491,21 @@ solib_read_symbols (struct so_list *so, int from_tty)
     }
   else
     {
-      if (catch_errors (symbol_add_stub, so,
-                       "Error while reading shared library symbols:\n",
-                       RETURN_MASK_ALL))
-       {
-         if (from_tty && print_symbol_loading)
-           printf_unfiltered (_("Loaded symbols for %s\n"), so->so_name);
-         so->symbols_loaded = 1;
-         return 1;
-       }
+      volatile struct gdb_exception exception;
+      TRY_CATCH (exception, RETURN_MASK_ALL)
+        {
+          symbol_add_stub (so, flags);
+        }
+      if (exception.reason != 0)
+        {
+          exception_fprintf (gdb_stderr, exception,
+                             "Error while reading shared library symbols:\n");
+          return 0;
+        }
+      if (from_tty && print_symbol_loading)
+        printf_unfiltered (_("Loaded symbols for %s\n"), so->so_name);
+      so->symbols_loaded = 1;
+      return 1;
     }
 
   return 0;
@@ -736,6 +740,8 @@ solib_add (char *pattern, int from_tty, struct target_ops *target, int readsyms)
   {
     int any_matches = 0;
     int loaded_any_symbols = 0;
+    const int flags =
+        SYMFILE_DEFER_BP_RESET | (from_tty ? SYMFILE_VERBOSE : 0);
 
     for (gdb = so_list_head; gdb; gdb = gdb->next)
       if (! pattern || re_exec (gdb->so_name))
@@ -749,10 +755,13 @@ solib_add (char *pattern, int from_tty, struct target_ops *target, int readsyms)
             (readsyms || libpthread_solib_p (gdb));
 
          any_matches = 1;
-         if (add_this_solib && solib_read_symbols (gdb, from_tty))
+         if (add_this_solib && solib_read_symbols (gdb, flags))
            loaded_any_symbols = 1;
        }
 
+    if (loaded_any_symbols)
+      breakpoint_re_set ();
+
     if (from_tty && pattern && ! any_matches)
       printf_unfiltered
        ("No loaded shared libraries match the pattern `%s'.\n", pattern);
index b8897e188fd87a42de429f14b90aaf262aeb124f..f6a3c794ec7003c3d4d00401a5e3a3c10c835725 100644 (file)
@@ -372,7 +372,8 @@ spu_symbol_file_add_from_memory (int inferior_fd)
   /* Open BFD representing SPE executable and read its symbols.  */
   nbfd = spu_bfd_open (addr);
   if (nbfd)
-    symbol_file_add_from_bfd (nbfd, 1, NULL, 1, 0);
+    symbol_file_add_from_bfd (nbfd, SYMFILE_VERBOSE | SYMFILE_MAINLINE,
+                              NULL, 0);
 }
 
 
@@ -600,4 +601,3 @@ _initialize_spu_nat (void)
   /* Register SPU target.  */
   add_target (t);
 }
-
index e336350f9f65c3c4ec4126fe3dd1061d97dacb33..0c0640f0ff4286a13af24d473556689338aa1682 100644 (file)
@@ -107,8 +107,8 @@ symbol_file_add_from_memory (struct bfd *templ, CORE_ADDR addr, char *name,
        ++i;
       }
 
-  objf = symbol_file_add_from_bfd (nbfd, from_tty,
-                                   sai, 0, OBJF_SHARED);
+  objf = symbol_file_add_from_bfd (nbfd, from_tty ? SYMFILE_VERBOSE : 0,
+                                   sai, OBJF_SHARED);
 
   /* This might change our ideas about frames already looked at.  */
   reinit_frame_cache ();
index 164690d8c0d4d0df885be343bb1b8092bbe303e3..7e6ea2c8b500bda1a64dfc8f549c9945600fc9b9 100644 (file)
@@ -740,22 +740,20 @@ default_symfile_segments (bfd *abfd)
    list any more; all we have is the section offset table.)  If
    OFFSETS is non-zero, ADDRS must be zero.
 
-   MAINLINE is nonzero if this is the main symbol file, or zero if
-   it's an extra symbol file such as dynamically loaded code.
-
-   VERBO is nonzero if the caller has printed a verbose message about
-   the symbol reading (and complaints can be more terse about it).  */
+   ADD_FLAGS encodes verbosity level, whether this is main symbol or
+   an extra symbol file such as dynamically loaded code, and wether
+   breakpoint reset should be deferred.  */
 
 void
 syms_from_objfile (struct objfile *objfile,
                    struct section_addr_info *addrs,
                    struct section_offsets *offsets,
                    int num_offsets,
-                  int mainline,
-                   int verbo)
+                  int add_flags)
 {
   struct section_addr_info *local_addr = NULL;
   struct cleanup *old_chain;
+  const int mainline = add_flags & SYMFILE_MAINLINE;
 
   gdb_assert (! (addrs && offsets));
 
@@ -875,7 +873,7 @@ syms_from_objfile (struct objfile *objfile,
      initial symbol reading for this file. */
 
   (*objfile->sf->sym_init) (objfile);
-  clear_complaints (&symfile_complaints, 1, verbo);
+  clear_complaints (&symfile_complaints, 1, add_flags & SYMFILE_VERBOSE);
 
   if (addrs)
     (*objfile->sf->sym_offsets) (objfile, addrs);
@@ -906,26 +904,26 @@ syms_from_objfile (struct objfile *objfile,
    objfile. */
 
 void
-new_symfile_objfile (struct objfile *objfile, int mainline, int verbo)
+new_symfile_objfile (struct objfile *objfile, int add_flags)
 {
 
   /* If this is the main symbol file we have to clean up all users of the
      old main symbol file. Otherwise it is sufficient to fixup all the
      breakpoints that may have been redefined by this symbol file.  */
-  if (mainline)
+  if (add_flags & SYMFILE_MAINLINE)
     {
       /* OK, make it the "real" symbol file.  */
       symfile_objfile = objfile;
 
       clear_symtab_users ();
     }
-  else
+  else if ((add_flags & SYMFILE_DEFER_BP_RESET) == 0)
     {
       breakpoint_re_set_objfile (objfile);
     }
 
   /* We're done reading the symbol file; finish off complaints.  */
-  clear_complaints (&symfile_complaints, 0, verbo);
+  clear_complaints (&symfile_complaints, 0, add_flags & SYMFILE_VERBOSE);
 }
 
 /* Process a symbol file, as either the main file or as a dynamically
@@ -934,23 +932,23 @@ new_symfile_objfile (struct objfile *objfile, int mainline, int verbo)
    ABFD is a BFD already open on the file, as from symfile_bfd_open.
    This BFD will be closed on error, and is always consumed by this function.
 
-   FROM_TTY says how verbose to be.
-
-   MAINLINE specifies whether this is the main symbol file, or whether
-   it's an extra symbol file such as dynamically loaded code.
+   ADD_FLAGS encodes verbosity, whether this is main symbol file or
+   extra, such as dynamically loaded code, and what to do with breakpoins.
 
    ADDRS, OFFSETS, and NUM_OFFSETS are as described for
-   syms_from_objfile, above.  ADDRS is ignored when MAINLINE is
-   non-zero.
+   syms_from_objfile, above.
+   ADDRS is ignored when SYMFILE_MAINLINE bit is set in ADD_FLAGS.
 
    Upon success, returns a pointer to the objfile that was added.
    Upon failure, jumps back to command level (never returns). */
+
 static struct objfile *
-symbol_file_add_with_addrs_or_offsets (bfd *abfd, int from_tty,
+symbol_file_add_with_addrs_or_offsets (bfd *abfd,
+                                       int add_flags,
                                        struct section_addr_info *addrs,
                                        struct section_offsets *offsets,
                                        int num_offsets,
-                                       int mainline, int flags)
+                                       int flags)
 {
   struct objfile *objfile;
   struct partial_symtab *psymtab;
@@ -958,6 +956,7 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd, int from_tty,
   struct section_addr_info *orig_addrs = NULL;
   struct cleanup *my_cleanups;
   const char *name = bfd_get_filename (abfd);
+  const int from_tty = add_flags & SYMFILE_VERBOSE;
 
   my_cleanups = make_cleanup_bfd_close (abfd);
 
@@ -965,7 +964,7 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd, int from_tty,
      interactively wiping out any existing symbols.  */
 
   if ((have_full_symbols () || have_partial_symbols ())
-      && mainline
+      && (add_flags & SYMFILE_MAINLINE)
       && from_tty
       && !query (_("Load new symbol table from \"%s\"? "), name))
     error (_("Not confirmed."));
@@ -997,7 +996,7 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd, int from_tty,
        }
     }
   syms_from_objfile (objfile, addrs, offsets, num_offsets,
-                    mainline, from_tty);
+                    add_flags);
 
   /* We now have at least a partial symbol table.  Check to see if the
      user requested that all symbols be read on initial access via either
@@ -1031,12 +1030,12 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd, int from_tty,
       if (addrs != NULL)
        {
          objfile->separate_debug_objfile
-            = symbol_file_add (debugfile, from_tty, orig_addrs, 0, flags);
+            = symbol_file_add (debugfile, add_flags, orig_addrs, flags);
        }
       else
        {
          objfile->separate_debug_objfile
-            = symbol_file_add (debugfile, from_tty, NULL, 0, flags);
+            = symbol_file_add (debugfile, add_flags, NULL, flags);
        }
       objfile->separate_debug_objfile->separate_debug_objfile_backlink
         = objfile;
@@ -1081,7 +1080,7 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd, int from_tty,
   if (objfile->sf == NULL)
     return objfile;    /* No symbols. */
 
-  new_symfile_objfile (objfile, mainline, from_tty);
+  new_symfile_objfile (objfile, add_flags);
 
   observer_notify_new_objfile (objfile);
 
@@ -1096,13 +1095,12 @@ symbol_file_add_with_addrs_or_offsets (bfd *abfd, int from_tty,
    See symbol_file_add_with_addrs_or_offsets's comments for
    details.  */
 struct objfile *
-symbol_file_add_from_bfd (bfd *abfd, int from_tty,
+symbol_file_add_from_bfd (bfd *abfd, int add_flags,
                           struct section_addr_info *addrs,
-                          int mainline, int flags)
+                          int flags)
 {
-  return symbol_file_add_with_addrs_or_offsets (abfd,
-                                               from_tty, addrs, 0, 0,
-                                                mainline, flags);
+  return symbol_file_add_with_addrs_or_offsets (abfd, add_flags, addrs, 0, 0,
+                                                flags);
 }
 
 
@@ -1110,11 +1108,11 @@ symbol_file_add_from_bfd (bfd *abfd, int from_tty,
    loaded file.  See symbol_file_add_with_addrs_or_offsets's comments
    for details.  */
 struct objfile *
-symbol_file_add (char *name, int from_tty, struct section_addr_info *addrs,
-                int mainline, int flags)
+symbol_file_add (char *name, int add_flags, struct section_addr_info *addrs,
+                int flags)
 {
-  return symbol_file_add_from_bfd (symfile_bfd_open (name), from_tty,
-                                   addrs, mainline, flags);
+  return symbol_file_add_from_bfd (symfile_bfd_open (name), add_flags, addrs,
+                                   flags);
 }
 
 
@@ -1135,7 +1133,8 @@ symbol_file_add_main (char *args, int from_tty)
 static void
 symbol_file_add_main_1 (char *args, int from_tty, int flags)
 {
-  symbol_file_add (args, from_tty, NULL, 1, flags);
+  const int add_flags = SYMFILE_MAINLINE | (from_tty ? SYMFILE_VERBOSE : 0);
+  symbol_file_add (args, add_flags, NULL, flags);
 
   /* Getting new symbols may change our opinion about
      what is frameless.  */
@@ -2224,7 +2223,8 @@ add_symbol_file_command (char *args, int from_tty)
   if (from_tty && (!query ("%s", "")))
     error (_("Not confirmed."));
 
-  symbol_file_add (filename, from_tty, section_addrs, 0, flags);
+  symbol_file_add (filename, from_tty ? SYMFILE_VERBOSE : 0,
+                   section_addrs, flags);
 
   /* Getting new symbols may change our opinion about what is
      frameless.  */
@@ -2506,10 +2506,9 @@ reread_separate_symbols (struct objfile *objfile)
       objfile->separate_debug_objfile
         = (symbol_file_add_with_addrs_or_offsets
            (symfile_bfd_open (debug_file),
-            info_verbose, /* from_tty: Don't override the default. */
+            info_verbose ? SYMFILE_VERBOSE : 0,
             0, /* No addr table.  */
             objfile->section_offsets, objfile->num_sections,
-            0, /* Not mainline.  See comments about this above.  */
             objfile->flags & (OBJF_REORDERED | OBJF_SHARED | OBJF_READNOW
                               | OBJF_USERLOADED)));
       objfile->separate_debug_objfile->separate_debug_objfile_backlink
index 5451c28ab6fc6fbe85ff76fef0b11e075f57f21d..bba242ca4ae261a15c7d3fe9260896a0cba2546d 100644 (file)
@@ -210,18 +210,34 @@ extern int free_named_symtabs (char *);
 
 extern void add_symtab_fns (struct sym_fns *);
 
+/* This enum encodes bit-flags passed as ADD_FLAGS parameter to
+   syms_from_objfile, symbol_file_add, etc.  */
+
+enum symfile_add_flags
+  {
+    /* Be chatty about what you are doing.  */
+    SYMFILE_VERBOSE = 1 << 1,
+
+    /* This is the main symbol file (as opposed to symbol file for dynamically
+       loaded code).  */
+    SYMFILE_MAINLINE = 1 << 2,
+
+    /* Do not call breakpoint_re_set when adding this symbol file.  */
+    SYMFILE_DEFER_BP_RESET = 1 << 3
+  };
+
 extern void syms_from_objfile (struct objfile *,
                               struct section_addr_info *,
-                              struct section_offsets *, int, int, int);
+                              struct section_offsets *, int, int);
 
-extern void new_symfile_objfile (struct objfile *, int, int);
+extern void new_symfile_objfile (struct objfile *, int);
 
 extern struct objfile *symbol_file_add (char *, int,
-                                       struct section_addr_info *, int, int);
+                                       struct section_addr_info *, int);
 
 extern struct objfile *symbol_file_add_from_bfd (bfd *, int,
                                                  struct section_addr_info *,
-                                                 int, int);
+                                                 int);
 
 /* Create a new section_addr_info, with room for NUM_SECTIONS.  */
 
index aed3a2b53e32c0e374400b0ab490daff1997e17a..a90973373cce6a289c9250a5a3d6e94ab7965568 100644 (file)
@@ -556,7 +556,9 @@ static int
 safe_symbol_file_add_stub (void *argv)
 {
 #define p ((struct safe_symbol_file_add_args *) argv)
-  p->ret = symbol_file_add (p->name, p->from_tty, p->addrs, p->mainline, p->flags);
+  const int add_flags = ((p->from_tty ? SYMFILE_VERBOSE : 0)
+                         | (p->mainline ? SYMFILE_MAINLINE : 0));
+  p->ret = symbol_file_add (p->name, add_flags, p->addrs, p->flags);
   return !!p->ret;
 #undef p
 }