diff options
-rw-r--r-- | gdb/ChangeLog | 12 | ||||
-rw-r--r-- | gdb/linux-thread-db.c | 6 | ||||
-rw-r--r-- | gdb/ppc-linux-tdep.c | 5 | ||||
-rw-r--r-- | gdb/target-delegates.c | 16 | ||||
-rw-r--r-- | gdb/target.c | 24 | ||||
-rw-r--r-- | gdb/target.h | 3 |
6 files changed, 44 insertions, 22 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f422110..f799737 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,15 @@ +2014-07-07 Tom Tromey <tromey@redhat.com> + + * target.h (struct target_ops) <to_get_thread_local_address>: Use + TARGET_DEFAULT_NORETURN. + * target.c (generic_tls_error): New function. + (target_translate_tls_address): Don't search target stack. + * target-delegates.c: Rebuild. + * ppc-linux-tdep.c (ppc_linux_spe_context): Don't search target + stack. + * linux-thread-db.c (thread_db_get_thread_local_address): + Unconditionally call beneath target. + 2014-07-03 Marc Khouzam <marc.khouzam@ericsson.com> * cli/cli-logging.c (pop_output_files): Assign targerr to diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c index e693c65..15902d8 100644 --- a/gdb/linux-thread-db.c +++ b/gdb/linux-thread-db.c @@ -1874,11 +1874,7 @@ thread_db_get_thread_local_address (struct target_ops *ops, } beneath = find_target_beneath (ops); - if (beneath->to_get_thread_local_address) - return beneath->to_get_thread_local_address (beneath, ptid, lm, offset); - else - throw_error (TLS_GENERIC_ERROR, - _("TLS not supported on this target")); + return beneath->to_get_thread_local_address (beneath, ptid, lm, offset); } /* Callback routine used to find a thread based on the TID part of diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c index 5410554..6e46765 100644 --- a/gdb/ppc-linux-tdep.c +++ b/gdb/ppc-linux-tdep.c @@ -1078,11 +1078,6 @@ ppc_linux_spe_context (int wordsize, enum bfd_endian byte_order, struct target_ops *target = ¤t_target; volatile struct gdb_exception ex; - while (target && !target->to_get_thread_local_address) - target = find_target_beneath (target); - if (!target) - return 0; - TRY_CATCH (ex, RETURN_MASK_ERROR) { /* We do not call target_translate_tls_address here, because diff --git a/gdb/target-delegates.c b/gdb/target-delegates.c index eac7018..a92c46a 100644 --- a/gdb/target-delegates.c +++ b/gdb/target-delegates.c @@ -767,6 +767,19 @@ tdefault_goto_bookmark (struct target_ops *self, const gdb_byte *arg1, int arg2) tcomplain (); } +static CORE_ADDR +delegate_get_thread_local_address (struct target_ops *self, ptid_t arg1, CORE_ADDR arg2, CORE_ADDR arg3) +{ + self = self->beneath; + return self->to_get_thread_local_address (self, arg1, arg2, arg3); +} + +static CORE_ADDR +tdefault_get_thread_local_address (struct target_ops *self, ptid_t arg1, CORE_ADDR arg2, CORE_ADDR arg3) +{ + generic_tls_error (); +} + static enum target_xfer_status delegate_xfer_partial (struct target_ops *self, enum target_object arg1, const char *arg2, gdb_byte *arg3, const gdb_byte *arg4, ULONGEST arg5, ULONGEST arg6, ULONGEST *arg7) { @@ -1781,6 +1794,8 @@ install_delegators (struct target_ops *ops) ops->to_get_bookmark = delegate_get_bookmark; if (ops->to_goto_bookmark == NULL) ops->to_goto_bookmark = delegate_goto_bookmark; + if (ops->to_get_thread_local_address == NULL) + ops->to_get_thread_local_address = delegate_get_thread_local_address; if (ops->to_xfer_partial == NULL) ops->to_xfer_partial = delegate_xfer_partial; if (ops->to_memory_map == NULL) @@ -1995,6 +2010,7 @@ install_dummy_methods (struct target_ops *ops) ops->to_make_corefile_notes = dummy_make_corefile_notes; ops->to_get_bookmark = tdefault_get_bookmark; ops->to_goto_bookmark = tdefault_goto_bookmark; + ops->to_get_thread_local_address = tdefault_get_thread_local_address; ops->to_xfer_partial = tdefault_xfer_partial; ops->to_memory_map = tdefault_memory_map; ops->to_flash_erase = tdefault_flash_erase; diff --git a/gdb/target.c b/gdb/target.c index ece59e6..91756c8 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -49,6 +49,8 @@ static void target_info (char *, int); +static void generic_tls_error (void) ATTRIBUTE_NORETURN; + static void default_terminal_info (struct target_ops *, const char *, int); static int default_watchpoint_addr_within_range (struct target_ops *, @@ -732,24 +734,24 @@ target_is_pushed (struct target_ops *t) return 0; } +/* Default implementation of to_get_thread_local_address. */ + +static void +generic_tls_error (void) +{ + throw_error (TLS_GENERIC_ERROR, + _("Cannot find thread-local variables on this target")); +} + /* Using the objfile specified in OBJFILE, find the address for the current thread's thread-local storage with offset OFFSET. */ CORE_ADDR target_translate_tls_address (struct objfile *objfile, CORE_ADDR offset) { volatile CORE_ADDR addr = 0; - struct target_ops *target; - - for (target = current_target.beneath; - target != NULL; - target = target->beneath) - { - if (target->to_get_thread_local_address != NULL) - break; - } + struct target_ops *target = ¤t_target; - if (target != NULL - && gdbarch_fetch_tls_load_module_address_p (target_gdbarch ())) + if (gdbarch_fetch_tls_load_module_address_p (target_gdbarch ())) { ptid_t ptid = inferior_ptid; volatile struct gdb_exception ex; diff --git a/gdb/target.h b/gdb/target.h index d0601b8..cf4ced1 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -610,7 +610,8 @@ struct target_ops CORE_ADDR (*to_get_thread_local_address) (struct target_ops *ops, ptid_t ptid, CORE_ADDR load_module_addr, - CORE_ADDR offset); + CORE_ADDR offset) + TARGET_DEFAULT_NORETURN (generic_tls_error ()); /* Request that OPS transfer up to LEN 8-bit bytes of the target's OBJECT. The OFFSET, for a seekable object, specifies the |