This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] Fix "skip" for ambiguous linespec


Hi,

this patch (only due to patch apply reasons) depends on:
	[patch] Code cleanup: Remove search_len parameter
	http://sourceware.org/ml/gdb-patches/2012-12/msg00262.html
	Message-ID: <20121210175101.GA27639@host2.jankratochvil.net>
and
	[doc patch] coding style: 0 vs. NULL + [patch] Code cleanup: skip.c
	http://sourceware.org/ml/gdb-patches/2012-12/msg00269.html
	Message-ID: <20121210184220.GA29321@host2.jankratochvil.net>

The current "skip" command originally checked in as
	commit eb1a2e1ef3957213a420bbeedff9c045016e3aa0
	Author: jlebar <jlebar>
	Date:   Tue Nov 1 14:51:15 2011 +0000
is no longer compatible with the "ambiguous linespec" (that for example
"break funcname" will put breakpoint to any "funcname" in any file and any
future shared library loads) checked in as
	commit d2fae92c9d78b49086182385a5bbd086b7a030b6
	Author: Tom Tromey <tromey@redhat.com>
	Date:   Tue Dec 6 18:54:35 2011 +0000
which is chronologically understandable.

As I needed to make some other changes of skip.c it no longer made sense on
top of the current code.

Currently one can "break dupname" but one cannot skip it due to:
	(gdb) skip function dupname
	Specify just one function at a time.

Also similarly one can
	(gdb) skip file thefile.cc
	File ./gdb.linespec/base/two/thefile.cc will be skipped when stepping.
but it is not right, there exists also a second file with the same basename:
	     ./gdb.linespec/base/one/thefile.cc

The handling of PC in skip.c IMO does not make much sense, it wouhld have to
handle multi-location skips (like multi-location breakpoints are handled) and
all this brings no additional feature and even no performance benefits over
the radical simplification below.

The multi-location skips are tested by a new testfile.

No regressions on {x86_64,x86_64-m32,i686}-fedora18-linux-gnu.


An unrelated note: On IRC there was a request that if one "skip function foo"
and "foo" calls "bar" then step into "foo" should step into "bar".  Currently
even "bar" is skipped in such case.  It would sure require a different
(slower, stepping) implementation of this command.



Thanks,
Jan


gdb/
2012-12-10  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* breakpoint.c (breakpoint_re_set): Remove the skip_re_set call.
	* infrun.c (handle_inferior_event): Rename the called function to
	function_name_is_marked_for_skip, pass it TMP_SAL.
	* skip.c (struct skiplist_entry): Update function_name comment.  Remove
	fields pc, gdbarch and pending.
	(skip_function_pc): Rename this forward declaration to ...
	(skip_function): ... here.
	(skip_file_command): Remove variable pending and its use, remove
	initialization of E fields pending and gdbarch.  Do not use SYMTAB
	filename, use the specified one.
	(skip_function_command): Remove variable func_pc, do not set it.
	Update the caller of skip_function.  Replace decode_line_1 call by
	a lookup_symbol call.  Remove variables orig_arg, decode_exception and
	sals.  Update the caller of skip_function.
	(skip_info): Remove variable address_width and its use.  Do not print
	address (PC).  Renumber column 5 to 4.
	(skip_function_pc): Rename to ...
	(skip_function): ... here and remove its parameters pc, arch and
	pending.  Update the function comment and no longer use those
	parameters.
	(function_pc_is_marked_for_skip): Rename to ...
	(function_name_is_marked_for_skip): ... here, update function comment
	just to a skip.h reference, replace pc parameter by function_name and
	function_sal.  No longer use E field pending and pc.  Remove variables
	searched_for_sal, sal and filename.  Call compare_filenames_for_search
	instead of just strcmp.
	(skip_re_set): Remove the function.
	* skip.h (struct symtab_and_line): New declaration.
	(function_pc_is_marked_for_skip): Rename to ...
	(function_name_is_marked_for_skip): ... here, replace pc parameter by
	function_name and function_sal, update the function comment.

gdb/testsuite/
2012-12-10  Jan Kratochvil  <jan.kratochvil@redhat.com>

	* gdb.base/skip-solib.exp (info skip with pending file): Update the
	expected output.
	(info skip with pending file): Remove.
	(ignoring function in solib, info skip for function multiply): Update
	the expected output.
	* gdb.base/skip.ex (skip (main), skip function baz, info skip)
	(info skip (delete 1), info skip after disabling all)
	(info skip after enabling all, info skip after disabling 4 2-3)
	(info skip after enabling 2-3, info skip 2-3)
	(info skip after deleting 2 3): Update the expected output.
	* gdb.linespec/base/two/thefile.cc (n): New variable v, split the
	statement to its initialization and return.
	* gdb.linespec/skip-two.exp: New file.

diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index f55a32b..bcd4525 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -14258,9 +14258,6 @@ breakpoint_re_set (void)
   create_longjmp_master_breakpoint ();
   create_std_terminate_master_breakpoint ();
   create_exception_master_breakpoint ();
-
-  /* While we're at it, reset the skip list too.  */
-  skip_re_set ();
 }
 
 /* Reset the thread number of this breakpoint:
diff --git a/gdb/infrun.c b/gdb/infrun.c
index b036682..27b6d20 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -4976,7 +4976,8 @@ process_event_stop_test:
 
 	tmp_sal = find_pc_line (ecs->stop_func_start, 0);
 	if (tmp_sal.line != 0
-	    && !function_pc_is_marked_for_skip (ecs->stop_func_start))
+	    && !function_name_is_marked_for_skip (ecs->stop_func_name,
+						  &tmp_sal))
 	  {
 	    if (execution_direction == EXEC_REVERSE)
 	      handle_step_into_function_backward (gdbarch, ecs);
diff --git a/gdb/skip.c b/gdb/skip.c
index 5d96446..ed726fc 100644
--- a/gdb/skip.c
+++ b/gdb/skip.c
@@ -42,30 +42,17 @@ struct skiplist_entry
   char *filename;
 
   /* The name of the marked-for-skip function, if this is a skiplist
-     entry for a function.  Note that this might be non-null even if
-     the pc is 0 if the entry is pending a shared library load.
-
+     entry for a function.
      The skiplist entry owns this pointer.  */
   char *function_name;
 
-  /* 0 if this is a skiplist entry for an entire file, or if this
-     entry will be on a function, pending a shared library load.  */
-  CORE_ADDR pc;
-
-  /* Architecture we used to create the skiplist entry. May be null
-     if the entry is pending a shared library load.  */
-  struct gdbarch *gdbarch;
-
   int enabled;
-  int pending;
 
   struct skiplist_entry *next;
 };
 
 static void add_skiplist_entry (struct skiplist_entry *e);
-static void skip_function_pc (CORE_ADDR pc, const char *name,
-			      struct gdbarch *arch,
-			      int pending);
+static void skip_function (const char *name);
 
 static struct skiplist_entry *skiplist_entry_chain;
 static int skiplist_entry_count;
@@ -83,7 +70,6 @@ skip_file_command (char *arg, int from_tty)
 {
   struct skiplist_entry *e;
   const struct symtab *symtab;
-  int pending = 0;
   const char *filename = NULL;
 
   /* If no argument was given, try to default to the last
@@ -106,19 +92,13 @@ skip_file_command (char *arg, int from_tty)
 Ignore file pending future shared library load? ")))
 	    return;
 
-	  pending = 1;
-	  filename = arg;
 	}
-      else
-	filename = symtab->filename;
+      filename = arg;
     }
 
   e = XZALLOC (struct skiplist_entry);
   e->filename = xstrdup (filename);
   e->enabled = 1;
-  e->pending = pending;
-  if (symtab != NULL)
-    e->gdbarch = get_objfile_arch (symtab->objfile);
 
   add_skiplist_entry (e);
 
@@ -128,7 +108,6 @@ Ignore file pending future shared library load? ")))
 static void
 skip_function_command (char *arg, int from_tty)
 {
-  CORE_ADDR func_pc;
   const char *name = NULL;
 
   /* Default to the current function if no argument is given.  */
@@ -140,67 +119,30 @@ skip_function_command (char *arg, int from_tty)
 	error (_("No default function now."));
 
       pc = get_last_displayed_addr ();
-      if (!find_pc_partial_function (pc, &name, &func_pc, NULL))
+      if (!find_pc_partial_function (pc, &name, NULL, NULL))
 	{
 	  error (_("No function found containing current program point %s."),
 		  paddress (get_current_arch (), pc));
 	}
-      skip_function_pc (func_pc, name, get_current_arch (), 0);
+      skip_function (name);
     }
   else
     {
-      /* Decode arg.  We set funfirstline = 1 so decode_line_1 will give us the
-	 first line of the function specified, if it can, and so that we'll
-	 reject variable names and the like.  */
-      char *orig_arg = arg; /* decode_line_1 modifies the arg pointer.  */
-      volatile struct gdb_exception decode_exception;
-      struct symtabs_and_lines sals = { NULL };
-
-      TRY_CATCH (decode_exception, RETURN_MASK_ERROR)
-	{
-	  sals = decode_line_1 (&arg, DECODE_LINE_FUNFIRSTLINE, NULL, 0);
-	}
-
-      if (decode_exception.reason < 0)
+      if (lookup_symbol (arg, NULL, VAR_DOMAIN, NULL) == NULL)
         {
-          if (decode_exception.error != NOT_FOUND_ERROR)
-            throw_exception (decode_exception);
-
 	  fprintf_filtered (gdb_stderr,
-			    _("No function found named %s.\n"), orig_arg);
+			    _("No function found named %s.\n"), arg);
 
 	  if (nquery (_("\
 Ignore function pending future shared library load? ")))
 	    {
-	      /* Add the pending skiplist entry.  */
-	      skip_function_pc (0, orig_arg, NULL, 1);
+	      /* Add the unverified skiplist entry.  */
+	      skip_function (arg);
 	    }
-
 	  return;
 	}
 
-      if (sals.nelts > 1)
-	error (_("Specify just one function at a time."));
-      if (*arg != 0)
-	error (_("Junk at end of arguments."));
-
-      /* The pc decode_line_1 gives us is the first line of the function,
-	 but we actually want the line before that.  The call to
-	 find_pc_partial_function gets us the value we actually want.  */
-      {
-	struct symtab_and_line sal = sals.sals[0];
-	CORE_ADDR pc = sal.pc;
-	CORE_ADDR func_start = 0;
-	struct gdbarch *arch = get_sal_arch (sal);
-
-	if (!find_pc_partial_function (pc, &name, &func_start, NULL))
-	  {
-	    error (_("No function found containing program point %s."),
-		     paddress (arch, pc));
-	  }
-
-	skip_function_pc (func_start, name, arch, 0);
-      }
+      skip_function (arg);
     }
 }
 
@@ -209,7 +151,6 @@ skip_info (char *arg, int from_tty)
 {
   struct skiplist_entry *e;
   int num_printable_entries = 0;
-  int address_width = 10;
   struct value_print_options opts;
   struct cleanup *tbl_chain;
 
@@ -219,11 +160,7 @@ skip_info (char *arg, int from_tty)
      64-bit address anywhere.  */
   ALL_SKIPLIST_ENTRIES (e)
     if (arg == NULL || number_is_in_list (arg, e->number))
-      {
-	num_printable_entries++;
-	if (e->gdbarch && gdbarch_addr_bit (e->gdbarch) > 32)
-	  address_width = 18;
-      }
+      num_printable_entries++;
 
   if (num_printable_entries == 0)
     {
@@ -237,25 +174,14 @@ Not skipping any files or functions.\n"));
       return;
     }
 
-  if (opts.addressprint)
-    tbl_chain = make_cleanup_ui_out_table_begin_end (current_uiout, 5,
-						     num_printable_entries,
-						     "SkiplistTable");
-  else
-    tbl_chain
-       = make_cleanup_ui_out_table_begin_end (current_uiout, 4,
-					      num_printable_entries,
-					      "SkiplistTable");
+  tbl_chain = make_cleanup_ui_out_table_begin_end (current_uiout, 4,
+						   num_printable_entries,
+						   "SkiplistTable");
 
   ui_out_table_header (current_uiout, 7, ui_left, "number", "Num");      /* 1 */
   ui_out_table_header (current_uiout, 14, ui_left, "type", "Type");      /* 2 */
   ui_out_table_header (current_uiout, 3, ui_left, "enabled", "Enb");     /* 3 */
-  if (opts.addressprint)
-    {
-      ui_out_table_header (current_uiout, address_width, ui_left,
-			   "addr", "Address");                           /* 4 */
-    }
-  ui_out_table_header (current_uiout, 40, ui_noalign, "what", "What");   /* 5 */
+  ui_out_table_header (current_uiout, 40, ui_noalign, "what", "What");   /* 4 */
   ui_out_table_body (current_uiout);
 
   ALL_SKIPLIST_ENTRIES (e)
@@ -283,39 +209,10 @@ Skiplist entry should have either a filename or a function name."));
       else
 	ui_out_field_string (current_uiout, "enabled", "n");             /* 3 */
 
-      if (opts.addressprint)
-	{
-	  if (e->pc != 0)
-	    ui_out_field_core_addr (current_uiout, "addr",
-				    e->gdbarch, e->pc);                  /* 4 */
-	  else
-	    ui_out_field_string (current_uiout, "addr", "");             /* 4 */
-	}
-
-      if (!e->pending && e->function_name != NULL)
-	{
-	   struct symbol *sym;
-
-	   gdb_assert (e->pc != 0);
-	   sym = find_pc_function (e->pc);
-	   if (sym)
-	     ui_out_field_fmt (current_uiout, "what", "%s at %s:%d",
-			       sym->ginfo.name,
-			       SYMBOL_SYMTAB (sym)->filename,
-			       sym->line);				 /* 5 */
-	   else
-	     ui_out_field_string (current_uiout, "what", "?");		 /* 5 */
-	}
-      else if (e->pending && e->function_name != NULL)
-	{
-	  ui_out_field_fmt (current_uiout, "what", "%s (PENDING)",
-			    e->function_name);				 /* 5 */
-	}
-      else if (!e->pending && e->filename != NULL)
-	ui_out_field_string (current_uiout, "what", e->filename);	 /* 5 */
-      else if (e->pending && e->filename != NULL)
-	ui_out_field_fmt (current_uiout, "what", "%s (PENDING)",
-			  e->filename);					 /* 5 */
+      if (e->function_name != NULL)
+	ui_out_field_string (current_uiout, "what", e->function_name);	 /* 4 */
+      else if (e->filename != NULL)
+	ui_out_field_string (current_uiout, "what", e->filename);	 /* 4 */
 
       ui_out_text (current_uiout, "\n");
       do_cleanups (entry_chain);
@@ -387,30 +284,20 @@ skip_delete_command (char *arg, int from_tty)
     error (_("No skiplist entries found with number %s."), arg);
 }
 
-/* Create a skiplist entry for the given pc corresponding to the given
-   function name and add it to the list.  */
+/* Create a skiplist entry for the given function NAME and add it to the
+   list.  */
 
 static void
-skip_function_pc (CORE_ADDR pc, const char *name, struct gdbarch *arch,
-		  int pending)
+skip_function (const char *name)
 {
   struct skiplist_entry *e = XZALLOC (struct skiplist_entry);
 
-  e->pc = pc;
-  e->gdbarch = arch;
   e->enabled = 1;
-  e->pending = pending;
   e->function_name = xstrdup (name);
 
   add_skiplist_entry (e);
 
-  if (!pending)
-    printf_filtered (_("Function %s at %s will be skipped when stepping.\n"),
-		     name, paddress (get_current_arch (), pc));
-  else
-    printf_filtered (_("Function %s will be skipped when stepping, "
-		       "pending shared library load.\n"),
-		     name);
+  printf_filtered (_("Function %s will be skipped when stepping.\n"), name);
 }
 
 /* Add the given skiplist entry to our list, and set the entry's number.  */
@@ -436,108 +323,38 @@ add_skiplist_entry (struct skiplist_entry *e)
     }
 }
 
-/* Does the given pc correspond to the beginning of a skipped function? */
+
+/* See skip.h.  */
 
 int
-function_pc_is_marked_for_skip (CORE_ADDR pc)
+function_name_is_marked_for_skip (const char *function_name,
+				  const struct symtab_and_line *function_sal)
 {
-  int searched_for_sal = 0;
-  struct symtab_and_line sal;
-  const char *filename = NULL;
   struct skiplist_entry *e;
 
+  if (function_name == NULL)
+    return 0;
+
   ALL_SKIPLIST_ENTRIES (e)
     {
-      if (!e->enabled || e->pending)
+      if (!e->enabled)
 	continue;
 
       /* Does the pc we're stepping into match e's stored pc? */
-      if (e->pc != 0 && pc == e->pc)
+      if (e->function_name != NULL
+	  && strcmp_iw (function_name, e->function_name) == 0)
 	return 1;
 
-      if (e->filename != NULL)
-	{
-	  /* Get the filename corresponding to this pc, if we haven't yet.  */
-	  if (!searched_for_sal)
-	    {
-	      sal = find_pc_line (pc, 0);
-              if (sal.symtab != NULL)
-                filename = sal.symtab->filename;
-	      searched_for_sal = 1;
-	    }
-	  if (filename != NULL && strcmp (filename, e->filename) == 0)
-	    return 1;
-	}
+      if (e->filename != NULL && function_sal->symtab != NULL
+	  && function_sal->symtab->filename != NULL
+	  && compare_filenames_for_search (function_sal->symtab->filename,
+					   e->filename))
+	return 1;
     }
 
   return 0;
 }
 
-/* Re-set the skip list after symbols have been re-loaded.  */
-
-void
-skip_re_set (void)
-{
-  struct skiplist_entry *e;
-
-  ALL_SKIPLIST_ENTRIES (e)
-    {
-      if (e->filename != NULL)
-	{
-	  /* If it's an entry telling us to skip a file, but the entry is
-	     currently pending a solib load, let's see if we now know
-	     about the file.  */
-	  const struct symtab *symtab = lookup_symtab (e->filename);
-
-	  if (symtab != NULL)
-	    {
-	      xfree (e->filename);
-	      e->filename = xstrdup (symtab->filename);
-	      e->gdbarch = get_objfile_arch (symtab->objfile);
-	      e->pending = 0;
-	    }
-	  else
-	    {
-	      e->pending = 1;
-	    }
-	}
-      else if (e->function_name != NULL)
-        {
-	  char *func_name = e->function_name;
-	  struct symtabs_and_lines sals = { NULL };
-	  volatile struct gdb_exception decode_exception;
-
-	  TRY_CATCH (decode_exception, RETURN_MASK_ERROR)
-	    {
-	      sals = decode_line_1 (&func_name, DECODE_LINE_FUNFIRSTLINE, NULL,
-				    0);
-	    }
-
-	  if (decode_exception.reason >= 0
-              && sals.nelts == 1 && *func_name == 0)
-	    {
-	      struct symtab_and_line sal = sals.sals[0];
-	      CORE_ADDR pc = sal.pc;
-	      CORE_ADDR func_start = 0;
-	      struct gdbarch *arch = get_sal_arch (sal);
-              const char *func_name;
-
-	      if (find_pc_partial_function (pc, &func_name, &func_start, NULL))
-		{
-		  e->pending = 0;
-                  e->function_name = xstrdup (func_name);
-		  e->pc = func_start;
-		  e->gdbarch = arch;
-		}
-	    }
-	  else
-	    {
-	      e->pending = 1;
-	    }
-        }
-    }
-}
-
 /* Provide a prototype to silence -Wmissing-prototypes.  */
 extern initialize_file_ftype _initialize_step_skip;
 
diff --git a/gdb/skip.h b/gdb/skip.h
index c1f8185..615ee59 100644
--- a/gdb/skip.h
+++ b/gdb/skip.h
@@ -18,11 +18,11 @@
 #if !defined (SKIP_H)
 #define SKIP_H
 
-/* Returns 1 if the given pc is marked for skip and shouldn't be
-   stepped into.  Otherwise, returns 0.  */
-int function_pc_is_marked_for_skip (CORE_ADDR pc);
+struct symtab_and_line;
 
-/* Re-set the skip list after symbols have been reloaded.  */
-void skip_re_set (void);
+/* Returns 1 if the given FUNCTION_NAME is marked for skip and shouldn't be
+   stepped into.  Otherwise, returns 0.  */
+int function_name_is_marked_for_skip (const char *function_name,
+				    const struct symtab_and_line *function_sal);
 
 #endif /* !defined (SKIP_H) */
diff --git a/gdb/testsuite/gdb.base/skip-solib.exp b/gdb/testsuite/gdb.base/skip-solib.exp
index 452c3d1..cdc55d7 100644
--- a/gdb/testsuite/gdb.base/skip-solib.exp
+++ b/gdb/testsuite/gdb.base/skip-solib.exp
@@ -69,11 +69,11 @@ Ignore file pending future shared library load.*" \
   "y"
 
 #
-# Does info skip list this entry as pending?
+# Checkinfo skip list.
 #
 gdb_test "info skip" \
-  "Num\\s+Type\\s+Enb\\s+Address\\s+What\\s*
-1\\s+file\\s+y\\s+\\s+${srcfile_lib} \\(PENDING\\)\\s*" \
+  "Num\\s+Type\\s+Enb\\s+What\\s*
+1\\s+file\\s+y\\s+${srcfile_lib}\\s*" \
   "info skip with pending file"
 
 if ![runto_main] { fail "skip tests suppressed" }
@@ -85,21 +85,12 @@ gdb_test "step" ""
 gdb_test "bt" "#0\\s+main.*" "step after ignoring solib file."
 
 #
-# Our entry should no longer be pending.  Note that we unfortunately need to do
-# at least one step before the entry will be unmarked as pending.
-#
-gdb_test "info skip" \
-  "Num\\s+Type\\s+Enb\\s+Address\\s+What\\s*
-1\\s+file\\s+y\\s+\\s+.*${srcfile_lib}\\s*" \
-  "info skip with pending file"
-
-#
 # Now restart gdb and testing ignoring of a function inside a solib.
 #
 clean_restart ${executable_main}
 
 gdb_test "skip function multiply" \
-  "Function multiply will be skipped when stepping, pending shared library load." \
+  "Function multiply will be skipped when stepping\\." \
   "ignoring function in solib" \
 "No function found named multiply..*
 Ignore function pending future shared library load.*" \
@@ -116,9 +107,9 @@ gdb_test "step" "square.*"
 # Now our entry should no longer be pending.
 #
 gdb_test "info skip" \
-  "Num\\s+Type\\s+Enb\\s+Address\\s+What\\s*
-1\\s+function\\s+y\\s+0x\[0-9a-f\]+\\s+multiply at .*${srcfile_lib}:.*\\s*" \
-  "skip should no longer be pending."
+  "Num\\s+Type\\s+Enb\\s+What\\s*
+1\\s+function\\s+y\\s+multiply\\s*" \
+  "info skip for function multiply"
 
 #
 # This step shouldn't go into multiply -- we should skip it and go on to the
diff --git a/gdb/testsuite/gdb.base/skip.exp b/gdb/testsuite/gdb.base/skip.exp
index 5cb1424..14137d1 100644
--- a/gdb/testsuite/gdb.base/skip.exp
+++ b/gdb/testsuite/gdb.base/skip.exp
@@ -42,13 +42,13 @@ gdb_test "info skip" "Not skipping any files or functions\." "info skip empty"
 # Create a skiplist entry for the current file and function.
 #
 gdb_test "skip file" "File .*$srcfile will be skipped when stepping\." "skip file ($srcfile)"
-gdb_test "skip" "Function main at .* will be skipped when stepping\." "skip (main)"
+gdb_test "skip" "Function main will be skipped when stepping\." "skip (main)"
 
 #
 # Create a skiplist entry for a specified file and function.
 #
 gdb_test "skip file skip1.c" "File .*$srcfile1 will be skipped when stepping\."
-gdb_test "skip function baz" "Function baz at .* will be skipped when stepping\."
+gdb_test "skip function baz" "Function baz will be skipped when stepping\."
 
 #
 # Test bad skiplist entry modification commands
@@ -69,11 +69,11 @@ gdb_test "info skip 999" "No skiplist entries found with number 999."
 # Does |info skip| look right?
 #
 gdb_test "info skip" \
-  "Num\\s+Type\\s+Enb\\s+Address\\s+What\\s*
+  "Num\\s+Type\\s+Enb\\s+What\\s*
 1\\s+file\\s+y\\s+.*$srcfile\\s*
-2\\s+function\\s+y\\s+0x\[0-9a-f\]+ main at .*$srcfile:\[0-9\]+\\s*
-3\\s+file\\s+y\\s+.*$srcfile1\\s*
-4\\s+function\\s+y\\s+0x\[0-9a-f\]+ baz at .*$srcfile1:\[0-9\]+\\s*"
+2\\s+function\\s+y\\s+main\\s*
+3\\s+file\\s+y\\s+$srcfile1\\s*
+4\\s+function\\s+y\\s+baz\\s*"
 
 #
 # Right now, we have an outstanding skiplist entry on both source
@@ -93,10 +93,10 @@ gdb_test "bt" "\\s*\\#0\\s+main.*" "step after all ignored"
 gdb_test "skip delete 1"
 # Check that entry 1 is missing from |info skip|
 gdb_test "info skip" \
-  "Num\\s+Type\\s+Enb\\s+Address\\s+What\\s*
-2\\s+function\\s+y\\s+0x\[0-9a-f\]+ main at .*$srcfile:\[0-9\]+\\s*
-3\\s+file\\s+y\\s+.*$srcfile1\\s*
-4\\s+function\\s+y\\s+0x\[0-9a-f\]+ baz at .*$srcfile1:\[0-9\]+\\s*" \
+  "Num\\s+Type\\s+Enb\\s+What\\s*
+2\\s+function\\s+y\\s+main\\s*
+3\\s+file\\s+y\\s+$srcfile1\\s*
+4\\s+function\\s+y\\s+baz\\s*" \
     "info skip (delete 1)"
 
 if ![runto_main] { fail "skip tests suppressed" }
@@ -134,45 +134,45 @@ gdb_test "step" "main \\(\\) at.*" "step after enable 3 (3)"
 
 gdb_test "skip disable"
 gdb_test "info skip" \
-  "Num\\s+Type\\s+Enb\\s+Address\\s+What\\s*
-2\\s+function\\s+n\\s+0x\[0-9a-f\]+ main at .*$srcfile:\[0-9\]+\\s*
-3\\s+file\\s+n\\s+.*$srcfile1\\s*
-4\\s+function\\s+n\\s+0x\[0-9a-f\]+ baz at .*$srcfile1:\[0-9\]+\\s*" \
+  "Num\\s+Type\\s+Enb\\s+What\\s*
+2\\s+function\\s+n\\s+main\\s*
+3\\s+file\\s+n\\s+$srcfile1\\s*
+4\\s+function\\s+n\\s+baz\\s*" \
   "info skip after disabling all"
 
 gdb_test "skip enable"
 gdb_test "info skip" \
-  "Num\\s+Type\\s+Enb\\s+Address\\s+What\\s*
-2\\s+function\\s+y\\s+0x\[0-9a-f\]+ main at .*$srcfile:\[0-9\]+\\s*
-3\\s+file\\s+y\\s+.*$srcfile1\\s*
-4\\s+function\\s+y\\s+0x\[0-9a-f\]+ baz at .*$srcfile1:\[0-9\]+\\s*" \
+  "Num\\s+Type\\s+Enb\\s+What\\s*
+2\\s+function\\s+y\\s+main\\s*
+3\\s+file\\s+y\\s+$srcfile1\\s*
+4\\s+function\\s+y\\s+baz\\s*" \
   "info skip after enabling all"
 
 gdb_test "skip disable 4 2-3"
 gdb_test "info skip" \
-  "Num\\s+Type\\s+Enb\\s+Address\\s+What\\s*
-2\\s+function\\s+n\\s+0x\[0-9a-f\]+ main at .*$srcfile:\[0-9\]+\\s*
-3\\s+file\\s+n\\s+.*$srcfile1\\s*
-4\\s+function\\s+n\\s+0x\[0-9a-f\]+ baz at .*$srcfile1:\[0-9\]+\\s*" \
+  "Num\\s+Type\\s+Enb\\s+What\\s*
+2\\s+function\\s+n\\s+main\\s*
+3\\s+file\\s+n\\s+$srcfile1\\s*
+4\\s+function\\s+n\\s+baz\\s*" \
   "info skip after disabling 4 2-3"
 
 gdb_test "skip enable 2-3"
 gdb_test "info skip" \
-  "Num\\s+Type\\s+Enb\\s+Address\\s+What\\s*
-2\\s+function\\s+y\\s+0x\[0-9a-f\]+ main at .*$srcfile:\[0-9\]+\\s*
-3\\s+file\\s+y\\s+.*$srcfile1\\s*
-4\\s+function\\s+n\\s+0x\[0-9a-f\]+ baz at .*$srcfile1:\[0-9\]+\\s*" \
+  "Num\\s+Type\\s+Enb\\s+What\\s*
+2\\s+function\\s+y\\s+main\\s*
+3\\s+file\\s+y\\s+$srcfile1\\s*
+4\\s+function\\s+n\\s+baz\\s*" \
   "info skip after enabling 2-3"
 
 gdb_test "info skip 2-3" \
-  "Num\\s+Type\\s+Enb\\s+Address\\s+What\\s*
-2\\s+function\\s+y\\s+0x\[0-9a-f\]+ main at .*$srcfile:\[0-9\]+\\s*
-3\\s+file\\s+y\\s+.*$srcfile1\\s*" \
+  "Num\\s+Type\\s+Enb\\s+What\\s*
+2\\s+function\\s+y\\s+main\\s*
+3\\s+file\\s+y\\s+$srcfile1\\s*" \
   "info skip 2-3"
 
 gdb_test "skip delete 2 3"
 gdb_test "info skip" \
-  "4\\s+function\\s+n\\s+0x\[0-9a-f\]+ baz at .*$srcfile1:\[0-9\]+\\s*" \
+  "4\\s+function\\s+n\\s+baz\\s*" \
   "info skip after deleting 2 3"
 
 gdb_test "skip delete"
diff --git a/gdb/testsuite/gdb.linespec/base/two/thefile.cc b/gdb/testsuite/gdb.linespec/base/two/thefile.cc
index ffca87a..f0c04cc 100644
--- a/gdb/testsuite/gdb.linespec/base/two/thefile.cc
+++ b/gdb/testsuite/gdb.linespec/base/two/thefile.cc
@@ -11,7 +11,8 @@ static int dupname(int y)
 
 int n(int y)
 {
-  return dupname(y) - 23;	/* thefile breakpoint */
+  int v = dupname(y) - 23;	/* thefile breakpoint */
+  return v;			/* after dupname */
 }
 
 int NameSpace::overload(double x)
diff --git a/gdb/testsuite/gdb.linespec/skip-two.exp b/gdb/testsuite/gdb.linespec/skip-two.exp
new file mode 100644
index 0000000..ea4e164
--- /dev/null
+++ b/gdb/testsuite/gdb.linespec/skip-two.exp
@@ -0,0 +1,84 @@
+# Copyright 2012 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/>.
+
+standard_testfile lspec.cc
+
+set execfile $testfile
+
+set baseone base/one/thefile.cc
+set basetwo base/two/thefile.cc
+
+if {[skip_cplus_tests]} {
+    unsupported ${testfile}.exp
+    return
+}
+
+if {[prepare_for_testing ${testfile}.exp $execfile \
+	 [list $srcfile $baseone $basetwo] \
+	 {debug nowarnings c++}]} {
+    return -1
+}
+
+gdb_test "skip function dupname" \
+	 {Function dupname will be skipped when stepping\.}
+
+if ![runto_main] {
+    return -1
+}
+
+set test "dupname ignored from main"
+gdb_test_multiple "step" $test {
+    -re "^step\r\ndupname .*\r\n$gdb_prompt $" {
+	fail $test
+    }
+    -re "^step\r\nm .*\r\n$gdb_prompt $" {
+	pass $test
+    }
+}
+
+gdb_breakpoint "n"
+gdb_continue_to_breakpoint "n" ".* dupname.* thefile breakpoint .*"
+
+set test "dupname ignored from n"
+gdb_test_multiple "step" $test {
+    -re "^step\r\ndupname .*\r\n$gdb_prompt $" {
+	fail $test
+    }
+    -re "^step\r\n\[^\r\n\]* after dupname .*\r\n$gdb_prompt $" {
+	pass $test
+    }
+}
+
+gdb_test_no_output "skip delete 1"
+
+gdb_test "skip file thefile.cc" \
+	 {File thefile\.cc will be skipped when stepping\.}
+
+if ![runto_main] {
+    return -1
+}
+
+gdb_test "step" "static int dupname .*" "step into dupname"
+gdb_test "finish" "return dupname.* body_elsewhere.*" "finish from dupname"
+
+set test "dupname ignored for thefile.cc"
+gdb_test_multiple "step" $test {
+    -re "^step\r\ndupname .*\r\n$gdb_prompt $" {
+	fail $test
+    }
+    -re "^step\r\nf1 .* f1 breakpoint .*\r\n$gdb_prompt $" {
+	pass $test
+    }
+}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]