]> Git Repo - binutils.git/blob - gdb/ada-tasks.c
gdb: remove TYPE_FIELD_TYPE macro
[binutils.git] / gdb / ada-tasks.c
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               && !TYPE_LOW_BOUND_UNDEFINED (idxtype)
900               && !TYPE_HIGH_BOUND_UNDEFINED (idxtype))
901             {
902               data->known_tasks_element = eltype;
903               data->known_tasks_length =
904                 TYPE_HIGH_BOUND (idxtype) - TYPE_LOW_BOUND (idxtype) + 1;
905               return;
906             }
907         }
908
909       /* Fallback to default values.  The runtime may have been stripped (as
910          in some distributions), but it is likely that the executable still
911          contains debug information on the task type (due to implicit with of
912          Ada.Tasking).  */
913       data->known_tasks_element =
914         builtin_type (target_gdbarch ())->builtin_data_ptr;
915       data->known_tasks_length = MAX_NUMBER_OF_KNOWN_TASKS;
916       return;
917     }
918
919
920   /* Try list.  */
921
922   msym = lookup_minimal_symbol (KNOWN_TASKS_LIST, NULL, NULL);
923   if (msym.minsym != NULL)
924     {
925       data->known_tasks_kind = ADA_TASKS_LIST;
926       data->known_tasks_addr = BMSYMBOL_VALUE_ADDRESS (msym);
927       data->known_tasks_length = 1;
928
929       sym = lookup_symbol_in_language (KNOWN_TASKS_LIST, NULL, VAR_DOMAIN,
930                                        language_c, NULL).symbol;
931       if (sym != NULL && SYMBOL_VALUE_ADDRESS (sym) != 0)
932         {
933           /* Validate.  */
934           struct type *type = check_typedef (SYMBOL_TYPE (sym));
935
936           if (type->code () == TYPE_CODE_PTR)
937             {
938               data->known_tasks_element = type;
939               return;
940             }
941         }
942
943       /* Fallback to default values.  */
944       data->known_tasks_element =
945         builtin_type (target_gdbarch ())->builtin_data_ptr;
946       data->known_tasks_length = 1;
947       return;
948     }
949
950   /* Can't find tasks.  */
951
952   data->known_tasks_kind = ADA_TASKS_NOT_FOUND;
953   data->known_tasks_addr = 0;
954 }
955
956 /* Read the known tasks from the current inferior's memory, and store it
957    in the current inferior's data TASK_LIST.  */
958
959 static void
960 read_known_tasks ()
961 {
962   struct ada_tasks_inferior_data *data =
963     get_ada_tasks_inferior_data (current_inferior ());
964
965   /* Step 1: Clear the current list, if necessary.  */
966   data->task_list.clear ();
967
968   /* Step 2: do the real work.
969      If the application does not use task, then no more needs to be done.
970      It is important to have the task list cleared (see above) before we
971      return, as we don't want a stale task list to be used...  This can
972      happen for instance when debugging a non-multitasking program after
973      having debugged a multitasking one.  */
974   ada_tasks_inferior_data_sniffer (data);
975   gdb_assert (data->known_tasks_kind != ADA_TASKS_UNKNOWN);
976
977   /* Step 3: Set task_list_valid_p, to avoid re-reading the Known_Tasks
978      array unless needed.  */
979   switch (data->known_tasks_kind)
980     {
981     case ADA_TASKS_NOT_FOUND: /* Tasking not in use in inferior.  */
982       break;
983     case ADA_TASKS_ARRAY:
984       data->task_list_valid_p = read_known_tasks_array (data);
985       break;
986     case ADA_TASKS_LIST:
987       data->task_list_valid_p = read_known_tasks_list (data);
988       break;
989     }
990 }
991
992 /* Build the task_list by reading the Known_Tasks array from
993    the inferior, and return the number of tasks in that list
994    (zero means that the program is not using tasking at all).  */
995
996 static int
997 ada_build_task_list ()
998 {
999   struct ada_tasks_inferior_data *data;
1000
1001   if (!target_has_stack)
1002     error (_("Cannot inspect Ada tasks when program is not running"));
1003
1004   data = get_ada_tasks_inferior_data (current_inferior ());
1005   if (!data->task_list_valid_p)
1006     read_known_tasks ();
1007
1008   return data->task_list.size ();
1009 }
1010
1011 /* Print a table providing a short description of all Ada tasks
1012    running inside inferior INF.  If ARG_STR is set, it will be
1013    interpreted as a task number, and the table will be limited to
1014    that task only.  */
1015
1016 void
1017 print_ada_task_info (struct ui_out *uiout,
1018                      const char *arg_str,
1019                      struct inferior *inf)
1020 {
1021   struct ada_tasks_inferior_data *data;
1022   int taskno, nb_tasks;
1023   int taskno_arg = 0;
1024   int nb_columns;
1025
1026   if (ada_build_task_list () == 0)
1027     {
1028       uiout->message (_("Your application does not use any Ada tasks.\n"));
1029       return;
1030     }
1031
1032   if (arg_str != NULL && arg_str[0] != '\0')
1033     taskno_arg = value_as_long (parse_and_eval (arg_str));
1034
1035   if (uiout->is_mi_like_p ())
1036     /* In GDB/MI mode, we want to provide the thread ID corresponding
1037        to each task.  This allows clients to quickly find the thread
1038        associated to any task, which is helpful for commands that
1039        take a --thread argument.  However, in order to be able to
1040        provide that thread ID, the thread list must be up to date
1041        first.  */
1042     target_update_thread_list ();
1043
1044   data = get_ada_tasks_inferior_data (inf);
1045
1046   /* Compute the number of tasks that are going to be displayed
1047      in the output.  If an argument was given, there will be
1048      at most 1 entry.  Otherwise, there will be as many entries
1049      as we have tasks.  */
1050   if (taskno_arg)
1051     {
1052       if (taskno_arg > 0 && taskno_arg <= data->task_list.size ())
1053         nb_tasks = 1;
1054       else
1055         nb_tasks = 0;
1056     }
1057   else
1058     nb_tasks = data->task_list.size ();
1059
1060   nb_columns = uiout->is_mi_like_p () ? 8 : 7;
1061   ui_out_emit_table table_emitter (uiout, nb_columns, nb_tasks, "tasks");
1062   uiout->table_header (1, ui_left, "current", "");
1063   uiout->table_header (3, ui_right, "id", "ID");
1064   {
1065     size_t tid_width = 9;
1066     /* Grown below in case the largest entry is bigger.  */
1067
1068     if (!uiout->is_mi_like_p ())
1069       {
1070         for (taskno = 1; taskno <= data->task_list.size (); taskno++)
1071           {
1072             const struct ada_task_info *const task_info
1073               = &data->task_list[taskno - 1];
1074
1075             gdb_assert (task_info != NULL);
1076
1077             tid_width = std::max (tid_width,
1078                                   1 + strlen (phex_nz (task_info->task_id,
1079                                                        sizeof (CORE_ADDR))));
1080           }
1081       }
1082     uiout->table_header (tid_width, ui_right, "task-id", "TID");
1083   }
1084   /* The following column is provided in GDB/MI mode only because
1085      it is only really useful in that mode, and also because it
1086      allows us to keep the CLI output shorter and more compact.  */
1087   if (uiout->is_mi_like_p ())
1088     uiout->table_header (4, ui_right, "thread-id", "");
1089   uiout->table_header (4, ui_right, "parent-id", "P-ID");
1090   uiout->table_header (3, ui_right, "priority", "Pri");
1091   uiout->table_header (22, ui_left, "state", "State");
1092   /* Use ui_noalign for the last column, to prevent the CLI uiout
1093      from printing an extra space at the end of each row.  This
1094      is a bit of a hack, but does get the job done.  */
1095   uiout->table_header (1, ui_noalign, "name", "Name");
1096   uiout->table_body ();
1097
1098   for (taskno = 1; taskno <= data->task_list.size (); taskno++)
1099     {
1100       const struct ada_task_info *const task_info =
1101         &data->task_list[taskno - 1];
1102       int parent_id;
1103
1104       gdb_assert (task_info != NULL);
1105
1106       /* If the user asked for the output to be restricted
1107          to one task only, and this is not the task, skip
1108          to the next one.  */
1109       if (taskno_arg && taskno != taskno_arg)
1110         continue;
1111
1112       ui_out_emit_tuple tuple_emitter (uiout, NULL);
1113
1114       /* Print a star if this task is the current task (or the task
1115          currently selected).  */
1116       if (task_info->ptid == inferior_ptid)
1117         uiout->field_string ("current", "*");
1118       else
1119         uiout->field_skip ("current");
1120
1121       /* Print the task number.  */
1122       uiout->field_signed ("id", taskno);
1123
1124       /* Print the Task ID.  */
1125       uiout->field_string ("task-id", phex_nz (task_info->task_id,
1126                                                sizeof (CORE_ADDR)));
1127
1128       /* Print the associated Thread ID.  */
1129       if (uiout->is_mi_like_p ())
1130         {
1131           thread_info *thread = (ada_task_is_alive (task_info)
1132                                  ? find_thread_ptid (inf, task_info->ptid)
1133                                  : nullptr);
1134
1135           if (thread != NULL)
1136             uiout->field_signed ("thread-id", thread->global_num);
1137           else
1138             {
1139               /* This can happen if the thread is no longer alive.  */
1140               uiout->field_skip ("thread-id");
1141             }
1142         }
1143
1144       /* Print the ID of the parent task.  */
1145       parent_id = get_task_number_from_id (task_info->parent, inf);
1146       if (parent_id)
1147         uiout->field_signed ("parent-id", parent_id);
1148       else
1149         uiout->field_skip ("parent-id");
1150
1151       /* Print the base priority of the task.  */
1152       uiout->field_signed ("priority", task_info->priority);
1153
1154       /* Print the task current state.  */
1155       if (task_info->caller_task)
1156         uiout->field_fmt ("state",
1157                           _("Accepting RV with %-4d"),
1158                           get_task_number_from_id (task_info->caller_task,
1159                                                    inf));
1160       else if (task_info->called_task)
1161         uiout->field_fmt ("state",
1162                           _("Waiting on RV with %-3d"),
1163                           get_task_number_from_id (task_info->called_task,
1164                                                    inf));
1165       else
1166         uiout->field_string ("state", task_states[task_info->state]);
1167
1168       /* Finally, print the task name, without quotes around it, as mi like
1169          is not expecting quotes, and in non mi-like no need for quotes
1170          as there is a specific column for the name.  */
1171       uiout->field_fmt ("name",
1172                         (task_info->name[0] != '\0'
1173                          ? ui_file_style ()
1174                          : metadata_style.style ()),
1175                         "%s",
1176                         (task_info->name[0] != '\0'
1177                          ? task_info->name
1178                          : _("<no name>")));
1179
1180       uiout->text ("\n");
1181     }
1182 }
1183
1184 /* Print a detailed description of the Ada task whose ID is TASKNO_STR
1185    for the given inferior (INF).  */
1186
1187 static void
1188 info_task (struct ui_out *uiout, const char *taskno_str, struct inferior *inf)
1189 {
1190   const int taskno = value_as_long (parse_and_eval (taskno_str));
1191   struct ada_task_info *task_info;
1192   int parent_taskno = 0;
1193   struct ada_tasks_inferior_data *data = get_ada_tasks_inferior_data (inf);
1194
1195   if (ada_build_task_list () == 0)
1196     {
1197       uiout->message (_("Your application does not use any Ada tasks.\n"));
1198       return;
1199     }
1200
1201   if (taskno <= 0 || taskno > data->task_list.size ())
1202     error (_("Task ID %d not known.  Use the \"info tasks\" command to\n"
1203              "see the IDs of currently known tasks"), taskno);
1204   task_info = &data->task_list[taskno - 1];
1205
1206   /* Print the Ada task ID.  */
1207   printf_filtered (_("Ada Task: %s\n"),
1208                    paddress (target_gdbarch (), task_info->task_id));
1209
1210   /* Print the name of the task.  */
1211   if (task_info->name[0] != '\0')
1212     printf_filtered (_("Name: %s\n"), task_info->name);
1213   else
1214     fprintf_styled (gdb_stdout, metadata_style.style (), _("<no name>\n"));
1215
1216   /* Print the TID and LWP.  */
1217   printf_filtered (_("Thread: %#lx\n"), task_info->ptid.tid ());
1218   printf_filtered (_("LWP: %#lx\n"), task_info->ptid.lwp ());
1219
1220   /* If set, print the base CPU.  */
1221   if (task_info->base_cpu != 0)
1222     printf_filtered (_("Base CPU: %d\n"), task_info->base_cpu);
1223
1224   /* Print who is the parent (if any).  */
1225   if (task_info->parent != 0)
1226     parent_taskno = get_task_number_from_id (task_info->parent, inf);
1227   if (parent_taskno)
1228     {
1229       struct ada_task_info *parent = &data->task_list[parent_taskno - 1];
1230
1231       printf_filtered (_("Parent: %d"), parent_taskno);
1232       if (parent->name[0] != '\0')
1233         printf_filtered (" (%s)", parent->name);
1234       printf_filtered ("\n");
1235     }
1236   else
1237     printf_filtered (_("No parent\n"));
1238
1239   /* Print the base priority.  */
1240   printf_filtered (_("Base Priority: %d\n"), task_info->priority);
1241
1242   /* print the task current state.  */
1243   {
1244     int target_taskno = 0;
1245
1246     if (task_info->caller_task)
1247       {
1248         target_taskno = get_task_number_from_id (task_info->caller_task, inf);
1249         printf_filtered (_("State: Accepting rendezvous with %d"),
1250                          target_taskno);
1251       }
1252     else if (task_info->called_task)
1253       {
1254         target_taskno = get_task_number_from_id (task_info->called_task, inf);
1255         printf_filtered (_("State: Waiting on task %d's entry"),
1256                          target_taskno);
1257       }
1258     else
1259       printf_filtered (_("State: %s"), _(long_task_states[task_info->state]));
1260
1261     if (target_taskno)
1262       {
1263         ada_task_info *target_task_info = &data->task_list[target_taskno - 1];
1264
1265         if (target_task_info->name[0] != '\0')
1266           printf_filtered (" (%s)", target_task_info->name);
1267       }
1268
1269     printf_filtered ("\n");
1270   }
1271 }
1272
1273 /* If ARG is empty or null, then print a list of all Ada tasks.
1274    Otherwise, print detailed information about the task whose ID
1275    is ARG.
1276    
1277    Does nothing if the program doesn't use Ada tasking.  */
1278
1279 static void
1280 info_tasks_command (const char *arg, int from_tty)
1281 {
1282   struct ui_out *uiout = current_uiout;
1283
1284   if (arg == NULL || *arg == '\0')
1285     print_ada_task_info (uiout, NULL, current_inferior ());
1286   else
1287     info_task (uiout, arg, current_inferior ());
1288 }
1289
1290 /* Print a message telling the user id of the current task.
1291    This function assumes that tasking is in use in the inferior.  */
1292
1293 static void
1294 display_current_task_id (void)
1295 {
1296   const int current_task = ada_get_task_number (inferior_thread ());
1297
1298   if (current_task == 0)
1299     printf_filtered (_("[Current task is unknown]\n"));
1300   else
1301     {
1302       struct ada_tasks_inferior_data *data
1303         = get_ada_tasks_inferior_data (current_inferior ());
1304       struct ada_task_info *task_info = &data->task_list[current_task - 1];
1305
1306       printf_filtered (_("[Current task is %s]\n"),
1307                        task_to_str (current_task, task_info).c_str ());
1308     }
1309 }
1310
1311 /* Parse and evaluate TIDSTR into a task id, and try to switch to
1312    that task.  Print an error message if the task switch failed.  */
1313
1314 static void
1315 task_command_1 (const char *taskno_str, int from_tty, struct inferior *inf)
1316 {
1317   const int taskno = value_as_long (parse_and_eval (taskno_str));
1318   struct ada_task_info *task_info;
1319   struct ada_tasks_inferior_data *data = get_ada_tasks_inferior_data (inf);
1320
1321   if (taskno <= 0 || taskno > data->task_list.size ())
1322     error (_("Task ID %d not known.  Use the \"info tasks\" command to\n"
1323              "see the IDs of currently known tasks"), taskno);
1324   task_info = &data->task_list[taskno - 1];
1325
1326   if (!ada_task_is_alive (task_info))
1327     error (_("Cannot switch to task %s: Task is no longer running"),
1328            task_to_str (taskno, task_info).c_str ());
1329    
1330   /* On some platforms, the thread list is not updated until the user
1331      performs a thread-related operation (by using the "info threads"
1332      command, for instance).  So this thread list may not be up to date
1333      when the user attempts this task switch.  Since we cannot switch
1334      to the thread associated to our task if GDB does not know about
1335      that thread, we need to make sure that any new threads gets added
1336      to the thread list.  */
1337   target_update_thread_list ();
1338
1339   /* Verify that the ptid of the task we want to switch to is valid
1340      (in other words, a ptid that GDB knows about).  Otherwise, we will
1341      cause an assertion failure later on, when we try to determine
1342      the ptid associated thread_info data.  We should normally never
1343      encounter such an error, but the wrong ptid can actually easily be
1344      computed if target_get_ada_task_ptid has not been implemented for
1345      our target (yet).  Rather than cause an assertion error in that case,
1346      it's nicer for the user to just refuse to perform the task switch.  */
1347   thread_info *tp = find_thread_ptid (inf, task_info->ptid);
1348   if (tp == NULL)
1349     error (_("Unable to compute thread ID for task %s.\n"
1350              "Cannot switch to this task."),
1351            task_to_str (taskno, task_info).c_str ());
1352
1353   switch_to_thread (tp);
1354   ada_find_printable_frame (get_selected_frame (NULL));
1355   printf_filtered (_("[Switching to task %s]\n"),
1356                    task_to_str (taskno, task_info).c_str ());
1357   print_stack_frame (get_selected_frame (NULL),
1358                      frame_relative_level (get_selected_frame (NULL)),
1359                      SRC_AND_LOC, 1);
1360 }
1361
1362
1363 /* Print the ID of the current task if TASKNO_STR is empty or NULL.
1364    Otherwise, switch to the task indicated by TASKNO_STR.  */
1365
1366 static void
1367 task_command (const char *taskno_str, int from_tty)
1368 {
1369   struct ui_out *uiout = current_uiout;
1370
1371   if (ada_build_task_list () == 0)
1372     {
1373       uiout->message (_("Your application does not use any Ada tasks.\n"));
1374       return;
1375     }
1376
1377   if (taskno_str == NULL || taskno_str[0] == '\0')
1378     display_current_task_id ();
1379   else
1380     task_command_1 (taskno_str, from_tty, current_inferior ());
1381 }
1382
1383 /* Indicate that the given inferior's task list may have changed,
1384    so invalidate the cache.  */
1385
1386 static void
1387 ada_task_list_changed (struct inferior *inf)
1388 {
1389   struct ada_tasks_inferior_data *data = get_ada_tasks_inferior_data (inf);
1390
1391   data->task_list_valid_p = false;
1392 }
1393
1394 /* Invalidate the per-program-space data.  */
1395
1396 static void
1397 ada_tasks_invalidate_pspace_data (struct program_space *pspace)
1398 {
1399   get_ada_tasks_pspace_data (pspace)->initialized_p = 0;
1400 }
1401
1402 /* Invalidate the per-inferior data.  */
1403
1404 static void
1405 ada_tasks_invalidate_inferior_data (struct inferior *inf)
1406 {
1407   struct ada_tasks_inferior_data *data = get_ada_tasks_inferior_data (inf);
1408
1409   data->known_tasks_kind = ADA_TASKS_UNKNOWN;
1410   data->task_list_valid_p = false;
1411 }
1412
1413 /* The 'normal_stop' observer notification callback.  */
1414
1415 static void
1416 ada_tasks_normal_stop_observer (struct bpstats *unused_args, int unused_args2)
1417 {
1418   /* The inferior has been resumed, and just stopped. This means that
1419      our task_list needs to be recomputed before it can be used again.  */
1420   ada_task_list_changed (current_inferior ());
1421 }
1422
1423 /* A routine to be called when the objfiles have changed.  */
1424
1425 static void
1426 ada_tasks_new_objfile_observer (struct objfile *objfile)
1427 {
1428   struct inferior *inf;
1429
1430   /* Invalidate the relevant data in our program-space data.  */
1431
1432   if (objfile == NULL)
1433     {
1434       /* All objfiles are being cleared, so we should clear all
1435          our caches for all program spaces.  */
1436       for (struct program_space *pspace : program_spaces)
1437         ada_tasks_invalidate_pspace_data (pspace);
1438     }
1439   else
1440     {
1441       /* The associated program-space data might have changed after
1442          this objfile was added.  Invalidate all cached data.  */
1443       ada_tasks_invalidate_pspace_data (objfile->pspace);
1444     }
1445
1446   /* Invalidate the per-inferior cache for all inferiors using
1447      this objfile (or, in other words, for all inferiors who have
1448      the same program-space as the objfile's program space).
1449      If all objfiles are being cleared (OBJFILE is NULL), then
1450      clear the caches for all inferiors.  */
1451
1452   for (inf = inferior_list; inf != NULL; inf = inf->next)
1453     if (objfile == NULL || inf->pspace == objfile->pspace)
1454       ada_tasks_invalidate_inferior_data (inf);
1455 }
1456
1457 void _initialize_tasks ();
1458 void
1459 _initialize_tasks ()
1460 {
1461   /* Attach various observers.  */
1462   gdb::observers::normal_stop.attach (ada_tasks_normal_stop_observer);
1463   gdb::observers::new_objfile.attach (ada_tasks_new_objfile_observer);
1464
1465   /* Some new commands provided by this module.  */
1466   add_info ("tasks", info_tasks_command,
1467             _("Provide information about all known Ada tasks."));
1468   add_cmd ("task", class_run, task_command,
1469            _("Use this command to switch between Ada tasks.\n\
1470 Without argument, this command simply prints the current task ID."),
1471            &cmdlist);
1472 }
This page took 0.107508 seconds and 4 git commands to generate.