aboutsummaryrefslogtreecommitdiff
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
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.
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/ada-lang.c6
-rw-r--r--gdb/dictionary.c11
-rw-r--r--gdb/testsuite/ChangeLog4
-rw-r--r--gdb/testsuite/gdb.ada/task_bp.exp68
-rw-r--r--gdb/testsuite/gdb.ada/task_bp/foo.adb20
-rw-r--r--gdb/testsuite/gdb.ada/task_bp/pck.adb21
-rw-r--r--gdb/testsuite/gdb.ada/task_bp/pck.ads20
8 files changed, 157 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 66cd31e..aba954f 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,10 @@
+2011-12-21 Joel Brobecker <brobecker@adacore.com>
+
+ * ada-lang.c (is_name_suffix): Add handling of "TKB" suffixes.
+ Update function documentation.
+ * dictionary.c (dict_hash): Ignore "TKB" suffixes in hash
+ computation.
+
2011-12-20 Pedro Alves <alves.ped@gmail.com>
Jan Kratochvil <jan.kratochvil@redhat.com>
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
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 '$':
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index e815b07..d1cb3f1 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2011-12-21 Joel Brobecker <brobecker@adacore.com>
+
+ * gdb.ada/task_bp: New testcase.
+
2011-12-19 Jan Kratochvil <jan.kratochvil@redhat.com>
* gdb.base/reread.exp: If srcfile2 fails to build retry it with
diff --git a/gdb/testsuite/gdb.ada/task_bp.exp b/gdb/testsuite/gdb.ada/task_bp.exp
new file mode 100644
index 0000000..3d07ad6
--- /dev/null
+++ b/gdb/testsuite/gdb.ada/task_bp.exp
@@ -0,0 +1,68 @@
+# Copyright 2011 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+load_lib "ada.exp"
+
+set testdir "task_bp"
+set testfile "${testdir}/foo"
+set srcfile ${srcdir}/${subdir}/${testfile}.adb
+set binfile ${objdir}/${subdir}/${testfile}
+
+file mkdir ${objdir}/${subdir}/${testdir}
+if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug]] != "" } {
+ return -1
+}
+
+# Insert a breakpoint at LOC, and run the program expecting us to
+# reach that breakpoint.
+#
+# LOC is expected to be a linespec referencing the body of task
+# Pck.Dummy_Task (the purpose is to test all the variations of
+# these equivalent linespecs).
+#
+# MSG is just a string that's used to qualify the name of the tests
+# that are executed inside that procedure. The purpose to be able
+# to call that function multiple times with the same linespec, in
+# order to test one given linespec under multiple conditions.
+
+proc test_bp { loc msg } {
+ gdb_test "break $loc" \
+ "Breakpoint \[0-9\]+ at 0x\[0-9a-fA-F\]+: file .*pck.adb, line \[0-9\]+\." \
+ "break $loc - $msg"
+
+ gdb_run_cmd
+ gdb_test "" \
+ "Breakpoint \[0-9\]+, pck\\.dummy_task (.*)" \
+ "run to $loc - $msg"
+}
+
+set all_linespecs { "pck.dummy_task" "dummy_task"
+ "pck.adb:pck.dummy_task" "pck.adb:dummy_task"}
+
+# First, test the linespecs when the associated symtab hasn't been
+# expanded yet.
+
+foreach linespec $all_linespecs {
+ clean_restart ${testfile}
+ test_bp $linespec "from psymtab"
+}
+
+# Now, do the same, but with the associated symtab already expanded.
+
+foreach linespec $all_linespecs {
+ clean_restart ${testfile}
+ gdb_test "list pck.adb:1" ".*" "expanding symtab for $linespec"
+ test_bp $linespec "from full symtab"
+}
diff --git a/gdb/testsuite/gdb.ada/task_bp/foo.adb b/gdb/testsuite/gdb.ada/task_bp/foo.adb
new file mode 100644
index 0000000..98919a9
--- /dev/null
+++ b/gdb/testsuite/gdb.ada/task_bp/foo.adb
@@ -0,0 +1,20 @@
+-- Copyright 2011 Free Software Foundation, Inc.
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+with Pck; use Pck;
+procedure Foo is
+begin
+ Dummy_Task.Start;
+end Foo;
diff --git a/gdb/testsuite/gdb.ada/task_bp/pck.adb b/gdb/testsuite/gdb.ada/task_bp/pck.adb
new file mode 100644
index 0000000..0b1a15c
--- /dev/null
+++ b/gdb/testsuite/gdb.ada/task_bp/pck.adb
@@ -0,0 +1,21 @@
+-- Copyright 2011 Free Software Foundation, Inc.
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+package body Pck is
+ task body Dummy_Task is
+ begin
+ accept Start;
+ end Dummy_Task;
+end Pck;
diff --git a/gdb/testsuite/gdb.ada/task_bp/pck.ads b/gdb/testsuite/gdb.ada/task_bp/pck.ads
new file mode 100644
index 0000000..37460ed
--- /dev/null
+++ b/gdb/testsuite/gdb.ada/task_bp/pck.ads
@@ -0,0 +1,20 @@
+-- Copyright 2011 Free Software Foundation, Inc.
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+package Pck is
+ task Dummy_Task is
+ entry Start;
+ end Dummy_Task;
+end Pck;