aboutsummaryrefslogtreecommitdiff
path: root/gdb/ada-lang.c
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@gnat.com>2011-12-21 07:10:59 +0000
committerJoel Brobecker <brobecker@gnat.com>2011-12-21 07:10:59 +0000
commit9ac7f98e7cc67d360b5aab46f281440b6b446288 (patch)
treef1a0d36649bfce4ebcecd77290eb1fbe0f32fc0e /gdb/ada-lang.c
parent496c2508ac12824a98d5ded95fa999e9ebc6c34b (diff)
downloadgdb-9ac7f98e7cc67d360b5aab46f281440b6b446288.zip
gdb-9ac7f98e7cc67d360b5aab46f281440b6b446288.tar.gz
gdb-9ac7f98e7cc67d360b5aab46f281440b6b446288.tar.bz2
[Ada] Breakpoints on task bodies
Consider the following declaration: package Pck is task Dummy_Task is entry Start; end Dummy_Task; end Pck; Inserting a breakpoint on the body of that task does not currently work: (gdb) b pck.dummy_task "pck.dummy_task" is not a function Make breakpoint pending on future shared library load? (y or [n]) n What happens here is that the compiler generates two symbols: (a) Symbol `pck__dummy_task' which is a *variable* referencing the task; (b) Symbol `pck__dummy_taskTKB' which is the subprogram implementing the body of the task. The symbol lookup only finds the variable before of the TKB suffix in the subprogram name. This patch fixes the problem by adjusting the ada-lang.c:is_name_suffix routine to recognize "TKB" suffixes. But that's not enough, because the search in the symtab is performed via the block dictionary, using a hashing algorithm. So, for the search to find `pck__dummy_taskTKB', I had to modify the hashing function to ignore TKB suffixes as well. gdb/ChangeLog: * ada-lang.c (is_name_suffix): Add handling of "TKB" suffixes. Update function documentation. * dictionary.c (dict_hash): Ignore "TKB" suffixes in hash computation. gdb/testsuite/ChangeLog: * gdb.ada/task_bp: New testcase.
Diffstat (limited to 'gdb/ada-lang.c')
-rw-r--r--gdb/ada-lang.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 1befc43..41e81ab 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -5154,6 +5154,7 @@ ada_lookup_symbol_nonlocal (const char *name,
[.$][0-9]+ [nested subprogram suffix, on platforms such as GNU/Linux]
___[0-9]+ [nested subprogram suffix, on platforms such as HP/UX]
+ TKB [subprogram suffix for task bodies]
_E[0-9]+[bs]$ [protected object entry suffixes]
(X[nb]*)?((\$|__)[0-9](_?[0-9]+)|___(JM|LJM|X([FDBUP].*|R[^T]?)))?$
@@ -5199,6 +5200,11 @@ is_name_suffix (const char *str)
return 1;
}
+ /* "TKB" suffixes are used for subprograms implementing task bodies. */
+
+ if (strcmp (str, "TKB") == 0)
+ return 1;
+
#if 0
/* FIXME: brobecker/2005-09-23: Protected Object subprograms end
with a N at the end. Unfortunately, the compiler uses the same