From: Tom Tromey Date: Thu, 16 Jan 2014 20:00:07 +0000 (-0700) Subject: convert to_get_unwinder and to_get_tailcall_unwinder to methods X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ac01945bf17f3699de5493da23f14ea92549617a;p=binutils-gdb.git convert to_get_unwinder and to_get_tailcall_unwinder to methods This converts to_get_unwinder and to_get_tailcall_unwinder to methods and arranges for them to use the new delegation scheme. This just lets us avoid having a differing style (neither new-style nor INHERIT) of delegation in the tree. 2014-02-19 Tom Tromey * 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) : Now function pointers. Use TARGET_DEFAULT_RETURN. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c75ca0d157c..9fbd6dd5214 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +2014-02-19 Tom Tromey + + * 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) : Now function pointers. Use + TARGET_DEFAULT_RETURN. + 2014-02-19 Tom Tromey * nto-procfs.c (procfs_remove_hw_breakpoint): Add 'self' diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c index 50bce79b3eb..c326c8ddf4b 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 04824f29de3..5b27b599067 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 911c279968e..4adc0945bcf 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 4a46a1660fa..2cc3c1356cf 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.