aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog13
-rw-r--r--gdb/ravenscar-thread.c40
2 files changed, 42 insertions, 11 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 702d827..0f4a1fd 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,18 @@
2020-08-07 Tom Tromey <tromey@adacore.com>
+ * ravenscar-thread.c (ravenscar_thread_target) <get_base_cpu,
+ get_base_thread_from_ravenscar_task>: Now methods.
+ <m_cpu_map>: New member.
+ (ravenscar_thread_target::get_thread_base_cpu): Rename from
+ ravenscar_get_thread_base_cpu. Check m_cpu_map.
+ (ravenscar_thread_target::task_is_currently_active): Update.
+ (ravenscar_thread_target::get_base_thread_from_ravenscar_task):
+ Now a method.
+ (ravenscar_thread_target::add_active_thread): Put initial thread
+ into the m_cpu_map.
+
+2020-08-07 Tom Tromey <tromey@adacore.com>
+
* ravenscar-thread.c (ravenscar_thread_target::wait): Return
event_ptid.
diff --git a/gdb/ravenscar-thread.c b/gdb/ravenscar-thread.c
index b89b5f6..ee95a1c 100644
--- a/gdb/ravenscar-thread.c
+++ b/gdb/ravenscar-thread.c
@@ -30,6 +30,7 @@
#include "top.h"
#include "regcache.h"
#include "objfiles.h"
+#include <unordered_map>
/* This module provides support for "Ravenscar" tasks (Ada) when
debugging on bare-metal targets.
@@ -133,6 +134,14 @@ private:
ptid_t active_task (int cpu);
bool task_is_currently_active (ptid_t ptid);
bool runtime_initialized ();
+ int get_thread_base_cpu (ptid_t ptid);
+ ptid_t get_base_thread_from_ravenscar_task (ptid_t ptid);
+
+ /* This maps a TID to the CPU on which it was running. This is
+ needed because sometimes the runtime will report an active task
+ that hasn't yet been put on the list of tasks that is read by
+ ada-tasks.c. */
+ std::unordered_map<long, int> m_cpu_map;
};
/* Return true iff PTID corresponds to a ravenscar task. */
@@ -156,8 +165,8 @@ is_ravenscar_task (ptid_t ptid)
This assume that PTID is a valid ptid_t. Otherwise, a gdb_assert
will be triggered. */
-static int
-ravenscar_get_thread_base_cpu (ptid_t ptid)
+int
+ravenscar_thread_target::get_thread_base_cpu (ptid_t ptid)
{
int base_cpu;
@@ -165,8 +174,15 @@ ravenscar_get_thread_base_cpu (ptid_t ptid)
{
struct ada_task_info *task_info = ada_get_task_info_from_ptid (ptid);
- gdb_assert (task_info != NULL);
- base_cpu = task_info->base_cpu;
+ if (task_info != NULL)
+ base_cpu = task_info->base_cpu;
+ else
+ {
+ auto iter = m_cpu_map.find (ptid.tid ());
+
+ gdb_assert (iter != m_cpu_map.end ());
+ base_cpu = iter->second;
+ }
}
else
{
@@ -190,8 +206,7 @@ ravenscar_get_thread_base_cpu (ptid_t ptid)
bool
ravenscar_thread_target::task_is_currently_active (ptid_t ptid)
{
- ptid_t active_task_ptid
- = active_task (ravenscar_get_thread_base_cpu (ptid));
+ ptid_t active_task_ptid = active_task (get_thread_base_cpu (ptid));
return ptid == active_task_ptid;
}
@@ -202,15 +217,15 @@ ravenscar_thread_target::task_is_currently_active (ptid_t ptid)
This is the thread that corresponds to the CPU on which the task
is running. */
-static ptid_t
-get_base_thread_from_ravenscar_task (ptid_t ptid)
+ptid_t
+ravenscar_thread_target::get_base_thread_from_ravenscar_task (ptid_t ptid)
{
int base_cpu;
if (!is_ravenscar_task (ptid))
return ptid;
- base_cpu = ravenscar_get_thread_base_cpu (ptid);
+ base_cpu = get_thread_base_cpu (ptid);
return ptid_t (ptid.pid (), base_cpu, 0);
}
@@ -227,7 +242,7 @@ ravenscar_thread_target::add_active_thread ()
int base_cpu;
gdb_assert (!is_ravenscar_task (m_base_ptid));
- base_cpu = ravenscar_get_thread_base_cpu (m_base_ptid);
+ base_cpu = get_thread_base_cpu (m_base_ptid);
if (!runtime_initialized ())
return nullptr;
@@ -242,7 +257,10 @@ ravenscar_thread_target::add_active_thread ()
may not always add it to the thread list. Add it here. */
thread_info *active_thr = find_thread_ptid (proc_target, active_ptid);
if (active_thr == nullptr)
- active_thr = add_thread (proc_target, active_ptid);
+ {
+ active_thr = ::add_thread (proc_target, active_ptid);
+ m_cpu_map[active_ptid.tid ()] = base_cpu;
+ }
return active_thr;
}