convert to_get_thread_local_address to use target delegation
authorTom Tromey <tromey@redhat.com>
Wed, 25 Jun 2014 16:16:55 +0000 (10:16 -0600)
committerTom Tromey <tromey@redhat.com>
Mon, 7 Jul 2014 15:06:14 +0000 (09:06 -0600)
This converts to_get_thread_local_address to use
TARGET_DEFAULT_NORETURN.  One possible oddity is that this changes the
text of the kind of exception thrown in some cases.  This doesn't seem
to be a problem; in fact perhaps the final call to 'error' in
target_translate_tls_address should be changed to call
generic_tls_error.

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.

gdb/ChangeLog
gdb/linux-thread-db.c
gdb/ppc-linux-tdep.c
gdb/target-delegates.c
gdb/target.c
gdb/target.h

index f4221108ef70d49577285c0fb782630a16a6dd7c..f79973790e4aeb0b3a203c560f23970f6464c50b 100644 (file)
@@ -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
index e693c65a7898d20c90b0ed743e1052a152cf62af..15902d8c0bfbe12c99c47a0a5b93d374a6b9d390 100644 (file)
@@ -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
index 5410554537341d2b64fd54ab1b6cdd866e73b2a1..6e467657acce988dfd5bfeb68171e3f7058f04bb 100644 (file)
@@ -1078,11 +1078,6 @@ ppc_linux_spe_context (int wordsize, enum bfd_endian byte_order,
       struct target_ops *target = &current_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
index eac70188c93e044a2e306f9f225391a579dd842c..a92c46ad689fa505244ddef897fbf7be79f6c2bd 100644 (file)
@@ -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;
index ece59e617cf3b961e9466f1d97f3f861483531ef..91756c874507434808bf912ef416e75900b93f29 100644 (file)
@@ -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 = &current_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;
index d0601b8d555117dbf66d5ce660b89ccacb960241..cf4ced1730fd992155dedadf9eecfe0fd974f3a4 100644 (file)
@@ -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