diff options
-rw-r--r-- | gdb/ChangeLog | 11 | ||||
-rw-r--r-- | gdb/record-btrace.c | 20 | ||||
-rw-r--r-- | gdb/target-delegates.c | 32 | ||||
-rw-r--r-- | gdb/target.c | 16 | ||||
-rw-r--r-- | gdb/target.h | 12 |
5 files changed, 71 insertions, 20 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c75ca0d..9fbd6dd 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,16 @@ 2014-02-19 Tom Tromey <tromey@redhat.com> + * target.c (target_get_unwinder): Rewrite. + (target_get_tailcall_unwinder): Rewrite. + * record-btrace.c (record_btrace_to_get_unwinder): New function. + (record_btrace_to_get_tailcall_unwinder): New function. + (init_record_btrace_ops): Update. + * target.h (struct target_ops) <to_get_unwinder, + to_get_tailcall_unwinder>: Now function pointers. Use + TARGET_DEFAULT_RETURN. + +2014-02-19 Tom Tromey <tromey@redhat.com> + * nto-procfs.c (procfs_remove_hw_breakpoint): Add 'self' argument. (init_procfs_ops): Correctly set to_remove_hw_breakpoint. diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c index 50bce79..c326c8d 100644 --- a/gdb/record-btrace.c +++ b/gdb/record-btrace.c @@ -1307,6 +1307,22 @@ const struct frame_unwind record_btrace_tailcall_frame_unwind = record_btrace_frame_dealloc_cache }; +/* Implement the to_get_unwinder method. */ + +static const struct frame_unwind * +record_btrace_to_get_unwinder (struct target_ops *self) +{ + return &record_btrace_frame_unwind; +} + +/* Implement the to_get_tailcall_unwinder method. */ + +static const struct frame_unwind * +record_btrace_to_get_tailcall_unwinder (struct target_ops *self) +{ + return &record_btrace_tailcall_frame_unwind; +} + /* Indicate that TP should be resumed according to FLAG. */ static void @@ -1893,8 +1909,8 @@ init_record_btrace_ops (void) ops->to_fetch_registers = record_btrace_fetch_registers; ops->to_store_registers = record_btrace_store_registers; ops->to_prepare_to_store = record_btrace_prepare_to_store; - ops->to_get_unwinder = &record_btrace_frame_unwind; - ops->to_get_tailcall_unwinder = &record_btrace_tailcall_frame_unwind; + ops->to_get_unwinder = &record_btrace_to_get_unwinder; + ops->to_get_tailcall_unwinder = &record_btrace_to_get_tailcall_unwinder; ops->to_resume = record_btrace_resume; ops->to_wait = record_btrace_wait; ops->to_find_new_threads = record_btrace_find_new_threads; diff --git a/gdb/target-delegates.c b/gdb/target-delegates.c index 04824f2..5b27b59 100644 --- a/gdb/target-delegates.c +++ b/gdb/target-delegates.c @@ -1572,6 +1572,32 @@ tdefault_augmented_libraries_svr4_read (struct target_ops *self) return 0; } +static const struct frame_unwind * +delegate_get_unwinder (struct target_ops *self) +{ + self = self->beneath; + return self->to_get_unwinder (self); +} + +static const struct frame_unwind * +tdefault_get_unwinder (struct target_ops *self) +{ + return NULL; +} + +static const struct frame_unwind * +delegate_get_tailcall_unwinder (struct target_ops *self) +{ + self = self->beneath; + return self->to_get_tailcall_unwinder (self); +} + +static const struct frame_unwind * +tdefault_get_tailcall_unwinder (struct target_ops *self) +{ + return NULL; +} + static CORE_ADDR delegate_decr_pc_after_break (struct target_ops *self, struct gdbarch *arg1) { @@ -1844,6 +1870,10 @@ install_delegators (struct target_ops *ops) ops->to_call_history_range = delegate_call_history_range; if (ops->to_augmented_libraries_svr4_read == NULL) ops->to_augmented_libraries_svr4_read = delegate_augmented_libraries_svr4_read; + if (ops->to_get_unwinder == NULL) + ops->to_get_unwinder = delegate_get_unwinder; + if (ops->to_get_tailcall_unwinder == NULL) + ops->to_get_tailcall_unwinder = delegate_get_tailcall_unwinder; if (ops->to_decr_pc_after_break == NULL) ops->to_decr_pc_after_break = delegate_decr_pc_after_break; } @@ -1982,5 +2012,7 @@ install_dummy_methods (struct target_ops *ops) ops->to_call_history_from = tdefault_call_history_from; ops->to_call_history_range = tdefault_call_history_range; ops->to_augmented_libraries_svr4_read = tdefault_augmented_libraries_svr4_read; + ops->to_get_unwinder = tdefault_get_unwinder; + ops->to_get_tailcall_unwinder = tdefault_get_tailcall_unwinder; ops->to_decr_pc_after_break = default_target_decr_pc_after_break; } diff --git a/gdb/target.c b/gdb/target.c index 911c279..4adc094 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -3822,13 +3822,7 @@ debug_to_prepare_to_store (struct target_ops *self, struct regcache *regcache) const struct frame_unwind * target_get_unwinder (void) { - struct target_ops *t; - - for (t = current_target.beneath; t != NULL; t = t->beneath) - if (t->to_get_unwinder != NULL) - return t->to_get_unwinder; - - return NULL; + return current_target.to_get_unwinder (¤t_target); } /* See target.h. */ @@ -3836,13 +3830,7 @@ target_get_unwinder (void) const struct frame_unwind * target_get_tailcall_unwinder (void) { - struct target_ops *t; - - for (t = current_target.beneath; t != NULL; t = t->beneath) - if (t->to_get_tailcall_unwinder != NULL) - return t->to_get_tailcall_unwinder; - - return NULL; + return current_target.to_get_tailcall_unwinder (¤t_target); } /* Default implementation of to_decr_pc_after_break. */ diff --git a/gdb/target.h b/gdb/target.h index 4a46a16..2cc3c13 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -1108,10 +1108,14 @@ struct target_ops int (*to_augmented_libraries_svr4_read) (struct target_ops *) TARGET_DEFAULT_RETURN (0); - /* Those unwinders are tried before any other arch unwinders. Use NULL if - it is not used. */ - const struct frame_unwind *to_get_unwinder; - const struct frame_unwind *to_get_tailcall_unwinder; + /* Those unwinders are tried before any other arch unwinders. If + SELF doesn't have unwinders, it should delegate to the + "beneath" target. */ + const struct frame_unwind *(*to_get_unwinder) (struct target_ops *self) + TARGET_DEFAULT_RETURN (NULL); + + const struct frame_unwind *(*to_get_tailcall_unwinder) (struct target_ops *self) + TARGET_DEFAULT_RETURN (NULL); /* Return the number of bytes by which the PC needs to be decremented after executing a breakpoint instruction. |