aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2011-07-25 11:21:08 +0000
committerPedro Alves <palves@redhat.com>2011-07-25 11:21:08 +0000
commit2060206eaf1f2784e57b350612dc6901504b526f (patch)
tree6b28266e5fd6b58262d42a6e2acc1309894b2019
parent001c8c333dd8a6fe452203185e57cbcd1a21c57c (diff)
downloadgdb-2060206eaf1f2784e57b350612dc6901504b526f.zip
gdb-2060206eaf1f2784e57b350612dc6901504b526f.tar.gz
gdb-2060206eaf1f2784e57b350612dc6901504b526f.tar.bz2
2011-07-25 Pedro Alves <pedro@codesourcery.com>
* ada-lang.c (dtor_exception, re_set_exception): Indirect through the the base class ops table. (catch_exception_breakpoint_ops) (catch_exception_unhandled_breakpoint_ops) (catch_assert_breakpoint_ops): Don't statically initialize. (initialize_ada_catchpoint_ops): New. (_initialize_ada_language): Call it. * breakpoint.c (base_breakpoint_ops, bkpt_base_breakpoint_ops) (bkpt_breakpoint_ops): Forward declare. (catch_fork_breakpoint_ops, catch_vfork_breakpoint_ops) (catch_syscall_breakpoint_ops, catch_exec_breakpoint_ops) (ranged_breakpoint_ops, watchpoint_breakpoint_ops) (masked_watchpoint_breakpoint_ops) (gnu_v3_exception_catchpoint_ops): Don't statically initialize. (dtor_catch_syscall, dtor_catch_exec): Indirect through the the base class ops table. (null_re_set, null_check_status, null_works_in_software_mode) (null_resources_needed, null_print_one_detail): Delete. (bkpt_dtor): Rename to ... (base_breakpoint_dtor): ... this. Make static. (bkpt_allocate_location): Rename to ... (base_breakpoint_allocate_location): ... this. Make static. (base_breakpoint_re_set): New. (internal_error_pure_virtual_called): New. (base_breakpoint_insert_location, base_breakpoint_remove_location) (base_breakpoint_breakpoint_hit, base_breakpoint_check_status) (base_breakpoint_works_in_software_mode) (base_breakpoint_resources_needed, base_breakpoint_print_it) (base_breakpoint_print_one_detail, base_breakpoint_print_mention) (base_breakpoint_print_recreate): New functions. (base_breakpoint_ops): New global. (bkpt_re_set, bkpt_insert_location, bkpt_remove_location) (bkpt_breakpoint_hit): Make static. (bkpt_check_status): Delete. (bkpt_resources_needed): Make static. (bkpt_works_in_software_mode): Delete. (bkpt_print_it, bkpt_print_mention, bkpt_print_recreate): Make static. (bkpt_breakpoint_ops, internal_breakpoint_ops) (momentary_breakpoint_ops): Don't statically initialize. (internal_bkpt_print_recreate, momentary_bkpt_print_recreate): Delete. (tracepoint_insert_location, tracepoint_remove_location) (tracepoint_check_status, tracepoint_works_in_software_mode) (tracepoint_print_it): Delete. (tracepoint_breakpoint_ops): Don't statically initialize. (initialize_breakpoint_ops): New. (_initialize_breakpoint): Call it. * breakpoint.h (null_re_set, null_works_in_software_mode) (null_resources_needed, null_check_status, null_print_one_detail): (bkpt_dtor, bkpt_allocate_location, bkpt_re_set) (bkpt_insert_location, bkpt_remove_location, bkpt_breakpoint_hit) (bkpt_check_status, bkpt_resources_needed) (bkpt_works_in_software_mode, bkpt_print_it) (null_print_one_detail, bkpt_print_mention, bkpt_print_recreate): Delete declarations. (initialize_breakpoint_ops): Declare.
-rw-r--r--gdb/ChangeLog60
-rw-r--r--gdb/ada-lang.c99
-rw-r--r--gdb/breakpoint.c623
-rw-r--r--gdb/breakpoint.h24
4 files changed, 398 insertions, 408 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index f396813..b10427d 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,65 @@
2011-07-25 Pedro Alves <pedro@codesourcery.com>
+ * ada-lang.c (dtor_exception, re_set_exception): Indirect through
+ the the base class ops table.
+ (catch_exception_breakpoint_ops)
+ (catch_exception_unhandled_breakpoint_ops)
+ (catch_assert_breakpoint_ops): Don't statically initialize.
+ (initialize_ada_catchpoint_ops): New.
+ (_initialize_ada_language): Call it.
+ * breakpoint.c (base_breakpoint_ops, bkpt_base_breakpoint_ops)
+ (bkpt_breakpoint_ops): Forward declare.
+ (catch_fork_breakpoint_ops, catch_vfork_breakpoint_ops)
+ (catch_syscall_breakpoint_ops, catch_exec_breakpoint_ops)
+ (ranged_breakpoint_ops, watchpoint_breakpoint_ops)
+ (masked_watchpoint_breakpoint_ops)
+ (gnu_v3_exception_catchpoint_ops): Don't statically initialize.
+ (dtor_catch_syscall, dtor_catch_exec): Indirect through the the
+ base class ops table.
+ (null_re_set, null_check_status, null_works_in_software_mode)
+ (null_resources_needed, null_print_one_detail): Delete.
+ (bkpt_dtor): Rename to ...
+ (base_breakpoint_dtor): ... this. Make static.
+ (bkpt_allocate_location): Rename to ...
+ (base_breakpoint_allocate_location): ... this. Make static.
+ (base_breakpoint_re_set): New.
+ (internal_error_pure_virtual_called): New.
+ (base_breakpoint_insert_location, base_breakpoint_remove_location)
+ (base_breakpoint_breakpoint_hit, base_breakpoint_check_status)
+ (base_breakpoint_works_in_software_mode)
+ (base_breakpoint_resources_needed, base_breakpoint_print_it)
+ (base_breakpoint_print_one_detail, base_breakpoint_print_mention)
+ (base_breakpoint_print_recreate): New functions.
+ (base_breakpoint_ops): New global.
+ (bkpt_re_set, bkpt_insert_location, bkpt_remove_location)
+ (bkpt_breakpoint_hit): Make static.
+ (bkpt_check_status): Delete.
+ (bkpt_resources_needed): Make static.
+ (bkpt_works_in_software_mode): Delete.
+ (bkpt_print_it, bkpt_print_mention, bkpt_print_recreate): Make
+ static.
+ (bkpt_breakpoint_ops, internal_breakpoint_ops)
+ (momentary_breakpoint_ops): Don't statically initialize.
+ (internal_bkpt_print_recreate, momentary_bkpt_print_recreate):
+ Delete.
+ (tracepoint_insert_location, tracepoint_remove_location)
+ (tracepoint_check_status, tracepoint_works_in_software_mode)
+ (tracepoint_print_it): Delete.
+ (tracepoint_breakpoint_ops): Don't statically initialize.
+ (initialize_breakpoint_ops): New.
+ (_initialize_breakpoint): Call it.
+ * breakpoint.h (null_re_set, null_works_in_software_mode)
+ (null_resources_needed, null_check_status, null_print_one_detail):
+ (bkpt_dtor, bkpt_allocate_location, bkpt_re_set)
+ (bkpt_insert_location, bkpt_remove_location, bkpt_breakpoint_hit)
+ (bkpt_check_status, bkpt_resources_needed)
+ (bkpt_works_in_software_mode, bkpt_print_it)
+ (null_print_one_detail, bkpt_print_mention, bkpt_print_recreate):
+ Delete declarations.
+ (initialize_breakpoint_ops): Declare.
+
+2011-07-25 Pedro Alves <pedro@codesourcery.com>
+
* breakpoint.c (bkpt_print_it, internal_bkpt_print_it)
(momentary_bkpt_print_it): Simplify.
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index a052cb6..cc1c2c7 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -10989,7 +10989,7 @@ dtor_exception (enum exception_catchpoint_kind ex, struct breakpoint *b)
xfree (c->excep_string);
- bkpt_dtor (b);
+ bkpt_breakpoint_ops.dtor (b);
}
/* Implement the ALLOCATE_LOCATION method in the breakpoint_ops
@@ -11017,7 +11017,7 @@ re_set_exception (enum exception_catchpoint_kind ex, struct breakpoint *b)
/* Call the base class's method. This updates the catchpoint's
locations. */
- bkpt_re_set (b);
+ bkpt_breakpoint_ops.re_set (b);
/* Reparse the exception conditional expressions. One for each
location. */
@@ -11314,23 +11314,7 @@ print_recreate_catch_exception (struct breakpoint *b, struct ui_file *fp)
print_recreate_exception (ex_catch_exception, b, fp);
}
-static struct breakpoint_ops catch_exception_breakpoint_ops =
-{
- dtor_catch_exception,
- allocate_location_catch_exception,
- re_set_catch_exception,
- bkpt_insert_location,
- bkpt_remove_location,
- bkpt_breakpoint_hit,
- check_status_catch_exception,
- bkpt_resources_needed,
- null_works_in_software_mode,
- print_it_catch_exception,
- print_one_catch_exception,
- null_print_one_detail,
- print_mention_catch_exception,
- print_recreate_catch_exception
-};
+static struct breakpoint_ops catch_exception_breakpoint_ops;
/* Virtual table for "catch exception unhandled" breakpoints. */
@@ -11384,22 +11368,7 @@ print_recreate_catch_exception_unhandled (struct breakpoint *b,
print_recreate_exception (ex_catch_exception_unhandled, b, fp);
}
-static struct breakpoint_ops catch_exception_unhandled_breakpoint_ops = {
- dtor_catch_exception_unhandled,
- allocate_location_catch_exception_unhandled,
- re_set_catch_exception_unhandled,
- bkpt_insert_location,
- bkpt_remove_location,
- bkpt_breakpoint_hit,
- check_status_catch_exception_unhandled,
- bkpt_resources_needed,
- null_works_in_software_mode,
- print_it_catch_exception_unhandled,
- print_one_catch_exception_unhandled,
- null_print_one_detail,
- print_mention_catch_exception_unhandled,
- print_recreate_catch_exception_unhandled
-};
+static struct breakpoint_ops catch_exception_unhandled_breakpoint_ops;
/* Virtual table for "catch assert" breakpoints. */
@@ -11451,22 +11420,7 @@ print_recreate_catch_assert (struct breakpoint *b, struct ui_file *fp)
print_recreate_exception (ex_catch_assert, b, fp);
}
-static struct breakpoint_ops catch_assert_breakpoint_ops = {
- dtor_catch_assert,
- allocate_location_catch_assert,
- re_set_catch_assert,
- bkpt_insert_location,
- bkpt_remove_location,
- bkpt_breakpoint_hit,
- check_status_catch_assert,
- bkpt_resources_needed,
- null_works_in_software_mode,
- print_it_catch_assert,
- print_one_catch_assert,
- null_print_one_detail,
- print_mention_catch_assert,
- print_recreate_catch_assert
-};
+static struct breakpoint_ops catch_assert_breakpoint_ops;
/* Return a newly allocated copy of the first space-separated token
in ARGSP, and then adjust ARGSP to point immediately after that
@@ -12354,11 +12308,54 @@ show_ada_command (char *args, int from_tty)
cmd_show_list (show_ada_list, from_tty, "");
}
+static void
+initialize_ada_catchpoint_ops (void)
+{
+ struct breakpoint_ops *ops;
+
+ initialize_breakpoint_ops ();
+
+ ops = &catch_exception_breakpoint_ops;
+ *ops = bkpt_breakpoint_ops;
+ ops->dtor = dtor_catch_exception;
+ ops->allocate_location = allocate_location_catch_exception;
+ ops->re_set = re_set_catch_exception;
+ ops->check_status = check_status_catch_exception;
+ ops->print_it = print_it_catch_exception;
+ ops->print_one = print_one_catch_exception;
+ ops->print_mention = print_mention_catch_exception;
+ ops->print_recreate = print_recreate_catch_exception;
+
+ ops = &catch_exception_unhandled_breakpoint_ops;
+ *ops = bkpt_breakpoint_ops;
+ ops->dtor = dtor_catch_exception_unhandled;
+ ops->allocate_location = allocate_location_catch_exception_unhandled;
+ ops->re_set = re_set_catch_exception_unhandled;
+ ops->check_status = check_status_catch_exception_unhandled;
+ ops->print_it = print_it_catch_exception_unhandled;
+ ops->print_one = print_one_catch_exception_unhandled;
+ ops->print_mention = print_mention_catch_exception_unhandled;
+ ops->print_recreate = print_recreate_catch_exception_unhandled;
+
+ ops = &catch_assert_breakpoint_ops;
+ *ops = bkpt_breakpoint_ops;
+ ops->dtor = dtor_catch_assert;
+ ops->allocate_location = allocate_location_catch_assert;
+ ops->re_set = re_set_catch_assert;
+ ops->check_status = check_status_catch_assert;
+ ops->print_it = print_it_catch_assert;
+ ops->print_one = print_one_catch_assert;
+ ops->print_mention = print_mention_catch_assert;
+ ops->print_recreate = print_recreate_catch_assert;
+}
+
void
_initialize_ada_language (void)
{
add_language (&ada_language_defn);
+ initialize_ada_catchpoint_ops ();
+
add_prefix_cmd ("ada", no_class, set_ada_command,
_("Prefix command for changing Ada-specfic settings"),
&set_ada_list, "set ada ", 0, &setlist);
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index a48ca6c..b41854c 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -236,10 +236,25 @@ static int is_masked_watchpoint (const struct breakpoint *b);
#define is_marker_spec(s) \
(s != NULL && strncmp (s, "-m", 2) == 0 && ((s)[2] == ' ' || (s)[2] == '\t'))
-/* Forward declarations. */
+/* The abstract base class all breakpoint_ops structures inherit
+ from. */
+static struct breakpoint_ops base_breakpoint_ops;
+
+/* The breakpoint_ops structure to be inherited by all breakpoint_ops
+ that are implemented on top of software or hardware breakpoints
+ (user breakpoints, internal and momentary breakpoints, etc.). */
+static struct breakpoint_ops bkpt_base_breakpoint_ops;
+
+/* Internal breakpoints class type. */
static struct breakpoint_ops internal_breakpoint_ops;
+
+/* Momentary breakpoints class type. */
static struct breakpoint_ops momentary_breakpoint_ops;
+/* The breakpoint_ops structure to be used in regular user created
+ breakpoints. */
+struct breakpoint_ops bkpt_breakpoint_ops;
+
/* A reference-counted struct command_line. This lets multiple
breakpoints share a single command list. */
struct counted_command_line
@@ -6105,23 +6120,7 @@ print_recreate_catch_fork (struct breakpoint *b, struct ui_file *fp)
/* The breakpoint_ops structure to be used in fork catchpoints. */
-static struct breakpoint_ops catch_fork_breakpoint_ops =
-{
- bkpt_dtor,
- bkpt_allocate_location,
- null_re_set,
- insert_catch_fork,
- remove_catch_fork,
- breakpoint_hit_catch_fork,
- null_check_status,
- null_resources_needed,
- null_works_in_software_mode,
- print_it_catch_fork,
- print_one_catch_fork,
- null_print_one_detail,
- print_mention_catch_fork,
- print_recreate_catch_fork
-};
+static struct breakpoint_ops catch_fork_breakpoint_ops;
/* Implement the "insert" breakpoint_ops method for vfork
catchpoints. */
@@ -6214,23 +6213,7 @@ print_recreate_catch_vfork (struct breakpoint *b, struct ui_file *fp)
/* The breakpoint_ops structure to be used in vfork catchpoints. */
-static struct breakpoint_ops catch_vfork_breakpoint_ops =
-{
- bkpt_dtor,
- bkpt_allocate_location,
- null_re_set,
- insert_catch_vfork,
- remove_catch_vfork,
- breakpoint_hit_catch_vfork,
- null_check_status,
- null_resources_needed,
- null_works_in_software_mode,
- print_it_catch_vfork,
- print_one_catch_vfork,
- null_print_one_detail,
- print_mention_catch_vfork,
- print_recreate_catch_vfork
-};
+static struct breakpoint_ops catch_vfork_breakpoint_ops;
/* An instance of this type is used to represent a syscall catchpoint.
It includes a "struct breakpoint" as a kind of base class; users
@@ -6260,7 +6243,7 @@ dtor_catch_syscall (struct breakpoint *b)
VEC_free (int, c->syscalls_to_be_caught);
- bkpt_dtor (b);
+ base_breakpoint_ops.dtor (b);
}
/* Implement the "insert" breakpoint_ops method for syscall
@@ -6546,23 +6529,7 @@ print_recreate_catch_syscall (struct breakpoint *b, struct ui_file *fp)
/* The breakpoint_ops structure to be used in syscall catchpoints. */
-static struct breakpoint_ops catch_syscall_breakpoint_ops =
-{
- dtor_catch_syscall,
- bkpt_allocate_location,
- null_re_set,
- insert_catch_syscall,
- remove_catch_syscall,
- breakpoint_hit_catch_syscall,
- null_check_status,
- null_resources_needed,
- null_works_in_software_mode,
- print_it_catch_syscall,
- print_one_catch_syscall,
- null_print_one_detail,
- print_mention_catch_syscall,
- print_recreate_catch_syscall
-};
+static struct breakpoint_ops catch_syscall_breakpoint_ops;
/* Returns non-zero if 'b' is a syscall catchpoint. */
@@ -6648,7 +6615,7 @@ dtor_catch_exec (struct breakpoint *b)
xfree (c->exec_pathname);
- bkpt_dtor (b);
+ base_breakpoint_ops.dtor (b);
}
static int
@@ -6722,23 +6689,7 @@ print_recreate_catch_exec (struct breakpoint *b, struct ui_file *fp)
fprintf_unfiltered (fp, "catch exec");
}
-static struct breakpoint_ops catch_exec_breakpoint_ops =
-{
- dtor_catch_exec,
- bkpt_allocate_location,
- null_re_set,
- insert_catch_exec,
- remove_catch_exec,
- breakpoint_hit_catch_exec,
- null_check_status,
- null_resources_needed,
- null_works_in_software_mode,
- print_it_catch_exec,
- print_one_catch_exec,
- null_print_one_detail,
- print_mention_catch_exec,
- print_recreate_catch_exec
-};
+static struct breakpoint_ops catch_exec_breakpoint_ops;
static void
create_syscall_event_catchpoint (int tempflag, VEC(int) *filter,
@@ -8201,23 +8152,7 @@ print_recreate_ranged_breakpoint (struct breakpoint *b, struct ui_file *fp)
/* The breakpoint_ops structure to be used in ranged breakpoints. */
-static struct breakpoint_ops ranged_breakpoint_ops =
-{
- bkpt_dtor,
- bkpt_allocate_location,
- bkpt_re_set,
- bkpt_insert_location,
- bkpt_remove_location,
- breakpoint_hit_ranged_breakpoint,
- null_check_status,
- resources_needed_ranged_breakpoint,
- null_works_in_software_mode,
- print_it_ranged_breakpoint,
- print_one_ranged_breakpoint,
- print_one_detail_ranged_breakpoint,
- print_mention_ranged_breakpoint,
- print_recreate_ranged_breakpoint
-};
+static struct breakpoint_ops ranged_breakpoint_ops;
/* Find the address where the end of the breakpoint range should be
placed, given the SAL of the end of the range. This is so that if
@@ -8743,23 +8678,7 @@ print_recreate_watchpoint (struct breakpoint *b, struct ui_file *fp)
/* The breakpoint_ops structure to be used in hardware watchpoints. */
-static struct breakpoint_ops watchpoint_breakpoint_ops =
-{
- bkpt_dtor,
- bkpt_allocate_location,
- re_set_watchpoint,
- insert_watchpoint,
- remove_watchpoint,
- breakpoint_hit_watchpoint,
- check_status_watchpoint,
- resources_needed_watchpoint,
- works_in_software_mode_watchpoint,
- print_it_watchpoint,
- NULL, /* print_one */
- null_print_one_detail,
- print_mention_watchpoint,
- print_recreate_watchpoint
-};
+static struct breakpoint_ops watchpoint_breakpoint_ops;
/* Implement the "insert" breakpoint_ops method for
masked hardware watchpoints. */
@@ -8927,23 +8846,7 @@ print_recreate_masked_watchpoint (struct breakpoint *b, struct ui_file *fp)
/* The breakpoint_ops structure to be used in masked hardware watchpoints. */
-static struct breakpoint_ops masked_watchpoint_breakpoint_ops =
-{
- bkpt_dtor,
- bkpt_allocate_location,
- re_set_watchpoint,
- insert_masked_watchpoint,
- remove_masked_watchpoint,
- breakpoint_hit_watchpoint,
- check_status_watchpoint,
- resources_needed_masked_watchpoint,
- works_in_software_mode_masked_watchpoint,
- print_it_masked_watchpoint,
- NULL, /* print_one */
- print_one_detail_masked_watchpoint,
- print_mention_masked_watchpoint,
- print_recreate_masked_watchpoint
-};
+static struct breakpoint_ops masked_watchpoint_breakpoint_ops;
/* Tell whether the given watchpoint is a masked hardware watchpoint. */
@@ -9753,22 +9656,7 @@ print_recreate_exception_catchpoint (struct breakpoint *b,
fprintf_unfiltered (fp, bp_throw ? "throw" : "catch");
}
-static struct breakpoint_ops gnu_v3_exception_catchpoint_ops = {
- bkpt_dtor,
- bkpt_allocate_location,
- bkpt_re_set,
- bkpt_insert_location,
- bkpt_remove_location,
- bkpt_breakpoint_hit,
- bkpt_check_status,
- bkpt_resources_needed,
- null_works_in_software_mode,
- print_it_exception_catchpoint,
- print_one_exception_catchpoint,
- null_print_one_detail,
- print_mention_exception_catchpoint,
- print_recreate_exception_catchpoint
-};
+static struct breakpoint_ops gnu_v3_exception_catchpoint_ops;
static int
handle_gnu_v3_exceptions (int tempflag, char *cond_string,
@@ -10624,45 +10512,6 @@ say_where (struct breakpoint *b)
}
}
-/* Default breakpoint_ops methods that do nothing. */
-
-void
-null_re_set (struct breakpoint *b)
-{
- /* Nothing to re-set. */
-}
-
-void
-null_check_status (bpstat bs)
-{
- /* nothing */
-}
-
-/* A "works_in_software_mode" breakpoint_ops method that just internal
- errors. */
-
-int
-null_works_in_software_mode (const struct breakpoint *b)
-{
- gdb_assert_not_reached ("null_works_in_software_mode called");
-}
-
-/* A "resources_needed" breakpoint_ops method that just internal
- errors. */
-
-int
-null_resources_needed (const struct bp_location *bl)
-{
- gdb_assert_not_reached ("null_resources_needed");
-}
-
-void
-null_print_one_detail (const struct breakpoint *self,
- struct ui_out *uiout)
-{
- /* nothing */
-}
-
/* Default bp_location_ops methods. */
static void
@@ -10677,10 +10526,11 @@ static const struct bp_location_ops bp_location_ops =
bp_location_dtor
};
-/* Default breakpoint_ops methods. */
+/* Default breakpoint_ops methods all breakpoint_ops ultimately
+ inherit from. */
-void
-bkpt_dtor (struct breakpoint *self)
+static void
+base_breakpoint_dtor (struct breakpoint *self)
{
decref_counted_command_line (&self->commands);
xfree (self->cond_string);
@@ -10694,8 +10544,8 @@ bkpt_dtor (struct breakpoint *self)
xfree (self->source_file);
}
-struct bp_location *
-bkpt_allocate_location (struct breakpoint *self)
+static struct bp_location *
+base_breakpoint_allocate_location (struct breakpoint *self)
{
struct bp_location *loc;
@@ -10704,7 +10554,105 @@ bkpt_allocate_location (struct breakpoint *self)
return loc;
}
-void
+static void
+base_breakpoint_re_set (struct breakpoint *b)
+{
+ /* Nothing to re-set. */
+}
+
+#define internal_error_pure_virtual_called() \
+ gdb_assert_not_reached ("pure virtual function called")
+
+static int
+base_breakpoint_insert_location (struct bp_location *bl)
+{
+ internal_error_pure_virtual_called ();
+}
+
+static int
+base_breakpoint_remove_location (struct bp_location *bl)
+{
+ internal_error_pure_virtual_called ();
+}
+
+static int
+base_breakpoint_breakpoint_hit (const struct bp_location *bl,
+ struct address_space *aspace,
+ CORE_ADDR bp_addr)
+{
+ internal_error_pure_virtual_called ();
+}
+
+static void
+base_breakpoint_check_status (bpstat bs)
+{
+ /* Always stop. */
+}
+
+/* A "works_in_software_mode" breakpoint_ops method that just internal
+ errors. */
+
+static int
+base_breakpoint_works_in_software_mode (const struct breakpoint *b)
+{
+ internal_error_pure_virtual_called ();
+}
+
+/* A "resources_needed" breakpoint_ops method that just internal
+ errors. */
+
+static int
+base_breakpoint_resources_needed (const struct bp_location *bl)
+{
+ internal_error_pure_virtual_called ();
+}
+
+static enum print_stop_action
+base_breakpoint_print_it (bpstat bs)
+{
+ internal_error_pure_virtual_called ();
+}
+
+static void
+base_breakpoint_print_one_detail (const struct breakpoint *self,
+ struct ui_out *uiout)
+{
+ /* nothing */
+}
+
+static void
+base_breakpoint_print_mention (struct breakpoint *b)
+{
+ internal_error_pure_virtual_called ();
+}
+
+static void
+base_breakpoint_print_recreate (struct breakpoint *b, struct ui_file *fp)
+{
+ internal_error_pure_virtual_called ();
+}
+
+static struct breakpoint_ops base_breakpoint_ops =
+{
+ base_breakpoint_dtor,
+ base_breakpoint_allocate_location,
+ base_breakpoint_re_set,
+ base_breakpoint_insert_location,
+ base_breakpoint_remove_location,
+ base_breakpoint_breakpoint_hit,
+ base_breakpoint_check_status,
+ base_breakpoint_resources_needed,
+ base_breakpoint_works_in_software_mode,
+ base_breakpoint_print_it,
+ NULL,
+ base_breakpoint_print_one_detail,
+ base_breakpoint_print_mention,
+ base_breakpoint_print_recreate
+};
+
+/* Default breakpoint_ops methods. */
+
+static void
bkpt_re_set (struct breakpoint *b)
{
/* Do not attempt to re-set breakpoints disabled during startup. */
@@ -10722,7 +10670,7 @@ bkpt_re_set (struct breakpoint *b)
breakpoint_re_set_default (b);
}
-int
+static int
bkpt_insert_location (struct bp_location *bl)
{
if (bl->loc_type == bp_loc_hardware_breakpoint)
@@ -10733,7 +10681,7 @@ bkpt_insert_location (struct bp_location *bl)
&bl->target_info);
}
-int
+static int
bkpt_remove_location (struct bp_location *bl)
{
if (bl->loc_type == bp_loc_hardware_breakpoint)
@@ -10742,7 +10690,7 @@ bkpt_remove_location (struct bp_location *bl)
return target_remove_breakpoint (bl->gdbarch, &bl->target_info);
}
-int
+static int
bkpt_breakpoint_hit (const struct bp_location *bl,
struct address_space *aspace, CORE_ADDR bp_addr)
{
@@ -10760,13 +10708,7 @@ bkpt_breakpoint_hit (const struct bp_location *bl,
return 1;
}
-void
-bkpt_check_status (bpstat bs)
-{
- /* nothing, always stop */
-}
-
-int
+static int
bkpt_resources_needed (const struct bp_location *bl)
{
gdb_assert (bl->owner->type == bp_hardware_breakpoint);
@@ -10774,13 +10716,7 @@ bkpt_resources_needed (const struct bp_location *bl)
return 1;
}
-int
-bkpt_works_in_software_mode (const struct breakpoint *b)
-{
- gdb_assert_not_reached ("bkpt_works_in_software_mode called");
-}
-
-enum print_stop_action
+static enum print_stop_action
bkpt_print_it (bpstat bs)
{
struct breakpoint *b;
@@ -10814,7 +10750,7 @@ bkpt_print_it (bpstat bs)
return PRINT_SRC_AND_LOC;
}
-void
+static void
bkpt_print_mention (struct breakpoint *b)
{
if (ui_out_is_mi_like_p (uiout))
@@ -10840,7 +10776,7 @@ bkpt_print_mention (struct breakpoint *b)
say_where (b);
}
-void
+static void
bkpt_print_recreate (struct breakpoint *tp, struct ui_file *fp)
{
if (tp->type == bp_breakpoint && tp->disposition == disp_del)
@@ -10856,39 +10792,9 @@ bkpt_print_recreate (struct breakpoint *tp, struct ui_file *fp)
internal_error (__FILE__, __LINE__,
_("unhandled breakpoint type %d"), (int) tp->type);
- if (tp->exp_string)
- fprintf_unfiltered (fp, " %s", tp->exp_string);
- else if (tp->addr_string)
- fprintf_unfiltered (fp, " %s", tp->addr_string);
- else
- {
- char tmp[40];
-
- sprintf_vma (tmp, tp->loc->address);
- fprintf_unfiltered (fp, " *0x%s", tmp);
- }
+ fprintf_unfiltered (fp, " %s", tp->addr_string);
}
-/* The breakpoint_ops structure to be used in regular breakpoints. */
-
-struct breakpoint_ops bkpt_breakpoint_ops =
-{
- bkpt_dtor,
- bkpt_allocate_location,
- bkpt_re_set,
- bkpt_insert_location,
- bkpt_remove_location,
- bkpt_breakpoint_hit,
- bkpt_check_status,
- bkpt_resources_needed,
- null_works_in_software_mode,
- bkpt_print_it,
- NULL, /* print_one */
- null_print_one_detail,
- bkpt_print_mention,
- bkpt_print_recreate
-};
-
/* Virtual table for internal breakpoints. */
static void
@@ -10977,33 +10883,6 @@ internal_bkpt_print_mention (struct breakpoint *b)
/* Nothing to mention. These breakpoints are internal. */
}
-static void
-internal_bkpt_print_recreate (struct breakpoint *tp, struct ui_file *fp)
-{
- gdb_assert_not_reached ("internal_bkpt_print_recreate called");
-}
-
-/* The breakpoint_ops structure to be used with internal
- breakpoints. */
-
-static struct breakpoint_ops internal_breakpoint_ops =
-{
- bkpt_dtor,
- bkpt_allocate_location,
- internal_bkpt_re_set,
- bkpt_insert_location,
- bkpt_remove_location,
- bkpt_breakpoint_hit,
- internal_bkpt_check_status,
- bkpt_resources_needed,
- null_works_in_software_mode,
- internal_bkpt_print_it,
- NULL, /* print_one */
- null_print_one_detail,
- internal_bkpt_print_mention,
- internal_bkpt_print_recreate
-};
-
/* Virtual table for momentary breakpoints */
static void
@@ -11053,33 +10932,6 @@ momentary_bkpt_print_mention (struct breakpoint *b)
/* Nothing to mention. These breakpoints are internal. */
}
-static void
-momentary_bkpt_print_recreate (struct breakpoint *tp, struct ui_file *fp)
-{
- gdb_assert_not_reached ("momentary_bkpt_print_recreate called");
-}
-
-/* The breakpoint_ops structure to be used with momentary
- breakpoints. */
-
-static struct breakpoint_ops momentary_breakpoint_ops =
-{
- bkpt_dtor,
- bkpt_allocate_location,
- momentary_bkpt_re_set,
- bkpt_insert_location,
- bkpt_remove_location,
- bkpt_breakpoint_hit,
- momentary_bkpt_check_status,
- bkpt_resources_needed,
- null_works_in_software_mode,
- momentary_bkpt_print_it,
- NULL, /* print_one */
- null_print_one_detail,
- momentary_bkpt_print_mention,
- momentary_bkpt_print_recreate
-};
-
/* The breakpoint_ops structure to be used in tracepoints. */
static void
@@ -11089,18 +10941,6 @@ tracepoint_re_set (struct breakpoint *b)
}
static int
-tracepoint_insert_location (struct bp_location *bl)
-{
- gdb_assert_not_reached ("tracepoint_insert_location called");
-}
-
-static int
-tracepoint_remove_location (struct bp_location *bl)
-{
- gdb_assert_not_reached ("tracepoint_remove_location called");
-}
-
-static int
tracepoint_breakpoint_hit (const struct bp_location *bl,
struct address_space *aspace, CORE_ADDR bp_addr)
{
@@ -11110,24 +10950,6 @@ tracepoint_breakpoint_hit (const struct bp_location *bl,
}
static void
-tracepoint_check_status (bpstat bs)
-{
- gdb_assert_not_reached ("tracepoint_check_status called");
-}
-
-static int
-tracepoint_works_in_software_mode (const struct breakpoint *b)
-{
- gdb_assert_not_reached ("tracepoint_works_in_software_mode called");
-}
-
-static enum print_stop_action
-tracepoint_print_it (bpstat bs)
-{
- gdb_assert_not_reached ("tracepoint_print_it called");
-}
-
-static void
tracepoint_print_one_detail (const struct breakpoint *self,
struct ui_out *uiout)
{
@@ -11186,23 +11008,7 @@ tracepoint_print_recreate (struct breakpoint *tp, struct ui_file *fp)
fprintf_unfiltered (fp, " %s", tp->addr_string);
}
-struct breakpoint_ops tracepoint_breakpoint_ops =
-{
- bkpt_dtor,
- bkpt_allocate_location,
- tracepoint_re_set,
- tracepoint_insert_location,
- tracepoint_remove_location,
- tracepoint_breakpoint_hit,
- tracepoint_check_status,
- null_resources_needed,
- tracepoint_works_in_software_mode,
- tracepoint_print_it,
- NULL, /* print_one */
- tracepoint_print_one_detail,
- tracepoint_print_mention,
- tracepoint_print_recreate
-};
+struct breakpoint_ops tracepoint_breakpoint_ops;
/* Delete a breakpoint and clean up all traces of it in the data
structures. */
@@ -13232,10 +13038,159 @@ iterate_over_breakpoints (int (*callback) (struct breakpoint *, void *),
}
void
+initialize_breakpoint_ops (void)
+{
+ static int initialized = 0;
+
+ struct breakpoint_ops *ops;
+
+ if (initialized)
+ return;
+ initialized = 1;
+
+ /* The breakpoint_ops structure to be inherit by all kinds of
+ breakpoints (real breakpoints, i.e., user "break" breakpoints,
+ internal and momentary breakpoints, etc.). */
+ ops = &bkpt_base_breakpoint_ops;
+ *ops = base_breakpoint_ops;
+ ops->re_set = bkpt_re_set;
+ ops->insert_location = bkpt_insert_location;
+ ops->remove_location = bkpt_remove_location;
+ ops->breakpoint_hit = bkpt_breakpoint_hit;
+
+ /* The breakpoint_ops structure to be used in regular breakpoints. */
+ ops = &bkpt_breakpoint_ops;
+ *ops = bkpt_base_breakpoint_ops;
+ ops->re_set = bkpt_re_set;
+ ops->resources_needed = bkpt_resources_needed;
+ ops->print_it = bkpt_print_it;
+ ops->print_mention = bkpt_print_mention;
+ ops->print_recreate = bkpt_print_recreate;
+
+ /* Ranged breakpoints. */
+ ops = &ranged_breakpoint_ops;
+ *ops = bkpt_breakpoint_ops;
+ ops->breakpoint_hit = breakpoint_hit_ranged_breakpoint;
+ ops->resources_needed = resources_needed_ranged_breakpoint;
+ ops->print_it = print_it_ranged_breakpoint;
+ ops->print_one = print_one_ranged_breakpoint;
+ ops->print_one_detail = print_one_detail_ranged_breakpoint;
+ ops->print_mention = print_mention_ranged_breakpoint;
+ ops->print_recreate = print_recreate_ranged_breakpoint;
+
+ /* Internal breakpoints. */
+ ops = &internal_breakpoint_ops;
+ *ops = bkpt_base_breakpoint_ops;
+ ops->re_set = internal_bkpt_re_set;
+ ops->check_status = internal_bkpt_check_status;
+ ops->print_it = internal_bkpt_print_it;
+ ops->print_mention = internal_bkpt_print_mention;
+
+ /* Momentary breakpoints. */
+ ops = &momentary_breakpoint_ops;
+ *ops = bkpt_base_breakpoint_ops;
+ ops->re_set = momentary_bkpt_re_set;
+ ops->check_status = momentary_bkpt_check_status;
+ ops->print_it = momentary_bkpt_print_it;
+ ops->print_mention = momentary_bkpt_print_mention;
+
+ /* GNU v3 exception catchpoints. */
+ ops = &gnu_v3_exception_catchpoint_ops;
+ *ops = bkpt_breakpoint_ops;
+ ops->print_it = print_it_exception_catchpoint;
+ ops->print_one = print_one_exception_catchpoint;
+ ops->print_mention = print_mention_exception_catchpoint;
+ ops->print_recreate = print_recreate_exception_catchpoint;
+
+ /* Watchpoints. */
+ ops = &watchpoint_breakpoint_ops;
+ *ops = base_breakpoint_ops;
+ ops->re_set = re_set_watchpoint;
+ ops->insert_location = insert_watchpoint;
+ ops->remove_location = remove_watchpoint;
+ ops->breakpoint_hit = breakpoint_hit_watchpoint;
+ ops->check_status = check_status_watchpoint;
+ ops->resources_needed = resources_needed_watchpoint;
+ ops->works_in_software_mode = works_in_software_mode_watchpoint;
+ ops->print_it = print_it_watchpoint;
+ ops->print_mention = print_mention_watchpoint;
+ ops->print_recreate = print_recreate_watchpoint;
+
+ /* Masked watchpoints. */
+ ops = &masked_watchpoint_breakpoint_ops;
+ *ops = watchpoint_breakpoint_ops;
+ ops->insert_location = insert_masked_watchpoint;
+ ops->remove_location = remove_masked_watchpoint;
+ ops->resources_needed = resources_needed_masked_watchpoint;
+ ops->works_in_software_mode = works_in_software_mode_masked_watchpoint;
+ ops->print_it = print_it_masked_watchpoint;
+ ops->print_one_detail = print_one_detail_masked_watchpoint;
+ ops->print_mention = print_mention_masked_watchpoint;
+ ops->print_recreate = print_recreate_masked_watchpoint;
+
+ /* Tracepoints. */
+ ops = &tracepoint_breakpoint_ops;
+ *ops = base_breakpoint_ops;
+ ops->re_set = tracepoint_re_set;
+ ops->breakpoint_hit = tracepoint_breakpoint_hit;
+ ops->print_one_detail = tracepoint_print_one_detail;
+ ops->print_mention = tracepoint_print_mention;
+ ops->print_recreate = tracepoint_print_recreate;
+
+ /* Fork catchpoints. */
+ ops = &catch_fork_breakpoint_ops;
+ *ops = base_breakpoint_ops;
+ ops->insert_location = insert_catch_fork;
+ ops->remove_location = remove_catch_fork;
+ ops->breakpoint_hit = breakpoint_hit_catch_fork;
+ ops->print_it = print_it_catch_fork;
+ ops->print_one = print_one_catch_fork;
+ ops->print_mention = print_mention_catch_fork;
+ ops->print_recreate = print_recreate_catch_fork;
+
+ /* Vfork catchpoints. */
+ ops = &catch_vfork_breakpoint_ops;
+ *ops = base_breakpoint_ops;
+ ops->insert_location = insert_catch_vfork;
+ ops->remove_location = remove_catch_vfork;
+ ops->breakpoint_hit = breakpoint_hit_catch_vfork;
+ ops->print_it = print_it_catch_vfork;
+ ops->print_one = print_one_catch_vfork;
+ ops->print_mention = print_mention_catch_vfork;
+ ops->print_recreate = print_recreate_catch_vfork;
+
+ /* Exec catchpoints. */
+ ops = &catch_exec_breakpoint_ops;
+ *ops = base_breakpoint_ops;
+ ops->dtor = dtor_catch_exec;
+ ops->insert_location = insert_catch_exec;
+ ops->remove_location = remove_catch_exec;
+ ops->breakpoint_hit = breakpoint_hit_catch_exec;
+ ops->print_it = print_it_catch_exec;
+ ops->print_one = print_one_catch_exec;
+ ops->print_mention = print_mention_catch_exec;
+ ops->print_recreate = print_recreate_catch_exec;
+
+ /* Syscall catchpoints. */
+ ops = &catch_syscall_breakpoint_ops;
+ *ops = base_breakpoint_ops;
+ ops->dtor = dtor_catch_syscall;
+ ops->insert_location = insert_catch_syscall;
+ ops->remove_location = remove_catch_syscall;
+ ops->breakpoint_hit = breakpoint_hit_catch_syscall;
+ ops->print_it = print_it_catch_syscall;
+ ops->print_one = print_one_catch_syscall;
+ ops->print_mention = print_mention_catch_syscall;
+ ops->print_recreate = print_recreate_catch_syscall;
+}
+
+void
_initialize_breakpoint (void)
{
struct cmd_list_element *c;
+ initialize_breakpoint_ops ();
+
observer_attach_solib_unloaded (disable_breakpoints_in_unloaded_shlib);
observer_attach_inferior_exit (clear_syscall_counts);
observer_attach_memory_changed (invalidate_bp_value_on_memory_change);
diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h
index 28fdd4e..ecd8007 100644
--- a/gdb/breakpoint.h
+++ b/gdb/breakpoint.h
@@ -1029,31 +1029,9 @@ extern void awatch_command_wrapper (char *, int, int);
extern void rwatch_command_wrapper (char *, int, int);
extern void tbreak_command (char *, int);
-extern void null_re_set (struct breakpoint *b);
-extern int null_works_in_software_mode (const struct breakpoint *b);
-extern int null_resources_needed (const struct bp_location *bl);
-extern void null_check_status (bpstat bs);
-extern void null_print_one_detail (const struct breakpoint *self,
- struct ui_out *uiout);
-
extern struct breakpoint_ops bkpt_breakpoint_ops;
-extern void bkpt_dtor (struct breakpoint *self);
-extern struct bp_location *bkpt_allocate_location (struct breakpoint *self);
-extern void bkpt_re_set (struct breakpoint *b);
-extern int bkpt_insert_location (struct bp_location *bl);
-extern int bkpt_remove_location (struct bp_location *bl);
-extern int bkpt_breakpoint_hit (const struct bp_location *bl,
- struct address_space *aspace,
- CORE_ADDR bp_addr);
-extern void bkpt_check_status (bpstat bs);
-extern int bkpt_resources_needed (const struct bp_location *bl);
-extern int bkpt_works_in_software_mode (const struct breakpoint *b);
-extern enum print_stop_action bkpt_print_it (bpstat bs);
-extern void null_print_one_detail (const struct breakpoint *self,
- struct ui_out *uiout);
-extern void bkpt_print_mention (struct breakpoint *b);
-extern void bkpt_print_recreate (struct breakpoint *tp, struct ui_file *fp);
+extern void initialize_breakpoint_ops (void);
/* Arguments to pass as context to some catch command handlers. */
#define CATCH_PERMANENT ((void *) (uintptr_t) 0)