gdb/
* 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:
parent
884f2a8d06
commit
858174054d
10 changed files with 218 additions and 277 deletions
|
@ -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.
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
|
|
259
gdb/skip.c
259
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 != 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;
|
||||
|
||||
|
|
10
gdb/skip.h
10
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) */
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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)
|
||||
|
|
84
gdb/testsuite/gdb.linespec/skip-two.exp
Normal file
84
gdb/testsuite/gdb.linespec/skip-two.exp
Normal 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
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue