summaryrefslogtreecommitdiff
path: root/gdb/ravenscar-thread.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/ravenscar-thread.c')
-rw-r--r--gdb/ravenscar-thread.c38
1 files changed, 28 insertions, 10 deletions
diff --git a/gdb/ravenscar-thread.c b/gdb/ravenscar-thread.c
index 7a80dcf9add..8f1be9b7641 100644
--- a/gdb/ravenscar-thread.c
+++ b/gdb/ravenscar-thread.c
@@ -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;