summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog10
-rw-r--r--gdb/breakpoint.c35
2 files changed, 35 insertions, 10 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 7334ae49461..597b0fbddec 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,15 @@
2017-06-02 Simon Marchi <simon.marchi@polymtl.ca>
+ * breakpoint.c (struct longjmp_breakpoint): New struct.
+ (is_tracepoint_type): Change return type to bool.
+ (is_longjmp_type): New function.
+ (new_breakpoint_from_type): Handle longjmp kinds of breakpoints.
+ (set_raw_breakpoint_without_location): Use
+ new_breakpoint_from_type.
+ (set_raw_breakpoint): Likewise.
+
+2017-06-02 Simon Marchi <simon.marchi@polymtl.ca>
+
* breakpoint.c (new_breakpoint_from_type): New function.
(create_breakpoint_sal): Use new_breakpoint_from_type and
unique_ptr.
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index d1202906037..31931e861e3 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -1160,16 +1160,27 @@ check_no_tracepoint_commands (struct command_line *commands)
}
}
+struct longjmp_breakpoint
+{
+ breakpoint base;
+};
+
/* Encapsulate tests for different types of tracepoints. */
-static int
-is_tracepoint_type (enum bptype type)
+static bool
+is_tracepoint_type (bptype type)
{
return (type == bp_tracepoint
|| type == bp_fast_tracepoint
|| type == bp_static_tracepoint);
}
+static bool
+is_longjmp_type (bptype type)
+{
+ return type == bp_longjmp || type == bp_exception;
+}
+
int
is_tracepoint (const struct breakpoint *b)
{
@@ -1186,6 +1197,8 @@ new_breakpoint_from_type (bptype type)
if (is_tracepoint_type (type))
b = (breakpoint *) new tracepoint ();
+ else if (is_longjmp_type (type))
+ b = (breakpoint *) new longjmp_breakpoint ();
else
b = new breakpoint ();
@@ -7446,11 +7459,12 @@ set_raw_breakpoint_without_location (struct gdbarch *gdbarch,
enum bptype bptype,
const struct breakpoint_ops *ops)
{
- struct breakpoint *b = new breakpoint ();
+ std::unique_ptr<breakpoint> b = new_breakpoint_from_type (bptype);
- init_raw_breakpoint_without_location (b, gdbarch, bptype, ops);
- add_to_breakpoint_chain (b);
- return b;
+ init_raw_breakpoint_without_location (b.get (), gdbarch, bptype, ops);
+ add_to_breakpoint_chain (b.get ());
+
+ return b.release ();
}
/* Initialize loc->function_name. EXPLICIT_LOC says no indirect function
@@ -7562,11 +7576,12 @@ set_raw_breakpoint (struct gdbarch *gdbarch,
struct symtab_and_line sal, enum bptype bptype,
const struct breakpoint_ops *ops)
{
- struct breakpoint *b = new breakpoint ();
+ std::unique_ptr<breakpoint> b = new_breakpoint_from_type (bptype);
- init_raw_breakpoint (b, gdbarch, sal, bptype, ops);
- add_to_breakpoint_chain (b);
- return b;
+ init_raw_breakpoint (b.get (), gdbarch, sal, bptype, ops);
+ add_to_breakpoint_chain (b.get ());
+
+ return b.release ();
}
/* Call this routine when stepping and nexting to enable a breakpoint