xref: /netbsd-src/external/gpl3/gdb/dist/gdb/ada-tasks.c (revision 53b02e147d4ed531c0d2a5ca9b3e8026ba3e99b5)
1 /* Copyright (C) 1992-2020 Free Software Foundation, Inc.
2 
3    This file is part of GDB.
4 
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 3 of the License, or
8    (at your option) any later version.
9 
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14 
15    You should have received a copy of the GNU General Public License
16    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
17 
18 #include "defs.h"
19 #include "observable.h"
20 #include "gdbcmd.h"
21 #include "target.h"
22 #include "ada-lang.h"
23 #include "gdbcore.h"
24 #include "inferior.h"
25 #include "gdbthread.h"
26 #include "progspace.h"
27 #include "objfiles.h"
28 #include "cli/cli-style.h"
29 
30 static int ada_build_task_list ();
31 
32 /* The name of the array in the GNAT runtime where the Ada Task Control
33    Block of each task is stored.  */
34 #define KNOWN_TASKS_NAME "system__tasking__debug__known_tasks"
35 
36 /* The maximum number of tasks known to the Ada runtime.  */
37 static const int MAX_NUMBER_OF_KNOWN_TASKS = 1000;
38 
39 /* The name of the variable in the GNAT runtime where the head of a task
40    chain is saved.  This is an alternate mechanism to find the list of known
41    tasks.  */
42 #define KNOWN_TASKS_LIST "system__tasking__debug__first_task"
43 
44 enum task_states
45 {
46   Unactivated,
47   Runnable,
48   Terminated,
49   Activator_Sleep,
50   Acceptor_Sleep,
51   Entry_Caller_Sleep,
52   Async_Select_Sleep,
53   Delay_Sleep,
54   Master_Completion_Sleep,
55   Master_Phase_2_Sleep,
56   Interrupt_Server_Idle_Sleep,
57   Interrupt_Server_Blocked_Interrupt_Sleep,
58   Timer_Server_Sleep,
59   AST_Server_Sleep,
60   Asynchronous_Hold,
61   Interrupt_Server_Blocked_On_Event_Flag,
62   Activating,
63   Acceptor_Delay_Sleep
64 };
65 
66 /* A short description corresponding to each possible task state.  */
67 static const char *task_states[] = {
68   N_("Unactivated"),
69   N_("Runnable"),
70   N_("Terminated"),
71   N_("Child Activation Wait"),
72   N_("Accept or Select Term"),
73   N_("Waiting on entry call"),
74   N_("Async Select Wait"),
75   N_("Delay Sleep"),
76   N_("Child Termination Wait"),
77   N_("Wait Child in Term Alt"),
78   "",
79   "",
80   "",
81   "",
82   N_("Asynchronous Hold"),
83   "",
84   N_("Activating"),
85   N_("Selective Wait")
86 };
87 
88 /* A longer description corresponding to each possible task state.  */
89 static const char *long_task_states[] = {
90   N_("Unactivated"),
91   N_("Runnable"),
92   N_("Terminated"),
93   N_("Waiting for child activation"),
94   N_("Blocked in accept or select with terminate"),
95   N_("Waiting on entry call"),
96   N_("Asynchronous Selective Wait"),
97   N_("Delay Sleep"),
98   N_("Waiting for children termination"),
99   N_("Waiting for children in terminate alternative"),
100   "",
101   "",
102   "",
103   "",
104   N_("Asynchronous Hold"),
105   "",
106   N_("Activating"),
107   N_("Blocked in selective wait statement")
108 };
109 
110 /* The index of certain important fields in the Ada Task Control Block
111    record and sub-records.  */
112 
113 struct atcb_fieldnos
114 {
115   /* Fields in record Ada_Task_Control_Block.  */
116   int common;
117   int entry_calls;
118   int atc_nesting_level;
119 
120   /* Fields in record Common_ATCB.  */
121   int state;
122   int parent;
123   int priority;
124   int image;
125   int image_len;     /* This field may be missing.  */
126   int activation_link;
127   int call;
128   int ll;
129   int base_cpu;
130 
131   /* Fields in Task_Primitives.Private_Data.  */
132   int ll_thread;
133   int ll_lwp;        /* This field may be missing.  */
134 
135   /* Fields in Common_ATCB.Call.all.  */
136   int call_self;
137 };
138 
139 /* This module's per-program-space data.  */
140 
141 struct ada_tasks_pspace_data
142 {
143   /* Nonzero if the data has been initialized.  If set to zero,
144      it means that the data has either not been initialized, or
145      has potentially become stale.  */
146   int initialized_p = 0;
147 
148   /* The ATCB record type.  */
149   struct type *atcb_type = nullptr;
150 
151   /* The ATCB "Common" component type.  */
152   struct type *atcb_common_type = nullptr;
153 
154   /* The type of the "ll" field, from the atcb_common_type.  */
155   struct type *atcb_ll_type = nullptr;
156 
157   /* The type of the "call" field, from the atcb_common_type.  */
158   struct type *atcb_call_type = nullptr;
159 
160   /* The index of various fields in the ATCB record and sub-records.  */
161   struct atcb_fieldnos atcb_fieldno {};
162 };
163 
164 /* Key to our per-program-space data.  */
165 static const struct program_space_key<ada_tasks_pspace_data>
166   ada_tasks_pspace_data_handle;
167 
168 /* The kind of data structure used by the runtime to store the list
169    of Ada tasks.  */
170 
171 enum ada_known_tasks_kind
172 {
173   /* Use this value when we haven't determined which kind of structure
174      is being used, or when we need to recompute it.
175 
176      We set the value of this enumerate to zero on purpose: This allows
177      us to use this enumerate in a structure where setting all fields
178      to zero will result in this kind being set to unknown.  */
179   ADA_TASKS_UNKNOWN = 0,
180 
181   /* This value means that we did not find any task list.  Unless
182      there is a bug somewhere, this means that the inferior does not
183      use tasking.  */
184   ADA_TASKS_NOT_FOUND,
185 
186   /* This value means that the task list is stored as an array.
187      This is the usual method, as it causes very little overhead.
188      But this method is not always used, as it does use a certain
189      amount of memory, which might be scarse in certain environments.  */
190   ADA_TASKS_ARRAY,
191 
192   /* This value means that the task list is stored as a linked list.
193      This has more runtime overhead than the array approach, but
194      also require less memory when the number of tasks is small.  */
195   ADA_TASKS_LIST,
196 };
197 
198 /* This module's per-inferior data.  */
199 
200 struct ada_tasks_inferior_data
201 {
202   /* The type of data structure used by the runtime to store
203      the list of Ada tasks.  The value of this field influences
204      the interpretation of the known_tasks_addr field below:
205        - ADA_TASKS_UNKNOWN: The value of known_tasks_addr hasn't
206          been determined yet;
207        - ADA_TASKS_NOT_FOUND: The program probably does not use tasking
208          and the known_tasks_addr is irrelevant;
209        - ADA_TASKS_ARRAY: The known_tasks is an array;
210        - ADA_TASKS_LIST: The known_tasks is a list.  */
211   enum ada_known_tasks_kind known_tasks_kind = ADA_TASKS_UNKNOWN;
212 
213   /* The address of the known_tasks structure.  This is where
214      the runtime stores the information for all Ada tasks.
215      The interpretation of this field depends on KNOWN_TASKS_KIND
216      above.  */
217   CORE_ADDR known_tasks_addr = 0;
218 
219   /* Type of elements of the known task.  Usually a pointer.  */
220   struct type *known_tasks_element = nullptr;
221 
222   /* Number of elements in the known tasks array.  */
223   unsigned int known_tasks_length = 0;
224 
225   /* When nonzero, this flag indicates that the task_list field
226      below is up to date.  When set to zero, the list has either
227      not been initialized, or has potentially become stale.  */
228   bool task_list_valid_p = false;
229 
230   /* The list of Ada tasks.
231 
232      Note: To each task we associate a number that the user can use to
233      reference it - this number is printed beside each task in the tasks
234      info listing displayed by "info tasks".  This number is equal to
235      its index in the vector + 1.  Reciprocally, to compute the index
236      of a task in the vector, we need to substract 1 from its number.  */
237   std::vector<ada_task_info> task_list;
238 };
239 
240 /* Key to our per-inferior data.  */
241 static const struct inferior_key<ada_tasks_inferior_data>
242   ada_tasks_inferior_data_handle;
243 
244 /* Return a string with TASKNO followed by the task name if TASK_INFO
245    contains a name.  */
246 
247 static std::string
248 task_to_str (int taskno, const ada_task_info *task_info)
249 {
250   if (task_info->name[0] == '\0')
251     return string_printf ("%d", taskno);
252   else
253     return string_printf ("%d \"%s\"", taskno, task_info->name);
254 }
255 
256 /* Return the ada-tasks module's data for the given program space (PSPACE).
257    If none is found, add a zero'ed one now.
258 
259    This function always returns a valid object.  */
260 
261 static struct ada_tasks_pspace_data *
262 get_ada_tasks_pspace_data (struct program_space *pspace)
263 {
264   struct ada_tasks_pspace_data *data;
265 
266   data = ada_tasks_pspace_data_handle.get (pspace);
267   if (data == NULL)
268     data = ada_tasks_pspace_data_handle.emplace (pspace);
269 
270   return data;
271 }
272 
273 /* Return the ada-tasks module's data for the given inferior (INF).
274    If none is found, add a zero'ed one now.
275 
276    This function always returns a valid object.
277 
278    Note that we could use an observer of the inferior-created event
279    to make sure that the ada-tasks per-inferior data always exists.
280    But we prefered this approach, as it avoids this entirely as long
281    as the user does not use any of the tasking features.  This is
282    quite possible, particularly in the case where the inferior does
283    not use tasking.  */
284 
285 static struct ada_tasks_inferior_data *
286 get_ada_tasks_inferior_data (struct inferior *inf)
287 {
288   struct ada_tasks_inferior_data *data;
289 
290   data = ada_tasks_inferior_data_handle.get (inf);
291   if (data == NULL)
292     data = ada_tasks_inferior_data_handle.emplace (inf);
293 
294   return data;
295 }
296 
297 /* Return the task number of the task whose thread is THREAD, or zero
298    if the task could not be found.  */
299 
300 int
301 ada_get_task_number (thread_info *thread)
302 {
303   struct inferior *inf = thread->inf;
304   struct ada_tasks_inferior_data *data;
305 
306   gdb_assert (inf != NULL);
307   data = get_ada_tasks_inferior_data (inf);
308 
309   for (int i = 0; i < data->task_list.size (); i++)
310     if (data->task_list[i].ptid == thread->ptid)
311       return i + 1;
312 
313   return 0;  /* No matching task found.  */
314 }
315 
316 /* Return the task number of the task running in inferior INF which
317    matches TASK_ID , or zero if the task could not be found.  */
318 
319 static int
320 get_task_number_from_id (CORE_ADDR task_id, struct inferior *inf)
321 {
322   struct ada_tasks_inferior_data *data = get_ada_tasks_inferior_data (inf);
323 
324   for (int i = 0; i < data->task_list.size (); i++)
325     {
326       if (data->task_list[i].task_id == task_id)
327         return i + 1;
328     }
329 
330   /* Task not found.  Return 0.  */
331   return 0;
332 }
333 
334 /* Return non-zero if TASK_NUM is a valid task number.  */
335 
336 int
337 valid_task_id (int task_num)
338 {
339   struct ada_tasks_inferior_data *data;
340 
341   ada_build_task_list ();
342   data = get_ada_tasks_inferior_data (current_inferior ());
343   return task_num > 0 && task_num <= data->task_list.size ();
344 }
345 
346 /* Return non-zero iff the task STATE corresponds to a non-terminated
347    task state.  */
348 
349 static int
350 ada_task_is_alive (const struct ada_task_info *task_info)
351 {
352   return (task_info->state != Terminated);
353 }
354 
355 /* Search through the list of known tasks for the one whose ptid is
356    PTID, and return it.  Return NULL if the task was not found.  */
357 
358 struct ada_task_info *
359 ada_get_task_info_from_ptid (ptid_t ptid)
360 {
361   struct ada_tasks_inferior_data *data;
362 
363   ada_build_task_list ();
364   data = get_ada_tasks_inferior_data (current_inferior ());
365 
366   for (ada_task_info &task : data->task_list)
367     {
368       if (task.ptid == ptid)
369 	return &task;
370     }
371 
372   return NULL;
373 }
374 
375 /* Call the ITERATOR function once for each Ada task that hasn't been
376    terminated yet.  */
377 
378 void
379 iterate_over_live_ada_tasks (ada_task_list_iterator_ftype iterator)
380 {
381   struct ada_tasks_inferior_data *data;
382 
383   ada_build_task_list ();
384   data = get_ada_tasks_inferior_data (current_inferior ());
385 
386   for (ada_task_info &task : data->task_list)
387     {
388       if (!ada_task_is_alive (&task))
389         continue;
390       iterator (&task);
391     }
392 }
393 
394 /* Extract the contents of the value as a string whose length is LENGTH,
395    and store the result in DEST.  */
396 
397 static void
398 value_as_string (char *dest, struct value *val, int length)
399 {
400   memcpy (dest, value_contents (val), length);
401   dest[length] = '\0';
402 }
403 
404 /* Extract the string image from the fat string corresponding to VAL,
405    and store it in DEST.  If the string length is greater than MAX_LEN,
406    then truncate the result to the first MAX_LEN characters of the fat
407    string.  */
408 
409 static void
410 read_fat_string_value (char *dest, struct value *val, int max_len)
411 {
412   struct value *array_val;
413   struct value *bounds_val;
414   int len;
415 
416   /* The following variables are made static to avoid recomputing them
417      each time this function is called.  */
418   static int initialize_fieldnos = 1;
419   static int array_fieldno;
420   static int bounds_fieldno;
421   static int upper_bound_fieldno;
422 
423   /* Get the index of the fields that we will need to read in order
424      to extract the string from the fat string.  */
425   if (initialize_fieldnos)
426     {
427       struct type *type = value_type (val);
428       struct type *bounds_type;
429 
430       array_fieldno = ada_get_field_index (type, "P_ARRAY", 0);
431       bounds_fieldno = ada_get_field_index (type, "P_BOUNDS", 0);
432 
433       bounds_type = type->field (bounds_fieldno).type ();
434       if (bounds_type->code () == TYPE_CODE_PTR)
435         bounds_type = TYPE_TARGET_TYPE (bounds_type);
436       if (bounds_type->code () != TYPE_CODE_STRUCT)
437         error (_("Unknown task name format. Aborting"));
438       upper_bound_fieldno = ada_get_field_index (bounds_type, "UB0", 0);
439 
440       initialize_fieldnos = 0;
441     }
442 
443   /* Get the size of the task image by checking the value of the bounds.
444      The lower bound is always 1, so we only need to read the upper bound.  */
445   bounds_val = value_ind (value_field (val, bounds_fieldno));
446   len = value_as_long (value_field (bounds_val, upper_bound_fieldno));
447 
448   /* Make sure that we do not read more than max_len characters...  */
449   if (len > max_len)
450     len = max_len;
451 
452   /* Extract LEN characters from the fat string.  */
453   array_val = value_ind (value_field (val, array_fieldno));
454   read_memory (value_address (array_val), (gdb_byte *) dest, len);
455 
456   /* Add the NUL character to close the string.  */
457   dest[len] = '\0';
458 }
459 
460 /* Get, from the debugging information, the type description of all types
461    related to the Ada Task Control Block that are needed in order to
462    read the list of known tasks in the Ada runtime.  If all of the info
463    needed to do so is found, then save that info in the module's per-
464    program-space data, and return NULL.  Otherwise, if any information
465    cannot be found, leave the per-program-space data untouched, and
466    return an error message explaining what was missing (that error
467    message does NOT need to be deallocated).  */
468 
469 const char *
470 ada_get_tcb_types_info (void)
471 {
472   struct type *type;
473   struct type *common_type;
474   struct type *ll_type;
475   struct type *call_type;
476   struct atcb_fieldnos fieldnos;
477   struct ada_tasks_pspace_data *pspace_data;
478 
479   const char *atcb_name = "system__tasking__ada_task_control_block___XVE";
480   const char *atcb_name_fixed = "system__tasking__ada_task_control_block";
481   const char *common_atcb_name = "system__tasking__common_atcb";
482   const char *private_data_name = "system__task_primitives__private_data";
483   const char *entry_call_record_name = "system__tasking__entry_call_record";
484 
485   /* ATCB symbols may be found in several compilation units.  As we
486      are only interested in one instance, use standard (literal,
487      C-like) lookups to get the first match.  */
488 
489   struct symbol *atcb_sym =
490     lookup_symbol_in_language (atcb_name, NULL, STRUCT_DOMAIN,
491 			       language_c, NULL).symbol;
492   const struct symbol *common_atcb_sym =
493     lookup_symbol_in_language (common_atcb_name, NULL, STRUCT_DOMAIN,
494 			       language_c, NULL).symbol;
495   const struct symbol *private_data_sym =
496     lookup_symbol_in_language (private_data_name, NULL, STRUCT_DOMAIN,
497 			       language_c, NULL).symbol;
498   const struct symbol *entry_call_record_sym =
499     lookup_symbol_in_language (entry_call_record_name, NULL, STRUCT_DOMAIN,
500 			       language_c, NULL).symbol;
501 
502   if (atcb_sym == NULL || atcb_sym->type == NULL)
503     {
504       /* In Ravenscar run-time libs, the  ATCB does not have a dynamic
505          size, so the symbol name differs.  */
506       atcb_sym = lookup_symbol_in_language (atcb_name_fixed, NULL,
507 					    STRUCT_DOMAIN, language_c,
508 					    NULL).symbol;
509 
510       if (atcb_sym == NULL || atcb_sym->type == NULL)
511         return _("Cannot find Ada_Task_Control_Block type");
512 
513       type = atcb_sym->type;
514     }
515   else
516     {
517       /* Get a static representation of the type record
518          Ada_Task_Control_Block.  */
519       type = atcb_sym->type;
520       type = ada_template_to_fixed_record_type_1 (type, NULL, 0, NULL, 0);
521     }
522 
523   if (common_atcb_sym == NULL || common_atcb_sym->type == NULL)
524     return _("Cannot find Common_ATCB type");
525   if (private_data_sym == NULL || private_data_sym->type == NULL)
526     return _("Cannot find Private_Data type");
527   if (entry_call_record_sym == NULL || entry_call_record_sym->type == NULL)
528     return _("Cannot find Entry_Call_Record type");
529 
530   /* Get the type for Ada_Task_Control_Block.Common.  */
531   common_type = common_atcb_sym->type;
532 
533   /* Get the type for Ada_Task_Control_Bloc.Common.Call.LL.  */
534   ll_type = private_data_sym->type;
535 
536   /* Get the type for Common_ATCB.Call.all.  */
537   call_type = entry_call_record_sym->type;
538 
539   /* Get the field indices.  */
540   fieldnos.common = ada_get_field_index (type, "common", 0);
541   fieldnos.entry_calls = ada_get_field_index (type, "entry_calls", 1);
542   fieldnos.atc_nesting_level =
543     ada_get_field_index (type, "atc_nesting_level", 1);
544   fieldnos.state = ada_get_field_index (common_type, "state", 0);
545   fieldnos.parent = ada_get_field_index (common_type, "parent", 1);
546   fieldnos.priority = ada_get_field_index (common_type, "base_priority", 0);
547   fieldnos.image = ada_get_field_index (common_type, "task_image", 1);
548   fieldnos.image_len = ada_get_field_index (common_type, "task_image_len", 1);
549   fieldnos.activation_link = ada_get_field_index (common_type,
550                                                   "activation_link", 1);
551   fieldnos.call = ada_get_field_index (common_type, "call", 1);
552   fieldnos.ll = ada_get_field_index (common_type, "ll", 0);
553   fieldnos.base_cpu = ada_get_field_index (common_type, "base_cpu", 0);
554   fieldnos.ll_thread = ada_get_field_index (ll_type, "thread", 0);
555   fieldnos.ll_lwp = ada_get_field_index (ll_type, "lwp", 1);
556   fieldnos.call_self = ada_get_field_index (call_type, "self", 0);
557 
558   /* On certain platforms such as x86-windows, the "lwp" field has been
559      named "thread_id".  This field will likely be renamed in the future,
560      but we need to support both possibilities to avoid an unnecessary
561      dependency on a recent compiler.  We therefore try locating the
562      "thread_id" field in place of the "lwp" field if we did not find
563      the latter.  */
564   if (fieldnos.ll_lwp < 0)
565     fieldnos.ll_lwp = ada_get_field_index (ll_type, "thread_id", 1);
566 
567   /* Set all the out parameters all at once, now that we are certain
568      that there are no potential error() anymore.  */
569   pspace_data = get_ada_tasks_pspace_data (current_program_space);
570   pspace_data->initialized_p = 1;
571   pspace_data->atcb_type = type;
572   pspace_data->atcb_common_type = common_type;
573   pspace_data->atcb_ll_type = ll_type;
574   pspace_data->atcb_call_type = call_type;
575   pspace_data->atcb_fieldno = fieldnos;
576   return NULL;
577 }
578 
579 /* Build the PTID of the task from its COMMON_VALUE, which is the "Common"
580    component of its ATCB record.  This PTID needs to match the PTID used
581    by the thread layer.  */
582 
583 static ptid_t
584 ptid_from_atcb_common (struct value *common_value)
585 {
586   long thread = 0;
587   CORE_ADDR lwp = 0;
588   struct value *ll_value;
589   ptid_t ptid;
590   const struct ada_tasks_pspace_data *pspace_data
591     = get_ada_tasks_pspace_data (current_program_space);
592 
593   ll_value = value_field (common_value, pspace_data->atcb_fieldno.ll);
594 
595   if (pspace_data->atcb_fieldno.ll_lwp >= 0)
596     lwp = value_as_address (value_field (ll_value,
597 					 pspace_data->atcb_fieldno.ll_lwp));
598   thread = value_as_long (value_field (ll_value,
599 				       pspace_data->atcb_fieldno.ll_thread));
600 
601   ptid = target_get_ada_task_ptid (lwp, thread);
602 
603   return ptid;
604 }
605 
606 /* Read the ATCB data of a given task given its TASK_ID (which is in practice
607    the address of its associated ATCB record), and store the result inside
608    TASK_INFO.  */
609 
610 static void
611 read_atcb (CORE_ADDR task_id, struct ada_task_info *task_info)
612 {
613   struct value *tcb_value;
614   struct value *common_value;
615   struct value *atc_nesting_level_value;
616   struct value *entry_calls_value;
617   struct value *entry_calls_value_element;
618   int called_task_fieldno = -1;
619   static const char ravenscar_task_name[] = "Ravenscar task";
620   const struct ada_tasks_pspace_data *pspace_data
621     = get_ada_tasks_pspace_data (current_program_space);
622 
623   /* Clear the whole structure to start with, so that everything
624      is always initialized the same.  */
625   memset (task_info, 0, sizeof (struct ada_task_info));
626 
627   if (!pspace_data->initialized_p)
628     {
629       const char *err_msg = ada_get_tcb_types_info ();
630 
631       if (err_msg != NULL)
632 	error (_("%s. Aborting"), err_msg);
633     }
634 
635   tcb_value = value_from_contents_and_address (pspace_data->atcb_type,
636 					       NULL, task_id);
637   common_value = value_field (tcb_value, pspace_data->atcb_fieldno.common);
638 
639   /* Fill in the task_id.  */
640 
641   task_info->task_id = task_id;
642 
643   /* Compute the name of the task.
644 
645      Depending on the GNAT version used, the task image is either a fat
646      string, or a thin array of characters.  Older versions of GNAT used
647      to use fat strings, and therefore did not need an extra field in
648      the ATCB to store the string length.  For efficiency reasons, newer
649      versions of GNAT replaced the fat string by a static buffer, but this
650      also required the addition of a new field named "Image_Len" containing
651      the length of the task name.  The method used to extract the task name
652      is selected depending on the existence of this field.
653 
654      In some run-time libs (e.g. Ravenscar), the name is not in the ATCB;
655      we may want to get it from the first user frame of the stack.  For now,
656      we just give a dummy name.  */
657 
658   if (pspace_data->atcb_fieldno.image_len == -1)
659     {
660       if (pspace_data->atcb_fieldno.image >= 0)
661         read_fat_string_value (task_info->name,
662                                value_field (common_value,
663 					    pspace_data->atcb_fieldno.image),
664                                sizeof (task_info->name) - 1);
665       else
666 	{
667 	  struct bound_minimal_symbol msym;
668 
669 	  msym = lookup_minimal_symbol_by_pc (task_id);
670 	  if (msym.minsym)
671 	    {
672 	      const char *full_name = msym.minsym->linkage_name ();
673 	      const char *task_name = full_name;
674 	      const char *p;
675 
676 	      /* Strip the prefix.  */
677 	      for (p = full_name; *p; p++)
678 		if (p[0] == '_' && p[1] == '_')
679 		  task_name = p + 2;
680 
681 	      /* Copy the task name.  */
682 	      strncpy (task_info->name, task_name,
683 		       sizeof (task_info->name) - 1);
684 	      task_info->name[sizeof (task_info->name) - 1] = 0;
685 	    }
686 	  else
687 	    {
688 	      /* No symbol found.  Use a default name.  */
689 	      strcpy (task_info->name, ravenscar_task_name);
690 	    }
691 	}
692     }
693   else
694     {
695       int len = value_as_long
696 		  (value_field (common_value,
697 				pspace_data->atcb_fieldno.image_len));
698 
699       value_as_string (task_info->name,
700                        value_field (common_value,
701 				    pspace_data->atcb_fieldno.image),
702 		       len);
703     }
704 
705   /* Compute the task state and priority.  */
706 
707   task_info->state =
708     value_as_long (value_field (common_value,
709 				pspace_data->atcb_fieldno.state));
710   task_info->priority =
711     value_as_long (value_field (common_value,
712 				pspace_data->atcb_fieldno.priority));
713 
714   /* If the ATCB contains some information about the parent task,
715      then compute it as well.  Otherwise, zero.  */
716 
717   if (pspace_data->atcb_fieldno.parent >= 0)
718     task_info->parent =
719       value_as_address (value_field (common_value,
720 				     pspace_data->atcb_fieldno.parent));
721 
722   /* If the task is in an entry call waiting for another task,
723      then determine which task it is.  */
724 
725   if (task_info->state == Entry_Caller_Sleep
726       && pspace_data->atcb_fieldno.atc_nesting_level > 0
727       && pspace_data->atcb_fieldno.entry_calls > 0)
728     {
729       /* Let My_ATCB be the Ada task control block of a task calling the
730          entry of another task; then the Task_Id of the called task is
731          in My_ATCB.Entry_Calls (My_ATCB.ATC_Nesting_Level).Called_Task.  */
732       atc_nesting_level_value =
733         value_field (tcb_value, pspace_data->atcb_fieldno.atc_nesting_level);
734       entry_calls_value =
735         ada_coerce_to_simple_array_ptr
736 	  (value_field (tcb_value, pspace_data->atcb_fieldno.entry_calls));
737       entry_calls_value_element =
738         value_subscript (entry_calls_value,
739 			 value_as_long (atc_nesting_level_value));
740       called_task_fieldno =
741         ada_get_field_index (value_type (entry_calls_value_element),
742                              "called_task", 0);
743       task_info->called_task =
744         value_as_address (value_field (entry_calls_value_element,
745                                        called_task_fieldno));
746     }
747 
748   /* If the ATCB contains some information about RV callers, then
749      compute the "caller_task".  Otherwise, leave it as zero.  */
750 
751   if (pspace_data->atcb_fieldno.call >= 0)
752     {
753       /* Get the ID of the caller task from Common_ATCB.Call.all.Self.
754          If Common_ATCB.Call is null, then there is no caller.  */
755       const CORE_ADDR call =
756         value_as_address (value_field (common_value,
757 				       pspace_data->atcb_fieldno.call));
758       struct value *call_val;
759 
760       if (call != 0)
761         {
762           call_val =
763             value_from_contents_and_address (pspace_data->atcb_call_type,
764 					     NULL, call);
765           task_info->caller_task =
766             value_as_address
767 	      (value_field (call_val, pspace_data->atcb_fieldno.call_self));
768         }
769     }
770 
771   task_info->base_cpu
772     = value_as_long (value_field (common_value,
773 				  pspace_data->atcb_fieldno.base_cpu));
774 
775   /* And finally, compute the task ptid.  Note that there is not point
776      in computing it if the task is no longer alive, in which case
777      it is good enough to set its ptid to the null_ptid.  */
778   if (ada_task_is_alive (task_info))
779     task_info->ptid = ptid_from_atcb_common (common_value);
780   else
781     task_info->ptid = null_ptid;
782 }
783 
784 /* Read the ATCB info of the given task (identified by TASK_ID), and
785    add the result to the given inferior's TASK_LIST.  */
786 
787 static void
788 add_ada_task (CORE_ADDR task_id, struct inferior *inf)
789 {
790   struct ada_task_info task_info;
791   struct ada_tasks_inferior_data *data = get_ada_tasks_inferior_data (inf);
792 
793   read_atcb (task_id, &task_info);
794   data->task_list.push_back (task_info);
795 }
796 
797 /* Read the Known_Tasks array from the inferior memory, and store
798    it in the current inferior's TASK_LIST.  Return true upon success.  */
799 
800 static bool
801 read_known_tasks_array (struct ada_tasks_inferior_data *data)
802 {
803   const int target_ptr_byte = TYPE_LENGTH (data->known_tasks_element);
804   const int known_tasks_size = target_ptr_byte * data->known_tasks_length;
805   gdb_byte *known_tasks = (gdb_byte *) alloca (known_tasks_size);
806   int i;
807 
808   /* Build a new list by reading the ATCBs from the Known_Tasks array
809      in the Ada runtime.  */
810   read_memory (data->known_tasks_addr, known_tasks, known_tasks_size);
811   for (i = 0; i < data->known_tasks_length; i++)
812     {
813       CORE_ADDR task_id =
814         extract_typed_address (known_tasks + i * target_ptr_byte,
815 			       data->known_tasks_element);
816 
817       if (task_id != 0)
818         add_ada_task (task_id, current_inferior ());
819     }
820 
821   return true;
822 }
823 
824 /* Read the known tasks from the inferior memory, and store it in
825    the current inferior's TASK_LIST.  Return true upon success.  */
826 
827 static bool
828 read_known_tasks_list (struct ada_tasks_inferior_data *data)
829 {
830   const int target_ptr_byte = TYPE_LENGTH (data->known_tasks_element);
831   gdb_byte *known_tasks = (gdb_byte *) alloca (target_ptr_byte);
832   CORE_ADDR task_id;
833   const struct ada_tasks_pspace_data *pspace_data
834     = get_ada_tasks_pspace_data (current_program_space);
835 
836   /* Sanity check.  */
837   if (pspace_data->atcb_fieldno.activation_link < 0)
838     return false;
839 
840   /* Build a new list by reading the ATCBs.  Read head of the list.  */
841   read_memory (data->known_tasks_addr, known_tasks, target_ptr_byte);
842   task_id = extract_typed_address (known_tasks, data->known_tasks_element);
843   while (task_id != 0)
844     {
845       struct value *tcb_value;
846       struct value *common_value;
847 
848       add_ada_task (task_id, current_inferior ());
849 
850       /* Read the chain.  */
851       tcb_value = value_from_contents_and_address (pspace_data->atcb_type,
852 						   NULL, task_id);
853       common_value = value_field (tcb_value, pspace_data->atcb_fieldno.common);
854       task_id = value_as_address
855 		  (value_field (common_value,
856                                 pspace_data->atcb_fieldno.activation_link));
857     }
858 
859   return true;
860 }
861 
862 /* Set all fields of the current inferior ada-tasks data pointed by DATA.
863    Do nothing if those fields are already set and still up to date.  */
864 
865 static void
866 ada_tasks_inferior_data_sniffer (struct ada_tasks_inferior_data *data)
867 {
868   struct bound_minimal_symbol msym;
869   struct symbol *sym;
870 
871   /* Return now if already set.  */
872   if (data->known_tasks_kind != ADA_TASKS_UNKNOWN)
873     return;
874 
875   /* Try array.  */
876 
877   msym = lookup_minimal_symbol (KNOWN_TASKS_NAME, NULL, NULL);
878   if (msym.minsym != NULL)
879     {
880       data->known_tasks_kind = ADA_TASKS_ARRAY;
881       data->known_tasks_addr = BMSYMBOL_VALUE_ADDRESS (msym);
882 
883       /* Try to get pointer type and array length from the symtab.  */
884       sym = lookup_symbol_in_language (KNOWN_TASKS_NAME, NULL, VAR_DOMAIN,
885 				       language_c, NULL).symbol;
886       if (sym != NULL)
887 	{
888 	  /* Validate.  */
889 	  struct type *type = check_typedef (SYMBOL_TYPE (sym));
890 	  struct type *eltype = NULL;
891 	  struct type *idxtype = NULL;
892 
893 	  if (type->code () == TYPE_CODE_ARRAY)
894 	    eltype = check_typedef (TYPE_TARGET_TYPE (type));
895 	  if (eltype != NULL
896 	      && eltype->code () == TYPE_CODE_PTR)
897 	    idxtype = check_typedef (type->index_type ());
898 	  if (idxtype != NULL
899 	      && idxtype->bounds ()->low.kind () != PROP_UNDEFINED
900 	      && idxtype->bounds ()->high.kind () != PROP_UNDEFINED)
901 	    {
902 	      data->known_tasks_element = eltype;
903 	      data->known_tasks_length =
904 		(idxtype->bounds ()->high.const_val ()
905 		 - idxtype->bounds ()->low.const_val () + 1);
906 	      return;
907 	    }
908 	}
909 
910       /* Fallback to default values.  The runtime may have been stripped (as
911 	 in some distributions), but it is likely that the executable still
912 	 contains debug information on the task type (due to implicit with of
913 	 Ada.Tasking).  */
914       data->known_tasks_element =
915 	builtin_type (target_gdbarch ())->builtin_data_ptr;
916       data->known_tasks_length = MAX_NUMBER_OF_KNOWN_TASKS;
917       return;
918     }
919 
920 
921   /* Try list.  */
922 
923   msym = lookup_minimal_symbol (KNOWN_TASKS_LIST, NULL, NULL);
924   if (msym.minsym != NULL)
925     {
926       data->known_tasks_kind = ADA_TASKS_LIST;
927       data->known_tasks_addr = BMSYMBOL_VALUE_ADDRESS (msym);
928       data->known_tasks_length = 1;
929 
930       sym = lookup_symbol_in_language (KNOWN_TASKS_LIST, NULL, VAR_DOMAIN,
931 				       language_c, NULL).symbol;
932       if (sym != NULL && SYMBOL_VALUE_ADDRESS (sym) != 0)
933 	{
934 	  /* Validate.  */
935 	  struct type *type = check_typedef (SYMBOL_TYPE (sym));
936 
937 	  if (type->code () == TYPE_CODE_PTR)
938 	    {
939 	      data->known_tasks_element = type;
940 	      return;
941 	    }
942 	}
943 
944       /* Fallback to default values.  */
945       data->known_tasks_element =
946 	builtin_type (target_gdbarch ())->builtin_data_ptr;
947       data->known_tasks_length = 1;
948       return;
949     }
950 
951   /* Can't find tasks.  */
952 
953   data->known_tasks_kind = ADA_TASKS_NOT_FOUND;
954   data->known_tasks_addr = 0;
955 }
956 
957 /* Read the known tasks from the current inferior's memory, and store it
958    in the current inferior's data TASK_LIST.  */
959 
960 static void
961 read_known_tasks ()
962 {
963   struct ada_tasks_inferior_data *data =
964     get_ada_tasks_inferior_data (current_inferior ());
965 
966   /* Step 1: Clear the current list, if necessary.  */
967   data->task_list.clear ();
968 
969   /* Step 2: do the real work.
970      If the application does not use task, then no more needs to be done.
971      It is important to have the task list cleared (see above) before we
972      return, as we don't want a stale task list to be used...  This can
973      happen for instance when debugging a non-multitasking program after
974      having debugged a multitasking one.  */
975   ada_tasks_inferior_data_sniffer (data);
976   gdb_assert (data->known_tasks_kind != ADA_TASKS_UNKNOWN);
977 
978   /* Step 3: Set task_list_valid_p, to avoid re-reading the Known_Tasks
979      array unless needed.  */
980   switch (data->known_tasks_kind)
981     {
982     case ADA_TASKS_NOT_FOUND: /* Tasking not in use in inferior.  */
983       break;
984     case ADA_TASKS_ARRAY:
985       data->task_list_valid_p = read_known_tasks_array (data);
986       break;
987     case ADA_TASKS_LIST:
988       data->task_list_valid_p = read_known_tasks_list (data);
989       break;
990     }
991 }
992 
993 /* Build the task_list by reading the Known_Tasks array from
994    the inferior, and return the number of tasks in that list
995    (zero means that the program is not using tasking at all).  */
996 
997 static int
998 ada_build_task_list ()
999 {
1000   struct ada_tasks_inferior_data *data;
1001 
1002   if (!target_has_stack)
1003     error (_("Cannot inspect Ada tasks when program is not running"));
1004 
1005   data = get_ada_tasks_inferior_data (current_inferior ());
1006   if (!data->task_list_valid_p)
1007     read_known_tasks ();
1008 
1009   return data->task_list.size ();
1010 }
1011 
1012 /* Print a table providing a short description of all Ada tasks
1013    running inside inferior INF.  If ARG_STR is set, it will be
1014    interpreted as a task number, and the table will be limited to
1015    that task only.  */
1016 
1017 void
1018 print_ada_task_info (struct ui_out *uiout,
1019 		     const char *arg_str,
1020 		     struct inferior *inf)
1021 {
1022   struct ada_tasks_inferior_data *data;
1023   int taskno, nb_tasks;
1024   int taskno_arg = 0;
1025   int nb_columns;
1026 
1027   if (ada_build_task_list () == 0)
1028     {
1029       uiout->message (_("Your application does not use any Ada tasks.\n"));
1030       return;
1031     }
1032 
1033   if (arg_str != NULL && arg_str[0] != '\0')
1034     taskno_arg = value_as_long (parse_and_eval (arg_str));
1035 
1036   if (uiout->is_mi_like_p ())
1037     /* In GDB/MI mode, we want to provide the thread ID corresponding
1038        to each task.  This allows clients to quickly find the thread
1039        associated to any task, which is helpful for commands that
1040        take a --thread argument.  However, in order to be able to
1041        provide that thread ID, the thread list must be up to date
1042        first.  */
1043     target_update_thread_list ();
1044 
1045   data = get_ada_tasks_inferior_data (inf);
1046 
1047   /* Compute the number of tasks that are going to be displayed
1048      in the output.  If an argument was given, there will be
1049      at most 1 entry.  Otherwise, there will be as many entries
1050      as we have tasks.  */
1051   if (taskno_arg)
1052     {
1053       if (taskno_arg > 0 && taskno_arg <= data->task_list.size ())
1054 	nb_tasks = 1;
1055       else
1056 	nb_tasks = 0;
1057     }
1058   else
1059     nb_tasks = data->task_list.size ();
1060 
1061   nb_columns = uiout->is_mi_like_p () ? 8 : 7;
1062   ui_out_emit_table table_emitter (uiout, nb_columns, nb_tasks, "tasks");
1063   uiout->table_header (1, ui_left, "current", "");
1064   uiout->table_header (3, ui_right, "id", "ID");
1065   {
1066     size_t tid_width = 9;
1067     /* Grown below in case the largest entry is bigger.  */
1068 
1069     if (!uiout->is_mi_like_p ())
1070       {
1071 	for (taskno = 1; taskno <= data->task_list.size (); taskno++)
1072 	  {
1073 	    const struct ada_task_info *const task_info
1074 	      = &data->task_list[taskno - 1];
1075 
1076 	    gdb_assert (task_info != NULL);
1077 
1078 	    tid_width = std::max (tid_width,
1079 				  1 + strlen (phex_nz (task_info->task_id,
1080 						       sizeof (CORE_ADDR))));
1081 	  }
1082       }
1083     uiout->table_header (tid_width, ui_right, "task-id", "TID");
1084   }
1085   /* The following column is provided in GDB/MI mode only because
1086      it is only really useful in that mode, and also because it
1087      allows us to keep the CLI output shorter and more compact.  */
1088   if (uiout->is_mi_like_p ())
1089     uiout->table_header (4, ui_right, "thread-id", "");
1090   uiout->table_header (4, ui_right, "parent-id", "P-ID");
1091   uiout->table_header (3, ui_right, "priority", "Pri");
1092   uiout->table_header (22, ui_left, "state", "State");
1093   /* Use ui_noalign for the last column, to prevent the CLI uiout
1094      from printing an extra space at the end of each row.  This
1095      is a bit of a hack, but does get the job done.  */
1096   uiout->table_header (1, ui_noalign, "name", "Name");
1097   uiout->table_body ();
1098 
1099   for (taskno = 1; taskno <= data->task_list.size (); taskno++)
1100     {
1101       const struct ada_task_info *const task_info =
1102 	&data->task_list[taskno - 1];
1103       int parent_id;
1104 
1105       gdb_assert (task_info != NULL);
1106 
1107       /* If the user asked for the output to be restricted
1108 	 to one task only, and this is not the task, skip
1109 	 to the next one.  */
1110       if (taskno_arg && taskno != taskno_arg)
1111         continue;
1112 
1113       ui_out_emit_tuple tuple_emitter (uiout, NULL);
1114 
1115       /* Print a star if this task is the current task (or the task
1116          currently selected).  */
1117       if (task_info->ptid == inferior_ptid)
1118 	uiout->field_string ("current", "*");
1119       else
1120 	uiout->field_skip ("current");
1121 
1122       /* Print the task number.  */
1123       uiout->field_signed ("id", taskno);
1124 
1125       /* Print the Task ID.  */
1126       uiout->field_string ("task-id", phex_nz (task_info->task_id,
1127 					       sizeof (CORE_ADDR)));
1128 
1129       /* Print the associated Thread ID.  */
1130       if (uiout->is_mi_like_p ())
1131         {
1132 	  thread_info *thread = (ada_task_is_alive (task_info)
1133 				 ? find_thread_ptid (inf, task_info->ptid)
1134 				 : nullptr);
1135 
1136 	  if (thread != NULL)
1137 	    uiout->field_signed ("thread-id", thread->global_num);
1138 	  else
1139 	    {
1140 	      /* This can happen if the thread is no longer alive.  */
1141 	      uiout->field_skip ("thread-id");
1142 	    }
1143 	}
1144 
1145       /* Print the ID of the parent task.  */
1146       parent_id = get_task_number_from_id (task_info->parent, inf);
1147       if (parent_id)
1148         uiout->field_signed ("parent-id", parent_id);
1149       else
1150         uiout->field_skip ("parent-id");
1151 
1152       /* Print the base priority of the task.  */
1153       uiout->field_signed ("priority", task_info->priority);
1154 
1155       /* Print the task current state.  */
1156       if (task_info->caller_task)
1157 	uiout->field_fmt ("state",
1158 			  _("Accepting RV with %-4d"),
1159 			  get_task_number_from_id (task_info->caller_task,
1160 						   inf));
1161       else if (task_info->called_task)
1162 	uiout->field_fmt ("state",
1163 			  _("Waiting on RV with %-3d"),
1164 			  get_task_number_from_id (task_info->called_task,
1165 						   inf));
1166       else
1167 	uiout->field_string ("state", task_states[task_info->state]);
1168 
1169       /* Finally, print the task name, without quotes around it, as mi like
1170 	 is not expecting quotes, and in non mi-like no need for quotes
1171          as there is a specific column for the name.  */
1172       uiout->field_fmt ("name",
1173 			(task_info->name[0] != '\0'
1174 			 ? ui_file_style ()
1175 			 : metadata_style.style ()),
1176 			"%s",
1177 			(task_info->name[0] != '\0'
1178 			 ? task_info->name
1179 			 : _("<no name>")));
1180 
1181       uiout->text ("\n");
1182     }
1183 }
1184 
1185 /* Print a detailed description of the Ada task whose ID is TASKNO_STR
1186    for the given inferior (INF).  */
1187 
1188 static void
1189 info_task (struct ui_out *uiout, const char *taskno_str, struct inferior *inf)
1190 {
1191   const int taskno = value_as_long (parse_and_eval (taskno_str));
1192   struct ada_task_info *task_info;
1193   int parent_taskno = 0;
1194   struct ada_tasks_inferior_data *data = get_ada_tasks_inferior_data (inf);
1195 
1196   if (ada_build_task_list () == 0)
1197     {
1198       uiout->message (_("Your application does not use any Ada tasks.\n"));
1199       return;
1200     }
1201 
1202   if (taskno <= 0 || taskno > data->task_list.size ())
1203     error (_("Task ID %d not known.  Use the \"info tasks\" command to\n"
1204              "see the IDs of currently known tasks"), taskno);
1205   task_info = &data->task_list[taskno - 1];
1206 
1207   /* Print the Ada task ID.  */
1208   printf_filtered (_("Ada Task: %s\n"),
1209 		   paddress (target_gdbarch (), task_info->task_id));
1210 
1211   /* Print the name of the task.  */
1212   if (task_info->name[0] != '\0')
1213     printf_filtered (_("Name: %s\n"), task_info->name);
1214   else
1215     fprintf_styled (gdb_stdout, metadata_style.style (), _("<no name>\n"));
1216 
1217   /* Print the TID and LWP.  */
1218   printf_filtered (_("Thread: %#lx\n"), task_info->ptid.tid ());
1219   printf_filtered (_("LWP: %#lx\n"), task_info->ptid.lwp ());
1220 
1221   /* If set, print the base CPU.  */
1222   if (task_info->base_cpu != 0)
1223     printf_filtered (_("Base CPU: %d\n"), task_info->base_cpu);
1224 
1225   /* Print who is the parent (if any).  */
1226   if (task_info->parent != 0)
1227     parent_taskno = get_task_number_from_id (task_info->parent, inf);
1228   if (parent_taskno)
1229     {
1230       struct ada_task_info *parent = &data->task_list[parent_taskno - 1];
1231 
1232       printf_filtered (_("Parent: %d"), parent_taskno);
1233       if (parent->name[0] != '\0')
1234         printf_filtered (" (%s)", parent->name);
1235       printf_filtered ("\n");
1236     }
1237   else
1238     printf_filtered (_("No parent\n"));
1239 
1240   /* Print the base priority.  */
1241   printf_filtered (_("Base Priority: %d\n"), task_info->priority);
1242 
1243   /* print the task current state.  */
1244   {
1245     int target_taskno = 0;
1246 
1247     if (task_info->caller_task)
1248       {
1249         target_taskno = get_task_number_from_id (task_info->caller_task, inf);
1250         printf_filtered (_("State: Accepting rendezvous with %d"),
1251                          target_taskno);
1252       }
1253     else if (task_info->called_task)
1254       {
1255         target_taskno = get_task_number_from_id (task_info->called_task, inf);
1256         printf_filtered (_("State: Waiting on task %d's entry"),
1257                          target_taskno);
1258       }
1259     else
1260       printf_filtered (_("State: %s"), _(long_task_states[task_info->state]));
1261 
1262     if (target_taskno)
1263       {
1264         ada_task_info *target_task_info = &data->task_list[target_taskno - 1];
1265 
1266         if (target_task_info->name[0] != '\0')
1267           printf_filtered (" (%s)", target_task_info->name);
1268       }
1269 
1270     printf_filtered ("\n");
1271   }
1272 }
1273 
1274 /* If ARG is empty or null, then print a list of all Ada tasks.
1275    Otherwise, print detailed information about the task whose ID
1276    is ARG.
1277 
1278    Does nothing if the program doesn't use Ada tasking.  */
1279 
1280 static void
1281 info_tasks_command (const char *arg, int from_tty)
1282 {
1283   struct ui_out *uiout = current_uiout;
1284 
1285   if (arg == NULL || *arg == '\0')
1286     print_ada_task_info (uiout, NULL, current_inferior ());
1287   else
1288     info_task (uiout, arg, current_inferior ());
1289 }
1290 
1291 /* Print a message telling the user id of the current task.
1292    This function assumes that tasking is in use in the inferior.  */
1293 
1294 static void
1295 display_current_task_id (void)
1296 {
1297   const int current_task = ada_get_task_number (inferior_thread ());
1298 
1299   if (current_task == 0)
1300     printf_filtered (_("[Current task is unknown]\n"));
1301   else
1302     {
1303       struct ada_tasks_inferior_data *data
1304 	= get_ada_tasks_inferior_data (current_inferior ());
1305       struct ada_task_info *task_info = &data->task_list[current_task - 1];
1306 
1307       printf_filtered (_("[Current task is %s]\n"),
1308 		       task_to_str (current_task, task_info).c_str ());
1309     }
1310 }
1311 
1312 /* Parse and evaluate TIDSTR into a task id, and try to switch to
1313    that task.  Print an error message if the task switch failed.  */
1314 
1315 static void
1316 task_command_1 (const char *taskno_str, int from_tty, struct inferior *inf)
1317 {
1318   const int taskno = value_as_long (parse_and_eval (taskno_str));
1319   struct ada_task_info *task_info;
1320   struct ada_tasks_inferior_data *data = get_ada_tasks_inferior_data (inf);
1321 
1322   if (taskno <= 0 || taskno > data->task_list.size ())
1323     error (_("Task ID %d not known.  Use the \"info tasks\" command to\n"
1324              "see the IDs of currently known tasks"), taskno);
1325   task_info = &data->task_list[taskno - 1];
1326 
1327   if (!ada_task_is_alive (task_info))
1328     error (_("Cannot switch to task %s: Task is no longer running"),
1329 	   task_to_str (taskno, task_info).c_str ());
1330 
1331   /* On some platforms, the thread list is not updated until the user
1332      performs a thread-related operation (by using the "info threads"
1333      command, for instance).  So this thread list may not be up to date
1334      when the user attempts this task switch.  Since we cannot switch
1335      to the thread associated to our task if GDB does not know about
1336      that thread, we need to make sure that any new threads gets added
1337      to the thread list.  */
1338   target_update_thread_list ();
1339 
1340   /* Verify that the ptid of the task we want to switch to is valid
1341      (in other words, a ptid that GDB knows about).  Otherwise, we will
1342      cause an assertion failure later on, when we try to determine
1343      the ptid associated thread_info data.  We should normally never
1344      encounter such an error, but the wrong ptid can actually easily be
1345      computed if target_get_ada_task_ptid has not been implemented for
1346      our target (yet).  Rather than cause an assertion error in that case,
1347      it's nicer for the user to just refuse to perform the task switch.  */
1348   thread_info *tp = find_thread_ptid (inf, task_info->ptid);
1349   if (tp == NULL)
1350     error (_("Unable to compute thread ID for task %s.\n"
1351              "Cannot switch to this task."),
1352            task_to_str (taskno, task_info).c_str ());
1353 
1354   switch_to_thread (tp);
1355   ada_find_printable_frame (get_selected_frame (NULL));
1356   printf_filtered (_("[Switching to task %s]\n"),
1357 		   task_to_str (taskno, task_info).c_str ());
1358   print_stack_frame (get_selected_frame (NULL),
1359                      frame_relative_level (get_selected_frame (NULL)),
1360 		     SRC_AND_LOC, 1);
1361 }
1362 
1363 
1364 /* Print the ID of the current task if TASKNO_STR is empty or NULL.
1365    Otherwise, switch to the task indicated by TASKNO_STR.  */
1366 
1367 static void
1368 task_command (const char *taskno_str, int from_tty)
1369 {
1370   struct ui_out *uiout = current_uiout;
1371 
1372   if (ada_build_task_list () == 0)
1373     {
1374       uiout->message (_("Your application does not use any Ada tasks.\n"));
1375       return;
1376     }
1377 
1378   if (taskno_str == NULL || taskno_str[0] == '\0')
1379     display_current_task_id ();
1380   else
1381     task_command_1 (taskno_str, from_tty, current_inferior ());
1382 }
1383 
1384 /* Indicate that the given inferior's task list may have changed,
1385    so invalidate the cache.  */
1386 
1387 static void
1388 ada_task_list_changed (struct inferior *inf)
1389 {
1390   struct ada_tasks_inferior_data *data = get_ada_tasks_inferior_data (inf);
1391 
1392   data->task_list_valid_p = false;
1393 }
1394 
1395 /* Invalidate the per-program-space data.  */
1396 
1397 static void
1398 ada_tasks_invalidate_pspace_data (struct program_space *pspace)
1399 {
1400   get_ada_tasks_pspace_data (pspace)->initialized_p = 0;
1401 }
1402 
1403 /* Invalidate the per-inferior data.  */
1404 
1405 static void
1406 ada_tasks_invalidate_inferior_data (struct inferior *inf)
1407 {
1408   struct ada_tasks_inferior_data *data = get_ada_tasks_inferior_data (inf);
1409 
1410   data->known_tasks_kind = ADA_TASKS_UNKNOWN;
1411   data->task_list_valid_p = false;
1412 }
1413 
1414 /* The 'normal_stop' observer notification callback.  */
1415 
1416 static void
1417 ada_tasks_normal_stop_observer (struct bpstats *unused_args, int unused_args2)
1418 {
1419   /* The inferior has been resumed, and just stopped. This means that
1420      our task_list needs to be recomputed before it can be used again.  */
1421   ada_task_list_changed (current_inferior ());
1422 }
1423 
1424 /* A routine to be called when the objfiles have changed.  */
1425 
1426 static void
1427 ada_tasks_new_objfile_observer (struct objfile *objfile)
1428 {
1429   struct inferior *inf;
1430 
1431   /* Invalidate the relevant data in our program-space data.  */
1432 
1433   if (objfile == NULL)
1434     {
1435       /* All objfiles are being cleared, so we should clear all
1436 	 our caches for all program spaces.  */
1437       for (struct program_space *pspace : program_spaces)
1438         ada_tasks_invalidate_pspace_data (pspace);
1439     }
1440   else
1441     {
1442       /* The associated program-space data might have changed after
1443 	 this objfile was added.  Invalidate all cached data.  */
1444       ada_tasks_invalidate_pspace_data (objfile->pspace);
1445     }
1446 
1447   /* Invalidate the per-inferior cache for all inferiors using
1448      this objfile (or, in other words, for all inferiors who have
1449      the same program-space as the objfile's program space).
1450      If all objfiles are being cleared (OBJFILE is NULL), then
1451      clear the caches for all inferiors.  */
1452 
1453   for (inf = inferior_list; inf != NULL; inf = inf->next)
1454     if (objfile == NULL || inf->pspace == objfile->pspace)
1455       ada_tasks_invalidate_inferior_data (inf);
1456 }
1457 
1458 void _initialize_tasks ();
1459 void
1460 _initialize_tasks ()
1461 {
1462   /* Attach various observers.  */
1463   gdb::observers::normal_stop.attach (ada_tasks_normal_stop_observer);
1464   gdb::observers::new_objfile.attach (ada_tasks_new_objfile_observer);
1465 
1466   /* Some new commands provided by this module.  */
1467   add_info ("tasks", info_tasks_command,
1468             _("Provide information about all known Ada tasks."));
1469   add_cmd ("task", class_run, task_command,
1470            _("Use this command to switch between Ada tasks.\n\
1471 Without argument, this command simply prints the current task ID."),
1472            &cmdlist);
1473 }
1474