aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.base/watchpoint-solib.c
diff options
context:
space:
mode:
authorVladimir Prus <vladimir@codesourcery.com>2008-01-29 17:52:47 +0000
committerVladimir Prus <vladimir@codesourcery.com>2008-01-29 17:52:47 +0000
commita5606eee5ec10851d09a8e2709354c7e0931a99c (patch)
tree74396fad6948f39a3d299b61354795949342468e /gdb/testsuite/gdb.base/watchpoint-solib.c
parent0b3de036ef7812900af73c59dae4a703fce5f2da (diff)
downloadgdb-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.c')
-rw-r--r--gdb/testsuite/gdb.base/watchpoint-solib.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.base/watchpoint-solib.c b/gdb/testsuite/gdb.base/watchpoint-solib.c
new file mode 100644
index 0000000..b316024
--- /dev/null
+++ b/gdb/testsuite/gdb.base/watchpoint-solib.c
@@ -0,0 +1,68 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2004, 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/>. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifdef __WIN32__
+#include <windows.h>
+#define dlopen(name, mode) LoadLibrary (TEXT (name))
+#ifdef _WIN32_WCE
+# define dlsym(handle, func) GetProcAddress (handle, TEXT (func))
+#else
+# define dlsym(handle, func) GetProcAddress (handle, func)
+#endif
+#define dlclose(handle) FreeLibrary (handle)
+#define dlerror() "error %d occurred", GetLastError ()
+#else
+#include <dlfcn.h>
+#endif
+
+
+void open_shlib ()
+{
+ void *handle;
+ void (*foo) (int);
+
+ handle = dlopen (SHLIB_NAME, RTLD_LAZY);
+
+ if (!handle)
+ {
+ fprintf (stderr, dlerror ());
+ exit (1);
+ }
+
+ foo = (void (*)(int))dlsym (handle, "foo");
+
+ if (!foo)
+ {
+ fprintf (stderr, dlerror ());
+ exit (1);
+ }
+
+ foo (1); // call to foo
+ foo (2);
+
+ dlclose (handle);
+}
+
+
+int main()
+{
+ open_shlib ();
+ return 0;
+}