diff options
author | Vladimir Prus <vladimir@codesourcery.com> | 2008-01-29 17:52:47 +0000 |
---|---|---|
committer | Vladimir Prus <vladimir@codesourcery.com> | 2008-01-29 17:52:47 +0000 |
commit | a5606eee5ec10851d09a8e2709354c7e0931a99c (patch) | |
tree | 74396fad6948f39a3d299b61354795949342468e /gdb/testsuite/gdb.base/watchpoint-solib.exp | |
parent | 0b3de036ef7812900af73c59dae4a703fce5f2da (diff) | |
download | gdb-a5606eee5ec10851d09a8e2709354c7e0931a99c.zip gdb-a5606eee5ec10851d09a8e2709354c7e0931a99c.tar.gz gdb-a5606eee5ec10851d09a8e2709354c7e0931a99c.tar.bz2 |
Use multiple locations for hardware watchpoints.
This eliminates the need to traverse value chain, doing
various checks, in three different places.
* breakpoint.h (struct bp_location): New fields
lengths and watchpoint_type.
(struct breakpoint): Remove the val_chain field.
* breakpoint.c (is_hardware_watchpoint): New.
(free_valchain): Remove.
(update_watchpoint): New.
(insert_bp_location): For hardware watchpoint, just
directly insert it.
(insert_breakpoints): Call update_watchpoint_locations
on all watchpoints. If we have failed to insert
any location of a hardware watchpoint, remove all inserted
locations.
(remove_breakpoint): For hardware watchpoints, directly
remove location.
(watchpoints_triggered): Iterate over locations.
(bpstat_stop_status): Use only first location of
a resource watchpoint.
(delete_breakpoint): Don't call free_valchain.
(print_one_breakpoint): Don't print all
locations for watchpoints.
(breakpoint_re_set_one): Use update_watchpoint for
watchpoints.
Diffstat (limited to 'gdb/testsuite/gdb.base/watchpoint-solib.exp')
-rw-r--r-- | gdb/testsuite/gdb.base/watchpoint-solib.exp | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.base/watchpoint-solib.exp b/gdb/testsuite/gdb.base/watchpoint-solib.exp new file mode 100644 index 0000000..f883f91 --- /dev/null +++ b/gdb/testsuite/gdb.base/watchpoint-solib.exp @@ -0,0 +1,91 @@ +# Copyright 2007 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +if $tracelevel then { + strace $tracelevel +} + +# +# test running programs +# +set prms_id 0 +set bug_id 0 + +if {[skip_shlib_tests]} { + return 0 +} + +# TODO: Use LoadLibrary on this target instead of dlopen. +if {[istarget arm*-*-symbianelf*]} { + return 0 +} + +set testfile "watchpoint-solib" +set libfile "watchpoint-solib-shr" +set libname "${libfile}.sl" +set libsrcfile ${libfile}.c +set srcfile $srcdir/$subdir/$testfile.c +set binfile $objdir/$subdir/$testfile +set shlibdir ${objdir}/${subdir} +set libsrc $srcdir/$subdir/$libfile.c +set lib_sl $objdir/$subdir/$libname + +if [get_compiler_info ${binfile}] { + return -1 +} + +set lib_opts debug +set exec_opts [list debug shlib_load additional_flags=-DSHLIB_NAME\=\"${libname}\"] + +if { [gdb_compile_shlib $libsrc $lib_sl $lib_opts] != "" + || [gdb_compile $srcfile $binfile executable $exec_opts] != ""} { + untested "Couldn't compile $libsrc or $srcfile." + return -1 +} + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} +gdb_load_shlibs $lib_sl + +if [target_info exists gdb_stub] { + gdb_step_for_stub; +} + +runto_main + +# Test that if we set a watchpoint on a global variable +# in a explicitly loaded shared library, and then +# re-run the application, gdb does not crash. +gdb_test_multiple "break foo" "set pending breakpoint" { + -re ".*Make breakpoint pending.*y or \\\[n\\\]. $" { + gdb_test "y" "Breakpoint.*foo.*pending." "set pending breakpoint" + } +} + +gdb_test "continue" ".*Breakpoint 2.*foo.*" "continue to foo" +gdb_test "watch g" "Hardware watchpoint 3: g" "set watchpoint on g" +gdb_test "continue" ".*New value = 1.*" "continue to watchpoint hit" +rerun_to_main +gdb_test "continue" ".*Breakpoint 2.*foo.*" "continue to foo again" +gdb_test "continue" ".*New value = 1.*" "continue to watchpoint hit again" + + + + + |