* 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/
	* 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.
This commit is contained in:
Jan Kratochvil 2012-12-24 19:40:05 +00:00
parent 884f2a8d06
commit 858174054d
10 changed files with 218 additions and 277 deletions

View File

@ -1,3 +1,37 @@
2012-12-24 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.
2012-12-18 Pierre Muller <muller@sourceware.org>
* ui-file.h (tee_file_new): Add extern modifier in header declaration.

View File

@ -14297,9 +14297,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:

View File

@ -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);

View File

@ -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 != NULL)
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;

View File

@ -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) */

View File

@ -1,3 +1,19 @@
2012-12-24 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.
2012-12-19 Doug Evans <dje@google.com>
* gdb.base/maint.exp: Handle testing with .gdb_index.

View File

@ -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" }
@ -84,22 +84,13 @@ if ![runto_main] { fail "skip tests suppressed" }
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

View File

@ -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"

View File

@ -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)

View File

@ -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
}
}