This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFA]: ada-tasks.c: display ravenscar task name


Hi,

currently ravenscar tasks are displayed by 'info tasks' as 'Ravenscar task' which is not very useful to distinct tasks.
Although these tasks have no name stored in the ATCB, the symbol for the ACTB uses the task name, so it is possible to recover the name of the task from the ATCB symbol.

This patch implements this idea.

Ok for trunk ?

I tested it on AdaCore internal test suite, and sanity-check that gdb still compiles.

Tristan.

2011-10-04  Tristan Gingold  <gingold@adacore.com>

	* ada-tasks.c (read_atcb): Make ravenscar_task_name static.
	Extract the ravenscar task name from the symbol for the atcb.


diff --git a/gdb/ada-tasks.c b/gdb/ada-tasks.c
index 2673fed..ee6685d 100644
--- a/gdb/ada-tasks.c
+++ b/gdb/ada-tasks.c
@@ -591,7 +591,7 @@ read_atcb (CORE_ADDR task_id, struct ada_task_info *task_info)
   struct value *entry_calls_value;
   struct value *entry_calls_value_element;
   int called_task_fieldno = -1;
-  const char ravenscar_task_name[] = "Ravenscar task";
+  static const char ravenscar_task_name[] = "Ravenscar task";
   const struct ada_tasks_pspace_data *pspace_data
     = get_ada_tasks_pspace_data (current_program_space);
 
@@ -629,7 +629,31 @@ read_atcb (CORE_ADDR task_id, struct ada_task_info *task_info)
 					    pspace_data->atcb_fieldno.image),
                                sizeof (task_info->name) - 1);
       else
-        strcpy (task_info->name, ravenscar_task_name);
+	{
+	  struct minimal_symbol *msym;
+
+	  msym = lookup_minimal_symbol_by_pc (task_id);
+	  if (msym)
+	    {
+	      const char *full_name = SYMBOL_LINKAGE_NAME (msym);
+	      const char *task_name = full_name;
+	      const char *p;
+	      
+	      /* Strip the prefix.  */
+	      for (p = full_name; *p; p++)
+		if (p[0] == '_' && p[1] == '_')
+		  task_name = p + 2;
+
+	      /* Copy the task name.  */
+	      strncpy (task_info->name, task_name, sizeof (task_info->name));
+	      task_info->name[sizeof (task_info->name) - 1] = 0;
+	    }
+	  else
+	    {
+	      /* No symbol found.  Use a default name.  */
+	      strcpy (task_info->name, ravenscar_task_name);
+	    }
+	}
     }
   else
     {


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]