diff options
-rw-r--r-- | gdb/ChangeLog | 11 | ||||
-rw-r--r-- | gdb/ada-lang.h | 2 | ||||
-rw-r--r-- | gdb/ada-tasks.c | 39 | ||||
-rw-r--r-- | gdb/ravenscar-thread.c | 8 |
4 files changed, 43 insertions, 17 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d7cf066..b833d34 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,16 @@ 2017-11-21 Joel Brobecker <brobecker@adacore.com> + * ada-lang.h (ada_get_tcb_types_info): Add declaration. + * ada-tasks.c (ada_get_tcb_types_info): Renames get_tcb_types_info. + Make non-static. Change return type to char *. Adjust code + accordingly. Rewrite the function's documentation. + (read_atcb): Adjust call to get_tcb_types_info accordingly. + * ravenscar-thread.c (ravenscar_inferior_created): Check that + we have enough debugging information in the runtime to support + Ada task debugging before we enable the ravenscar-thread layer. + +2017-11-21 Joel Brobecker <brobecker@adacore.com> + * ada-lang.h (ada_get_task_info_from_ptid): Add declaration. * ada-tasks.c (ada_get_task_info_from_ptid): New function. * ravenscar-thread.c: Add into comment. diff --git a/gdb/ada-lang.h b/gdb/ada-lang.h index 36a5820..0530e9a 100644 --- a/gdb/ada-lang.h +++ b/gdb/ada-lang.h @@ -409,6 +409,8 @@ typedef void (ada_task_list_iterator_ftype) (struct ada_task_info *task); extern void iterate_over_live_ada_tasks (ada_task_list_iterator_ftype *iterator); +extern const char *ada_get_tcb_types_info (void); + extern int ada_build_task_list (void); extern void print_ada_task_info (struct ui_out *uiout, diff --git a/gdb/ada-tasks.c b/gdb/ada-tasks.c index 16cee35..eac6c5b 100644 --- a/gdb/ada-tasks.c +++ b/gdb/ada-tasks.c @@ -466,18 +466,17 @@ read_fat_string_value (char *dest, struct value *val, int max_len) dest[len] = '\0'; } -/* Get from the debugging information the type description of all types - related to the Ada Task Control Block that will be needed in order to - read the list of known tasks in the Ada runtime. Also return the - associated ATCB_FIELDNOS. - - Error handling: Any data missing from the debugging info will cause - an error to be raised, and none of the return values to be set. - Users of this function can depend on the fact that all or none of the - return values will be set. */ - -static void -get_tcb_types_info (void) +/* Get, from the debugging information, the type description of all types + related to the Ada Task Control Block that are needed in order to + read the list of known tasks in the Ada runtime. If all of the info + needed to do so is found, then save that info in the module's per- + program-space data, and return NULL. Otherwise, if any information + cannot be found, leave the per-program-space data untouched, and + return an error message explaining what was missing (that error + message does NOT need to be deallocated). */ + +const char * +ada_get_tcb_types_info (void) { struct type *type; struct type *common_type; @@ -518,7 +517,7 @@ get_tcb_types_info (void) NULL).symbol; if (atcb_sym == NULL || atcb_sym->type == NULL) - error (_("Cannot find Ada_Task_Control_Block type. Aborting")); + return _("Cannot find Ada_Task_Control_Block type"); type = atcb_sym->type; } @@ -531,11 +530,11 @@ get_tcb_types_info (void) } if (common_atcb_sym == NULL || common_atcb_sym->type == NULL) - error (_("Cannot find Common_ATCB type. Aborting")); + return _("Cannot find Common_ATCB type"); if (private_data_sym == NULL || private_data_sym->type == NULL) - error (_("Cannot find Private_Data type. Aborting")); + return _("Cannot find Private_Data type"); if (entry_call_record_sym == NULL || entry_call_record_sym->type == NULL) - error (_("Cannot find Entry_Call_Record type. Aborting")); + return _("Cannot find Entry_Call_Record type"); /* Get the type for Ada_Task_Control_Block.Common. */ common_type = common_atcb_sym->type; @@ -583,6 +582,7 @@ get_tcb_types_info (void) pspace_data->atcb_ll_type = ll_type; pspace_data->atcb_call_type = call_type; pspace_data->atcb_fieldno = fieldnos; + return NULL; } /* Build the PTID of the task from its COMMON_VALUE, which is the "Common" @@ -630,7 +630,12 @@ read_atcb (CORE_ADDR task_id, struct ada_task_info *task_info) = get_ada_tasks_pspace_data (current_program_space); if (!pspace_data->initialized_p) - get_tcb_types_info (); + { + const char *err_msg = ada_get_tcb_types_info (); + + if (err_msg != NULL) + error (_("%s. Aborting"), err_msg); + } tcb_value = value_from_contents_and_address (pspace_data->atcb_type, NULL, task_id); diff --git a/gdb/ravenscar-thread.c b/gdb/ravenscar-thread.c index 83dfd9d..e792227 100644 --- a/gdb/ravenscar-thread.c +++ b/gdb/ravenscar-thread.c @@ -519,12 +519,20 @@ ravenscar_core_of_thread (struct target_ops *ops, ptid_t ptid) static void ravenscar_inferior_created (struct target_ops *target, int from_tty) { + const char *err_msg; if (!ravenscar_task_support || gdbarch_ravenscar_ops (target_gdbarch ()) == NULL || !has_ravenscar_runtime ()) return; + err_msg = ada_get_tcb_types_info (); + if (err_msg != NULL) + { + warning (_("%s. Task/thread support disabled.\n"), err_msg); + return; + } + ravenscar_update_inferior_ptid (); push_target (&ravenscar_ops); } |