diff options
author | Paul Pluzhnikov <ppluzhnikov@google.com> | 2009-06-16 18:49:25 +0000 |
---|---|---|
committer | Paul Pluzhnikov <ppluzhnikov@google.com> | 2009-06-16 18:49:25 +0000 |
commit | 7eedccfa2afb7a44b513282cb138d85cde1f7f41 (patch) | |
tree | ca021f970e20247ff72764df9982ce692250b94d /gdb/solib.c | |
parent | 19ef5c713c0116f2e15fea28168614d7894b613a (diff) | |
download | gdb-7eedccfa2afb7a44b513282cb138d85cde1f7f41.zip gdb-7eedccfa2afb7a44b513282cb138d85cde1f7f41.tar.gz gdb-7eedccfa2afb7a44b513282cb138d85cde1f7f41.tar.bz2 |
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.
Diffstat (limited to 'gdb/solib.c')
-rw-r--r-- | gdb/solib.c | 55 |
1 files changed, 32 insertions, 23 deletions
diff --git a/gdb/solib.c b/gdb/solib.c index a434ece..d194ac7 100644 --- a/gdb/solib.c +++ b/gdb/solib.c @@ -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); |