[vxworks 01/14] Some ada-lang/ada-tasks routines needed by the VxWorks target.

Joel Brobecker
2010-04-25T15:47:55Z

We need to add a few routines in the following units...

- ada-lang.c:

After switching to a new partition, if there is an Ada main in there,
and the language is auto, switch the language to Ada (if not already
Ada).

- ada-tasks.c:

The remote-wtx backend needs to access the list of known Ada
tasks in order to build the associated list of VxWorks threads
running as part of an Ada "program". This is for the multi-tasks
mode.

2010-04-24 Joel Brobecker <brobecker@adacore.com>

* ada-lang.c (ada_language_auto_set, clear_ada_sym_cache):
New functions.
* ada-tasks.c (ada_get_environment_task, iterate_over_live_ada_tasks):
New functions.
* ada-lang.h (ada_language_auto_set, ada_get_environment_task)
(ada_task_list_iterator_ftype, iterate_over_live_ada_tasks):
Add declarations.
---
gdb/ada-lang.c | 19 +++++++++++++++++++
gdb/ada-lang.h | 8 ++++++++
gdb/ada-tasks.c | 37 +++++++++++++++++++++++++++++++++++++
3 files changed, 64 insertions(+), 0 deletions(-)

diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 9da0609..5da30f9 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -646,6 +646,20 @@ ada_update_initial_language (enum language lang)
return lang;
}

+/* If the language mode is auto, and we can find some Ada code
+ in one of the module, then automatically set the language to Ada. */
+
+void
+ada_language_auto_set (void)
+{
+ if (language_mode == language_mode_auto
+ && ada_update_initial_language (language_unknown) == language_ada)
+ {
+ set_language (language_ada);
+ expected_language = current_language;
+ }
+}
+
/* If the main procedure is written in Ada, then return its name.
The result is good until the next call. Return NULL if the main
procedure doesn't appear to be in Ada. */
@@ -3940,6 +3954,11 @@ make_array_descriptor (struct type *type, struct value *arr,
/* Dummy definitions for an experimental caching module that is not
* used in the public sources. */

+void
+clear_ada_sym_cache (void)
+{
+}
+
static int
lookup_cached_symbol (const char *name, domain_enum namespace,
struct symbol **sym, struct block **block)
diff --git a/gdb/ada-lang.h b/gdb/ada-lang.h
index 3d60f8f..e73e939 100644
--- a/gdb/ada-lang.h
+++ b/gdb/ada-lang.h
@@ -211,6 +211,8 @@ extern const char *ada_decode (const char*);

extern enum language ada_update_initial_language (enum language);

+extern void ada_language_auto_set (void);
+
extern void clear_ada_sym_cache (void);

extern int ada_lookup_symbol_list (const char *, const struct block *,
@@ -373,8 +375,14 @@ extern char *ada_main_name (void);

extern int valid_task_id (int);

+extern struct ada_task_info *ada_get_environment_task (void);
+
extern int ada_get_task_number (ptid_t);

+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 int ada_build_task_list (int warn_if_null);

extern int ada_exception_catchpoint_p (struct breakpoint *b);
diff --git a/gdb/ada-tasks.c b/gdb/ada-tasks.c
index 519cfc6..7f0b1c2 100644
--- a/gdb/ada-tasks.c
+++ b/gdb/ada-tasks.c
@@ -212,6 +212,43 @@ ada_task_is_alive (struct ada_task_info *task_info)
return (task_info->state != Terminated);
}

+/* Return the task info associated to the Environment Task.
+ This function assumes that the inferior does in fact use tasking. */
+
+struct ada_task_info *
+ada_get_environment_task (void)
+{
+ ada_build_task_list (0);
+ gdb_assert (VEC_length (ada_task_info_s, task_list) > 0);
+
+ /* We use a little bit of insider knowledge to determine which task
+ is the Environment Task: We know that this task is created first,
+ and thus should always be task #1, which is at index 0 of the
+ TASK_LIST. */
+ return (VEC_index (ada_task_info_s, task_list, 0));
+}
+
+/* Call the ITERATOR function once for each Ada task that hasn't been
+ terminated yet. */
+
+void
+iterate_over_live_ada_tasks (ada_task_list_iterator_ftype *iterator)
+{
+ int i, nb_tasks;
+ struct ada_task_info *task;
+
+ ada_build_task_list (0);
+ nb_tasks = VEC_length (ada_task_info_s, task_list);
+
+ for (i = 0; i < nb_tasks; i++)
+ {
+ task = VEC_index (ada_task_info_s, task_list, i);
+ if (!ada_task_is_alive (task))
+ continue;
+ iterator (task);
+ }
+}
+
/* Extract the contents of the value as a string whose length is LENGTH,
and store the result in DEST. */

--
1.6.3.3