diff options
author | Joel Brobecker <brobecker@gnat.com> | 2011-12-21 07:10:59 +0000 |
---|---|---|
committer | Joel Brobecker <brobecker@gnat.com> | 2011-12-21 07:10:59 +0000 |
commit | 9ac7f98e7cc67d360b5aab46f281440b6b446288 (patch) | |
tree | f1a0d36649bfce4ebcecd77290eb1fbe0f32fc0e /gdb/dictionary.c | |
parent | 496c2508ac12824a98d5ded95fa999e9ebc6c34b (diff) | |
download | gdb-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/dictionary.c')
-rw-r--r-- | gdb/dictionary.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/gdb/dictionary.c b/gdb/dictionary.c index 8142d29..7c451d2 100644 --- a/gdb/dictionary.c +++ b/gdb/dictionary.c @@ -801,6 +801,17 @@ dict_hash (const char *string0) hash = 0; while (*string) { + /* Ignore "TKB" suffixes. + + These are used by Ada for subprograms implementing a task body. + For instance for a task T inside package Pck, the name of the + subprogram implementing T's body is `pck__tTKB'. We need to + ignore the "TKB" suffix because searches for this task body + subprogram are going to be performed using `pck__t' (the encoded + version of the natural name `pck.t'). */ + if (strcmp (string, "TKB") == 0) + return hash; + switch (*string) { case '$': |