2008-08-18 Pedro Alves * breakpoint.c (defer_breakpoint_re_setting): New. (breakpoint_re_set): Check it. (solib_add, reload_shared_libraries): Mask breakpoint_re_set. --- gdb/breakpoint.c | 8 ++++++++ gdb/solib.c | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+) Index: src/gdb/breakpoint.c =================================================================== --- src.orig/gdb/breakpoint.c 2008-08-19 12:17:03.000000000 +0100 +++ src/gdb/breakpoint.c 2008-08-19 12:21:04.000000000 +0100 @@ -7616,6 +7616,8 @@ breakpoint_re_set_one (void *bint) return 0; } +int defer_breakpoint_re_setting = 0; + /* Re-set all breakpoints after symbols have been re-loaded. */ void breakpoint_re_set (void) @@ -7624,6 +7626,12 @@ breakpoint_re_set (void) enum language save_language; int save_input_radix; + if (defer_breakpoint_re_setting) + /* When we're adding symbol files in batch, we defer doing + breakpoint re-setting until all symbols files are loaded -- + e.g., we're loading shared libraries. */ + return; + save_language = current_language->la_language; save_input_radix = input_radix; ALL_BREAKPOINTS_SAFE (b, temp) Index: src/gdb/solib.c =================================================================== --- src.orig/gdb/solib.c 2008-08-19 12:17:15.000000000 +0100 +++ src/gdb/solib.c 2008-08-19 12:25:43.000000000 +0100 @@ -668,10 +668,18 @@ libpthread_solib_p (struct so_list *so) FROM_TTY and TARGET are as described for update_solib_list, above. */ +extern int defer_breakpoint_re_setting; + void solib_add (char *pattern, int from_tty, struct target_ops *target, int readsyms) { struct so_list *gdb; + struct cleanup *old_chain; + + /* Defer reparsing breakpoints until after loading all + libraries. */ + old_chain = make_cleanup_restore_integer (&defer_breakpoint_re_setting); + defer_breakpoint_re_setting = 1; if (pattern) { @@ -721,6 +729,8 @@ solib_add (char *pattern, int from_tty, ops->special_symbol_handling (); } } + + do_cleanups (old_chain); } @@ -959,8 +969,17 @@ static void reload_shared_libraries (char *ignored, int from_tty, struct cmd_list_element *e) { + struct cleanup *old_chain; + no_shared_libraries (NULL, from_tty); + + /* Defer reparsing breakpoints until loading all libraries. */ + old_chain = make_cleanup_restore_integer (&defer_breakpoint_re_setting); + defer_breakpoint_re_setting = 1; + solib_add (NULL, from_tty, NULL, auto_solib_add); + + do_cleanups (old_chain); } static void