From 858174054dbd9970d840c043aeb318f721fcf4fd Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Mon, 24 Dec 2012 19:40:05 +0000 Subject: [PATCH] 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. --- gdb/ChangeLog | 34 +++ gdb/breakpoint.c | 3 - gdb/infrun.c | 3 +- gdb/skip.c | 259 +++--------------- gdb/skip.h | 10 +- gdb/testsuite/ChangeLog | 16 ++ gdb/testsuite/gdb.base/skip-solib.exp | 23 +- gdb/testsuite/gdb.base/skip.exp | 60 ++-- .../gdb.linespec/base/two/thefile.cc | 3 +- gdb/testsuite/gdb.linespec/skip-two.exp | 84 ++++++ 10 files changed, 218 insertions(+), 277 deletions(-) create mode 100644 gdb/testsuite/gdb.linespec/skip-two.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2f682cd69e..e4248dd541 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,37 @@ +2012-12-24 Jan Kratochvil + + * 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 * ui-file.h (tee_file_new): Add extern modifier in header declaration. diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 40cceee731..bb4be0bdae 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -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: diff --git a/gdb/infrun.c b/gdb/infrun.c index b036682460..27b6d20d7d 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 f07edd340c..ed726fcaf3 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 != 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; diff --git a/gdb/skip.h b/gdb/skip.h index c1f8185460..615ee597a6 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/ChangeLog b/gdb/testsuite/ChangeLog index 5e9ce9abb0..b83d445a60 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,19 @@ +2012-12-24 Jan Kratochvil + + * 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 * gdb.base/maint.exp: Handle testing with .gdb_index. diff --git a/gdb/testsuite/gdb.base/skip-solib.exp b/gdb/testsuite/gdb.base/skip-solib.exp index 452c3d1084..cdc55d7547 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" } @@ -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 diff --git a/gdb/testsuite/gdb.base/skip.exp b/gdb/testsuite/gdb.base/skip.exp index 5cb1424325..14137d19b0 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 ffca87a4e8..f0c04cc04e 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 0000000000..ea4e164ede --- /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 . + +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 + } +}