gdb
authorTom Tromey <tromey@redhat.com>
Tue, 13 Jul 2010 20:07:44 +0000 (20:07 +0000)
committerTom Tromey <tromey@redhat.com>
Tue, 13 Jul 2010 20:07:44 +0000 (20:07 +0000)
PR breakpoints/8357:
* symtab.h (domain_enum_tag) <LABEL_DOMAIN>: Update comment.
* linespec.c (decode_line_1): Update comment.  Call decode_label.
(decode_label): New function.
(symbol_found): Handle LOC_LABEL.
* dwarf2read.c (new_symbol) <DW_TAG_label>: Set symbol's type and
domain.  Call add_symbol_to_list.
gdb/doc
* gdb.texinfo (Specify Location): Document labels.
gdb/testsuite
* gdb.base/label.exp: New file.
* gdb.base/label.c: New file.

gdb/ChangeLog
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/dwarf2read.c
gdb/linespec.c
gdb/symtab.h
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/label.c [new file with mode: 0644]
gdb/testsuite/gdb.base/label.exp [new file with mode: 0644]

index 44f606f502bf18550c4760fd8b7addbad41fe6b1..4937d9475b549f9034e20caf3d69ec22bc340788 100644 (file)
@@ -1,3 +1,13 @@
+2010-07-13  Tom Tromey  <tromey@redhat.com>
+
+       PR breakpoints/8357:
+       * symtab.h (domain_enum_tag) <LABEL_DOMAIN>: Update comment.
+       * linespec.c (decode_line_1): Update comment.  Call decode_label.
+       (decode_label): New function.
+       (symbol_found): Handle LOC_LABEL.
+       * dwarf2read.c (new_symbol) <DW_TAG_label>: Set symbol's type and
+       domain.  Call add_symbol_to_list.
+
 2010-07-13  Tom Tromey  <tromey@redhat.com>
 
        * dwarf2loc.h (dwarf2_per_cu_text_offset): Declare.
index 240ba890abcab4f36a69b85081251486d3ec40c0..d635ca5f9996356130ecab81159c5a1e672d587f 100644 (file)
@@ -1,3 +1,7 @@
+2010-07-13  Tom Tromey  <tromey@redhat.com>
+
+       * gdb.texinfo (Specify Location): Document labels.
+
 2010-07-01  Pedro Alves  <pedro@codesourcery.com>
 
        * gdb.texinfo (Create and Delete Tracepoints): Add more index
index 7abb9ed9a20126f3aa3601c938e2554d27e7c19c..bcd4b242443792e9414124081ec5b7721fc21763 100644 (file)
@@ -6330,6 +6330,13 @@ in the file @var{filename}.  You only need the file name with a
 function name to avoid ambiguity when there are identically named
 functions in different source files.
 
+@item @var{label}
+Specifies the line at which the label named @var{label} appears.
+@value{GDBN} searches for the label in the function corresponding to
+the currently selected stack frame.  If there is no current selected
+stack frame (for instance, if the inferior is not running), then
+@value{GDBN} will not search for a label.
+
 @item *@var{address}
 Specifies the program address @var{address}.  For line-oriented
 commands, such as @code{list} and @code{edit}, this specifies a source
index 240bee195d3afd580ffaa86a9a1a1833d87a2a7c..85740e655006adc5a0fc46f8af7e18ff731b2839 100644 (file)
@@ -8807,7 +8807,10 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
            {
              SYMBOL_VALUE_ADDRESS (sym) = DW_ADDR (attr) + baseaddr;
            }
+         SYMBOL_TYPE (sym) = objfile_type (objfile)->builtin_core_addr;
+         SYMBOL_DOMAIN (sym) = LABEL_DOMAIN;
          SYMBOL_CLASS (sym) = LOC_LABEL;
+         add_symbol_to_list (sym, cu->list_in_scope);
          break;
        case DW_TAG_subprogram:
          /* SYMBOL_BLOCK_VALUE (sym) will be filled in later by
index 378c6c940cf61af7942e92cce8a7c8d54adb8dec..91c5b901320ec5df64d34ab00bd5fe017a27cf76 100644 (file)
@@ -122,6 +122,9 @@ static struct symtabs_and_lines decode_dollar (char *copy,
                                               char ***canonical,
                                               struct symtab *file_symtab);
 
+static int decode_label (char *copy, char ***canonical,
+                        struct symtabs_and_lines *result);
+
 static struct symtabs_and_lines decode_variable (char *copy,
                                                 int funfirstline,
                                                 char ***canonical,
@@ -672,6 +675,7 @@ find_method_overload_end (char *p)
    FILE:LINENUM -- that line in that file.  PC returned is 0.
    FUNCTION -- line number of openbrace of that function.
    PC returned is the start of the function.
+   LABEL -- a label in the current scope
    VARIABLE -- line number of definition of that variable.
    PC returned is 0.
    FILE:FUNCTION -- likewise, but prefer functions in that file.
@@ -903,6 +907,16 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab,
     return decode_dollar (copy, funfirstline, default_symtab,
                          canonical, file_symtab);
 
+  /* Try the token as a label, but only if no file was specified,
+     because we can only really find labels in the current scope.  */
+
+  if (!file_symtab)
+    {
+      struct symtabs_and_lines label_result;
+      if (decode_label (copy, canonical, &label_result))
+       return label_result;
+    }
+
   /* Look up that token as a variable.
      If file specified, use that file's per-file block to start with.  */
 
@@ -1838,6 +1852,27 @@ decode_dollar (char *copy, int funfirstline, struct symtab *default_symtab,
 
 \f
 
+/* A helper for decode_line_1 that tries to find a label.  The label
+   is searched for in the current block.
+   COPY is the name of the label to find.
+   CANONICAL is the same as the "canonical" argument to decode_line_1.
+   RESULT is a pointer to a symtabs_and_lines structure which will be
+   filled in on success.
+   This function returns 1 if a label was found, 0 otherwise.  */
+
+static int
+decode_label (char *copy, char ***canonical, struct symtabs_and_lines *result)
+{
+  struct symbol *sym;
+
+  sym = lookup_symbol (copy, get_selected_block (0), LABEL_DOMAIN, 0);
+
+  if (sym != NULL)
+    *result = symbol_found (0, canonical, copy, sym, NULL);
+
+  return sym != NULL;
+}
+
 /* Decode a linespec that's a variable.  If FILE_SYMTAB is non-NULL,
    look in that symtab's static variables first.  If NOT_FOUND_PTR is not NULL and
    the function cannot be found, store boolean true in the location pointed to
@@ -1917,7 +1952,7 @@ symbol_found (int funfirstline, char ***canonical, char *copy,
     }
   else
     {
-      if (funfirstline)
+      if (funfirstline && SYMBOL_CLASS (sym) != LOC_LABEL)
        error (_("\"%s\" is not a function"), copy);
       else if (SYMBOL_LINE (sym) != 0)
        {
@@ -1928,6 +1963,7 @@ symbol_found (int funfirstline, char ***canonical, char *copy,
          memset (&values.sals[0], 0, sizeof (values.sals[0]));
          values.sals[0].symtab = SYMBOL_SYMTAB (sym);
          values.sals[0].line = SYMBOL_LINE (sym);
+         values.sals[0].pspace = SYMTAB_PSPACE (SYMBOL_SYMTAB (sym));
          return values;
        }
       else
index bedc10a7392525815147c6f7879ee591c3b7f410..5f676bf31635fedb93b66fefae94d299baabd88b 100644 (file)
@@ -377,8 +377,7 @@ typedef enum domain_enum_tag
 
   STRUCT_DOMAIN,
 
-  /* LABEL_DOMAIN may be used for names of labels (for gotos);
-     currently it is not used and labels are not recorded at all.  */
+  /* LABEL_DOMAIN may be used for names of labels (for gotos).  */
 
   LABEL_DOMAIN,
 
index 803e74dd5140a3587230d88abe89ed65a5bc473a..92fb577e7de748d54b679dbee10c75b3fd8a807d 100644 (file)
@@ -1,3 +1,8 @@
+2010-07-13  Tom Tromey  <tromey@redhat.com>
+
+       * gdb.base/label.exp: New file.
+       * gdb.base/label.c: New file.
+
 2010-07-12  Ulrich Weigand  <uweigand@de.ibm.com>
            H.J. Lu  <hongjiu.lu@intel.com>
 
diff --git a/gdb/testsuite/gdb.base/label.c b/gdb/testsuite/gdb.base/label.c
new file mode 100644 (file)
index 0000000..f9cd8c3
--- /dev/null
@@ -0,0 +1,21 @@
+#include <stdio.h>
+
+int
+main (int argc, char *argv)
+{
+  int i = 0;
+  goto there;
+
+here:
+  printf("not here\n");
+  i = 1;
+  
+there:
+  printf("but here\n");
+  if (i == 0)
+    goto here;
+
+done:
+  return 0;
+}
+
diff --git a/gdb/testsuite/gdb.base/label.exp b/gdb/testsuite/gdb.base/label.exp
new file mode 100644 (file)
index 0000000..9e30520
--- /dev/null
@@ -0,0 +1,59 @@
+# Copyright 2010 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/>.
+
+if $tracelevel then {
+    strace $tracelevel
+}
+
+
+if [is_remote target] then {
+    return 0
+}
+
+
+#
+# test running programs
+#
+
+set testfile "label"
+set srcfile ${testfile}.c
+set binfile ${objdir}/${subdir}/${testfile}
+
+if { [prepare_for_testing ${testfile}.exp $testfile ${testfile}.c debug] } {
+    untested label.exp
+    return -1
+}
+
+
+if {![runto_main]} {
+  fail "label tests suppressed"
+  return -1
+}
+
+gdb_test "break here" \
+  "Breakpoint.*at.*" \
+  "breakpoint here"
+
+gdb_test "break there" \
+  "Breakpoint.*at.*" \
+  "breakpoint there"
+
+gdb_test "cont" \
+  "Breakpoint 3,.*" \
+  "continue to 'there'"
+
+gdb_test "cont" \
+  "Breakpoint 2,.*" \
+  "continue to 'here'"