]> Git Repo - binutils.git/blob - gdb/ada-tasks.c
Update copyright year range in all GDB files.
[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_TYPE (type, bounds_fieldno);
434       if (TYPE_CODE (bounds_type) == TYPE_CODE_PTR)
435         bounds_type = TYPE_TARGET_TYPE (bounds_type);
436       if (TYPE_CODE (bounds_type) != 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, sizeof (task_info->name));
683               task_info->name[sizeof (task_info->name) - 1] = 0;
684             }
685           else
686             {
687               /* No symbol found.  Use a default name.  */
688               strcpy (task_info->name, ravenscar_task_name);
689             }
690         }
691     }
692   else
693     {
694       int len = value_as_long
695                   (value_field (common_value,
696                                 pspace_data->atcb_fieldno.image_len));
697
698       value_as_string (task_info->name,
699                        value_field (common_value,
700                                     pspace_data->atcb_fieldno.image),
701                        len);
702     }
703
704   /* Compute the task state and priority.  */
705
706   task_info->state =
707     value_as_long (value_field (common_value,
708                                 pspace_data->atcb_fieldno.state));
709   task_info->priority =
710     value_as_long (value_field (common_value,
711                                 pspace_data->atcb_fieldno.priority));
712
713   /* If the ATCB contains some information about the parent task,
714      then compute it as well.  Otherwise, zero.  */
715
716   if (pspace_data->atcb_fieldno.parent >= 0)
717     task_info->parent =
718       value_as_address (value_field (common_value,
719                                      pspace_data->atcb_fieldno.parent));
720
721   /* If the task is in an entry call waiting for another task,
722      then determine which task it is.  */
723
724   if (task_info->state == Entry_Caller_Sleep
725       && pspace_data->atcb_fieldno.atc_nesting_level > 0
726       && pspace_data->atcb_fieldno.entry_calls > 0)
727     {
728       /* Let My_ATCB be the Ada task control block of a task calling the
729          entry of another task; then the Task_Id of the called task is
730          in My_ATCB.Entry_Calls (My_ATCB.ATC_Nesting_Level).Called_Task.  */
731       atc_nesting_level_value =
732         value_field (tcb_value, pspace_data->atcb_fieldno.atc_nesting_level);
733       entry_calls_value =
734         ada_coerce_to_simple_array_ptr
735           (value_field (tcb_value, pspace_data->atcb_fieldno.entry_calls));
736       entry_calls_value_element =
737         value_subscript (entry_calls_value,
738                          value_as_long (atc_nesting_level_value));
739       called_task_fieldno =
740         ada_get_field_index (value_type (entry_calls_value_element),
741                              "called_task", 0);
742       task_info->called_task =
743         value_as_address (value_field (entry_calls_value_element,
744                                        called_task_fieldno));
745     }
746
747   /* If the ATCB contains some information about RV callers, then
748      compute the "caller_task".  Otherwise, leave it as zero.  */
749
750   if (pspace_data->atcb_fieldno.call >= 0)
751     {
752       /* Get the ID of the caller task from Common_ATCB.Call.all.Self.
753          If Common_ATCB.Call is null, then there is no caller.  */
754       const CORE_ADDR call =
755         value_as_address (value_field (common_value,
756                                        pspace_data->atcb_fieldno.call));
757       struct value *call_val;
758
759       if (call != 0)
760         {
761           call_val =
762             value_from_contents_and_address (pspace_data->atcb_call_type,
763                                              NULL, call);
764           task_info->caller_task =
765             value_as_address
766               (value_field (call_val, pspace_data->atcb_fieldno.call_self));
767         }
768     }
769
770   task_info->base_cpu
771     = value_as_long (value_field (common_value,
772                                   pspace_data->atcb_fieldno.base_cpu));
773
774   /* And finally, compute the task ptid.  Note that there is not point
775      in computing it if the task is no longer alive, in which case
776      it is good enough to set its ptid to the null_ptid.  */
777   if (ada_task_is_alive (task_info))
778     task_info->ptid = ptid_from_atcb_common (common_value);
779   else
780     task_info->ptid = null_ptid;
781 }
782
783 /* Read the ATCB info of the given task (identified by TASK_ID), and
784    add the result to the given inferior's TASK_LIST.  */
785
786 static void
787 add_ada_task (CORE_ADDR task_id, struct inferior *inf)
788 {
789   struct ada_task_info task_info;
790   struct ada_tasks_inferior_data *data = get_ada_tasks_inferior_data (inf);
791
792   read_atcb (task_id, &task_info);
793   data->task_list.push_back (task_info);
794 }
795
796 /* Read the Known_Tasks array from the inferior memory, and store
797    it in the current inferior's TASK_LIST.  Return true upon success.  */
798
799 static bool
800 read_known_tasks_array (struct ada_tasks_inferior_data *data)
801 {
802   const int target_ptr_byte = TYPE_LENGTH (data->known_tasks_element);
803   const int known_tasks_size = target_ptr_byte * data->known_tasks_length;
804   gdb_byte *known_tasks = (gdb_byte *) alloca (known_tasks_size);
805   int i;
806
807   /* Build a new list by reading the ATCBs from the Known_Tasks array
808      in the Ada runtime.  */
809   read_memory (data->known_tasks_addr, known_tasks, known_tasks_size);
810   for (i = 0; i < data->known_tasks_length; i++)
811     {
812       CORE_ADDR task_id =
813         extract_typed_address (known_tasks + i * target_ptr_byte,
814                                data->known_tasks_element);
815
816       if (task_id != 0)
817         add_ada_task (task_id, current_inferior ());
818     }
819
820   return true;
821 }
822
823 /* Read the known tasks from the inferior memory, and store it in
824    the current inferior's TASK_LIST.  Return true upon success.  */
825
826 static bool
827 read_known_tasks_list (struct ada_tasks_inferior_data *data)
828 {
829   const int target_ptr_byte = TYPE_LENGTH (data->known_tasks_element);
830   gdb_byte *known_tasks = (gdb_byte *) alloca (target_ptr_byte);
831   CORE_ADDR task_id;
832   const struct ada_tasks_pspace_data *pspace_data
833     = get_ada_tasks_pspace_data (current_program_space);
834
835   /* Sanity check.  */
836   if (pspace_data->atcb_fieldno.activation_link < 0)
837     return false;
838
839   /* Build a new list by reading the ATCBs.  Read head of the list.  */
840   read_memory (data->known_tasks_addr, known_tasks, target_ptr_byte);
841   task_id = extract_typed_address (known_tasks, data->known_tasks_element);
842   while (task_id != 0)
843     {
844       struct value *tcb_value;
845       struct value *common_value;
846
847       add_ada_task (task_id, current_inferior ());
848
849       /* Read the chain.  */
850       tcb_value = value_from_contents_and_address (pspace_data->atcb_type,
851                                                    NULL, task_id);
852       common_value = value_field (tcb_value, pspace_data->atcb_fieldno.common);
853       task_id = value_as_address
854                   (value_field (common_value,
855                                 pspace_data->atcb_fieldno.activation_link));
856     }
857
858   return true;
859 }
860
861 /* Set all fields of the current inferior ada-tasks data pointed by DATA.
862    Do nothing if those fields are already set and still up to date.  */
863
864 static void
865 ada_tasks_inferior_data_sniffer (struct ada_tasks_inferior_data *data)
866 {
867   struct bound_minimal_symbol msym;
868   struct symbol *sym;
869
870   /* Return now if already set.  */
871   if (data->known_tasks_kind != ADA_TASKS_UNKNOWN)
872     return;
873
874   /* Try array.  */
875
876   msym = lookup_minimal_symbol (KNOWN_TASKS_NAME, NULL, NULL);
877   if (msym.minsym != NULL)
878     {
879       data->known_tasks_kind = ADA_TASKS_ARRAY;
880       data->known_tasks_addr = BMSYMBOL_VALUE_ADDRESS (msym);
881
882       /* Try to get pointer type and array length from the symtab.  */
883       sym = lookup_symbol_in_language (KNOWN_TASKS_NAME, NULL, VAR_DOMAIN,
884                                        language_c, NULL).symbol;
885       if (sym != NULL)
886         {
887           /* Validate.  */
888           struct type *type = check_typedef (SYMBOL_TYPE (sym));
889           struct type *eltype = NULL;
890           struct type *idxtype = NULL;
891
892           if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
893             eltype = check_typedef (TYPE_TARGET_TYPE (type));
894           if (eltype != NULL
895               && TYPE_CODE (eltype) == TYPE_CODE_PTR)
896             idxtype = check_typedef (TYPE_INDEX_TYPE (type));
897           if (idxtype != NULL
898               && !TYPE_LOW_BOUND_UNDEFINED (idxtype)
899               && !TYPE_HIGH_BOUND_UNDEFINED (idxtype))
900             {
901               data->known_tasks_element = eltype;
902               data->known_tasks_length =
903                 TYPE_HIGH_BOUND (idxtype) - TYPE_LOW_BOUND (idxtype) + 1;
904               return;
905             }
906         }
907
908       /* Fallback to default values.  The runtime may have been stripped (as
909          in some distributions), but it is likely that the executable still
910          contains debug information on the task type (due to implicit with of
911          Ada.Tasking).  */
912       data->known_tasks_element =
913         builtin_type (target_gdbarch ())->builtin_data_ptr;
914       data->known_tasks_length = MAX_NUMBER_OF_KNOWN_TASKS;
915       return;
916     }
917
918
919   /* Try list.  */
920
921   msym = lookup_minimal_symbol (KNOWN_TASKS_LIST, NULL, NULL);
922   if (msym.minsym != NULL)
923     {
924       data->known_tasks_kind = ADA_TASKS_LIST;
925       data->known_tasks_addr = BMSYMBOL_VALUE_ADDRESS (msym);
926       data->known_tasks_length = 1;
927
928       sym = lookup_symbol_in_language (KNOWN_TASKS_LIST, NULL, VAR_DOMAIN,
929                                        language_c, NULL).symbol;
930       if (sym != NULL && SYMBOL_VALUE_ADDRESS (sym) != 0)
931         {
932           /* Validate.  */
933           struct type *type = check_typedef (SYMBOL_TYPE (sym));
934
935           if (TYPE_CODE (type) == TYPE_CODE_PTR)
936             {
937               data->known_tasks_element = type;
938               return;
939             }
940         }
941
942       /* Fallback to default values.  */
943       data->known_tasks_element =
944         builtin_type (target_gdbarch ())->builtin_data_ptr;
945       data->known_tasks_length = 1;
946       return;
947     }
948
949   /* Can't find tasks.  */
950
951   data->known_tasks_kind = ADA_TASKS_NOT_FOUND;
952   data->known_tasks_addr = 0;
953 }
954
955 /* Read the known tasks from the current inferior's memory, and store it
956    in the current inferior's data TASK_LIST.  */
957
958 static void
959 read_known_tasks ()
960 {
961   struct ada_tasks_inferior_data *data =
962     get_ada_tasks_inferior_data (current_inferior ());
963
964   /* Step 1: Clear the current list, if necessary.  */
965   data->task_list.clear ();
966
967   /* Step 2: do the real work.
968      If the application does not use task, then no more needs to be done.
969      It is important to have the task list cleared (see above) before we
970      return, as we don't want a stale task list to be used...  This can
971      happen for instance when debugging a non-multitasking program after
972      having debugged a multitasking one.  */
973   ada_tasks_inferior_data_sniffer (data);
974   gdb_assert (data->known_tasks_kind != ADA_TASKS_UNKNOWN);
975
976   /* Step 3: Set task_list_valid_p, to avoid re-reading the Known_Tasks
977      array unless needed.  */
978   switch (data->known_tasks_kind)
979     {
980     case ADA_TASKS_NOT_FOUND: /* Tasking not in use in inferior.  */
981       break;
982     case ADA_TASKS_ARRAY:
983       data->task_list_valid_p = read_known_tasks_array (data);
984       break;
985     case ADA_TASKS_LIST:
986       data->task_list_valid_p = read_known_tasks_list (data);
987       break;
988     }
989 }
990
991 /* Build the task_list by reading the Known_Tasks array from
992    the inferior, and return the number of tasks in that list
993    (zero means that the program is not using tasking at all).  */
994
995 static int
996 ada_build_task_list ()
997 {
998   struct ada_tasks_inferior_data *data;
999
1000   if (!target_has_stack)
1001     error (_("Cannot inspect Ada tasks when program is not running"));
1002
1003   data = get_ada_tasks_inferior_data (current_inferior ());
1004   if (!data->task_list_valid_p)
1005     read_known_tasks ();
1006
1007   return data->task_list.size ();
1008 }
1009
1010 /* Print a table providing a short description of all Ada tasks
1011    running inside inferior INF.  If ARG_STR is set, it will be
1012    interpreted as a task number, and the table will be limited to
1013    that task only.  */
1014
1015 void
1016 print_ada_task_info (struct ui_out *uiout,
1017                      const char *arg_str,
1018                      struct inferior *inf)
1019 {
1020   struct ada_tasks_inferior_data *data;
1021   int taskno, nb_tasks;
1022   int taskno_arg = 0;
1023   int nb_columns;
1024
1025   if (ada_build_task_list () == 0)
1026     {
1027       uiout->message (_("Your application does not use any Ada tasks.\n"));
1028       return;
1029     }
1030
1031   if (arg_str != NULL && arg_str[0] != '\0')
1032     taskno_arg = value_as_long (parse_and_eval (arg_str));
1033
1034   if (uiout->is_mi_like_p ())
1035     /* In GDB/MI mode, we want to provide the thread ID corresponding
1036        to each task.  This allows clients to quickly find the thread
1037        associated to any task, which is helpful for commands that
1038        take a --thread argument.  However, in order to be able to
1039        provide that thread ID, the thread list must be up to date
1040        first.  */
1041     target_update_thread_list ();
1042
1043   data = get_ada_tasks_inferior_data (inf);
1044
1045   /* Compute the number of tasks that are going to be displayed
1046      in the output.  If an argument was given, there will be
1047      at most 1 entry.  Otherwise, there will be as many entries
1048      as we have tasks.  */
1049   if (taskno_arg)
1050     {
1051       if (taskno_arg > 0 && taskno_arg <= data->task_list.size ())
1052         nb_tasks = 1;
1053       else
1054         nb_tasks = 0;
1055     }
1056   else
1057     nb_tasks = data->task_list.size ();
1058
1059   nb_columns = uiout->is_mi_like_p () ? 8 : 7;
1060   ui_out_emit_table table_emitter (uiout, nb_columns, nb_tasks, "tasks");
1061   uiout->table_header (1, ui_left, "current", "");
1062   uiout->table_header (3, ui_right, "id", "ID");
1063   {
1064     size_t tid_width = 9;
1065     /* Grown below in case the largest entry is bigger.  */
1066
1067     if (!uiout->is_mi_like_p ())
1068       {
1069         for (taskno = 1; taskno <= data->task_list.size (); taskno++)
1070           {
1071             const struct ada_task_info *const task_info
1072               = &data->task_list[taskno - 1];
1073
1074             gdb_assert (task_info != NULL);
1075
1076             tid_width = std::max (tid_width,
1077                                   1 + strlen (phex_nz (task_info->task_id,
1078                                                        sizeof (CORE_ADDR))));
1079           }
1080       }
1081     uiout->table_header (tid_width, ui_right, "task-id", "TID");
1082   }
1083   /* The following column is provided in GDB/MI mode only because
1084      it is only really useful in that mode, and also because it
1085      allows us to keep the CLI output shorter and more compact.  */
1086   if (uiout->is_mi_like_p ())
1087     uiout->table_header (4, ui_right, "thread-id", "");
1088   uiout->table_header (4, ui_right, "parent-id", "P-ID");
1089   uiout->table_header (3, ui_right, "priority", "Pri");
1090   uiout->table_header (22, ui_left, "state", "State");
1091   /* Use ui_noalign for the last column, to prevent the CLI uiout
1092      from printing an extra space at the end of each row.  This
1093      is a bit of a hack, but does get the job done.  */
1094   uiout->table_header (1, ui_noalign, "name", "Name");
1095   uiout->table_body ();
1096
1097   for (taskno = 1; taskno <= data->task_list.size (); taskno++)
1098     {
1099       const struct ada_task_info *const task_info =
1100         &data->task_list[taskno - 1];
1101       int parent_id;
1102
1103       gdb_assert (task_info != NULL);
1104
1105       /* If the user asked for the output to be restricted
1106          to one task only, and this is not the task, skip
1107          to the next one.  */
1108       if (taskno_arg && taskno != taskno_arg)
1109         continue;
1110
1111       ui_out_emit_tuple tuple_emitter (uiout, NULL);
1112
1113       /* Print a star if this task is the current task (or the task
1114          currently selected).  */
1115       if (task_info->ptid == inferior_ptid)
1116         uiout->field_string ("current", "*");
1117       else
1118         uiout->field_skip ("current");
1119
1120       /* Print the task number.  */
1121       uiout->field_signed ("id", taskno);
1122
1123       /* Print the Task ID.  */
1124       uiout->field_string ("task-id", phex_nz (task_info->task_id,
1125                                                sizeof (CORE_ADDR)));
1126
1127       /* Print the associated Thread ID.  */
1128       if (uiout->is_mi_like_p ())
1129         {
1130           thread_info *thread = (ada_task_is_alive (task_info)
1131                                  ? find_thread_ptid (task_info->ptid)
1132                                  : nullptr);
1133
1134           if (thread != NULL)
1135             uiout->field_signed ("thread-id", thread->global_num);
1136           else
1137             {
1138               /* This can happen if the thread is no longer alive.  */
1139               uiout->field_skip ("thread-id");
1140             }
1141         }
1142
1143       /* Print the ID of the parent task.  */
1144       parent_id = get_task_number_from_id (task_info->parent, inf);
1145       if (parent_id)
1146         uiout->field_signed ("parent-id", parent_id);
1147       else
1148         uiout->field_skip ("parent-id");
1149
1150       /* Print the base priority of the task.  */
1151       uiout->field_signed ("priority", task_info->priority);
1152
1153       /* Print the task current state.  */
1154       if (task_info->caller_task)
1155         uiout->field_fmt ("state",
1156                           _("Accepting RV with %-4d"),
1157                           get_task_number_from_id (task_info->caller_task,
1158                                                    inf));
1159       else if (task_info->called_task)
1160         uiout->field_fmt ("state",
1161                           _("Waiting on RV with %-3d"),
1162                           get_task_number_from_id (task_info->called_task,
1163                                                    inf));
1164       else
1165         uiout->field_string ("state", task_states[task_info->state]);
1166
1167       /* Finally, print the task name, without quotes around it, as mi like
1168          is not expecting quotes, and in non mi-like no need for quotes
1169          as there is a specific column for the name.  */
1170       uiout->field_fmt ("name",
1171                         (task_info->name[0] != '\0'
1172                          ? ui_file_style ()
1173                          : metadata_style.style ()),
1174                         "%s",
1175                         (task_info->name[0] != '\0'
1176                          ? task_info->name
1177                          : _("<no name>")));
1178
1179       uiout->text ("\n");
1180     }
1181 }
1182
1183 /* Print a detailed description of the Ada task whose ID is TASKNO_STR
1184    for the given inferior (INF).  */
1185
1186 static void
1187 info_task (struct ui_out *uiout, const char *taskno_str, struct inferior *inf)
1188 {
1189   const int taskno = value_as_long (parse_and_eval (taskno_str));
1190   struct ada_task_info *task_info;
1191   int parent_taskno = 0;
1192   struct ada_tasks_inferior_data *data = get_ada_tasks_inferior_data (inf);
1193
1194   if (ada_build_task_list () == 0)
1195     {
1196       uiout->message (_("Your application does not use any Ada tasks.\n"));
1197       return;
1198     }
1199
1200   if (taskno <= 0 || taskno > data->task_list.size ())
1201     error (_("Task ID %d not known.  Use the \"info tasks\" command to\n"
1202              "see the IDs of currently known tasks"), taskno);
1203   task_info = &data->task_list[taskno - 1];
1204
1205   /* Print the Ada task ID.  */
1206   printf_filtered (_("Ada Task: %s\n"),
1207                    paddress (target_gdbarch (), task_info->task_id));
1208
1209   /* Print the name of the task.  */
1210   if (task_info->name[0] != '\0')
1211     printf_filtered (_("Name: %s\n"), task_info->name);
1212   else
1213     fprintf_styled (gdb_stdout, metadata_style.style (), _("<no name>\n"));
1214
1215   /* Print the TID and LWP.  */
1216   printf_filtered (_("Thread: %#lx\n"), task_info->ptid.tid ());
1217   printf_filtered (_("LWP: %#lx\n"), task_info->ptid.lwp ());
1218
1219   /* If set, print the base CPU.  */
1220   if (task_info->base_cpu != 0)
1221     printf_filtered (_("Base CPU: %d\n"), task_info->base_cpu);
1222
1223   /* Print who is the parent (if any).  */
1224   if (task_info->parent != 0)
1225     parent_taskno = get_task_number_from_id (task_info->parent, inf);
1226   if (parent_taskno)
1227     {
1228       struct ada_task_info *parent = &data->task_list[parent_taskno - 1];
1229
1230       printf_filtered (_("Parent: %d"), parent_taskno);
1231       if (parent->name[0] != '\0')
1232         printf_filtered (" (%s)", parent->name);
1233       printf_filtered ("\n");
1234     }
1235   else
1236     printf_filtered (_("No parent\n"));
1237
1238   /* Print the base priority.  */
1239   printf_filtered (_("Base Priority: %d\n"), task_info->priority);
1240
1241   /* print the task current state.  */
1242   {
1243     int target_taskno = 0;
1244
1245     if (task_info->caller_task)
1246       {
1247         target_taskno = get_task_number_from_id (task_info->caller_task, inf);
1248         printf_filtered (_("State: Accepting rendezvous with %d"),
1249                          target_taskno);
1250       }
1251     else if (task_info->called_task)
1252       {
1253         target_taskno = get_task_number_from_id (task_info->called_task, inf);
1254         printf_filtered (_("State: Waiting on task %d's entry"),
1255                          target_taskno);
1256       }
1257     else
1258       printf_filtered (_("State: %s"), _(long_task_states[task_info->state]));
1259
1260     if (target_taskno)
1261       {
1262         ada_task_info *target_task_info = &data->task_list[target_taskno - 1];
1263
1264         if (target_task_info->name[0] != '\0')
1265           printf_filtered (" (%s)", target_task_info->name);
1266       }
1267
1268     printf_filtered ("\n");
1269   }
1270 }
1271
1272 /* If ARG is empty or null, then print a list of all Ada tasks.
1273    Otherwise, print detailed information about the task whose ID
1274    is ARG.
1275    
1276    Does nothing if the program doesn't use Ada tasking.  */
1277
1278 static void
1279 info_tasks_command (const char *arg, int from_tty)
1280 {
1281   struct ui_out *uiout = current_uiout;
1282
1283   if (arg == NULL || *arg == '\0')
1284     print_ada_task_info (uiout, NULL, current_inferior ());
1285   else
1286     info_task (uiout, arg, current_inferior ());
1287 }
1288
1289 /* Print a message telling the user id of the current task.
1290    This function assumes that tasking is in use in the inferior.  */
1291
1292 static void
1293 display_current_task_id (void)
1294 {
1295   const int current_task = ada_get_task_number (inferior_thread ());
1296
1297   if (current_task == 0)
1298     printf_filtered (_("[Current task is unknown]\n"));
1299   else
1300     {
1301       struct ada_tasks_inferior_data *data
1302         = get_ada_tasks_inferior_data (current_inferior ());
1303       struct ada_task_info *task_info = &data->task_list[current_task - 1];
1304
1305       printf_filtered (_("[Current task is %s]\n"),
1306                        task_to_str (current_task, task_info).c_str ());
1307     }
1308 }
1309
1310 /* Parse and evaluate TIDSTR into a task id, and try to switch to
1311    that task.  Print an error message if the task switch failed.  */
1312
1313 static void
1314 task_command_1 (const char *taskno_str, int from_tty, struct inferior *inf)
1315 {
1316   const int taskno = value_as_long (parse_and_eval (taskno_str));
1317   struct ada_task_info *task_info;
1318   struct ada_tasks_inferior_data *data = get_ada_tasks_inferior_data (inf);
1319
1320   if (taskno <= 0 || taskno > data->task_list.size ())
1321     error (_("Task ID %d not known.  Use the \"info tasks\" command to\n"
1322              "see the IDs of currently known tasks"), taskno);
1323   task_info = &data->task_list[taskno - 1];
1324
1325   if (!ada_task_is_alive (task_info))
1326     error (_("Cannot switch to task %s: Task is no longer running"),
1327            task_to_str (taskno, task_info).c_str ());
1328    
1329   /* On some platforms, the thread list is not updated until the user
1330      performs a thread-related operation (by using the "info threads"
1331      command, for instance).  So this thread list may not be up to date
1332      when the user attempts this task switch.  Since we cannot switch
1333      to the thread associated to our task if GDB does not know about
1334      that thread, we need to make sure that any new threads gets added
1335      to the thread list.  */
1336   target_update_thread_list ();
1337
1338   /* Verify that the ptid of the task we want to switch to is valid
1339      (in other words, a ptid that GDB knows about).  Otherwise, we will
1340      cause an assertion failure later on, when we try to determine
1341      the ptid associated thread_info data.  We should normally never
1342      encounter such an error, but the wrong ptid can actually easily be
1343      computed if target_get_ada_task_ptid has not been implemented for
1344      our target (yet).  Rather than cause an assertion error in that case,
1345      it's nicer for the user to just refuse to perform the task switch.  */
1346   thread_info *tp = find_thread_ptid (task_info->ptid);
1347   if (tp == NULL)
1348     error (_("Unable to compute thread ID for task %s.\n"
1349              "Cannot switch to this task."),
1350            task_to_str (taskno, task_info).c_str ());
1351
1352   switch_to_thread (tp);
1353   ada_find_printable_frame (get_selected_frame (NULL));
1354   printf_filtered (_("[Switching to task %s]\n"),
1355                    task_to_str (taskno, task_info).c_str ());
1356   print_stack_frame (get_selected_frame (NULL),
1357                      frame_relative_level (get_selected_frame (NULL)),
1358                      SRC_AND_LOC, 1);
1359 }
1360
1361
1362 /* Print the ID of the current task if TASKNO_STR is empty or NULL.
1363    Otherwise, switch to the task indicated by TASKNO_STR.  */
1364
1365 static void
1366 task_command (const char *taskno_str, int from_tty)
1367 {
1368   struct ui_out *uiout = current_uiout;
1369
1370   if (ada_build_task_list () == 0)
1371     {
1372       uiout->message (_("Your application does not use any Ada tasks.\n"));
1373       return;
1374     }
1375
1376   if (taskno_str == NULL || taskno_str[0] == '\0')
1377     display_current_task_id ();
1378   else
1379     task_command_1 (taskno_str, from_tty, current_inferior ());
1380 }
1381
1382 /* Indicate that the given inferior's task list may have changed,
1383    so invalidate the cache.  */
1384
1385 static void
1386 ada_task_list_changed (struct inferior *inf)
1387 {
1388   struct ada_tasks_inferior_data *data = get_ada_tasks_inferior_data (inf);
1389
1390   data->task_list_valid_p = false;
1391 }
1392
1393 /* Invalidate the per-program-space data.  */
1394
1395 static void
1396 ada_tasks_invalidate_pspace_data (struct program_space *pspace)
1397 {
1398   get_ada_tasks_pspace_data (pspace)->initialized_p = 0;
1399 }
1400
1401 /* Invalidate the per-inferior data.  */
1402
1403 static void
1404 ada_tasks_invalidate_inferior_data (struct inferior *inf)
1405 {
1406   struct ada_tasks_inferior_data *data = get_ada_tasks_inferior_data (inf);
1407
1408   data->known_tasks_kind = ADA_TASKS_UNKNOWN;
1409   data->task_list_valid_p = false;
1410 }
1411
1412 /* The 'normal_stop' observer notification callback.  */
1413
1414 static void
1415 ada_tasks_normal_stop_observer (struct bpstats *unused_args, int unused_args2)
1416 {
1417   /* The inferior has been resumed, and just stopped. This means that
1418      our task_list needs to be recomputed before it can be used again.  */
1419   ada_task_list_changed (current_inferior ());
1420 }
1421
1422 /* A routine to be called when the objfiles have changed.  */
1423
1424 static void
1425 ada_tasks_new_objfile_observer (struct objfile *objfile)
1426 {
1427   struct inferior *inf;
1428
1429   /* Invalidate the relevant data in our program-space data.  */
1430
1431   if (objfile == NULL)
1432     {
1433       /* All objfiles are being cleared, so we should clear all
1434          our caches for all program spaces.  */
1435       struct program_space *pspace;
1436
1437       for (pspace = program_spaces; pspace != NULL; pspace = pspace->next)
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
1459 _initialize_tasks (void)
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.109737 seconds and 4 git commands to generate.