diff options
author | Tom Tromey <tromey@redhat.com> | 2012-01-24 21:39:18 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2012-01-24 21:39:18 +0000 |
commit | edcc5120824df89e290bfe8bded1c7cf89a5b40f (patch) | |
tree | ad610ce2f545a5076d5fcfe5b4e0631dc54622ed /gdb/infrun.c | |
parent | fa864999823be896ef9d00d06c67a853f588aa22 (diff) | |
download | gdb-edcc5120824df89e290bfe8bded1c7cf89a5b40f.zip gdb-edcc5120824df89e290bfe8bded1c7cf89a5b40f.tar.gz gdb-edcc5120824df89e290bfe8bded1c7cf89a5b40f.tar.bz2 |
PR symtab/12406:
* solib.c (update_solib_list): Update the program space's
added_solibs and deleted_solibs fields.
* progspace.h (struct program_space) <added_solibs,
deleted_solibs>: New fields.
(clear_program_space_solib_cache): Declare.
* progspace.c (release_program_space): Call
clear_program_space_solib_cache.
(clear_program_space_solib_cache): New function.
* infrun.c (handle_inferior_event) <TARGET_WAITKIND_LOADED>: Call
bpstat_stop_status. Use handle_solib_event.
* breakpoint.c: Include gdb_regex.h.
(print_solib_event): New function.
(bpstat_print): Use print_solib_event.
(bpstat_stop_status): Add special case for bp_shlib_event.
(handle_solib_event): New function.
(bpstat_what): Use handle_solib_event.
(struct solib_catchpoint): New.
(dtor_catch_solib, insert_catch_solib, remove_catch_solib)
(breakpoint_hit_catch_solib, check_status_catch_solib)
(print_it_catch_solib, print_one_catch_solib)
(print_mention_catch_solib, print_recreate_catch_solib): New
functions.
(catch_solib_breakpoint_ops): New global.
(catch_load_or_unload, catch_load_command_1)
(catch_unload_command_1): New functions.
(internal_bkpt_check_status): Add special case for
bp_shlib_event.
(internal_bkpt_print_it): Use print_solib_event.
(initialize_breakpoint_ops): Initialize
catch_solib_breakpoint_ops.
(_initialize_breakpoint): Register "catch load" and "catch
unload".
* breakpoint.h (handle_solib_event): Declare.
* NEWS: Add entry for "catch load" and "catch unload".
gdb/doc
* gdb.texinfo (Set Catchpoints): Document "catch load" and "catch
unload".
(Files): Mention new catch commands.
(GDB/MI Async Records): Likewise.
gdb/testsuite
* lib/mi-support.exp (mi_expect_stop): Add special case for
solib-event.
* gdb.base/catch-load-so.c: New file.
* gdb.base/catch-load.exp: New file.
* gdb.base/catch-load.c: New file.
* gdb.base/break-interp.exp (reach_1): Update regexp.
Diffstat (limited to 'gdb/infrun.c')
-rw-r--r-- | gdb/infrun.c | 41 |
1 files changed, 21 insertions, 20 deletions
diff --git a/gdb/infrun.c b/gdb/infrun.c index de4a8b7..bb4139a 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -3316,28 +3316,32 @@ handle_inferior_event (struct execution_control_state *ecs) established. */ if (stop_soon == NO_STOP_QUIETLY) { - /* Check for any newly added shared libraries if we're - supposed to be adding them automatically. Switch - terminal for any messages produced by - breakpoint_re_set. */ - target_terminal_ours_for_output (); - /* NOTE: cagney/2003-11-25: Make certain that the target - stack's section table is kept up-to-date. Architectures, - (e.g., PPC64), use the section table to perform - operations such as address => section name and hence - require the table to contain all sections (including - those found in shared libraries). */ -#ifdef SOLIB_ADD - SOLIB_ADD (NULL, 0, ¤t_target, auto_solib_add); -#else - solib_add (NULL, 0, ¤t_target, auto_solib_add); -#endif - target_terminal_inferior (); + struct regcache *regcache; + + if (!ptid_equal (ecs->ptid, inferior_ptid)) + context_switch (ecs->ptid); + regcache = get_thread_regcache (ecs->ptid); + + handle_solib_event (); + + ecs->event_thread->control.stop_bpstat + = bpstat_stop_status (get_regcache_aspace (regcache), + stop_pc, ecs->ptid, &ecs->ws); + ecs->random_signal + = !bpstat_explains_signal (ecs->event_thread->control.stop_bpstat); + + if (!ecs->random_signal) + { + /* A catchpoint triggered. */ + ecs->event_thread->suspend.stop_signal = TARGET_SIGNAL_TRAP; + goto process_event_stop_test; + } /* If requested, stop when the dynamic linker notifies gdb of events. This allows the user to get control and place breakpoints in initializer routines for dynamically loaded objects (among other things). */ + ecs->event_thread->suspend.stop_signal = TARGET_SIGNAL_0; if (stop_on_solib_events) { /* Make sure we print "Stopped due to solib-event" in @@ -3347,9 +3351,6 @@ handle_inferior_event (struct execution_control_state *ecs) stop_stepping (ecs); return; } - - /* NOTE drow/2007-05-11: This might be a good place to check - for "catch load". */ } /* If we are skipping through a shell, or through shared library |