[Ada/ravenscar] New name for active-thread symbol
authorJoel Brobecker <brobecker@gnat.com>
Tue, 23 Nov 2010 00:55:08 +0000 (00:55 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Tue, 23 Nov 2010 00:55:08 +0000 (00:55 +0000)
The GNAT Ravenscar implementation has recently been enhanced to allow
programs using that runtime to run on multi-cpu systems.  One of the
changes that were made is that the name of the symbol we use to
determine which task is the currently-running task has changed.

This patch enhances the debugger to use the new name, and fallback on
the old name if not found (this is for compatibility with older versions
of the compiler/runtime).

gdb/ChangeLog:

        * ravenscar-thread.c (running_thread_name): Change value.
        (read_thread_id): Remove advance declaration.
        (get_running_thread_msymbol): New function.
        (has_ravenscar_runtime): Use get_running_thread_msymbol to
        compute msym_running_thread.
        (get_running_thread_id): Renames read_thread_id. Slight modifications
        to not take any argument anymore, using get_running_thread_msymbol
        to determine which symbol to use instead.
        (ravenscar_running_thread): Use get_running_thread_id instead of
        read_thread_id.

gdb/ChangeLog
gdb/ravenscar-thread.c

index b99f302c9a86d9c71460cf556f185214c211650b..0ec240365adbeb7529ab78c87758a7f226170ce3 100644 (file)
@@ -1,3 +1,16 @@
+2010-11-22  Joel Brobecker  <brobecker@adacore.com>
+
+       * ravenscar-thread.c (running_thread_name): Change value.
+       (read_thread_id): Remove advance declaration.
+       (get_running_thread_msymbol): New function.
+       (has_ravenscar_runtime): Use get_running_thread_msymbol to
+       compute msym_running_thread.
+       (get_running_thread_id): Renames read_thread_id. Slight modifications
+       to not take any argument anymore, using get_running_thread_msymbol
+       to determine which symbol to use instead.
+       (ravenscar_running_thread): Use get_running_thread_id instead of
+       read_thread_id.
+
 2010-11-22  Joel Brobecker  <brobecker@adacore.com>
 
        * ravenscar-sparc-thread.c (supply_register_at_address):
index 7a80dcf9add19ac44dbfab1954768d090c1355f6..8f1be9b7641f26bfe4b881485a05d44f3bb089a7 100644 (file)
@@ -48,7 +48,7 @@ static ptid_t base_magic_null_ptid;
 /* Ptid of the inferior as seen by the process stratum.  */
 static ptid_t base_ptid;
 
-static const char running_thread_name[] = "running_thread";
+static const char running_thread_name[] = "__gnat_running_thread_table";
 
 static const char known_tasks_name[] = "system__tasking__debug__known_tasks";
 
@@ -59,8 +59,6 @@ static struct observer *update_target_observer = NULL;
 /* Architecture-specific hooks.  */
 static struct ravenscar_arch_ops* current_arch_ops;
 
-static CORE_ADDR read_thread_id (const char *symbol_name);
-
 static void ravenscar_find_new_threads (struct target_ops *ops);
 static ptid_t ravenscar_running_thread (void);
 static char *ravenscar_extra_thread_info (struct thread_info *tp);
@@ -105,6 +103,27 @@ ravenscar_update_inferior_ptid (void)
     add_thread (inferior_ptid);
 }
 
+/* The Ravenscar Runtime exports a symbol which contains the ID of
+   the thread that is currently running.  Try to locate that symbol
+   and return its associated minimal symbol.
+   Return NULL if not found.  */
+
+static struct minimal_symbol *
+get_running_thread_msymbol (void)
+{
+  struct minimal_symbol *msym;
+
+  msym = lookup_minimal_symbol (running_thread_name, NULL, NULL);
+  if (!msym)
+    /* Older versions of the GNAT runtime were using a different
+       (less ideal) name for the symbol where the active thread ID
+       is stored.  If we couldn't find the symbol using the latest
+       name, then try the old one.  */
+    msym = lookup_minimal_symbol ("running_thread", NULL, NULL);
+
+  return msym;
+}
+
 /* Return True if the Ada Ravenscar run-time can be found in the
    application.  */
 
@@ -115,8 +134,7 @@ has_ravenscar_runtime (void)
     lookup_minimal_symbol (ravenscar_runtime_initializer, NULL, NULL);
   struct minimal_symbol *msym_known_tasks =
     lookup_minimal_symbol (known_tasks_name, NULL, NULL);
-  struct minimal_symbol *msym_running_thread =
-    lookup_minimal_symbol (running_thread_name, NULL, NULL);
+  struct minimal_symbol *msym_running_thread = get_running_thread_msymbol ();
 
   return (msym_ravenscar_runtime_initializer
          && msym_known_tasks
@@ -132,13 +150,13 @@ ravenscar_runtime_initialized (void)
   return (!(ptid_equal (ravenscar_running_thread (), null_ptid)));
 }
 
-/* Read the thread ID whose symbol name is SYMBOL_NAME.  */
+/* Return the ID of the thread that is currently running.
+   Return 0 if the ID could not be determined.  */
 
 static CORE_ADDR
-read_thread_id (const char *symbol_name)
+get_running_thread_id (void)
 {
-  const struct minimal_symbol *object_msym =
-    lookup_minimal_symbol (symbol_name, NULL, NULL);
+  const struct minimal_symbol *object_msym = get_running_thread_msymbol ();
   int object_size;
   int buf_size;
   char *buf;
@@ -213,7 +231,7 @@ ravenscar_find_new_threads (struct target_ops *ops)
 static ptid_t
 ravenscar_running_thread (void)
 {
-  CORE_ADDR tid = read_thread_id (running_thread_name);
+  CORE_ADDR tid = get_running_thread_id ();
 
   if (tid == 0)
     return null_ptid;