From 6fa2f55b2780c05a15a945461d351a86d147aa7a Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Jan 01 2011 00:27:30 +0000 Subject: - Rebase to FSF GDB 7.2.50.20101231 (which is a 7.3 pre-release). - Remove gdb-6.3-bt-past-zero-20051201.patch, gdb-archer-ada.patch and gdb-6.3-framepczero-20040927.patch already removed from .spec before. - Remove gdb-6.5-dwarf-stack-overflow.patch, upstreamed (Tom Tromey). - Remove gdb-6.6-bz225783-gdb-debuginfo-paths.patch, upstreamed (Tom Tromey). - Remove gdb-6.6-readline-system.patch, reimplemented upstream (Tom Tromey). - Remove gdb-bz642879-elfread-sigint-stale.patch, upstreamed (Jan Kratochvil). - Remove gdb-next-over-throw.patch, upstreamed (Tom Tromey). --- diff --git a/.gitignore b/.gitignore index 2bfa609..ed12a9d 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -gdb-7.2.50.20101117.tar.bz2 +/gdb-7.2.50.20101231.tar.bz2 diff --git a/gdb-6.3-bt-past-zero-20051201.patch b/gdb-6.3-bt-past-zero-20051201.patch deleted file mode 100644 index 11b946d..0000000 --- a/gdb-6.3-bt-past-zero-20051201.patch +++ /dev/null @@ -1,88 +0,0 @@ -2005-12-01 Jeff Johnston - - * frame.c (backtrace_past_zero_pc): New static variable. - (get_prev_frame): Don't return NULL for zero pc value if - backtrace past-zero-frame option is turned on. - (_initialize_frame): Initialize new command to allow backtracing - past a zero pc value (set backtrace past-zero-pc). - -testsuite/gdb.base: -2005-12-01 Jeff Johnston - - * setshow.exp: Add testing of "set backtrace past-zero-pc" option. - -2007-10-15 Jan Kratochvil - - Port to GDB-6.7. - -Index: gdb-7.1.90.20100711/gdb/testsuite/gdb.base/setshow.exp -=================================================================== ---- gdb-7.1.90.20100711.orig/gdb/testsuite/gdb.base/setshow.exp 2010-06-11 22:56:06.000000000 +0200 -+++ gdb-7.1.90.20100711/gdb/testsuite/gdb.base/setshow.exp 2010-07-12 10:46:06.000000000 +0200 -@@ -96,6 +96,16 @@ if { ![target_info exists use_gdb_stub] - delete_breakpoints - gdb_test "run" "Starting program:.*foo bar blup baz bubble.*" "passing args" - } -+#test show backtrace past-zero-pc -+gdb_test "show backtrace past-zero-pc" "Whether backtraces should continue past a zero pc value is off." "default show backtrace past-zero-pc (off)" -+#test set backtrace past-zero-pc on -+gdb_test "set backtrace past-zero-pc on" "" "set backtrace past-zero-pc on" -+#test show backtrace past-zero-pc -+gdb_test "show backtrace past-zero-pc" "Whether backtraces should continue past a zero pc value is on." "show backtrace past-zero-pc (on)" -+#test set backtrace past-zero-pc off -+gdb_test "set backtrace past-zero-pc off" "" "set backtrace past-zero-pc off" -+#test show backtrace past-zero-pc -+gdb_test "show backtrace past-zero-pc" "Whether backtraces should continue past a zero pc value is off." "show backtrace past-zero-pc (off)" - #test set check range on - gdb_test "set check range on" ".*" "set check range on" - #test show check range on -Index: gdb-7.1.90.20100711/gdb/frame.c -=================================================================== ---- gdb-7.1.90.20100711.orig/gdb/frame.c 2010-07-12 10:00:56.000000000 +0200 -+++ gdb-7.1.90.20100711/gdb/frame.c 2010-07-12 10:45:18.000000000 +0200 -@@ -185,6 +185,16 @@ Whether backtraces should continue past - value); - } - -+static int backtrace_past_zero_pc; -+static void -+show_backtrace_past_zero_pc (struct ui_file *file, int from_tty, -+ struct cmd_list_element *c, const char *value) -+{ -+ fprintf_filtered (file, _("\ -+Whether backtraces should continue past a zero pc value is %s.\n"), -+ value); -+} -+ - static int backtrace_past_entry; - static void - show_backtrace_past_entry (struct ui_file *file, int from_tty, -@@ -1784,9 +1794,7 @@ get_prev_frame (struct frame_info *this_ - } - - if (this_frame->level > 0 --#if 0 -- && backtrace_past_zero_pc --#endif -+ && !backtrace_past_zero_pc - && get_frame_type (this_frame) == NORMAL_FRAME - && get_frame_type (get_next_frame (this_frame)) == NORMAL_FRAME - && get_frame_pc (this_frame) == 0) -@@ -2271,6 +2279,17 @@ the rest of the stack trace."), - &set_backtrace_cmdlist, - &show_backtrace_cmdlist); - -+ add_setshow_boolean_cmd ("past-zero-pc", class_obscure, -+ &backtrace_past_zero_pc, _("\ -+Set whether backtraces should continue past a zero pc value."), _("\ -+Show whether backtraces should continue past a zero pc value."), _("\ -+Normally GDB stops backtracing when it finds a zero pc.\n\ -+Set this variable if you need to see the rest of the stack trace."), -+ NULL, -+ show_backtrace_past_zero_pc, -+ &set_backtrace_cmdlist, -+ &show_backtrace_cmdlist); -+ - add_setshow_integer_cmd ("limit", class_obscure, - &backtrace_limit, _("\ - Set an upper bound on the number of backtrace levels."), _("\ diff --git a/gdb-6.3-framepczero-20040927.patch b/gdb-6.3-framepczero-20040927.patch deleted file mode 100644 index a8dae6b..0000000 --- a/gdb-6.3-framepczero-20040927.patch +++ /dev/null @@ -1,28 +0,0 @@ -2004-09-27 Andrew Cagney - - * frame.c (get_prev_frame): Stop backtrace when a zero PC and - successive normal frames. - -Index: gdb-6.8.50.20081128/gdb/frame.c -=================================================================== ---- gdb-6.8.50.20081128.orig/gdb/frame.c 2008-12-04 01:34:37.000000000 +0100 -+++ gdb-6.8.50.20081128/gdb/frame.c 2008-12-04 01:35:47.000000000 +0100 -@@ -1566,6 +1566,18 @@ get_prev_frame (struct frame_info *this_ - return NULL; - } - -+ if (this_frame->level > 0 -+#if 0 -+ && backtrace_past_zero_pc -+#endif -+ && get_frame_type (this_frame) == NORMAL_FRAME -+ && get_frame_type (get_next_frame (this_frame)) == NORMAL_FRAME -+ && get_frame_pc (this_frame) == 0) -+ { -+ frame_debug_got_null_frame (this_frame, "zero PC"); -+ return NULL; -+ } -+ - return get_prev_frame_1 (this_frame); - } - diff --git a/gdb-6.3-ia64-sigill-20051115.patch b/gdb-6.3-ia64-sigill-20051115.patch index 07a6b46..84d83ce 100644 --- a/gdb-6.3-ia64-sigill-20051115.patch +++ b/gdb-6.3-ia64-sigill-20051115.patch @@ -12,10 +12,10 @@ gdb/testsuite: * gdb.arch/ia64-sigill.c: New test. * gdb.arch/ia64-sigill.exp: Ditto. -Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.arch/ia64-sigill.exp +Index: gdb-7.2.50.20101231/gdb/testsuite/gdb.arch/ia64-sigill.exp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20081128/gdb/testsuite/gdb.arch/ia64-sigill.exp 2008-12-02 21:10:57.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/testsuite/gdb.arch/ia64-sigill.exp 2011-01-01 00:55:04.000000000 +0100 @@ -0,0 +1,49 @@ +# Copyright 2005 Free Software Foundation, Inc. + @@ -66,10 +66,10 @@ Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.arch/ia64-sigill.exp +gdb_test "handle SIGILL nostop noprint" "SIGILL.*No.*No.*Yes.*" "handle sigill" +gdb_test "run" "Starting program.*ia64-sigill.*\[New thread.*\].*hello world.*Program exited normally." "run to exit" + -Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.arch/ia64-sigill.c +Index: gdb-7.2.50.20101231/gdb/testsuite/gdb.arch/ia64-sigill.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-6.8.50.20081128/gdb/testsuite/gdb.arch/ia64-sigill.c 2008-12-02 21:10:57.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/testsuite/gdb.arch/ia64-sigill.c 2011-01-01 00:55:04.000000000 +0100 @@ -0,0 +1,8 @@ +#include + @@ -79,11 +79,11 @@ Index: gdb-6.8.50.20081128/gdb/testsuite/gdb.arch/ia64-sigill.c + return 0; +} + -Index: gdb-6.8.50.20081128/gdb/linux-nat.c +Index: gdb-7.2.50.20101231/gdb/linux-nat.c =================================================================== ---- gdb-6.8.50.20081128.orig/gdb/linux-nat.c 2008-12-02 19:04:38.000000000 +0100 -+++ gdb-6.8.50.20081128/gdb/linux-nat.c 2008-12-02 21:11:11.000000000 +0100 -@@ -2974,7 +2974,8 @@ retry: +--- gdb-7.2.50.20101231.orig/gdb/linux-nat.c 2011-01-01 00:54:04.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/linux-nat.c 2011-01-01 00:55:58.000000000 +0100 +@@ -3652,7 +3652,8 @@ retry: threads can be a bit time-consuming so if we want decent performance with heavily multi-threaded programs, especially when they're using a high frequency timer, we'd better avoid it if we @@ -93,8 +93,8 @@ Index: gdb-6.8.50.20081128/gdb/linux-nat.c if (WIFSTOPPED (status)) { -@@ -2992,7 +2993,9 @@ retry: - && inf->stop_soon == NO_STOP_QUIETLY +@@ -3670,7 +3671,9 @@ retry: + && inf->control.stop_soon == NO_STOP_QUIETLY && signal_stop_state (signo) == 0 && signal_print_state (signo) == 0 - && signal_pass_state (signo) == 1) diff --git a/gdb-6.3-readnever-20050907.patch b/gdb-6.3-readnever-20050907.patch index 519643d..80e3068 100644 --- a/gdb-6.3-readnever-20050907.patch +++ b/gdb-6.3-readnever-20050907.patch @@ -11,11 +11,11 @@ * gdb.texinfo (File Options): Document --readnever. -Index: gdb-7.2.50.20101116/gdb/doc/gdb.texinfo +Index: gdb-7.2.50.20101231/gdb/doc/gdb.texinfo =================================================================== ---- gdb-7.2.50.20101116.orig/gdb/doc/gdb.texinfo 2010-11-12 21:49:41.000000000 +0100 -+++ gdb-7.2.50.20101116/gdb/doc/gdb.texinfo 2010-11-16 07:59:31.000000000 +0100 -@@ -1001,6 +1001,12 @@ Read each symbol file's entire symbol ta +--- gdb-7.2.50.20101231.orig/gdb/doc/gdb.texinfo 2010-12-29 09:01:31.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/doc/gdb.texinfo 2011-01-01 00:54:07.000000000 +0100 +@@ -1007,6 +1007,12 @@ Read each symbol file's entire symbol ta the default, which is to read it incrementally as it is needed. This makes startup slower, but makes future operations faster. @@ -28,11 +28,11 @@ Index: gdb-7.2.50.20101116/gdb/doc/gdb.texinfo @end table @node Mode Options -Index: gdb-7.2.50.20101116/gdb/main.c +Index: gdb-7.2.50.20101231/gdb/main.c =================================================================== ---- gdb-7.2.50.20101116.orig/gdb/main.c 2010-11-16 07:59:20.000000000 +0100 -+++ gdb-7.2.50.20101116/gdb/main.c 2010-11-16 07:59:59.000000000 +0100 -@@ -390,6 +390,7 @@ captured_main (void *data) +--- gdb-7.2.50.20101231.orig/gdb/main.c 2011-01-01 00:53:09.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/main.c 2011-01-01 00:54:07.000000000 +0100 +@@ -391,6 +391,7 @@ captured_main (void *data) {"xdb", no_argument, &xdb_commands, 1}, {"dbx", no_argument, &dbx_commands, 1}, {"readnow", no_argument, &readnow_symbol_files, 1}, @@ -40,7 +40,7 @@ Index: gdb-7.2.50.20101116/gdb/main.c {"r", no_argument, &readnow_symbol_files, 1}, {"quiet", no_argument, &quiet, 1}, {"q", no_argument, &quiet, 1}, -@@ -982,6 +983,7 @@ Options:\n\n\ +@@ -993,6 +994,7 @@ Options:\n\n\ fputs_unfiltered (_(" file.\n\ --quiet Do not print version number on startup.\n\ --readnow Fully read symbol files on first access.\n\ @@ -48,10 +48,10 @@ Index: gdb-7.2.50.20101116/gdb/main.c "), stream); fputs_unfiltered (_("\ --se=FILE Use FILE as symbol file and executable file.\n\ -Index: gdb-7.2.50.20101116/gdb/symfile.c +Index: gdb-7.2.50.20101231/gdb/symfile.c =================================================================== ---- gdb-7.2.50.20101116.orig/gdb/symfile.c 2010-10-17 20:49:46.000000000 +0200 -+++ gdb-7.2.50.20101116/gdb/symfile.c 2010-11-16 07:59:31.000000000 +0100 +--- gdb-7.2.50.20101231.orig/gdb/symfile.c 2010-11-23 01:59:58.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/symfile.c 2011-01-01 00:54:07.000000000 +0100 @@ -80,6 +80,7 @@ static void clear_symtab_users_cleanup ( /* Global variables owned by this file */ @@ -60,10 +60,10 @@ Index: gdb-7.2.50.20101116/gdb/symfile.c /* External variables and functions referenced. */ -Index: gdb-7.2.50.20101116/gdb/dwarf2read.c +Index: gdb-7.2.50.20101231/gdb/dwarf2read.c =================================================================== ---- gdb-7.2.50.20101116.orig/gdb/dwarf2read.c 2010-11-16 07:54:02.000000000 +0100 -+++ gdb-7.2.50.20101116/gdb/dwarf2read.c 2010-11-16 08:00:18.000000000 +0100 +--- gdb-7.2.50.20101231.orig/gdb/dwarf2read.c 2011-01-01 00:41:51.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/dwarf2read.c 2011-01-01 00:54:07.000000000 +0100 @@ -57,6 +57,7 @@ #include "vec.h" #include "c-lang.h" @@ -72,7 +72,7 @@ Index: gdb-7.2.50.20101116/gdb/dwarf2read.c #include #include "gdb_string.h" -@@ -1356,8 +1357,9 @@ dwarf2_has_info (struct objfile *objfile +@@ -1345,8 +1346,9 @@ dwarf2_has_info (struct objfile *objfile bfd_map_over_sections (objfile->obfd, dwarf2_locate_sections, NULL); dwarf2_per_objfile->objfile = objfile; } @@ -84,15 +84,15 @@ Index: gdb-7.2.50.20101116/gdb/dwarf2read.c } /* When loading sections, we can either look for ".", or for -Index: gdb-7.2.50.20101116/gdb/top.h +Index: gdb-7.2.50.20101231/gdb/top.h =================================================================== ---- gdb-7.2.50.20101116.orig/gdb/top.h 2010-04-07 18:54:39.000000000 +0200 -+++ gdb-7.2.50.20101116/gdb/top.h 2010-11-16 07:59:31.000000000 +0100 +--- gdb-7.2.50.20101231.orig/gdb/top.h 2010-12-29 01:58:14.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/top.h 2011-01-01 00:54:21.000000000 +0100 @@ -61,6 +61,7 @@ extern void set_prompt (char *); /* From random places. */ extern int readnow_symbol_files; +extern int readnever_symbol_files; - /* Perform _initialize initialization */ + /* Perform _initialize initialization. */ extern void gdb_init (char *); diff --git a/gdb-6.3-security-errata-20050610.patch b/gdb-6.3-security-errata-20050610.patch index 37765f9..0fe68df 100644 --- a/gdb-6.3-security-errata-20050610.patch +++ b/gdb-6.3-security-errata-20050610.patch @@ -19,10 +19,10 @@ Proposed upstream but never committed upstream. (source_command): Update documentation. Check permissions if FROM_TTY is -1. -Index: gdb-7.1.90.20100720/gdb/cli/cli-cmds.c +Index: gdb-7.2.50.20101231/gdb/cli/cli-cmds.c =================================================================== ---- gdb-7.1.90.20100720.orig/gdb/cli/cli-cmds.c 2010-05-17 21:28:12.000000000 +0200 -+++ gdb-7.1.90.20100720/gdb/cli/cli-cmds.c 2010-07-21 20:30:30.000000000 +0200 +--- gdb-7.2.50.20101231.orig/gdb/cli/cli-cmds.c 2010-12-29 03:11:04.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/cli/cli-cmds.c 2011-01-01 00:53:51.000000000 +0100 @@ -39,6 +39,7 @@ #include "source.h" #include "disasm.h" @@ -31,7 +31,7 @@ Index: gdb-7.1.90.20100720/gdb/cli/cli-cmds.c #include "ui-out.h" -@@ -487,7 +488,7 @@ Script filename extension recognition is +@@ -488,7 +489,7 @@ Script filename extension recognition is int find_and_open_script (const char *script_file, int search_path, @@ -40,7 +40,7 @@ Index: gdb-7.1.90.20100720/gdb/cli/cli-cmds.c { char *file; int fd; -@@ -513,6 +514,32 @@ find_and_open_script (const char *script +@@ -514,6 +515,32 @@ find_and_open_script (const char *script return 0; } @@ -73,7 +73,7 @@ Index: gdb-7.1.90.20100720/gdb/cli/cli-cmds.c do_cleanups (old_cleanups); *streamp = fdopen (fd, FOPEN_RT); -@@ -572,13 +599,14 @@ source_script_with_search (const char *f +@@ -573,13 +600,14 @@ source_script_with_search (const char *f if (file == NULL || *file == 0) error (_("source command requires file name of file to source.")); @@ -81,19 +81,19 @@ Index: gdb-7.1.90.20100720/gdb/cli/cli-cmds.c + if (!find_and_open_script (file, search_path, &stream, &full_path, + from_tty)) { - /* The script wasn't found, or was otherwise inaccessible. - If the source command was invoked interactively, throw an error. - Otherwise (e.g. if it was invoked by a script), silently ignore - the error. */ + /* The script wasn't found, or was otherwise inaccessible. + If the source command was invoked interactively, throw an + error. Otherwise (e.g. if it was invoked by a script), + silently ignore the error. */ - if (from_tty) + if (from_tty > 0) perror_with_name (file); else return; -Index: gdb-7.1.90.20100720/gdb/testsuite/gdb.base/gdbinit.exp +Index: gdb-7.2.50.20101231/gdb/testsuite/gdb.base/gdbinit.exp =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-7.1.90.20100720/gdb/testsuite/gdb.base/gdbinit.exp 2010-07-20 22:25:40.000000000 +0200 ++++ gdb-7.2.50.20101231/gdb/testsuite/gdb.base/gdbinit.exp 2011-01-01 00:53:09.000000000 +0100 @@ -0,0 +1,91 @@ +# Copyright 2005 +# Free Software Foundation, Inc. @@ -186,17 +186,17 @@ Index: gdb-7.1.90.20100720/gdb/testsuite/gdb.base/gdbinit.exp +} + +remote_exec build "rm .gdbinit" -Index: gdb-7.1.90.20100720/gdb/testsuite/gdb.base/gdbinit.sample +Index: gdb-7.2.50.20101231/gdb/testsuite/gdb.base/gdbinit.sample =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-7.1.90.20100720/gdb/testsuite/gdb.base/gdbinit.sample 2010-07-20 22:25:40.000000000 +0200 ++++ gdb-7.2.50.20101231/gdb/testsuite/gdb.base/gdbinit.sample 2011-01-01 00:53:09.000000000 +0100 @@ -0,0 +1 @@ +echo "\nin gdbinit" -Index: gdb-7.1.90.20100720/gdb/main.c +Index: gdb-7.2.50.20101231/gdb/main.c =================================================================== ---- gdb-7.1.90.20100720.orig/gdb/main.c 2010-06-26 08:44:47.000000000 +0200 -+++ gdb-7.1.90.20100720/gdb/main.c 2010-07-21 20:09:03.000000000 +0200 -@@ -794,7 +794,7 @@ Excess command line arguments ignored. ( +--- gdb-7.2.50.20101231.orig/gdb/main.c 2010-12-29 01:58:14.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/main.c 2011-01-01 00:53:09.000000000 +0100 +@@ -805,7 +805,7 @@ Excess command line arguments ignored. ( debugging or what directory you are in. */ if (home_gdbinit && !inhibit_gdbinit) @@ -205,7 +205,7 @@ Index: gdb-7.1.90.20100720/gdb/main.c /* Now perform all the actions indicated by the arguments. */ if (cdarg != NULL) -@@ -868,7 +868,7 @@ Can't attach to process and specify a co +@@ -880,7 +880,7 @@ Can't attach to process and specify a co /* Read the .gdbinit file in the current directory, *if* it isn't the same as the $HOME/.gdbinit file (it should exist, also). */ if (local_gdbinit && !inhibit_gdbinit) @@ -214,11 +214,11 @@ Index: gdb-7.1.90.20100720/gdb/main.c /* Now that all .gdbinit's have been read and all -d options have been processed, we can read any scripts mentioned in SYMARG. -Index: gdb-7.1.90.20100720/gdb/python/py-auto-load.c +Index: gdb-7.2.50.20101231/gdb/python/py-auto-load.c =================================================================== ---- gdb-7.1.90.20100720.orig/gdb/python/py-auto-load.c 2010-05-17 23:23:25.000000000 +0200 -+++ gdb-7.1.90.20100720/gdb/python/py-auto-load.c 2010-07-20 22:25:40.000000000 +0200 -@@ -219,7 +219,7 @@ source_section_scripts (struct objfile * +--- gdb-7.2.50.20101231.orig/gdb/python/py-auto-load.c 2010-12-15 18:27:59.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/python/py-auto-load.c 2011-01-01 00:53:09.000000000 +0100 +@@ -224,7 +224,7 @@ source_section_scripts (struct objfile * } opened = find_and_open_script (file, 1 /*search_path*/, @@ -227,10 +227,10 @@ Index: gdb-7.1.90.20100720/gdb/python/py-auto-load.c /* If the file is not found, we still record the file in the hash table, we only want to print an error message once. -Index: gdb-7.1.90.20100720/gdb/cli/cli-cmds.h +Index: gdb-7.2.50.20101231/gdb/cli/cli-cmds.h =================================================================== ---- gdb-7.1.90.20100720.orig/gdb/cli/cli-cmds.h 2010-05-03 01:52:14.000000000 +0200 -+++ gdb-7.1.90.20100720/gdb/cli/cli-cmds.h 2010-07-20 22:25:40.000000000 +0200 +--- gdb-7.2.50.20101231.orig/gdb/cli/cli-cmds.h 2010-12-29 03:11:04.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/cli/cli-cmds.h 2011-01-01 00:53:09.000000000 +0100 @@ -126,7 +126,8 @@ extern void source_script (char *, int); /* Exported to objfiles.c. */ diff --git a/gdb-6.5-dwarf-stack-overflow.patch b/gdb-6.5-dwarf-stack-overflow.patch deleted file mode 100644 index 0d107b3..0000000 --- a/gdb-6.5-dwarf-stack-overflow.patch +++ /dev/null @@ -1,52 +0,0 @@ -for gdb/ChangeLog: -2006-08-22 Will Drewry - Tavis Ormandy - - * dwarf2read.c (decode_locdesc): Enforce location description stack - boundaries. - * dwarfread.c (locval): Likewise. - -2007-10-15 Jan Kratochvil - - Port to GDB-6.7. - -Index: gdb-7.1.90.20100711/gdb/dwarf2read.c -=================================================================== ---- gdb-7.1.90.20100711.orig/gdb/dwarf2read.c 2010-07-12 10:43:53.000000000 +0200 -+++ gdb-7.1.90.20100711/gdb/dwarf2read.c 2010-07-12 10:49:32.000000000 +0200 -@@ -11382,8 +11382,7 @@ read_signatured_type (struct objfile *ob - callers will only want a very basic result and this can become a - complaint. - -- Note that stack[0] is unused except as a default error return. -- Note that stack overflow is not yet handled. */ -+ Note that stack[0] is unused except as a default error return. */ - - static CORE_ADDR - decode_locdesc (struct dwarf_block *blk, struct dwarf2_cu *cu) -@@ -11399,7 +11398,7 @@ decode_locdesc (struct dwarf_block *blk, - - i = 0; - stacki = 0; -- stack[stacki] = 0; -+ stack[++stacki] = 0; - - while (i < size) - { -@@ -11581,6 +11580,16 @@ decode_locdesc (struct dwarf_block *blk, - dwarf_stack_op_name (op, 1)); - return (stack[stacki]); - } -+ /* Enforce maximum stack depth of size-1 to avoid ++stacki writing -+ outside of the allocated space. Also enforce minimum > 0. -+ -- wad@google.com 14 Aug 2006 */ -+ if (stacki >= sizeof (stack) / sizeof (*stack) - 1) -+ internal_error (__FILE__, __LINE__, -+ _("location description stack too deep: %d"), -+ stacki); -+ if (stacki <= 0) -+ internal_error (__FILE__, __LINE__, -+ _("location description stack too shallow")); - } - return (stack[stacki]); - } diff --git a/gdb-6.6-buildid-locate-core-as-arg.patch b/gdb-6.6-buildid-locate-core-as-arg.patch index a430667..c8b8883 100644 --- a/gdb-6.6-buildid-locate-core-as-arg.patch +++ b/gdb-6.6-buildid-locate-core-as-arg.patch @@ -58,10 +58,10 @@ Http://sourceware.org/ml/gdb-patches/2010-01/msg00517.html * exec.c (exec_file_attach): Print a more useful error message if the user did "gdb core". -Index: gdb-7.1.90.20100711/gdb/exceptions.h +Index: gdb-7.2.50.20101231/gdb/exceptions.h =================================================================== ---- gdb-7.1.90.20100711.orig/gdb/exceptions.h 2010-05-03 01:52:14.000000000 +0200 -+++ gdb-7.1.90.20100711/gdb/exceptions.h 2010-07-13 22:56:29.000000000 +0200 +--- gdb-7.2.50.20101231.orig/gdb/exceptions.h 2010-05-03 01:52:14.000000000 +0200 ++++ gdb-7.2.50.20101231/gdb/exceptions.h 2011-01-01 01:10:44.000000000 +0100 @@ -78,6 +78,9 @@ enum errors { /* Feature is not supported in this copy of GDB. */ UNSUPPORTED_ERROR, @@ -72,10 +72,10 @@ Index: gdb-7.1.90.20100711/gdb/exceptions.h /* Add more errors here. */ NR_ERRORS }; -Index: gdb-7.1.90.20100711/gdb/exec.c +Index: gdb-7.2.50.20101231/gdb/exec.c =================================================================== ---- gdb-7.1.90.20100711.orig/gdb/exec.c 2010-07-12 23:07:34.000000000 +0200 -+++ gdb-7.1.90.20100711/gdb/exec.c 2010-07-13 22:56:29.000000000 +0200 +--- gdb-7.2.50.20101231.orig/gdb/exec.c 2010-08-31 20:08:43.000000000 +0200 ++++ gdb-7.2.50.20101231/gdb/exec.c 2011-01-01 01:10:44.000000000 +0100 @@ -34,6 +34,7 @@ #include "arch-utils.h" #include "gdbthread.h" @@ -115,11 +115,11 @@ Index: gdb-7.1.90.20100711/gdb/exec.c } /* FIXME - This should only be run for RS6000, but the ifdef is a poor -Index: gdb-7.1.90.20100711/gdb/main.c +Index: gdb-7.2.50.20101231/gdb/main.c =================================================================== ---- gdb-7.1.90.20100711.orig/gdb/main.c 2010-07-12 23:07:34.000000000 +0200 -+++ gdb-7.1.90.20100711/gdb/main.c 2010-07-13 22:58:20.000000000 +0200 -@@ -241,6 +241,36 @@ captured_command_loop (void *data) +--- gdb-7.2.50.20101231.orig/gdb/main.c 2011-01-01 01:00:54.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/main.c 2011-01-01 01:11:48.000000000 +0100 +@@ -242,6 +242,36 @@ captured_command_loop (void *data) return 1; } @@ -156,7 +156,7 @@ Index: gdb-7.1.90.20100711/gdb/main.c static int captured_main (void *data) { -@@ -678,6 +708,8 @@ extern int gdbtk_test (char *); +@@ -688,6 +718,8 @@ captured_main (void *data) { symarg = argv[optind]; execarg = argv[optind]; @@ -165,7 +165,7 @@ Index: gdb-7.1.90.20100711/gdb/main.c optind++; } -@@ -816,10 +848,25 @@ Excess command line arguments ignored. ( +@@ -828,10 +860,25 @@ Excess command line arguments ignored. ( && symarg != NULL && strcmp (execarg, symarg) == 0) { @@ -182,11 +182,10 @@ Index: gdb-7.1.90.20100711/gdb/main.c + func = exec_file_attach; + /* The exec file and the symbol-file are the same. If we can't -- open it, better only print one error message. -- catch_command_errors returns non-zero on success! */ + open it, better only print one error message. +- catch_command_errors returns non-zero on success! */ - if (catch_command_errors (exec_file_attach, execarg, !batch_flag, RETURN_MASK_ALL)) -+ open it, better only print one error message. -+ catch_command_errors returns non-zero on success! ++ catch_command_errors returns non-zero on success! + Do not load EXECARG as a symbol file if it has been already processed + as a core file. */ + if (catch_command_errors (func, execarg, !batch_flag, RETURN_MASK_ALL) diff --git a/gdb-6.6-buildid-locate-rpm.patch b/gdb-6.6-buildid-locate-rpm.patch index 4416e68..477cc27 100644 --- a/gdb-6.6-buildid-locate-rpm.patch +++ b/gdb-6.6-buildid-locate-rpm.patch @@ -1,25 +1,25 @@ -Index: gdb-7.2.50.20101116/gdb/event-top.c +Index: gdb-7.2.50.20101231/gdb/event-top.c =================================================================== ---- gdb-7.2.50.20101116.orig/gdb/event-top.c 2010-09-11 18:00:25.000000000 +0200 -+++ gdb-7.2.50.20101116/gdb/event-top.c 2010-11-16 08:14:26.000000000 +0100 +--- gdb-7.2.50.20101231.orig/gdb/event-top.c 2010-12-29 01:58:14.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/event-top.c 2011-01-01 01:07:37.000000000 +0100 @@ -33,6 +33,7 @@ #include "cli/cli-script.h" /* for reset_command_nest_depth */ #include "main.h" #include "gdbthread.h" +#include "symfile.h" - /* For dont_repeat() */ - #include "gdbcmd.h" -@@ -193,6 +194,8 @@ cli_command_loop (void) + #include "gdbcmd.h" /* for dont_repeat() */ + +@@ -192,6 +193,8 @@ cli_command_loop (void) char *a_prompt; char *gdb_prompt = get_prompt (); + debug_flush_missing (); + - /* Tell readline what the prompt to display is and what function it - will need to call after a whole line is read. This also displays - the first prompt. */ -@@ -264,6 +267,8 @@ display_gdb_prompt (char *new_prompt) + /* Tell readline what the prompt to display is and what function + it will need to call after a whole line is read. This also + displays the first prompt. */ +@@ -263,6 +266,8 @@ display_gdb_prompt (char *new_prompt) /* Reset the nesting depth used when trace-commands is set. */ reset_command_nest_depth (); @@ -28,10 +28,10 @@ Index: gdb-7.2.50.20101116/gdb/event-top.c /* Each interpreter has its own rules on displaying the command prompt. */ if (!current_interp_display_prompt_p ()) -Index: gdb-7.2.50.20101116/gdb/elfread.c +Index: gdb-7.2.50.20101231/gdb/elfread.c =================================================================== ---- gdb-7.2.50.20101116.orig/gdb/elfread.c 2010-11-16 08:04:18.000000000 +0100 -+++ gdb-7.2.50.20101116/gdb/elfread.c 2010-11-16 08:14:26.000000000 +0100 +--- gdb-7.2.50.20101231.orig/gdb/elfread.c 2011-01-01 01:05:01.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/elfread.c 2011-01-01 01:05:10.000000000 +0100 @@ -42,6 +42,7 @@ #include "gdbcore.h" #include "gdbcmd.h" @@ -464,11 +464,11 @@ Index: gdb-7.2.50.20101116/gdb/elfread.c } static char * -Index: gdb-7.2.50.20101116/gdb/symfile.h +Index: gdb-7.2.50.20101231/gdb/symfile.h =================================================================== ---- gdb-7.2.50.20101116.orig/gdb/symfile.h 2010-11-16 08:04:18.000000000 +0100 -+++ gdb-7.2.50.20101116/gdb/symfile.h 2010-11-16 08:14:26.000000000 +0100 -@@ -552,6 +552,8 @@ extern struct build_id *build_id_addr_ge +--- gdb-7.2.50.20101231.orig/gdb/symfile.h 2011-01-01 01:05:01.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/symfile.h 2011-01-01 01:05:10.000000000 +0100 +@@ -559,6 +559,8 @@ extern struct build_id *build_id_addr_ge extern char *build_id_to_filename (struct build_id *build_id, char **link_return, int add_debug_suffix); extern void debug_print_missing (const char *binary, const char *debug); @@ -477,11 +477,11 @@ Index: gdb-7.2.50.20101116/gdb/symfile.h /* From dwarf2read.c */ -Index: gdb-7.2.50.20101116/gdb/testsuite/lib/gdb.exp +Index: gdb-7.2.50.20101231/gdb/testsuite/lib/gdb.exp =================================================================== ---- gdb-7.2.50.20101116.orig/gdb/testsuite/lib/gdb.exp 2010-11-16 08:04:18.000000000 +0100 -+++ gdb-7.2.50.20101116/gdb/testsuite/lib/gdb.exp 2010-11-16 08:14:26.000000000 +0100 -@@ -1358,7 +1358,7 @@ proc default_gdb_start { } { +--- gdb-7.2.50.20101231.orig/gdb/testsuite/lib/gdb.exp 2011-01-01 01:05:01.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/testsuite/lib/gdb.exp 2011-01-01 01:05:10.000000000 +0100 +@@ -1389,7 +1389,7 @@ proc default_gdb_start { } { warning "Couldn't set the width to 0." } } @@ -490,10 +490,10 @@ Index: gdb-7.2.50.20101116/gdb/testsuite/lib/gdb.exp send_gdb "set build-id-verbose 0\n" gdb_expect 10 { -re "$gdb_prompt $" { -Index: gdb-7.2.50.20101116/gdb/testsuite/lib/mi-support.exp +Index: gdb-7.2.50.20101231/gdb/testsuite/lib/mi-support.exp =================================================================== ---- gdb-7.2.50.20101116.orig/gdb/testsuite/lib/mi-support.exp 2010-11-16 08:04:18.000000000 +0100 -+++ gdb-7.2.50.20101116/gdb/testsuite/lib/mi-support.exp 2010-11-16 08:14:26.000000000 +0100 +--- gdb-7.2.50.20101231.orig/gdb/testsuite/lib/mi-support.exp 2011-01-01 01:05:01.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/testsuite/lib/mi-support.exp 2011-01-01 01:05:10.000000000 +0100 @@ -221,7 +221,7 @@ proc default_mi_gdb_start { args } { } } @@ -503,10 +503,10 @@ Index: gdb-7.2.50.20101116/gdb/testsuite/lib/mi-support.exp send_gdb "190-gdb-set build-id-verbose 0\n" gdb_expect 10 { -re ".*190-gdb-set build-id-verbose 0\r\n190\\\^done\r\n$mi_gdb_prompt$" { -Index: gdb-7.2.50.20101116/gdb/tui/tui-interp.c +Index: gdb-7.2.50.20101231/gdb/tui/tui-interp.c =================================================================== ---- gdb-7.2.50.20101116.orig/gdb/tui/tui-interp.c 2010-05-18 00:21:43.000000000 +0200 -+++ gdb-7.2.50.20101116/gdb/tui/tui-interp.c 2010-11-16 08:14:26.000000000 +0100 +--- gdb-7.2.50.20101231.orig/gdb/tui/tui-interp.c 2010-05-18 00:21:43.000000000 +0200 ++++ gdb-7.2.50.20101231/gdb/tui/tui-interp.c 2011-01-01 01:05:10.000000000 +0100 @@ -30,6 +30,7 @@ #include "tui/tui.h" #include "tui/tui-io.h" @@ -524,10 +524,10 @@ Index: gdb-7.2.50.20101116/gdb/tui/tui-interp.c /* Tell readline what the prompt to display is and what function it will need to call after a whole line is read. This also displays the first prompt. */ -Index: gdb-7.2.50.20101116/gdb/aclocal.m4 +Index: gdb-7.2.50.20101231/gdb/aclocal.m4 =================================================================== ---- gdb-7.2.50.20101116.orig/gdb/aclocal.m4 2010-05-23 02:56:59.000000000 +0200 -+++ gdb-7.2.50.20101116/gdb/aclocal.m4 2010-11-16 08:14:26.000000000 +0100 +--- gdb-7.2.50.20101231.orig/gdb/aclocal.m4 2010-05-23 02:56:59.000000000 +0200 ++++ gdb-7.2.50.20101231/gdb/aclocal.m4 2011-01-01 01:05:10.000000000 +0100 @@ -19,6 +19,162 @@ You have another version of autoconf. I If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) @@ -691,10 +691,10 @@ Index: gdb-7.2.50.20101116/gdb/aclocal.m4 # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation -Index: gdb-7.2.50.20101116/gdb/config.in +Index: gdb-7.2.50.20101231/gdb/config.in =================================================================== ---- gdb-7.2.50.20101116.orig/gdb/config.in 2010-09-02 19:12:35.000000000 +0200 -+++ gdb-7.2.50.20101116/gdb/config.in 2010-11-16 08:14:26.000000000 +0100 +--- gdb-7.2.50.20101231.orig/gdb/config.in 2010-09-02 19:12:35.000000000 +0200 ++++ gdb-7.2.50.20101231/gdb/config.in 2011-01-01 01:05:10.000000000 +0100 @@ -46,6 +46,9 @@ /* Define to BFD's default target vector. */ #undef DEFAULT_BFD_VEC @@ -715,11 +715,11 @@ Index: gdb-7.2.50.20101116/gdb/config.in /* Define if libunwind library is being used. */ #undef HAVE_LIBUNWIND -Index: gdb-7.2.50.20101116/gdb/configure +Index: gdb-7.2.50.20101231/gdb/configure =================================================================== ---- gdb-7.2.50.20101116.orig/gdb/configure 2010-11-05 02:50:17.000000000 +0100 -+++ gdb-7.2.50.20101116/gdb/configure 2010-11-16 08:15:33.000000000 +0100 -@@ -679,6 +679,9 @@ REPORT_BUGS_TO +--- gdb-7.2.50.20101231.orig/gdb/configure 2010-12-14 08:17:14.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/configure 2011-01-01 01:08:50.000000000 +0100 +@@ -680,6 +680,9 @@ REPORT_BUGS_TO PKGVERSION TARGET_OBS subdirs @@ -729,7 +729,7 @@ Index: gdb-7.2.50.20101116/gdb/configure GDB_DATADIR DEBUGDIR am__fastdepCC_FALSE -@@ -945,6 +948,7 @@ enable_dependency_tracking +@@ -946,6 +949,7 @@ enable_dependency_tracking with_separate_debug_dir with_gdb_datadir with_relocated_sources @@ -737,7 +737,7 @@ Index: gdb-7.2.50.20101116/gdb/configure enable_targets enable_64_bit_bfd enable_gdbcli -@@ -986,6 +990,9 @@ LDFLAGS +@@ -987,6 +991,9 @@ LDFLAGS LIBS CPPFLAGS CPP @@ -747,7 +747,7 @@ Index: gdb-7.2.50.20101116/gdb/configure YACC YFLAGS XMKMF' -@@ -1649,6 +1656,8 @@ Optional Packages: +@@ -1650,6 +1657,8 @@ Optional Packages: [DATADIR/gdb] --with-relocated-sources=PATH automatically relocate this path for source files @@ -756,7 +756,7 @@ Index: gdb-7.2.50.20101116/gdb/configure --with-libunwind use libunwind frame unwinding support --with-curses use the curses library instead of the termcap library -@@ -1684,6 +1693,9 @@ Some influential environment variables: +@@ -1685,6 +1694,9 @@ Some influential environment variables: CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor @@ -766,7 +766,7 @@ Index: gdb-7.2.50.20101116/gdb/configure YACC The `Yet Another C Compiler' implementation to use. Defaults to the first program found out of: `bison -y', `byacc', `yacc'. YFLAGS The list of arguments that will be passed by default to $YACC. -@@ -7881,6 +7893,486 @@ _ACEOF +@@ -7882,6 +7894,486 @@ _ACEOF fi @@ -1252,11 +1252,11 @@ Index: gdb-7.2.50.20101116/gdb/configure + - subdirs="$subdirs doc testsuite" -Index: gdb-7.2.50.20101116/gdb/configure.ac + subdirs="$subdirs testsuite" +Index: gdb-7.2.50.20101231/gdb/configure.ac =================================================================== ---- gdb-7.2.50.20101116.orig/gdb/configure.ac 2010-11-05 02:50:18.000000000 +0100 -+++ gdb-7.2.50.20101116/gdb/configure.ac 2010-11-16 08:15:10.000000000 +0100 +--- gdb-7.2.50.20101231.orig/gdb/configure.ac 2010-12-14 08:17:15.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/configure.ac 2011-01-01 01:08:28.000000000 +0100 @@ -108,6 +108,199 @@ AS_HELP_STRING([--with-relocated-sources [Relocated directory for source files. ]) ]) @@ -1454,13 +1454,13 @@ Index: gdb-7.2.50.20101116/gdb/configure.ac + fi +fi + - AC_CONFIG_SUBDIRS(doc testsuite) + AC_CONFIG_SUBDIRS(testsuite) # Check whether to support alternative target configurations -Index: gdb-7.2.50.20101116/gdb/acinclude.m4 +Index: gdb-7.2.50.20101231/gdb/acinclude.m4 =================================================================== ---- gdb-7.2.50.20101116.orig/gdb/acinclude.m4 2010-05-27 05:40:45.000000000 +0200 -+++ gdb-7.2.50.20101116/gdb/acinclude.m4 2010-11-16 08:14:26.000000000 +0100 +--- gdb-7.2.50.20101231.orig/gdb/acinclude.m4 2010-05-27 05:40:45.000000000 +0200 ++++ gdb-7.2.50.20101231/gdb/acinclude.m4 2011-01-01 01:05:10.000000000 +0100 @@ -1,3 +1,5 @@ +# serial 1 + @@ -1476,10 +1476,10 @@ Index: gdb-7.2.50.20101116/gdb/acinclude.m4 # @defmac AC_PROG_CC_STDC # @maindex PROG_CC_STDC # @ovindex CC -Index: gdb-7.2.50.20101116/gdb/corelow.c +Index: gdb-7.2.50.20101231/gdb/corelow.c =================================================================== ---- gdb-7.2.50.20101116.orig/gdb/corelow.c 2010-11-16 08:04:18.000000000 +0100 -+++ gdb-7.2.50.20101116/gdb/corelow.c 2010-11-16 08:14:26.000000000 +0100 +--- gdb-7.2.50.20101231.orig/gdb/corelow.c 2011-01-01 01:05:01.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/corelow.c 2011-01-01 01:05:10.000000000 +0100 @@ -317,7 +317,7 @@ build_id_locate_exec (int from_tty) symfile_objfile->flags |= OBJF_BUILD_ID_CORE_LOADED; } diff --git a/gdb-6.6-bz225783-gdb-debuginfo-paths.patch b/gdb-6.6-bz225783-gdb-debuginfo-paths.patch deleted file mode 100644 index 639bbcd..0000000 --- a/gdb-6.6-bz225783-gdb-debuginfo-paths.patch +++ /dev/null @@ -1,33 +0,0 @@ -https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=225783 - - -Index: gdb-6.8.50.20081128/gdb/Makefile.in -=================================================================== ---- gdb-6.8.50.20081128.orig/gdb/Makefile.in 2008-12-02 23:06:16.000000000 +0100 -+++ gdb-6.8.50.20081128/gdb/Makefile.in 2008-12-02 23:28:02.000000000 +0100 -@@ -1490,8 +1490,10 @@ po/$(PACKAGE).pot: force - - .SUFFIXES: .y .l - .y.c: -- $(SHELL) $(YLWRAP) $< y.tab.c $@.tmp -- $(YACC) $(YFLAGS) -- -sed -e '/extern.*malloc/d' \ -+ rm -f $@ $@.tmp -+ $(SHELL) $(YLWRAP) $< y.tab.c $@ -- $(YACC) $(YFLAGS) && mv $@ $@.tmp \ -+ || (rm -f $@; false) -+ sed -e '/extern.*malloc/d' \ - -e '/extern.*realloc/d' \ - -e '/extern.*free/d' \ - -e '/include.*malloc.h/d' \ -@@ -1500,9 +1502,9 @@ po/$(PACKAGE).pot: force - -e 's/\([ \t;,(]\)free\([ \t]*[&(),]\)/\1xfree\2/g' \ - -e 's/\([ \t;,(]\)free$$/\1xfree/g' \ - -e '/^#line.*y.tab.c/d' \ -- < $@.tmp > $@.new -- -rm $@.tmp -- mv $@.new ./$*.c -+ -e "s/^\(#line.*\)`basename $<`/\1`echo $<|sed 's/\//\\\\\//g'`/" \ -+ < $@.tmp > $@ -+ rm -f $@.tmp - .l.c: - if [ "$(FLEX)" ] && $(FLEX) --version >/dev/null 2>&1; then \ - $(FLEX) -o$@ $< && \ diff --git a/gdb-6.6-readline-system.patch b/gdb-6.6-readline-system.patch deleted file mode 100644 index 02901e7..0000000 --- a/gdb-6.6-readline-system.patch +++ /dev/null @@ -1,116 +0,0 @@ -2007-10-16 Jan Kratochvil - - Port to GDB-6.7. - -Index: gdb-6.7/gdb/doc/Makefile.in -=================================================================== ---- gdb-6.7.orig/gdb/doc/Makefile.in 2007-07-26 12:34:00.000000000 +0200 -+++ gdb-6.7/gdb/doc/Makefile.in 2007-10-16 16:31:08.000000000 +0200 -@@ -109,9 +109,7 @@ DVIPS = dvips - GDB_DOC_SOURCE_INCLUDES = \ - $(srcdir)/fdl.texi \ - $(srcdir)/gpl.texi \ -- $(srcdir)/agentexpr.texi \ -- $(READLINE_DIR)/rluser.texi \ -- $(READLINE_DIR)/inc-hist.texinfo -+ $(srcdir)/agentexpr.texi - GDB_DOC_BUILD_INCLUDES = \ - gdb-cfg.texi \ - GDBvn.texi -Index: gdb-6.7/gdb/doc/gdb.texinfo -=================================================================== ---- gdb-6.7.orig/gdb/doc/gdb.texinfo 2007-10-16 16:19:19.000000000 +0200 -+++ gdb-6.7/gdb/doc/gdb.texinfo 2007-10-16 16:32:10.000000000 +0200 -@@ -158,8 +158,8 @@ software in general. We will miss him. - - * GDB Bugs:: Reporting bugs in @value{GDBN} - --* Command Line Editing:: Command Line Editing --* Using History Interactively:: Using History Interactively -+* Command Line Editing: (rluserman). Command Line Editing -+* Using History Interactively: (history). Using History Interactively - * Formatting Documentation:: How to format and print @value{GDBN} documentation - * Installing GDB:: Installing GDB - * Maintenance Commands:: Maintenance Commands -@@ -15533,7 +15533,7 @@ Disable command line editing. - Show whether command line editing is enabled. - @end table - --@xref{Command Line Editing}, for more details about the Readline -+@xref{Command Line Editing, , , rluserman, GNU Readline Library}, for more details about the Readline - interface. Users unfamiliar with @sc{gnu} Emacs or @code{vi} are - encouraged to read that chapter. - -@@ -15548,7 +15548,8 @@ history facility. - - @value{GDBN} uses the @sc{gnu} History library, a part of the Readline - package, to provide the history facility. @xref{Using History --Interactively}, for the detailed description of the History library. -+Interactively, , , history, GNU History Library}, for the detailed description -+of the History library. - - To issue a command to @value{GDBN} without affecting certain aspects of - the state which is seen by users, prefix it with @samp{server } -@@ -15600,7 +15601,7 @@ This defaults to the value of the enviro - @end table - - History expansion assigns special meaning to the character @kbd{!}. --@xref{Event Designators}, for more details. -+@xref{Event Designators, , , history, GNU History Library}, for more details. - - @cindex history expansion, turn on/off - Since @kbd{!} is also the logical not operator in C, history expansion -@@ -16660,7 +16661,8 @@ Indicates the current program counter ad - @cindex TUI key bindings - - The TUI installs several key bindings in the readline keymaps --(@pxref{Command Line Editing}). The following key bindings -+(@pxref{Command Line Editing, , , rluserman, GNU Readline Library}). -+The following key bindings - are installed for both TUI mode and the @value{GDBN} standard mode. - - @table @kbd -@@ -21937,15 +21939,6 @@ Such guesses are usually wrong. Even we - things without first using the debugger to find the facts. - @end itemize - --@c The readline documentation is distributed with the readline code --@c and consists of the two following files: --@c rluser.texinfo --@c inc-hist.texinfo --@c Use -I with makeinfo to point to the appropriate directory, --@c environment var TEXINPUTS with TeX. --@include rluser.texi --@include inc-hist.texinfo -- - - @node Formatting Documentation - @appendix Formatting Documentation -@@ -22115,9 +22108,6 @@ source for the @samp{-liberty} free soft - @item gdb-@value{GDBVN}/opcodes - source for the library of opcode tables and disassemblers - --@item gdb-@value{GDBVN}/readline --source for the @sc{gnu} command-line interface -- - @item gdb-@value{GDBVN}/glob - source for the @sc{gnu} filename pattern-matching subroutine - -@@ -22149,7 +22139,7 @@ where @var{host} is an identifier such a - correct value by examining your system.) - - Running @samp{configure @var{host}} and then running @code{make} builds the --@file{bfd}, @file{readline}, @file{mmalloc}, and @file{libiberty} -+@file{bfd}, @file{mmalloc}, and @file{libiberty} - libraries, then @code{gdb} itself. The configured source files, and the - binaries, are left in the corresponding source directories. - -@@ -22175,7 +22165,7 @@ source tree, the @file{gdb-@var{version- - that subdirectory. That is usually not what you want. In particular, - if you run the first @file{configure} from the @file{gdb} subdirectory - of the @file{gdb-@var{version-number}} directory, you will omit the --configuration of @file{bfd}, @file{readline}, and other sibling -+configuration of @file{bfd}, and other sibling - directories of the @file{gdb} subdirectory. This leads to build errors - about missing include files such as @file{bfd/bfd.h}. - diff --git a/gdb-6.6-scheduler_locking-step-sw-watchpoints2.patch b/gdb-6.6-scheduler_locking-step-sw-watchpoints2.patch index f19712e..e894258 100644 --- a/gdb-6.6-scheduler_locking-step-sw-watchpoints2.patch +++ b/gdb-6.6-scheduler_locking-step-sw-watchpoints2.patch @@ -21,11 +21,11 @@ Port to GDB-6.8pre. -Index: gdb-7.2.50.20101116/gdb/inferior.h +Index: gdb-7.2.50.20101231/gdb/inferior.h =================================================================== ---- gdb-7.2.50.20101116.orig/gdb/inferior.h 2010-06-24 17:17:30.000000000 +0200 -+++ gdb-7.2.50.20101116/gdb/inferior.h 2010-11-16 07:54:36.000000000 +0100 -@@ -198,7 +198,15 @@ extern void reopen_exec_file (void); +--- gdb-7.2.50.20101231.orig/gdb/inferior.h 2011-01-01 01:25:01.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/inferior.h 2011-01-01 01:25:16.000000000 +0100 +@@ -186,7 +186,15 @@ extern void reopen_exec_file (void); /* The `resume' routine should only be called in special circumstances. Normally, use `proceed', which handles a lot of bookkeeping. */ @@ -42,11 +42,11 @@ Index: gdb-7.2.50.20101116/gdb/inferior.h /* From misc files */ -Index: gdb-7.2.50.20101116/gdb/infrun.c +Index: gdb-7.2.50.20101231/gdb/infrun.c =================================================================== ---- gdb-7.2.50.20101116.orig/gdb/infrun.c 2010-11-16 07:53:59.000000000 +0100 -+++ gdb-7.2.50.20101116/gdb/infrun.c 2010-11-16 07:55:23.000000000 +0100 -@@ -74,7 +74,7 @@ static int follow_fork (void); +--- gdb-7.2.50.20101231.orig/gdb/infrun.c 2011-01-01 01:25:01.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/infrun.c 2011-01-01 01:25:29.000000000 +0100 +@@ -76,7 +76,7 @@ static int follow_fork (void); static void set_schedlock_func (char *args, int from_tty, struct cmd_list_element *c); @@ -55,7 +55,7 @@ Index: gdb-7.2.50.20101116/gdb/infrun.c static int currently_stepping_or_nexting_callback (struct thread_info *tp, void *data); -@@ -1557,7 +1557,7 @@ maybe_software_singlestep (struct gdbarc +@@ -1570,7 +1570,7 @@ maybe_software_singlestep (struct gdbarc STEP nonzero if we should step (zero to continue instead). SIG is the signal to give the inferior (zero for none). */ void @@ -64,24 +64,24 @@ Index: gdb-7.2.50.20101116/gdb/infrun.c { int should_resume = 1; struct cleanup *old_cleanups = make_cleanup (resume_cleanups, 0); -@@ -1589,10 +1589,12 @@ resume (int step, enum target_signal sig +@@ -1602,10 +1602,12 @@ resume (int step, enum target_signal sig } if (debug_infrun) - fprintf_unfiltered (gdb_stdlog, - "infrun: resume (step=%d, signal=%d), " - "trap_expected=%d\n", -- step, sig, tp->trap_expected); +- step, sig, tp->control.trap_expected); + fprintf_unfiltered (gdb_stdlog, "infrun: resume (step=%s, signal=%d), " + "trap_expected=%d\n", + (step == RESUME_STEP_CONTINUE ? "RESUME_STEP_CONTINUE" + : (step == RESUME_STEP_USER ? "RESUME_STEP_USER" + : "RESUME_STEP_NEEDED")), -+ sig, tp->trap_expected); ++ sig, tp->control.trap_expected); /* Normally, by the time we reach `resume', the breakpoints are either removed or inserted, as appropriate. The exception is if we're sitting -@@ -1710,9 +1712,10 @@ a command like `return' or `jump' to con +@@ -1723,9 +1725,10 @@ a command like `return' or `jump' to con individually. */ resume_ptid = inferior_ptid; } @@ -94,7 +94,7 @@ Index: gdb-7.2.50.20101116/gdb/infrun.c { /* User-settable 'scheduler' mode requires solo thread resume. */ resume_ptid = inferior_ptid; -@@ -1921,7 +1924,7 @@ proceed (CORE_ADDR addr, enum target_sig +@@ -1934,7 +1937,7 @@ proceed (CORE_ADDR addr, enum target_sig struct thread_info *tp; CORE_ADDR pc; struct address_space *aspace; @@ -103,7 +103,7 @@ Index: gdb-7.2.50.20101116/gdb/infrun.c /* If we're stopped at a fork/vfork, follow the branch set by the "set follow-fork-mode" command; otherwise, we'll just proceed -@@ -1956,13 +1959,13 @@ proceed (CORE_ADDR addr, enum target_sig +@@ -1969,13 +1972,13 @@ proceed (CORE_ADDR addr, enum target_sig actually be executing the breakpoint insn anyway. We'll be (un-)executing the previous instruction. */ @@ -119,7 +119,7 @@ Index: gdb-7.2.50.20101116/gdb/infrun.c } else { -@@ -2003,13 +2006,13 @@ proceed (CORE_ADDR addr, enum target_sig +@@ -2016,13 +2019,13 @@ proceed (CORE_ADDR addr, enum target_sig is required it returns TRUE and sets the current thread to the old thread. */ if (prepare_to_proceed (step)) @@ -133,9 +133,9 @@ Index: gdb-7.2.50.20101116/gdb/infrun.c - if (oneproc) + if (resume_step == RESUME_STEP_USER) { - tp->trap_expected = 1; + tp->control.trap_expected = 1; /* If displaced stepping is enabled, we can step over the -@@ -2096,8 +2099,13 @@ proceed (CORE_ADDR addr, enum target_sig +@@ -2109,8 +2112,13 @@ proceed (CORE_ADDR addr, enum target_sig /* Reset to normal state. */ init_infwait_state (); @@ -145,12 +145,12 @@ Index: gdb-7.2.50.20101116/gdb/infrun.c + resume_step = RESUME_STEP_NEEDED; + /* Resume inferior. */ -- resume (oneproc || step || bpstat_should_step (), tp->stop_signal); -+ resume (resume_step, tp->stop_signal); +- resume (oneproc || step || bpstat_should_step (), tp->suspend.stop_signal); ++ resume (resume_step, tp->suspend.stop_signal); /* Wait for it to stop (if not standalone) and in any case decode why it stopped, and act accordingly. */ -@@ -4859,13 +4867,18 @@ infrun: not switching back to stepped th +@@ -4933,14 +4941,19 @@ infrun: not switching back to stepped th /* Is thread TP in the middle of single-stepping? */ @@ -158,12 +158,14 @@ Index: gdb-7.2.50.20101116/gdb/infrun.c +static enum resume_step currently_stepping (struct thread_info *tp) { -- return ((tp->step_range_end && tp->step_resume_breakpoint == NULL) -- || tp->trap_expected -- || tp->stepping_through_solib_after_catch -- || bpstat_should_step ()); -+ if ((tp->step_range_end && tp->step_resume_breakpoint == NULL) -+ || tp->trap_expected +- return ((tp->control.step_range_end +- && tp->control.step_resume_breakpoint == NULL) +- || tp->control.trap_expected +- || tp->stepping_through_solib_after_catch +- || bpstat_should_step ()); ++ if ((tp->control.step_range_end ++ && tp->control.step_resume_breakpoint == NULL) ++ || tp->control.trap_expected + || tp->stepping_through_solib_after_catch) + return RESUME_STEP_USER; + @@ -174,11 +176,11 @@ Index: gdb-7.2.50.20101116/gdb/infrun.c } /* Returns true if any thread *but* the one passed in "data" is in the -Index: gdb-7.2.50.20101116/gdb/linux-nat.c +Index: gdb-7.2.50.20101231/gdb/linux-nat.c =================================================================== ---- gdb-7.2.50.20101116.orig/gdb/linux-nat.c 2010-11-16 07:53:59.000000000 +0100 -+++ gdb-7.2.50.20101116/gdb/linux-nat.c 2010-11-16 07:54:36.000000000 +0100 -@@ -2883,7 +2883,10 @@ count_events_callback (struct lwp_info * +--- gdb-7.2.50.20101231.orig/gdb/linux-nat.c 2011-01-01 01:25:16.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/linux-nat.c 2011-01-01 01:25:16.000000000 +0100 +@@ -2908,7 +2908,10 @@ count_events_callback (struct lwp_info * static int select_singlestep_lwp_callback (struct lwp_info *lp, void *data) { @@ -190,10 +192,10 @@ Index: gdb-7.2.50.20101116/gdb/linux-nat.c return 1; else return 0; -Index: gdb-7.2.50.20101116/gdb/linux-nat.h +Index: gdb-7.2.50.20101231/gdb/linux-nat.h =================================================================== ---- gdb-7.2.50.20101116.orig/gdb/linux-nat.h 2010-07-27 22:51:37.000000000 +0200 -+++ gdb-7.2.50.20101116/gdb/linux-nat.h 2010-11-16 07:54:36.000000000 +0100 +--- gdb-7.2.50.20101231.orig/gdb/linux-nat.h 2011-01-01 01:25:16.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/linux-nat.h 2011-01-01 01:25:16.000000000 +0100 @@ -55,8 +55,8 @@ struct lwp_info /* If non-zero, a pending wait status. */ int status; diff --git a/gdb-6.8-quit-never-aborts.patch b/gdb-6.8-quit-never-aborts.patch index ed22d6b..79a2f47 100644 --- a/gdb-6.8-quit-never-aborts.patch +++ b/gdb-6.8-quit-never-aborts.patch @@ -5,11 +5,11 @@ Some of the threads may not be properly PTRACE_DETACHed which hurts if they should have been detached with SIGSTOP (as they are accidentally left running on the debugger termination). -Index: gdb-6.8.50.20081128/gdb/defs.h +Index: gdb-7.2.50.20101231/gdb/defs.h =================================================================== ---- gdb-6.8.50.20081128.orig/gdb/defs.h 2008-11-27 10:23:01.000000000 +0100 -+++ gdb-6.8.50.20081128/gdb/defs.h 2008-12-06 21:49:32.000000000 +0100 -@@ -155,6 +155,7 @@ extern char *gdb_sysroot; +--- gdb-7.2.50.20101231.orig/gdb/defs.h 2011-01-01 01:00:29.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/defs.h 2011-01-01 01:09:17.000000000 +0100 +@@ -165,6 +165,7 @@ extern char *python_libdir; extern char *debug_file_directory; extern int quit_flag; @@ -17,7 +17,7 @@ Index: gdb-6.8.50.20081128/gdb/defs.h extern int immediate_quit; extern int sevenbit_strings; -@@ -168,7 +169,7 @@ extern void quit (void); +@@ -178,7 +179,7 @@ extern void quit (void); needed. */ #define QUIT { \ @@ -26,24 +26,24 @@ Index: gdb-6.8.50.20081128/gdb/defs.h if (deprecated_interactive_hook) deprecated_interactive_hook (); \ } -Index: gdb-6.8.50.20081128/gdb/event-top.c +Index: gdb-7.2.50.20101231/gdb/event-top.c =================================================================== ---- gdb-6.8.50.20081128.orig/gdb/event-top.c 2008-12-04 10:34:31.000000000 +0100 -+++ gdb-6.8.50.20081128/gdb/event-top.c 2008-12-06 21:49:07.000000000 +0100 -@@ -939,7 +939,7 @@ async_request_quit (gdb_client_data arg) +--- gdb-7.2.50.20101231.orig/gdb/event-top.c 2011-01-01 01:07:37.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/event-top.c 2011-01-01 01:09:39.000000000 +0100 +@@ -904,7 +904,7 @@ async_request_quit (gdb_client_data arg) is no reason to call quit again here, unless immediate_quit is - set.*/ + set. */ - if (quit_flag || immediate_quit) + if ((quit_flag || immediate_quit) && !quit_flag_cleanup) quit (); } -Index: gdb-6.8.50.20081128/gdb/top.c +Index: gdb-7.2.50.20101231/gdb/top.c =================================================================== ---- gdb-6.8.50.20081128.orig/gdb/top.c 2008-12-04 10:23:12.000000000 +0100 -+++ gdb-6.8.50.20081128/gdb/top.c 2008-12-06 21:49:07.000000000 +0100 -@@ -1299,7 +1299,9 @@ quit_force (char *args, int from_tty) +--- gdb-7.2.50.20101231.orig/gdb/top.c 2011-01-01 01:00:29.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/top.c 2011-01-01 01:09:17.000000000 +0100 +@@ -1254,7 +1254,9 @@ quit_force (char *args, int from_tty) qt.args = args; qt.from_tty = from_tty; @@ -54,11 +54,11 @@ Index: gdb-6.8.50.20081128/gdb/top.c catch_errors (quit_target, &qt, "Quitting: ", RETURN_MASK_ALL); -Index: gdb-6.8.50.20081128/gdb/utils.c +Index: gdb-7.2.50.20101231/gdb/utils.c =================================================================== ---- gdb-6.8.50.20081128.orig/gdb/utils.c 2008-12-04 10:31:00.000000000 +0100 -+++ gdb-6.8.50.20081128/gdb/utils.c 2008-12-06 21:49:07.000000000 +0100 -@@ -114,6 +114,11 @@ int job_control; +--- gdb-7.2.50.20101231.orig/gdb/utils.c 2011-01-01 01:00:29.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/utils.c 2011-01-01 01:09:17.000000000 +0100 +@@ -121,6 +121,11 @@ int job_control; int quit_flag; diff --git a/gdb-archer-ada.patch b/gdb-archer-ada.patch deleted file mode 100644 index 128112b..0000000 --- a/gdb-archer-ada.patch +++ /dev/null @@ -1,23 +0,0 @@ -From: Keith Seitz -Message-ID: <4B7F207A.7020102@redhat.com> - -[ read_partial_die part dropped in the port to Rawhide ] - ---- gdb-7.0.1-orig/gdb/dwarf2read.c 2010-02-20 01:06:44.000000000 +0100 -+++ gdb-7.0.1/gdb/dwarf2read.c 2010-02-20 01:08:28.000000000 +0100 -@@ -9924,9 +9928,13 @@ dwarf2_canonicalize_name (char *name, st - static char * - dwarf2_name (struct die_info *die, struct dwarf2_cu *cu) - { -- struct attribute *attr; -+ struct attribute *attr = NULL; -+ -+ if (cu->language == language_ada) -+ attr = dwarf2_attr (die, DW_AT_MIPS_linkage_name, cu); - -- attr = dwarf2_attr (die, DW_AT_name, cu); -+ if (!attr) -+ attr = dwarf2_attr (die, DW_AT_name, cu); - if (!attr || !DW_STRING (attr)) - return NULL; - diff --git a/gdb-archer.patch b/gdb-archer.patch index 9c12a7f..06e76a0 100644 --- a/gdb-archer.patch +++ b/gdb-archer.patch @@ -2,7 +2,7 @@ http://sourceware.org/gdb/wiki/ProjectArcher http://sourceware.org/gdb/wiki/ArcherBranchManagement GIT snapshot: -commit e77402373d43ec23661a16a134c94e6112b9d030 +commit 18d3d5d564eac7ad10bc972c957e6159a4276d3f branch `archer' - the merge of branches: archer-jankratochvil-vla @@ -14,10 +14,10 @@ archer-jankratochvil-ifunc diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c -index ea71ea2..ccd7b29 100644 +index 3efff2e..99097bf 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c -@@ -11250,6 +11250,7 @@ ada_operator_length (const struct expression *exp, int pc, int *oplenp, +@@ -11356,6 +11356,7 @@ ada_operator_length (const struct expression *exp, int pc, int *oplenp, static int ada_operator_check (struct expression *exp, int pos, @@ -25,7 +25,7 @@ index ea71ea2..ccd7b29 100644 int (*objfile_func) (struct objfile *objfile, void *data), void *data) { -@@ -11264,12 +11265,15 @@ ada_operator_check (struct expression *exp, int pos, +@@ -11370,12 +11371,15 @@ ada_operator_check (struct expression *exp, int pos, break; default: @@ -44,40 +44,229 @@ index ea71ea2..ccd7b29 100644 return 1; diff --git a/gdb/amd64-linux-nat.c b/gdb/amd64-linux-nat.c -index 16e97a2..3a5d57e 100644 +index 16e97a2..784a476 100644 --- a/gdb/amd64-linux-nat.c +++ b/gdb/amd64-linux-nat.c -@@ -375,6 +375,20 @@ amd64_linux_dr_unset_status (unsigned long mask) - } +@@ -265,18 +265,11 @@ amd64_linux_store_inferior_registers (struct target_ops *ops, + + /* Support for debug registers. */ + +-static unsigned long amd64_linux_dr[DR_CONTROL + 1]; +- + static unsigned long +-amd64_linux_dr_get (ptid_t ptid, int regnum) ++amd64_linux_dr_get (int tid, int regnum) + { +- int tid; + unsigned long value; + +- tid = TIDGET (ptid); +- if (tid == 0) +- tid = PIDGET (ptid); +- + /* FIXME: kettenis/2001-03-27: Calling perror_with_name if the + ptrace call fails breaks debugging remote targets. The correct + way to fix this is to add the hardware breakpoint and watchpoint +@@ -298,14 +291,8 @@ amd64_linux_dr_get (ptid_t ptid, int regnum) + /* Set debug register REGNUM to VALUE in only the one LWP of PTID. */ + + static void +-amd64_linux_dr_set (ptid_t ptid, int regnum, unsigned long value) ++amd64_linux_dr_set (int tid, int regnum, unsigned long value) + { +- int tid; +- +- tid = TIDGET (ptid); +- if (tid == 0) +- tid = PIDGET (ptid); +- + errno = 0; + ptrace (PTRACE_POKEUSER, tid, + offsetof (struct user, u_debugreg[regnum]), value); +@@ -313,35 +300,96 @@ amd64_linux_dr_set (ptid_t ptid, int regnum, unsigned long value) + perror_with_name (_("Couldn't write debug register")); } -+/* See i386_dr_low_type.detach. Do not use wrappers amd64_linux_dr_set_control -+ or amd64_linux_dr_reset_addr as they would modify the register cache -+ (amd64_linux_dr). */ +-/* Set DR_CONTROL to ADDR in all LWPs of LWP_LIST. */ ++/* Helper for amd64_linux_dr_set_control. */ ++ ++static void ++amd64_linux_dr_set_control_callback (int tid, void *control_voidp) ++{ ++ unsigned long control = *(unsigned long *) control_voidp; ++ ++ amd64_linux_dr_set (tid, DR_CONTROL, control); ++} ++ ++static void amd64_linux_dr_set_addr (int regnum, CORE_ADDR addr); ++ ++/* Set DR_CONTROL to ADDR in all LWPs of CURRENT_INFERIOR. */ + + static void + amd64_linux_dr_set_control (unsigned long control) + { +- struct lwp_info *lp; +- ptid_t ptid; ++ int inferior_pid = ptid_get_pid (inferior_ptid); ++ struct inferior *inf = current_inferior (); ++ ++ /* Are we detaching breakpoints from a fork-ed child? ++ See linux_nat_iterate_watchpoint_lwps for the fork-ed child description. ++ The i386 counterpart is i386_linux_dr_set_control. */ ++ if (inf->pid != inferior_pid) ++ { ++ struct i386_dr_mirror *dr_mirror = i386_dr_mirror_get (); ++ int i; ++ ++ /* There were two changes in Linux kernel 2.6.33 by the commit: ++ 72f674d203cd230426437cdcf7dd6f681dad8b0d ++ ++ (1) After fork/vfork/clone the new task no longer inherits the debug ++ registers. It has them zeroed instead. Either case is OK for GDB as ++ GDB already registers a fix up by linux_nat_set_new_thread. ++ ++ (2) If you enable a breakpoint by the CONTROL bits you have already ++ written its ADDRESS. Otherwise Linux kernel will report EINVAL. ++ For this case the workaround here ensures that during resetting ++ (detaching) watchpoints for a fork-ed child we can set CONTROL ++ arbitrarily as the addresses get pre-set here just to be sure. ++ ++ The second issue is hopefully going to be fixed in Linux kernel: ++ https://bugzilla.redhat.com/show_bug.cgi?id=660204 */ ++ ++ if (!dr_mirror->addr_preset) ++ { ++ dr_mirror->addr_preset = 1; ++ ++ for (i = 0; i < DR_LASTADDR - DR_FIRSTADDR; i++) ++ amd64_linux_dr_set_addr (i, dr_mirror->addr[i]); ++ } ++ } ++ ++ linux_nat_iterate_watchpoint_lwps (amd64_linux_dr_set_control_callback, ++ &control); ++} ++ ++/* Helper for amd64_linux_dr_set_addr. */ ++ ++struct amd64_linux_dr_set_addr_data ++ { ++ int regnum; ++ CORE_ADDR addr; ++ }; + +static void -+amd64_linux_dr_detach (void) ++amd64_linux_dr_set_addr_callback (int tid, void *datap_voidp) +{ -+ int regnum; ++ const struct amd64_linux_dr_set_addr_data *datap = datap_voidp; + +- amd64_linux_dr[DR_CONTROL] = control; +- ALL_LWPS (lp, ptid) +- amd64_linux_dr_set (ptid, DR_CONTROL, control); ++ amd64_linux_dr_set (tid, DR_FIRSTADDR + datap->regnum, datap->addr); + } + +-/* Set address REGNUM (zero based) to ADDR in all LWPs of LWP_LIST. */ ++/* Set address REGNUM (zero based) to ADDR in all LWPs of CURRENT_INFERIOR. ++ */ + + static void + amd64_linux_dr_set_addr (int regnum, CORE_ADDR addr) + { +- struct lwp_info *lp; +- ptid_t ptid; ++ struct amd64_linux_dr_set_addr_data data; + + gdb_assert (regnum >= 0 && regnum <= DR_LASTADDR - DR_FIRSTADDR); + +- amd64_linux_dr[DR_FIRSTADDR + regnum] = addr; +- ALL_LWPS (lp, ptid) +- amd64_linux_dr_set (ptid, DR_FIRSTADDR + regnum, addr); ++ data.regnum = regnum; ++ data.addr = addr; ++ linux_nat_iterate_watchpoint_lwps (amd64_linux_dr_set_addr_callback, &data); + } + +-/* Set address REGNUM (zero based) to zero in all LWPs of LWP_LIST. */ ++/* Set address REGNUM (zero based) to zero in all LWPs of CURRENT_INFERIOR. ++ */ + + static void + amd64_linux_dr_reset_addr (int regnum) +@@ -354,37 +402,54 @@ amd64_linux_dr_reset_addr (int regnum) + static unsigned long + amd64_linux_dr_get_status (void) + { +- return amd64_linux_dr_get (inferior_ptid, DR_STATUS); ++ int tid; ++ ++ tid = TIDGET (inferior_ptid); ++ if (tid == 0) ++ tid = PIDGET (inferior_ptid); ++ ++ return amd64_linux_dr_get (tid, DR_STATUS); + } + +-/* Unset MASK bits in DR_STATUS in all LWPs of LWP_LIST. */ ++/* Helper for amd64_linux_dr_unset_status. */ + + static void +-amd64_linux_dr_unset_status (unsigned long mask) ++amd64_linux_dr_unset_status_callback (int tid, void *mask_voidp) + { +- struct lwp_info *lp; +- ptid_t ptid; +- +- ALL_LWPS (lp, ptid) +- { +- unsigned long value; ++ unsigned long mask = *(unsigned long *) mask_voidp; ++ unsigned long value; + +- value = amd64_linux_dr_get (ptid, DR_STATUS); +- value &= ~mask; +- amd64_linux_dr_set (ptid, DR_STATUS, value); +- } ++ value = amd64_linux_dr_get (tid, DR_STATUS); ++ value &= ~mask; ++ amd64_linux_dr_set (tid, DR_STATUS, value); + } + ++/* Unset MASK bits in DR_STATUS in all LWPs of CURRENT_INFERIOR. */ + -+ amd64_linux_dr_set (inferior_ptid, DR_CONTROL, 0); -+ amd64_linux_dr_unset_status (~0UL); -+ for (regnum = DR_FIRSTADDR; regnum <= DR_LASTADDR; regnum++) -+ amd64_linux_dr_set (inferior_ptid, regnum, 0); ++static void ++amd64_linux_dr_unset_status (unsigned long mask) ++{ ++ linux_nat_iterate_watchpoint_lwps (amd64_linux_dr_unset_status_callback, ++ &mask); +} static void amd64_linux_new_thread (ptid_t ptid) -@@ -800,6 +814,7 @@ _initialize_amd64_linux_nat (void) - i386_dr_low.reset_addr = amd64_linux_dr_reset_addr; - i386_dr_low.get_status = amd64_linux_dr_get_status; - i386_dr_low.unset_status = amd64_linux_dr_unset_status; -+ i386_dr_low.detach = amd64_linux_dr_detach; - i386_set_debug_register_length (8); - - /* Override the GNU/Linux inferior startup hook. */ + { +- int i; ++ struct i386_dr_mirror *dr_mirror = i386_dr_mirror_get (); ++ int i, tid; ++ ++ /* Verify DR_MIRROR is valid. */ ++ gdb_assert (PIDGET (ptid) == PIDGET (inferior_ptid)); ++ ++ tid = TIDGET (ptid); ++ if (tid == 0) ++ tid = PIDGET (ptid); + +- for (i = DR_FIRSTADDR; i <= DR_LASTADDR; i++) +- amd64_linux_dr_set (ptid, i, amd64_linux_dr[i]); ++ for (i = 0; i < DR_LASTADDR - DR_FIRSTADDR; i++) ++ amd64_linux_dr_set (tid, DR_FIRSTADDR + i, dr_mirror->addr[i]); + +- amd64_linux_dr_set (ptid, DR_CONTROL, amd64_linux_dr[DR_CONTROL]); ++ amd64_linux_dr_set (tid, DR_CONTROL, dr_mirror->control); + } + + diff --git a/gdb/block.c b/gdb/block.c -index 48ac21b..ffcc97f 100644 +index f932d41..6e2cd88 100644 --- a/gdb/block.c +++ b/gdb/block.c @@ -321,3 +321,21 @@ allocate_block (struct obstack *obstack) @@ -114,26 +303,18 @@ index 7eedb6c..a517e80 100644 + #endif /* BLOCK_H */ diff --git a/gdb/blockframe.c b/gdb/blockframe.c -index 0348bf4..f01d0ee 100644 +index 366bedd..97f418a 100644 --- a/gdb/blockframe.c +++ b/gdb/blockframe.c -@@ -38,6 +38,7 @@ - #include "block.h" - #include "inline-frame.h" - #include "psymtab.h" -+#include "elf-bfd.h" - - /* Return the innermost lexical block in execution - in a specified stack frame. The frame address is assumed valid. -@@ -159,6 +160,7 @@ static CORE_ADDR cache_pc_function_low = 0; +@@ -160,6 +160,7 @@ static CORE_ADDR cache_pc_function_low = 0; static CORE_ADDR cache_pc_function_high = 0; static char *cache_pc_function_name = 0; static struct obj_section *cache_pc_function_section = NULL; +static int cache_pc_function_is_gnu_ifunc = 0; - /* Clear cache, e.g. when symbol table is discarded. */ + /* Clear cache, e.g. when symbol table is discarded. */ -@@ -169,6 +171,7 @@ clear_pc_function_cache (void) +@@ -170,6 +171,7 @@ clear_pc_function_cache (void) cache_pc_function_high = 0; cache_pc_function_name = (char *) 0; cache_pc_function_section = NULL; @@ -141,7 +322,7 @@ index 0348bf4..f01d0ee 100644 } /* Finds the "function" (text symbol) that is smaller than PC but -@@ -184,7 +187,7 @@ clear_pc_function_cache (void) +@@ -185,7 +187,7 @@ clear_pc_function_cache (void) /* Backward compatibility, no section argument. */ @@ -150,7 +331,7 @@ index 0348bf4..f01d0ee 100644 find_pc_partial_function (CORE_ADDR pc, char **name, CORE_ADDR *address, CORE_ADDR *endaddr) { -@@ -236,6 +239,7 @@ find_pc_partial_function (CORE_ADDR pc, char **name, CORE_ADDR *address, +@@ -237,6 +239,7 @@ find_pc_partial_function (CORE_ADDR pc, char **name, CORE_ADDR *address, cache_pc_function_high = BLOCK_END (SYMBOL_BLOCK_VALUE (f)); cache_pc_function_name = SYMBOL_LINKAGE_NAME (f); cache_pc_function_section = section; @@ -158,7 +339,7 @@ index 0348bf4..f01d0ee 100644 goto return_cached_value; } } -@@ -258,12 +262,13 @@ find_pc_partial_function (CORE_ADDR pc, char **name, CORE_ADDR *address, +@@ -259,12 +262,13 @@ find_pc_partial_function (CORE_ADDR pc, char **name, CORE_ADDR *address, *address = 0; if (endaddr != NULL) *endaddr = 0; @@ -173,7 +354,7 @@ index 0348bf4..f01d0ee 100644 /* If the minimal symbol has a size, use it for the cache. Otherwise use the lesser of the next minimal symbol in the same -@@ -323,7 +328,8 @@ find_pc_partial_function (CORE_ADDR pc, char **name, CORE_ADDR *address, +@@ -324,7 +328,8 @@ find_pc_partial_function (CORE_ADDR pc, char **name, CORE_ADDR *address, *endaddr = cache_pc_function_high; } @@ -182,9 +363,9 @@ index 0348bf4..f01d0ee 100644 + : FIND_PC_PARTIAL_FUNCTION_NORMAL; } - /* Return the innermost stack frame executing inside of BLOCK, + /* Return the innermost stack frame executing inside of BLOCK, or NULL diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c -index 6b55313..30626a6 100644 +index 809eb53..8f92c4e 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -62,6 +62,7 @@ @@ -195,27 +376,17 @@ index 6b55313..30626a6 100644 /* readline include files */ #include "readline/readline.h" -@@ -92,6 +93,9 @@ static void map_breakpoint_numbers (char *, void (*) (struct breakpoint *, - - static void ignore_command (char *, int); - -+static void update_breakpoint_locations (struct breakpoint *b, -+ struct symtabs_and_lines sals); -+ - static int breakpoint_re_set_one (void *); - - static void clear_command (char *, int); -@@ -104,6 +108,9 @@ static void break_command_1 (char *, int, int); +@@ -104,6 +105,9 @@ static void break_command_1 (char *, int, int); static void mention (struct breakpoint *); +static struct bp_location *add_location_to_breakpoint (struct breakpoint *b, + const struct symtab_and_line *sal); + - /* This function is used in gdbtk sources and thus can not be made static. */ + /* This function is used in gdbtk sources and thus can not be made + static. */ struct breakpoint *set_raw_breakpoint (struct gdbarch *gdbarch, - struct symtab_and_line, -@@ -219,6 +226,10 @@ static void disable_trace_command (char *, int); +@@ -220,6 +224,10 @@ static void disable_trace_command (char *, int); static void trace_pass_command (char *, int); @@ -226,7 +397,7 @@ index 6b55313..30626a6 100644 /* Assuming we're creating a static tracepoint, does S look like a static tracepoint marker spec ("-m MARKER_ID")? */ #define is_marker_spec(s) \ -@@ -1241,6 +1252,22 @@ watchpoint_in_thread_scope (struct breakpoint *b) +@@ -1270,6 +1278,22 @@ watchpoint_in_thread_scope (struct breakpoint *b) && !is_executing (inferior_ptid))); } @@ -249,7 +420,7 @@ index 6b55313..30626a6 100644 /* Assuming that B is a watchpoint: - Reparse watchpoint expression, if REPARSE is non-zero - Evaluate expression and store the result in B->val -@@ -1296,6 +1323,8 @@ update_watchpoint (struct breakpoint *b, int reparse) +@@ -1329,12 +1353,17 @@ update_watchpoint (struct breakpoint *b, int reparse) struct frame_id saved_frame_id; int frame_saved; @@ -258,7 +429,16 @@ index 6b55313..30626a6 100644 /* If this is a local watchpoint, we only want to check if the watchpoint frame is in scope if the current thread is the thread that was used to create the watchpoint. */ -@@ -1500,13 +1529,7 @@ update_watchpoint (struct breakpoint *b, int reparse) + if (!watchpoint_in_thread_scope (b)) + return; + ++ if (b->pspace != current_program_space) ++ return; ++ + /* We don't free locations. They are stored in bp_location array + and update_global_locations will eventually delete them and + remove breakpoints if needed. */ +@@ -1534,13 +1563,7 @@ update_watchpoint (struct breakpoint *b, int reparse) Watchpoint %d deleted because the program has left the block\n\ in which its expression is valid.\n"), b->number); @@ -273,30 +453,67 @@ index 6b55313..30626a6 100644 } /* Restore the selected frame. */ -@@ -2354,6 +2377,8 @@ detach_breakpoints (int pid) - /* Detach single-step breakpoints as well. */ - detach_single_step_breakpoints (); +@@ -1916,6 +1939,7 @@ insert_breakpoint_locations (void) + int val = 0; + int disabled_breaks = 0; + int hw_breakpoint_error = 0; ++ struct program_space *saved_current_program_space = current_program_space; + + struct ui_file *tmp_error_stream = mem_fileopen (); + struct cleanup *cleanups = make_cleanup_ui_file_delete (tmp_error_stream); +@@ -1943,9 +1967,13 @@ insert_breakpoint_locations (void) + /* For targets that support global breakpoints, there's no need + to select an inferior to insert breakpoint to. In fact, even + if we aren't attached to any process yet, we should still +- insert breakpoints. */ ++ insert breakpoints. ++ ++ Also inserting breakpoints into inappropriate inferior must be ++ prevented. */ + if (!gdbarch_has_global_breakpoints (target_gdbarch) +- && ptid_equal (inferior_ptid, null_ptid)) ++ && (ptid_equal (inferior_ptid, null_ptid) ++ || bl->pspace != saved_current_program_space)) + continue; -+ val |= target_detach_watchpoints (); -+ - do_cleanups (old_chain); - return val; - } -@@ -2455,9 +2480,11 @@ remove_breakpoint_1 (struct bp_location *b, insertion_state_t is) - return val; - b->inserted = (is == mark_inserted); - } -- else if (b->loc_type == bp_loc_hardware_watchpoint) -+ /* bp_loc_hardware_watchpoint with mark_inserted is being handled by -+ target_detach_watchpoints. */ -+ else if (b->loc_type == bp_loc_hardware_watchpoint && is == mark_uninserted) - { -- b->inserted = (is == mark_inserted); -+ b->inserted = 0; - val = target_remove_watchpoint (b->address, b->length, - b->watchpoint_type, b->owner->cond_exp); + val = insert_bp_location (bl, tmp_error_stream, &disabled_breaks, +@@ -1969,13 +1997,19 @@ insert_breakpoint_locations (void) -@@ -3342,6 +3369,8 @@ print_it_typical (bpstat bs) + if (bpt->disposition == disp_del_at_next_stop) + continue; +- ++ + for (loc = bpt->loc; loc; loc = loc->next) +- if (!loc->inserted && should_be_inserted (loc)) +- { +- some_failed = 1; +- break; +- } ++ { ++ /* Verify the first loop above really tried to insert this LOC. */ ++ if (!loc->inserted && should_be_inserted (loc) ++ && (gdbarch_has_global_breakpoints (target_gdbarch) ++ || (!ptid_equal (inferior_ptid, null_ptid) ++ && loc->pspace == saved_current_program_space))) ++ { ++ some_failed = 1; ++ break; ++ } ++ } + if (some_failed) + { + for (loc = bpt->loc; loc; loc = loc->next) +@@ -2525,8 +2559,7 @@ remove_breakpoint_1 (struct bp_location *bl, insertion_state_t is) + { + bl->inserted = (is == mark_inserted); + val = target_remove_watchpoint (bl->address, bl->length, +- bl->watchpoint_type, +- bl->owner->cond_exp); ++ bl->watchpoint_type, bl->owner->cond_exp); + + /* Failure to remove any of the hardware watchpoints comes here. */ + if ((is == mark_uninserted) && (bl->inserted)) +@@ -3419,6 +3452,8 @@ print_it_typical (bpstat bs) case bp_tracepoint: case bp_fast_tracepoint: case bp_jit_event: @@ -305,7 +522,7 @@ index 6b55313..30626a6 100644 default: result = PRINT_UNKNOWN; break; -@@ -3562,6 +3591,8 @@ watchpoint_check (void *p) +@@ -3640,6 +3675,8 @@ watchpoint_check (void *p) gdb_assert (bs->breakpoint_at != NULL); b = bs->breakpoint_at; @@ -314,7 +531,7 @@ index 6b55313..30626a6 100644 /* If this is a local watchpoint, we only want to check if the watchpoint frame is in scope if the current thread is the thread that was used to create the watchpoint. */ -@@ -3668,13 +3699,7 @@ watchpoint_check (void *p) +@@ -3748,13 +3785,7 @@ watchpoint_check (void *p) ui_out_text (uiout, " deleted because the program has left the block in\n\ which its expression is valid.\n"); @@ -329,22 +546,7 @@ index 6b55313..30626a6 100644 return WP_DELETED; } -@@ -3743,8 +3768,12 @@ bpstat_check_location (const struct bp_location *bl, - - /* If BS refers to a watchpoint, determine if the watched values - has actually changed, and we should stop. If not, set BS->stop -- to 0. */ --static void -+ to 0. -+ Return 0 for watchpoints which could not be the cause of this trap. -+ In such case PRINT_IT will be print_it_noop and STOP will be 0. -+ Otherwise return 1 but in such case it is not guaranteed whether this -+ breakpoint did or did not trigger this trap. */ -+static int - bpstat_check_watchpoint (bpstat bs) - { - const struct bp_location *bl; -@@ -3878,9 +3907,7 @@ bpstat_check_watchpoint (bpstat bs) +@@ -3958,9 +3989,7 @@ bpstat_check_watchpoint (bpstat bs) case 0: /* Error from catch_errors. */ printf_filtered (_("Watchpoint %d deleted.\n"), b->number); @@ -355,27 +557,7 @@ index 6b55313..30626a6 100644 /* We've already printed what needs to be printed. */ bs->print_it = print_it_done; break; -@@ -3894,8 +3921,10 @@ bpstat_check_watchpoint (bpstat bs) - anything for this watchpoint. */ - bs->print_it = print_it_noop; - bs->stop = 0; -+ return 0; - } - } -+ return 1; - } - - -@@ -4035,7 +4064,7 @@ bpstat_stop_status (struct address_space *aspace, - struct bp_location *bl; - struct bp_location *loc; - /* First item of allocated bpstat's. */ -- bpstat bs_head = NULL, *bs_link = &bs_head; -+ bpstat bs_head = NULL, *bs_link = &bs_head, *bs_link_next; - /* Pointer to the last thing in the chain currently. */ - bpstat bs; - int ix; -@@ -4084,7 +4113,7 @@ bpstat_stop_status (struct address_space *aspace, +@@ -4166,7 +4195,7 @@ bpstat_stop_status (struct address_space *aspace, watchpoint as triggered so that we will handle the out-of-scope event. We'll get to the watchpoint next iteration. */ @@ -384,36 +566,7 @@ index 6b55313..30626a6 100644 b->related_breakpoint->watchpoint_triggered = watch_triggered_yes; } } -@@ -4108,12 +4137,26 @@ bpstat_stop_status (struct address_space *aspace, - - removed_any = 0; - -- for (bs = bs_head; bs != NULL; bs = bs->next) -+ for (bs_link = &bs_head; *bs_link != NULL; bs_link = bs_link_next) - { -+ bs = *bs_link; -+ bs_link_next = &bs->next; -+ - if (!bs->stop) - continue; - -- bpstat_check_watchpoint (bs); -+ if (!bpstat_check_watchpoint (bs)) -+ { -+ /* Ensure bpstat_explains_signal stays false if this BL could not be -+ the cause of this trap. */ -+ -+ gdb_assert (bs->print_it == print_it_noop); -+ gdb_assert (!bs->stop); -+ *bs_link = bs->next; -+ bs_link_next = bs_link; -+ xfree (bs); -+ continue; -+ } - if (!bs->stop) - continue; - -@@ -4205,7 +4248,7 @@ handle_jit_event (void) +@@ -4288,7 +4317,7 @@ handle_jit_event (void) /* Decide what infrun needs to do with this bpstat. */ struct bpstat_what @@ -422,7 +575,7 @@ index 6b55313..30626a6 100644 { struct bpstat_what retval; /* We need to defer calling `solib_add', as adding new symbols -@@ -4213,11 +4256,12 @@ bpstat_what (bpstat bs) +@@ -4296,12 +4325,13 @@ bpstat_what (bpstat bs) and hence may clear unprocessed entries in the BS chain. */ int shlib_event = 0; int jit_event = 0; @@ -430,13 +583,14 @@ index 6b55313..30626a6 100644 retval.main_action = BPSTAT_WHAT_KEEP_CHECKING; retval.call_dummy = STOP_NONE; + retval.is_longjmp = 0; - for (; bs != NULL; bs = bs->next) + for (bs = bs_head; bs != NULL; bs = bs->next) { /* Extract this BS's action. After processing each BS, we check if its action overrides all we've seem so far. */ -@@ -4342,6 +4386,20 @@ bpstat_what (bpstat bs) +@@ -4431,6 +4461,20 @@ bpstat_what (bpstat bs) out already. */ internal_error (__FILE__, __LINE__, _("bpstat_what: tracepoint encountered")); @@ -457,7 +611,7 @@ index 6b55313..30626a6 100644 default: internal_error (__FILE__, __LINE__, _("bpstat_what: unhandled bptype %d"), (int) bptype); -@@ -4379,6 +4437,21 @@ bpstat_what (bpstat bs) +@@ -4468,6 +4512,21 @@ bpstat_what (bpstat bs) handle_jit_event (); } @@ -479,7 +633,7 @@ index 6b55313..30626a6 100644 return retval; } -@@ -4497,6 +4570,8 @@ bptype_string (enum bptype type) +@@ -4589,6 +4648,8 @@ bptype_string (enum bptype type) {bp_fast_tracepoint, "fast tracepoint"}, {bp_static_tracepoint, "static tracepoint"}, {bp_jit_event, "jit events"}, @@ -488,7 +642,7 @@ index 6b55313..30626a6 100644 }; if (((int) type >= (sizeof (bptypes) / sizeof (bptypes[0]))) -@@ -4643,6 +4718,8 @@ print_one_breakpoint_location (struct breakpoint *b, +@@ -4736,6 +4797,8 @@ print_one_breakpoint_location (struct breakpoint *b, case bp_fast_tracepoint: case bp_static_tracepoint: case bp_jit_event: @@ -497,7 +651,7 @@ index 6b55313..30626a6 100644 if (opts.addressprint) { annotate_field (4); -@@ -4923,7 +5000,8 @@ user_settable_breakpoint (const struct breakpoint *b) +@@ -5017,7 +5080,8 @@ user_settable_breakpoint (const struct breakpoint *b) || b->type == bp_catchpoint || b->type == bp_hardware_breakpoint || is_tracepoint (b) @@ -505,26 +659,26 @@ index 6b55313..30626a6 100644 + || is_watchpoint (b) + || b->type == bp_gnu_ifunc_resolver); } - + /* Print information on user settable breakpoint (watchpoint, etc) -@@ -5389,6 +5467,8 @@ allocate_bp_location (struct breakpoint *bpt) - case bp_jit_event: +@@ -5497,6 +5561,8 @@ allocate_bp_location (struct breakpoint *bpt) case bp_longjmp_master: case bp_std_terminate_master: + case bp_exception_master: + case bp_gnu_ifunc_resolver: + case bp_gnu_ifunc_resolver_return: loc->loc_type = bp_loc_software_breakpoint; break; case bp_hardware_breakpoint: -@@ -5477,6 +5557,7 @@ set_raw_breakpoint_without_location (struct gdbarch *gdbarch, +@@ -5586,6 +5652,7 @@ set_raw_breakpoint_without_location (struct gdbarch *gdbarch, b->ops = NULL; b->condition_not_parsed = 0; b->py_bp_object = NULL; + b->related_breakpoint = b; - /* Add this breakpoint to the end of the chain - so that a list of breakpoints will come out in order -@@ -5496,7 +5577,7 @@ set_raw_breakpoint_without_location (struct gdbarch *gdbarch, + /* Add this breakpoint to the end of the chain so that a list of + breakpoints will come out in order of increasing numbers. */ +@@ -5604,7 +5671,7 @@ set_raw_breakpoint_without_location (struct gdbarch *gdbarch, /* Initialize loc->function_name. */ static void @@ -533,7 +687,7 @@ index 6b55313..30626a6 100644 { gdb_assert (loc->owner != NULL); -@@ -5504,8 +5585,29 @@ set_breakpoint_location_function (struct bp_location *loc) +@@ -5612,8 +5679,29 @@ set_breakpoint_location_function (struct bp_location *loc) || loc->owner->type == bp_hardware_breakpoint || is_tracepoint (loc->owner)) { @@ -565,7 +719,7 @@ index 6b55313..30626a6 100644 if (loc->function_name) loc->function_name = xstrdup (loc->function_name); } -@@ -5578,7 +5680,8 @@ set_raw_breakpoint (struct gdbarch *gdbarch, +@@ -5688,7 +5776,8 @@ set_raw_breakpoint (struct gdbarch *gdbarch, b->loc->section = sal.section; b->line_number = sal.line; @@ -575,7 +729,7 @@ index 6b55313..30626a6 100644 breakpoints_changed (); -@@ -6652,7 +6755,7 @@ clone_momentary_breakpoint (struct breakpoint *orig) +@@ -6775,7 +6864,7 @@ clone_momentary_breakpoint (struct breakpoint *orig) copy = set_raw_breakpoint_without_location (orig->gdbarch, orig->type); copy->loc = allocate_bp_location (copy); @@ -584,7 +738,7 @@ index 6b55313..30626a6 100644 copy->loc->gdbarch = orig->loc->gdbarch; copy->loc->requested_address = orig->loc->requested_address; -@@ -6751,6 +6854,7 @@ mention (struct breakpoint *b) +@@ -6874,6 +6963,7 @@ mention (struct breakpoint *b) do_cleanups (ui_out_chain); break; case bp_breakpoint: @@ -592,7 +746,7 @@ index 6b55313..30626a6 100644 if (ui_out_is_mi_like_p (uiout)) { say_where = 0; -@@ -6761,6 +6865,8 @@ mention (struct breakpoint *b) +@@ -6884,6 +6974,8 @@ mention (struct breakpoint *b) else printf_filtered (_("Breakpoint")); printf_filtered (_(" %d"), b->number); @@ -601,15 +755,15 @@ index 6b55313..30626a6 100644 say_where = 1; break; case bp_hardware_breakpoint: -@@ -6817,6 +6923,7 @@ mention (struct breakpoint *b) - case bp_jit_event: +@@ -6943,6 +7035,7 @@ mention (struct breakpoint *b) case bp_longjmp_master: case bp_std_terminate_master: + case bp_exception_master: + case bp_gnu_ifunc_resolver_return: break; } -@@ -6877,7 +6984,8 @@ add_location_to_breakpoint (struct breakpoint *b, +@@ -7003,7 +7096,8 @@ add_location_to_breakpoint (struct breakpoint *b, gdb_assert (loc->pspace != NULL); loc->section = sal->section; @@ -619,10 +773,28 @@ index 6b55313..30626a6 100644 return loc; } -@@ -9712,12 +9820,22 @@ delete_breakpoint (struct breakpoint *bpt) +@@ -8397,6 +8491,7 @@ watch_command_1 (char *arg, int accessflag, int from_tty, + b = set_raw_breakpoint_without_location (NULL, bp_type); + set_breakpoint_number (internal, b); + b->thread = thread; ++ b->pspace = current_program_space; + b->disposition = disp_donttouch; + b->exp = exp; + b->exp_valid_block = exp_valid_block; +@@ -9550,6 +9645,9 @@ update_global_location_list (int should_insert) + int keep_in_target = 0; + int removed = 0; + ++ if (old_loc->pspace != current_program_space) ++ continue; ++ + /* Skip LOCP entries which will definitely never be needed. + Stop either at or being the one matching OLD_LOC. */ + while (locp < bp_location + bp_location_count +@@ -9865,12 +9963,22 @@ delete_breakpoint (struct breakpoint *bpt) - /* At least avoid this stale reference until the reference counting of - breakpoints gets resolved. */ + /* At least avoid this stale reference until the reference counting + of breakpoints gets resolved. */ - if (bpt->related_breakpoint != NULL) + if (bpt->related_breakpoint != bpt) { @@ -647,7 +819,7 @@ index 6b55313..30626a6 100644 } observer_notify_breakpoint_deleted (bpt->number); -@@ -10049,6 +10167,9 @@ update_breakpoint_locations (struct breakpoint *b, +@@ -10201,6 +10309,9 @@ update_breakpoint_locations (struct breakpoint *b, return; b->loc = NULL; @@ -657,7 +829,7 @@ index 6b55313..30626a6 100644 for (i = 0; i < sals.nelts; ++i) { -@@ -10075,11 +10196,7 @@ update_breakpoint_locations (struct breakpoint *b, +@@ -10227,11 +10338,7 @@ update_breakpoint_locations (struct breakpoint *b, } } @@ -670,7 +842,7 @@ index 6b55313..30626a6 100644 b->source_file = xstrdup (sals.sals[i].symtab->filename); if (b->line_number == 0) -@@ -10161,6 +10278,7 @@ breakpoint_re_set_one (void *bint) +@@ -10314,6 +10421,7 @@ breakpoint_re_set_one (void *bint) case bp_tracepoint: case bp_fast_tracepoint: case bp_static_tracepoint: @@ -678,15 +850,15 @@ index 6b55313..30626a6 100644 /* Do not attempt to re-set breakpoints disabled during startup. */ if (b->enable_state == bp_startup_disabled) return 0; -@@ -10325,6 +10443,7 @@ breakpoint_re_set_one (void *bint) - case bp_longjmp: - case bp_longjmp_resume: +@@ -10484,6 +10592,7 @@ breakpoint_re_set_one (void *bint) + case bp_exception: + case bp_exception_resume: case bp_jit_event: + case bp_gnu_ifunc_resolver_return: break; } -@@ -10496,11 +10615,25 @@ map_breakpoint_numbers (char *args, void (*function) (struct breakpoint *, +@@ -10656,11 +10765,25 @@ map_breakpoint_numbers (char *args, void (*function) (struct breakpoint *, ALL_BREAKPOINTS_SAFE (b, tmp) if (b->number == num) { @@ -716,7 +888,7 @@ index 6b55313..30626a6 100644 break; } if (match == 0) -@@ -11604,6 +11737,22 @@ all_tracepoints () +@@ -11769,6 +11892,22 @@ all_tracepoints () return tp_vec; } @@ -737,10 +909,10 @@ index 6b55313..30626a6 100644 +} + - /* This help string is used for the break, hbreak, tbreak and thbreak commands. - It is defined as a macro to prevent duplication. -@@ -11673,6 +11822,107 @@ save_command (char *arg, int from_tty) - help_list (save_cmdlist, "save ", -1, gdb_stdout); + /* This help string is used for the break, hbreak, tbreak and thbreak + commands. It is defined as a macro to prevent duplication. +@@ -11854,6 +11993,107 @@ iterate_over_breakpoints (int (*callback) (struct breakpoint *, void *), + return NULL; } +static void @@ -844,20 +1016,20 @@ index 6b55313..30626a6 100644 + update_breakpoint_locations (b, sals); +} + - struct breakpoint * - iterate_over_breakpoints (int (*callback) (struct breakpoint *, void *), - void *data) -@@ -12222,4 +12472,5 @@ inferior in all-stop mode, gdb behaves as if always-inserted mode is off."), + void + _initialize_breakpoint (void) + { +@@ -12388,4 +12628,5 @@ inferior in all-stop mode, gdb behaves as if always-inserted mode is off."), automatic_hardware_breakpoints = 1; observer_attach_about_to_proceed (breakpoint_about_to_proceed); + observer_attach_mark_used (breakpoint_types_mark_used); } diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h -index e34c2d3..4aadd57 100644 +index bfae8d9..a058e46 100644 --- a/gdb/breakpoint.h +++ b/gdb/breakpoint.h -@@ -138,6 +138,9 @@ enum bptype +@@ -147,6 +147,9 @@ enum bptype /* Event for JIT compiled code generation or deletion. */ bp_jit_event, @@ -886,6 +1058,19 @@ index 04f8127..2e29eb2 100644 fprintf_filtered (stream, "%d", (int) (high_bound - low_bound + 1)); fprintf_filtered (stream, "]"); +diff --git a/gdb/defs.h b/gdb/defs.h +index 489de74..335d3f5 100644 +--- a/gdb/defs.h ++++ b/gdb/defs.h +@@ -398,6 +398,8 @@ extern struct cleanup *make_cleanup_restore_page_info (void); + extern struct cleanup * + set_batch_flag_and_make_cleanup_restore_page_info (void); + ++extern struct cleanup *make_cleanup_restore_selected_frame (void); ++ + extern char *gdb_realpath (const char *); + extern char *xfullpath (const char *); + diff --git a/gdb/doc/gdbint.texinfo b/gdb/doc/gdbint.texinfo index 4a112aa..7b6bed4 100644 --- a/gdb/doc/gdbint.texinfo @@ -1032,10 +1217,10 @@ index e19b8ed..343e160 100644 This observer is used for internal testing. Do not use. See testsuite/gdb.gdb/observer.exp. diff --git a/gdb/dwarf2expr.c b/gdb/dwarf2expr.c -index b9ae108..2555908 100644 +index 29bfcf4..c339378 100644 --- a/gdb/dwarf2expr.c +++ b/gdb/dwarf2expr.c -@@ -875,6 +875,13 @@ execute_stack_op (struct dwarf_expr_context *ctx, +@@ -900,6 +900,13 @@ execute_stack_op (struct dwarf_expr_context *ctx, ctx->dwarf_call (ctx, result); goto no_push; @@ -1050,10 +1235,10 @@ index b9ae108..2555908 100644 error (_("Unhandled dwarf expression opcode 0x%x"), op); } diff --git a/gdb/dwarf2expr.h b/gdb/dwarf2expr.h -index 61b8f00..d94c03c 100644 +index 68cc667..5b5f29c 100644 --- a/gdb/dwarf2expr.h +++ b/gdb/dwarf2expr.h -@@ -108,9 +108,15 @@ struct dwarf_expr_context +@@ -114,9 +114,15 @@ struct dwarf_expr_context #if 0 /* Not yet implemented. */ @@ -1071,10 +1256,10 @@ index 61b8f00..d94c03c 100644 /* The current depth of dwarf expression recursion, via DW_OP_call*, DW_OP_fbreg, DW_OP_push_object_address, etc., and the maximum diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c -index b2aecf2..afc7907 100644 +index f0e08c7..d5c0c36 100644 --- a/gdb/dwarf2loc.c +++ b/gdb/dwarf2loc.c -@@ -127,6 +127,9 @@ struct dwarf_expr_baton +@@ -133,6 +133,9 @@ struct dwarf_expr_baton { struct frame_info *frame; struct dwarf2_per_cu_data *per_cu; @@ -1084,9 +1269,9 @@ index b2aecf2..afc7907 100644 }; /* Helper functions for dwarf2_evaluate_loc_desc. */ -@@ -195,23 +198,33 @@ dwarf_expr_frame_base_1 (struct symbol *framefunc, CORE_ADDR pc, +@@ -201,23 +204,33 @@ dwarf_expr_frame_base_1 (struct symbol *framefunc, CORE_ADDR pc, symbaton = SYMBOL_LOCATION_BATON (framefunc); - *start = find_location_expression (symbaton, length, pc); + *start = dwarf2_find_location_expression (symbaton, length, pc); } - else + else if (SYMBOL_COMPUTED_OPS (framefunc) == &dwarf2_locexpr_funcs) @@ -1127,8 +1312,8 @@ index b2aecf2..afc7907 100644 } /* Helper function for dwarf2_evaluate_loc_desc. Computes the CFA for -@@ -263,6 +276,158 @@ dwarf_expr_dwarf_call (struct dwarf_expr_context *ctx, size_t die_offset) - return per_cu_dwarf_call (ctx, die_offset, debaton->per_cu); +@@ -284,6 +297,159 @@ dwarf_expr_dwarf_call (struct dwarf_expr_context *ctx, size_t die_offset) + ctx->get_frame_pc, ctx->baton); } +static CORE_ADDR @@ -1209,6 +1394,7 @@ index b2aecf2..afc7907 100644 + ctx->read_mem = dwarf_expr_read_mem; + ctx->get_frame_base = dwarf_expr_frame_base; + ctx->get_frame_cfa = dwarf_expr_frame_cfa; ++ ctx->get_frame_pc = dwarf_expr_frame_pc; + ctx->get_tls_address = dwarf_expr_tls_address; + ctx->dwarf_call = dwarf_expr_dwarf_call; + ctx->get_object_address = dwarf_expr_object_address; @@ -1270,8 +1456,8 @@ index b2aecf2..afc7907 100644 + if (!dllbaton) + return 0; + -+ data = find_location_expression (dllbaton, &size, -+ get_frame_address_in_block (frame)); ++ data = dwarf2_find_location_expression (dllbaton, &size, ++ get_frame_address_in_block (frame)); + if (data == NULL) + return 0; + @@ -1286,29 +1472,29 @@ index b2aecf2..afc7907 100644 struct piece_closure { /* Reference count. */ -@@ -887,10 +1052,8 @@ dwarf2_evaluate_loc_desc (struct type *type, struct frame_info *frame, - struct dwarf2_per_cu_data *per_cu) +@@ -1038,10 +1204,8 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame, + LONGEST byte_offset) { struct value *retval; - struct dwarf_expr_baton baton; struct dwarf_expr_context *ctx; -- struct cleanup *old_chain; + struct cleanup *old_chain; - struct objfile *objfile = dwarf2_per_cu_objfile (per_cu); -+ struct cleanup *old_chain = make_cleanup (null_cleanup, 0); - if (size == 0) - { -@@ -900,24 +1063,8 @@ dwarf2_evaluate_loc_desc (struct type *type, struct frame_info *frame, + if (byte_offset < 0) + invalid_synthetic_pointer (); +@@ -1054,25 +1218,10 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame, return retval; } - baton.frame = frame; - baton.per_cu = per_cu; -+ ctx = dwarf_expr_prep_ctx (frame, data, size, per_cu); ++ old_chain = make_cleanup (null_cleanup, 0); - ctx = new_dwarf_expr_context (); - old_chain = make_cleanup_free_dwarf_expr_context (ctx); -- ++ ctx = dwarf_expr_prep_ctx (frame, data, size, per_cu); + - ctx->gdbarch = get_objfile_arch (objfile); - ctx->addr_size = dwarf2_per_cu_addr_size (per_cu); - ctx->offset = dwarf2_per_cu_text_offset (per_cu); @@ -1317,6 +1503,7 @@ index b2aecf2..afc7907 100644 - ctx->read_mem = dwarf_expr_read_mem; - ctx->get_frame_base = dwarf_expr_frame_base; - ctx->get_frame_cfa = dwarf_expr_frame_cfa; +- ctx->get_frame_pc = dwarf_expr_frame_pc; - ctx->get_tls_address = dwarf_expr_tls_address; - ctx->dwarf_call = dwarf_expr_dwarf_call; - @@ -1324,10 +1511,14 @@ index b2aecf2..afc7907 100644 if (ctx->num_pieces > 0) { struct piece_closure *c; -@@ -951,6 +1098,11 @@ dwarf2_evaluate_loc_desc (struct type *type, struct frame_info *frame, +@@ -1116,6 +1265,15 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame, CORE_ADDR address = dwarf_expr_fetch_address (ctx, 0); int in_stack_memory = dwarf_expr_fetch_in_stack_memory (ctx, 0); ++ /* Frame may be needed for check_typedef of TYPE_DYNAMIC. */ ++ make_cleanup_restore_selected_frame (); ++ select_frame (frame); ++ + /* object_address_set called here is required in ALLOCATE_VALUE's + CHECK_TYPEDEF for the object's possible + DW_OP_push_object_address. */ @@ -1336,7 +1527,7 @@ index b2aecf2..afc7907 100644 retval = allocate_value (type); VALUE_LVAL (retval) = lval_memory; set_value_lazy (retval, 1); -@@ -2587,11 +2739,51 @@ loclist_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch, +@@ -2810,11 +2968,51 @@ loclist_tracepoint_var_ref (struct symbol *symbol, struct gdbarch *gdbarch, dlbaton->per_cu); } @@ -1391,10 +1582,10 @@ index b2aecf2..afc7907 100644 + missing_tracepoint_var_ref +}; diff --git a/gdb/dwarf2loc.h b/gdb/dwarf2loc.h -index a2cfe7f..f2d07ef 100644 +index e94346c..55beec2 100644 --- a/gdb/dwarf2loc.h +++ b/gdb/dwarf2loc.h -@@ -96,5 +96,14 @@ struct dwarf2_loclist_baton +@@ -105,5 +105,14 @@ struct dwarf2_loclist_baton extern const struct symbol_computed_ops dwarf2_locexpr_funcs; extern const struct symbol_computed_ops dwarf2_loclist_funcs; @@ -1410,12 +1601,12 @@ index a2cfe7f..f2d07ef 100644 #endif /* dwarf2loc.h */ diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c -index 404faf8..e372afb 100644 +index 80770f8..9908495 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c -@@ -1221,6 +1221,9 @@ static int attr_form_is_section_offset (struct attribute *); - - static int attr_form_is_constant (struct attribute *); +@@ -1206,6 +1206,9 @@ static void fill_in_loclist_baton (struct dwarf2_cu *cu, + struct dwarf2_loclist_baton *baton, + struct attribute *attr); +static struct dwarf2_loclist_baton *dwarf2_attr_to_loclist_baton + (struct attribute *attr, struct dwarf2_cu *cu); @@ -1423,7 +1614,7 @@ index 404faf8..e372afb 100644 static void dwarf2_symbol_mark_computed (struct attribute *attr, struct symbol *sym, struct dwarf2_cu *cu); -@@ -1251,6 +1254,9 @@ static void age_cached_comp_units (void); +@@ -1240,6 +1243,9 @@ static void age_cached_comp_units (void); static void free_one_cached_comp_unit (void *); @@ -1433,7 +1624,7 @@ index 404faf8..e372afb 100644 static struct type *set_die_type (struct die_info *, struct type *, struct dwarf2_cu *); -@@ -1275,6 +1281,9 @@ static struct type *get_die_type_at_offset (unsigned int, +@@ -1264,6 +1270,9 @@ static struct type *get_die_type_at_offset (unsigned int, static struct type *get_die_type (struct die_info *die, struct dwarf2_cu *cu); @@ -1443,7 +1634,7 @@ index 404faf8..e372afb 100644 static void dwarf2_release_queue (void *dummy); static void queue_comp_unit (struct dwarf2_per_cu_data *per_cu, -@@ -7112,6 +7121,29 @@ process_enumeration_scope (struct die_info *die, struct dwarf2_cu *cu) +@@ -7237,6 +7246,29 @@ process_enumeration_scope (struct die_info *die, struct dwarf2_cu *cu) new_symbol (die, this_type, cu); } @@ -1473,7 +1664,7 @@ index 404faf8..e372afb 100644 /* Extract all information from a DW_TAG_array_type DIE and put it in the DIE's type field. For now, this only handles one dimensional arrays. */ -@@ -7125,7 +7157,7 @@ read_array_type (struct die_info *die, struct dwarf2_cu *cu) +@@ -7250,7 +7282,7 @@ read_array_type (struct die_info *die, struct dwarf2_cu *cu) struct type *element_type, *range_type, *index_type; struct type **range_types = NULL; struct attribute *attr; @@ -1482,7 +1673,7 @@ index 404faf8..e372afb 100644 struct cleanup *back_to; char *name; -@@ -7178,17 +7210,11 @@ read_array_type (struct die_info *die, struct dwarf2_cu *cu) +@@ -7303,17 +7335,11 @@ read_array_type (struct die_info *die, struct dwarf2_cu *cu) type = element_type; if (read_array_order (die, cu) == DW_ORD_col_major) @@ -1505,7 +1696,7 @@ index 404faf8..e372afb 100644 /* Understand Dwarf2 support for vector types (like they occur on the PowerPC w/ AltiVec). Gcc just adds another attribute to the -@@ -7681,29 +7707,114 @@ read_tag_string_type (struct die_info *die, struct dwarf2_cu *cu) +@@ -7806,29 +7832,114 @@ read_tag_string_type (struct die_info *die, struct dwarf2_cu *cu) struct gdbarch *gdbarch = get_objfile_arch (objfile); struct type *type, *range_type, *index_type, *char_type; struct attribute *attr; @@ -1634,7 +1825,7 @@ index 404faf8..e372afb 100644 char_type = language_string_char_type (cu->language_defn, gdbarch); type = create_string_type (NULL, char_type, range_type); -@@ -7985,8 +8096,7 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) +@@ -8110,8 +8221,7 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) struct type *base_type; struct type *range_type; struct attribute *attr; @@ -1644,7 +1835,7 @@ index 404faf8..e372afb 100644 char *name; LONGEST negative_mask; -@@ -7999,48 +8109,125 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) +@@ -8124,48 +8234,125 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) if (range_type) return range_type; @@ -1802,7 +1993,7 @@ index 404faf8..e372afb 100644 } /* Dwarf-2 specifications explicitly allows to create subrange types -@@ -8082,20 +8269,41 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) +@@ -8207,20 +8394,41 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) } } @@ -1856,7 +2047,7 @@ index 404faf8..e372afb 100644 name = dwarf2_name (die, cu); if (name) -@@ -10559,10 +10767,12 @@ var_decode_location (struct attribute *attr, struct symbol *sym, +@@ -10686,10 +10894,12 @@ var_decode_location (struct attribute *attr, struct symbol *sym, (i.e. when the value of a register or memory location is referenced, or a thread-local block, etc.). Then again, it might not be worthwhile. I'm assuming that it isn't unless performance @@ -1871,7 +2062,7 @@ index 404faf8..e372afb 100644 } /* Given a pointer to a DWARF information entry, figure out if we need -@@ -10600,6 +10810,8 @@ new_symbol_full (struct die_info *die, struct type *type, struct dwarf2_cu *cu, +@@ -10727,6 +10937,8 @@ new_symbol_full (struct die_info *die, struct type *type, struct dwarf2_cu *cu, else sym = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct symbol); OBJSTAT (objfile, n_syms++); @@ -1880,7 +2071,7 @@ index 404faf8..e372afb 100644 /* Cache this symbol's name and the name's demangled form (if any). */ SYMBOL_SET_LANGUAGE (sym, cu->language); -@@ -11367,6 +11579,9 @@ read_type_die_1 (struct die_info *die, struct dwarf2_cu *cu) +@@ -11494,6 +11706,9 @@ read_type_die_1 (struct die_info *die, struct dwarf2_cu *cu) break; } @@ -1890,8 +2081,8 @@ index 404faf8..e372afb 100644 return this_type; } -@@ -14119,67 +14334,102 @@ attr_form_is_constant (struct attribute *attr) - } +@@ -14292,59 +14507,97 @@ fill_in_loclist_baton (struct dwarf2_cu *cu, + baton->base_address = cu->base_address; } -static void @@ -1911,27 +2102,15 @@ index 404faf8..e372afb 100644 - { - struct dwarf2_loclist_baton *baton; + struct dwarf2_locexpr_baton *baton; - -- baton = obstack_alloc (&cu->objfile->objfile_obstack, -- sizeof (struct dwarf2_loclist_baton)); -- baton->per_cu = cu->per_cu; -- gdb_assert (baton->per_cu); ++ + gdb_assert (attr_form_is_block (attr)); - -- dwarf2_read_section (dwarf2_per_objfile->objfile, -- &dwarf2_per_objfile->loc); ++ + baton = obstack_alloc (&cu->objfile->objfile_obstack, sizeof (*baton)); + baton->per_cu = cu->per_cu; + gdb_assert (baton->per_cu); -- /* We don't know how long the location list is, but make sure we -- don't run off the edge of the section. */ -- baton->size = dwarf2_per_objfile->loc.size - DW_UNSND (attr); -- baton->data = dwarf2_per_objfile->loc.buffer + DW_UNSND (attr); -- baton->base_address = cu->base_address; -- if (cu->base_known == 0) -- complaint (&symfile_complaints, -- _("Location list used without specifying the CU base address.")); +- baton = obstack_alloc (&cu->objfile->objfile_obstack, +- sizeof (struct dwarf2_loclist_baton)); + /* Note that we're just copying the block's data pointer + here, not the actual data. We're still pointing into the + info_buffer for SYM's objfile; right now we never release @@ -1940,20 +2119,24 @@ index 404faf8..e372afb 100644 + baton->size = DW_BLOCK (attr)->size; + baton->data = DW_BLOCK (attr)->data; + gdb_assert (baton->size == 0 || baton->data != NULL); -+ + +- fill_in_loclist_baton (cu, baton, attr); + return baton; +} -+ + +- if (cu->base_known == 0) +- complaint (&symfile_complaints, +- _("Location list used without specifying the CU base address.")); +static struct dwarf2_loclist_baton * +dwarf2_attr_to_loclist_baton (struct attribute *attr, struct dwarf2_cu *cu) +{ + struct dwarf2_loclist_baton *baton; -+ + + /* DW_AT_location of the referenced DIE may be missing if the referenced + variable has been optimized out. */ + if (!attr) + return NULL; - ++ + dwarf2_read_section (dwarf2_per_objfile->objfile, + &dwarf2_per_objfile->loc); + @@ -1966,14 +2149,9 @@ index 404faf8..e372afb 100644 + + baton = obstack_alloc (&cu->objfile->objfile_obstack, + sizeof (struct dwarf2_loclist_baton)); -+ baton->per_cu = cu->per_cu; -+ gdb_assert (baton->per_cu); + -+ /* We don't know how long the location list is, but make sure we -+ don't run off the edge of the section. */ -+ baton->size = dwarf2_per_objfile->loc.size - DW_UNSND (attr); -+ baton->data = dwarf2_per_objfile->loc.buffer + DW_UNSND (attr); -+ baton->base_address = cu->base_address; ++ fill_in_loclist_baton (cu, baton, attr); ++ + if (cu->base_known == 0) + complaint (&symfile_complaints, + _("Location list used without specifying the CU base address.")); @@ -2042,7 +2220,7 @@ index 404faf8..e372afb 100644 } } -@@ -14533,6 +14783,31 @@ offset_and_type_eq (const void *item_lhs, const void *item_rhs) +@@ -14690,6 +14943,31 @@ offset_and_type_eq (const void *item_lhs, const void *item_rhs) return ofs_lhs->offset == ofs_rhs->offset; } @@ -2074,7 +2252,7 @@ index 404faf8..e372afb 100644 /* Set the type associated with DIE to TYPE. Save it in CU's hash table if necessary. For convenience, return TYPE. -@@ -14558,6 +14833,8 @@ set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu) +@@ -14715,6 +14993,8 @@ set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu) struct objfile *objfile = cu->objfile; htab_t *type_hash_ptr; @@ -2084,7 +2262,7 @@ index 404faf8..e372afb 100644 initialized (if not already set). There are a few types where we should not be doing so, because the type-specific area is diff --git a/gdb/elfread.c b/gdb/elfread.c -index 270f93f..a589c23 100644 +index d607b87..2aa7dd9 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -37,6 +37,7 @@ @@ -2368,7 +2546,7 @@ index 270f93f..a589c23 100644 struct build_id { size_t size; -@@ -800,6 +1049,8 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags) +@@ -806,6 +1055,8 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags) bfd_errmsg (bfd_get_error ())); elf_symtab_read (objfile, ST_DYNAMIC, dynsymcount, dyn_symbol_table, 0); @@ -3038,7 +3216,7 @@ index e0ca12c..de6311a 100644 else { diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c -index d96d0f8..4bebcda 100644 +index b651098..70269d6 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -39,6 +39,9 @@ @@ -3322,7 +3500,7 @@ index d96d0f8..4bebcda 100644 + TYPE_TARGET_TYPE (type) = target_type; if (TYPE_STUB (target_type) || TYPE_TARGET_STUB (target_type)) { - /* Empty. */ + /* Nothing we can do. */ } else if (TYPE_CODE (type) == TYPE_CODE_ARRAY - && TYPE_NFIELDS (type) == 1 @@ -3968,7 +4146,7 @@ index d96d0f8..4bebcda 100644 add_setshow_zinteger_cmd ("overload", no_class, &overload_debug, _("\ diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h -index 51eb445..627e5af 100644 +index 1ce2d91..133f583 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -170,6 +170,7 @@ enum type_flag_value @@ -4182,7 +4360,7 @@ index 51eb445..627e5af 100644 /* C++ */ -@@ -1176,6 +1285,10 @@ struct builtin_type +@@ -1177,6 +1286,10 @@ struct builtin_type (*) () can server as a generic function pointer. */ struct type *builtin_func_ptr; @@ -4193,7 +4371,7 @@ index 51eb445..627e5af 100644 /* Special-purpose types. */ -@@ -1216,6 +1329,8 @@ struct objfile_type +@@ -1217,6 +1330,8 @@ struct objfile_type /* Types used for symbols with no debug information. */ struct type *nodebug_text_symbol; @@ -4202,7 +4380,7 @@ index 51eb445..627e5af 100644 struct type *nodebug_data_symbol; struct type *nodebug_unknown_symbol; struct type *nodebug_tls_symbol; -@@ -1363,6 +1478,18 @@ extern struct type *create_array_type (struct type *, struct type *, +@@ -1364,6 +1479,18 @@ extern struct type *create_array_type (struct type *, struct type *, struct type *); extern struct type *lookup_array_range_type (struct type *, int, int); @@ -4221,7 +4399,7 @@ index 51eb445..627e5af 100644 extern struct type *create_string_type (struct type *, struct type *, struct type *); extern struct type *lookup_string_range_type (struct type *, int, int); -@@ -1408,6 +1535,8 @@ extern int is_public_ancestor (struct type *, struct type *); +@@ -1409,6 +1536,8 @@ extern int is_public_ancestor (struct type *, struct type *); extern int is_unique_ancestor (struct type *, struct value *); @@ -4230,7 +4408,7 @@ index 51eb445..627e5af 100644 /* Overload resolution */ #define LENGTH_MATCH(bv) ((bv)->rank[0]) -@@ -1478,10 +1607,11 @@ extern void maintenance_print_type (char *, int); +@@ -1479,10 +1608,11 @@ extern void maintenance_print_type (char *, int); extern htab_t create_copied_types_hash (struct objfile *objfile); @@ -4245,123 +4423,632 @@ index 51eb445..627e5af 100644 + #endif /* GDBTYPES_H */ diff --git a/gdb/i386-linux-nat.c b/gdb/i386-linux-nat.c -index 4fce1ac..144a899 100644 +index 4fce1ac..7b6961e 100644 --- a/gdb/i386-linux-nat.c +++ b/gdb/i386-linux-nat.c -@@ -747,6 +747,21 @@ i386_linux_dr_unset_status (unsigned long mask) - } +@@ -633,22 +633,13 @@ i386_linux_store_inferior_registers (struct target_ops *ops, + } + + +-/* Support for debug registers. */ +- +-static unsigned long i386_linux_dr[DR_CONTROL + 1]; +- + /* Get debug register REGNUM value from only the one LWP of PTID. */ + + static unsigned long +-i386_linux_dr_get (ptid_t ptid, int regnum) ++i386_linux_dr_get (int tid, int regnum) + { +- int tid; + unsigned long value; + +- tid = TIDGET (ptid); +- if (tid == 0) +- tid = PIDGET (ptid); +- + /* FIXME: kettenis/2001-03-27: Calling perror_with_name if the + ptrace call fails breaks debugging remote targets. The correct + way to fix this is to add the hardware breakpoint and watchpoint +@@ -670,14 +661,8 @@ i386_linux_dr_get (ptid_t ptid, int regnum) + /* Set debug register REGNUM to VALUE in only the one LWP of PTID. */ + + static void +-i386_linux_dr_set (ptid_t ptid, int regnum, unsigned long value) ++i386_linux_dr_set (int tid, int regnum, unsigned long value) + { +- int tid; +- +- tid = TIDGET (ptid); +- if (tid == 0) +- tid = PIDGET (ptid); +- + errno = 0; + ptrace (PTRACE_POKEUSER, tid, + offsetof (struct user, u_debugreg[regnum]), value); +@@ -685,35 +670,78 @@ i386_linux_dr_set (ptid_t ptid, int regnum, unsigned long value) + perror_with_name (_("Couldn't write debug register")); } -+/* See i386_dr_low_type.detach. Do not use wrappers i386_linux_dr_set_control -+ or i386_linux_dr_reset_addr as they would modify the register cache -+ (i386_linux_dr). */ +-/* Set DR_CONTROL to ADDR in all LWPs of LWP_LIST. */ ++/* Helper for i386_linux_dr_set_control. */ + +static void -+i386_linux_dr_detach (void) ++i386_linux_dr_set_control_callback (int tid, void *control_voidp) +{ -+ int regnum; ++ unsigned long control = *(unsigned long *) control_voidp; + -+ i386_linux_dr_set (inferior_ptid, DR_CONTROL, 0); -+ i386_linux_dr_unset_status (~0UL); -+ for (regnum = DR_FIRSTADDR; regnum <= DR_LASTADDR; regnum++) -+ i386_linux_dr_set (inferior_ptid, regnum, 0); ++ i386_linux_dr_set (tid, DR_CONTROL, control); +} + ++static void i386_linux_dr_set_addr (int regnum, CORE_ADDR addr); ++ ++/* Set DR_CONTROL to ADDR in all LWPs of CURRENT_INFERIOR. */ + static void - i386_linux_new_thread (ptid_t ptid) + i386_linux_dr_set_control (unsigned long control) { -@@ -976,6 +991,7 @@ _initialize_i386_linux_nat (void) - i386_dr_low.reset_addr = i386_linux_dr_reset_addr; - i386_dr_low.get_status = i386_linux_dr_get_status; - i386_dr_low.unset_status = i386_linux_dr_unset_status; -+ i386_dr_low.detach = i386_linux_dr_detach; - i386_set_debug_register_length (4); - - /* Override the default ptrace resume method. */ -diff --git a/gdb/i386-nat.c b/gdb/i386-nat.c -index eaa3644..0921c7e 100644 ---- a/gdb/i386-nat.c -+++ b/gdb/i386-nat.c -@@ -533,6 +533,17 @@ i386_remove_watchpoint (CORE_ADDR addr, int len, int type, - return retval; +- struct lwp_info *lp; +- ptid_t ptid; ++ int inferior_pid = ptid_get_pid (inferior_ptid); ++ struct inferior *inf = current_inferior (); ++ ++ /* The amd64 counterpart and description is amd64_linux_dr_set_control. */ ++ if (inf->pid != inferior_pid) ++ { ++ struct i386_dr_mirror *dr_mirror = i386_dr_mirror_get (); ++ int i; ++ ++ if (!dr_mirror->addr_preset) ++ { ++ dr_mirror->addr_preset = 1; + +- i386_linux_dr[DR_CONTROL] = control; +- ALL_LWPS (lp, ptid) +- i386_linux_dr_set (ptid, DR_CONTROL, control); ++ for (i = 0; i < DR_LASTADDR - DR_FIRSTADDR; i++) ++ i386_linux_dr_set_addr (i, dr_mirror->addr[i]); ++ } ++ } ++ ++ linux_nat_iterate_watchpoint_lwps (i386_linux_dr_set_control_callback, ++ &control); } -+/* See target_detach_watchpoints. */ +-/* Set address REGNUM (zero based) to ADDR in all LWPs of LWP_LIST. */ ++/* Helper for i386_linux_dr_set_addr. */ + -+static int -+i386_detach_watchpoints (void) ++struct i386_linux_dr_set_addr_data ++ { ++ int regnum; ++ CORE_ADDR addr; ++ }; ++ ++static void ++i386_linux_dr_set_addr_callback (int tid, void *datap_voidp) +{ -+ if (i386_dr_low.detach) -+ i386_dr_low.detach (); ++ const struct i386_linux_dr_set_addr_data *datap = datap_voidp; + -+ return 0; ++ i386_linux_dr_set (tid, DR_FIRSTADDR + datap->regnum, datap->addr); +} + - /* Return non-zero if we can watch a memory region that starts at - address ADDR and whose length is LEN bytes. */ ++/* Set address REGNUM (zero based) to ADDR in all LWPs of CURRENT_INFERIOR. ++ */ -@@ -685,6 +696,7 @@ i386_use_watchpoints (struct target_ops *t) - t->to_stopped_data_address = i386_stopped_data_address; - t->to_insert_watchpoint = i386_insert_watchpoint; - t->to_remove_watchpoint = i386_remove_watchpoint; -+ t->to_detach_watchpoints = i386_detach_watchpoints; - t->to_insert_hw_breakpoint = i386_insert_hw_breakpoint; - t->to_remove_hw_breakpoint = i386_remove_hw_breakpoint; + static void + i386_linux_dr_set_addr (int regnum, CORE_ADDR addr) + { +- struct lwp_info *lp; +- ptid_t ptid; ++ struct i386_linux_dr_set_addr_data data; + + gdb_assert (regnum >= 0 && regnum <= DR_LASTADDR - DR_FIRSTADDR); + +- i386_linux_dr[DR_FIRSTADDR + regnum] = addr; +- ALL_LWPS (lp, ptid) +- i386_linux_dr_set (ptid, DR_FIRSTADDR + regnum, addr); ++ data.regnum = regnum; ++ data.addr = addr; ++ linux_nat_iterate_watchpoint_lwps (i386_linux_dr_set_addr_callback, &data); } -diff --git a/gdb/i386-nat.h b/gdb/i386-nat.h -index 7317e7d..ea914a5 100644 ---- a/gdb/i386-nat.h -+++ b/gdb/i386-nat.h -@@ -62,6 +62,10 @@ extern void i386_use_watchpoints (struct target_ops *); - unset_status -- unset the specified bits of the debug - status (DR6) register for all LWPs - -+ detach -- clear all debug registers of only the -+ INFERIOR_PTID task without affecting any -+ register caches. -+ - Additionally, the native file should set the debug_register_length - field to 4 or 8 depending on the number of bytes used for - deubg registers. */ -@@ -73,6 +77,7 @@ struct i386_dr_low_type - void (*reset_addr) (int); - unsigned long (*get_status) (void); - void (*unset_status) (unsigned long); -+ void (*detach) (void); - int debug_register_length; - }; -diff --git a/gdb/infcall.c b/gdb/infcall.c -index 7f60e56..b7acfc6 100644 ---- a/gdb/infcall.c -+++ b/gdb/infcall.c -@@ -225,6 +225,56 @@ value_arg_coerce (struct gdbarch *gdbarch, struct value *arg, - return value_cast (type, arg); +-/* Set address REGNUM (zero based) to zero in all LWPs of LWP_LIST. */ ++/* Set address REGNUM (zero based) to zero in all LWPs of CURRENT_INFERIOR. ++ */ + + static void + i386_linux_dr_reset_addr (int regnum) +@@ -726,36 +754,54 @@ i386_linux_dr_reset_addr (int regnum) + static unsigned long + i386_linux_dr_get_status (void) + { +- return i386_linux_dr_get (inferior_ptid, DR_STATUS); ++ int tid; ++ ++ tid = TIDGET (inferior_ptid); ++ if (tid == 0) ++ tid = PIDGET (inferior_ptid); ++ ++ return i386_linux_dr_get (tid, DR_STATUS); } -+/* Call gnu-ifunc (STT_GNU_IFUNC - a function returning addresss of a real -+ function to call). PC is the gnu-ifunc function entry. Function returns -+ function entry of the gnu-ifunc-resolved function to call. If RETVAL_TYPEP -+ is not NULL fill in *RETVAL_TYPEP with return type of the gnu-ifunc-resolved -+ function to call. Keep *RETVAL_TYPEP intact if the return type could not be -+ found. */ +-/* Unset MASK bits in DR_STATUS in all LWPs of LWP_LIST. */ ++/* Helper for i386_linux_dr_unset_status. */ + + static void +-i386_linux_dr_unset_status (unsigned long mask) ++i386_linux_dr_unset_status_callback (int tid, void *mask_voidp) + { +- struct lwp_info *lp; +- ptid_t ptid; +- +- ALL_LWPS (lp, ptid) +- { +- unsigned long value; ++ unsigned long mask = *(unsigned long *) mask_voidp; ++ unsigned long value; + +- value = i386_linux_dr_get (ptid, DR_STATUS); +- value &= ~mask; +- i386_linux_dr_set (ptid, DR_STATUS, value); +- } ++ value = i386_linux_dr_get (tid, DR_STATUS); ++ value &= ~mask; ++ i386_linux_dr_set (tid, DR_STATUS, value); ++} + -+static CORE_ADDR -+gnu_ifunc_resolve (struct gdbarch *gdbarch, CORE_ADDR pc) ++/* Unset MASK bits in DR_STATUS in all LWPs of CURRENT_INFERIOR. */ ++ ++static void ++i386_linux_dr_unset_status (unsigned long mask) +{ -+ char *name_at_pc; -+ CORE_ADDR start_at_pc, address; -+ struct type *func_func_type = builtin_type (gdbarch)->builtin_func_func; -+ struct value *function, *address_val; ++ linux_nat_iterate_watchpoint_lwps (i386_linux_dr_unset_status_callback, ++ &mask); + } + + static void + i386_linux_new_thread (ptid_t ptid) + { +- int i; ++ struct i386_dr_mirror *dr_mirror = i386_dr_mirror_get (); ++ int i, tid; + -+ if (find_pc_partial_function (pc, &name_at_pc, &start_at_pc, NULL) -+ && start_at_pc == pc) -+ { -+ if (resolve_gnu_ifunc (name_at_pc, &address)) -+ return address; -+ } -+ else -+ name_at_pc = NULL; ++ /* Verify DR_MIRROR is valid. */ ++ gdb_assert (PIDGET (ptid) == PIDGET (inferior_ptid)); ++ ++ tid = TIDGET (ptid); ++ if (tid == 0) ++ tid = PIDGET (ptid); + +- for (i = DR_FIRSTADDR; i <= DR_LASTADDR; i++) +- i386_linux_dr_set (ptid, i, i386_linux_dr[i]); ++ for (i = 0; i < DR_LASTADDR - DR_FIRSTADDR; i++) ++ i386_linux_dr_set (tid, DR_FIRSTADDR + i, dr_mirror->addr[i]); + +- i386_linux_dr_set (ptid, DR_CONTROL, i386_linux_dr[DR_CONTROL]); ++ i386_linux_dr_set (tid, DR_CONTROL, dr_mirror->control); + } + + +diff --git a/gdb/i386-nat.c b/gdb/i386-nat.c +index eaa3644..7f32bd2 100644 +--- a/gdb/i386-nat.c ++++ b/gdb/i386-nat.c +@@ -25,6 +25,7 @@ + #include "gdbcmd.h" + #include "target.h" + #include "gdb_assert.h" ++#include "inferior.h" + + /* Support for hardware watchpoints and breakpoints using the i386 + debug registers. +@@ -44,7 +45,6 @@ struct i386_dr_low_type i386_dr_low; + #define TARGET_HAS_DR_LEN_8 (i386_dr_low.debug_register_length == 8) + + /* Debug registers' indices. */ +-#define DR_NADDR 4 /* The number of debug address registers. */ + #define DR_STATUS 6 /* Index of debug status register (DR6). */ + #define DR_CONTROL 7 /* Index of debug control register (DR7). */ + +@@ -111,49 +111,60 @@ struct i386_dr_low_type i386_dr_low; + + /* The I'th debug register is vacant if its Local and Global Enable + bits are reset in the Debug Control register. */ +-#define I386_DR_VACANT(i) \ +- ((dr_control_mirror & (3 << (DR_ENABLE_SIZE * (i)))) == 0) ++ ++static inline int ++i386_dr_vacant (struct i386_dr_mirror *dr_mirror, int i) ++{ ++ return (dr_mirror->control & (3 << (DR_ENABLE_SIZE * i))) == 0; ++} + + /* Locally enable the break/watchpoint in the I'th debug register. */ +-#define I386_DR_LOCAL_ENABLE(i) \ +- dr_control_mirror |= (1 << (DR_LOCAL_ENABLE_SHIFT + DR_ENABLE_SIZE * (i))) + +-/* Globally enable the break/watchpoint in the I'th debug register. */ +-#define I386_DR_GLOBAL_ENABLE(i) \ +- dr_control_mirror |= (1 << (DR_GLOBAL_ENABLE_SHIFT + DR_ENABLE_SIZE * (i))) ++static inline void ++i386_dr_local_enable (struct i386_dr_mirror *dr_mirror, int i) ++{ ++ dr_mirror->control |= 1 << (DR_LOCAL_ENABLE_SHIFT + DR_ENABLE_SIZE * i); ++} + + /* Disable the break/watchpoint in the I'th debug register. */ +-#define I386_DR_DISABLE(i) \ +- dr_control_mirror &= ~(3 << (DR_ENABLE_SIZE * (i))) ++ ++static inline void ++i386_dr_disable (struct i386_dr_mirror *dr_mirror, int i) ++{ ++ dr_mirror->control &= ~(3 << (DR_ENABLE_SIZE * i)); ++} + + /* Set in DR7 the RW and LEN fields for the I'th debug register. */ +-#define I386_DR_SET_RW_LEN(i,rwlen) \ +- do { \ +- dr_control_mirror &= ~(0x0f << (DR_CONTROL_SHIFT+DR_CONTROL_SIZE*(i))); \ +- dr_control_mirror |= ((rwlen) << (DR_CONTROL_SHIFT+DR_CONTROL_SIZE*(i))); \ +- } while (0) ++ ++static inline void ++i386_dr_set_rw_len (struct i386_dr_mirror *dr_mirror, int i, unsigned rwlen) ++{ ++ dr_mirror->control &= ~(0x0f << (DR_CONTROL_SHIFT + DR_CONTROL_SIZE * i)); ++ dr_mirror->control |= rwlen << (DR_CONTROL_SHIFT + DR_CONTROL_SIZE * i); ++} + + /* Get from DR7 the RW and LEN fields for the I'th debug register. */ +-#define I386_DR_GET_RW_LEN(i) \ +- ((dr_control_mirror >> (DR_CONTROL_SHIFT + DR_CONTROL_SIZE * (i))) & 0x0f) ++ ++static inline unsigned ++i386_dr_get_rw_len (struct i386_dr_mirror *dr_mirror, int i) ++{ ++ return ((dr_mirror->control >> (DR_CONTROL_SHIFT + DR_CONTROL_SIZE * i)) ++ & 0x0f); ++} + + /* Mask that this I'th watchpoint has triggered. */ + #define I386_DR_WATCH_MASK(i) (1 << (i)) + + /* Did the watchpoint whose address is in the I'th register break? */ +-#define I386_DR_WATCH_HIT(i) (dr_status_mirror & I386_DR_WATCH_MASK (i)) ++static inline int ++i386_dr_watch_hit (struct i386_dr_mirror *dr_mirror, int i) ++{ ++ return (dr_mirror->status & I386_DR_WATCH_MASK (i)) != 0; ++} + + /* A macro to loop over all debug registers. */ + #define ALL_DEBUG_REGISTERS(i) for (i = 0; i < DR_NADDR; i++) + +-/* Mirror the inferior's DRi registers. We keep the status and +- control registers separated because they don't hold addresses. */ +-static CORE_ADDR dr_mirror[DR_NADDR]; +-static unsigned long dr_status_mirror, dr_control_mirror; +- +-/* Reference counts for each debug register. */ +-static int dr_ref_count[DR_NADDR]; +- + /* Whether or not to print the mirrored debug registers. */ + static int maint_show_dr; + +@@ -195,21 +206,80 @@ static int i386_handle_nonaligned_watchpoint (i386_wp_op_t what, + + /* Implementation. */ + ++/* Per-inferior data key. */ ++static const struct inferior_data *i386_inferior_data; ++ ++struct i386_inferior_data ++ { ++ /* Copy of i386 hardware debug registers for performance reasons. */ ++ struct i386_dr_mirror dr_mirror; ++ }; ++ ++static void ++i386_inferior_data_cleanup (struct inferior *inf, void *arg) ++{ ++ struct i386_inferior_data *inf_data = arg; ++ ++ xfree (inf_data); ++} ++ ++static struct i386_inferior_data * ++i386_inferior_data_get (void) ++{ ++ struct inferior *inf = current_inferior (); ++ struct i386_inferior_data *inf_data; ++ ++ inf_data = inferior_data (inf, i386_inferior_data); ++ if (inf_data == NULL) ++ { ++ inf_data = xzalloc (sizeof (*inf_data)); ++ set_inferior_data (current_inferior (), i386_inferior_data, inf_data); ++ } ++ ++ if (inf->pid != ptid_get_pid (inferior_ptid)) ++ { ++ static struct i386_inferior_data detached_inf_data_local; ++ static int detached_inf_pid = -1; ++ ++ if (detached_inf_pid != ptid_get_pid (inferior_ptid)) ++ { ++ detached_inf_pid = ptid_get_pid (inferior_ptid); ++ ++ /* Forked processes get a copy of the debug registers. */ ++ memcpy (&detached_inf_data_local, inf_data, ++ sizeof (detached_inf_data_local)); ++ detached_inf_data_local.dr_mirror.addr_preset = 0; ++ } ++ ++ return &detached_inf_data_local; ++ } ++ ++ return inf_data; ++} ++ + /* Clear the reference counts and forget everything we knew about the + debug registers. */ + ++struct i386_dr_mirror * ++i386_dr_mirror_get (void) ++{ ++ return &i386_inferior_data_get ()->dr_mirror; ++} ++ + void + i386_cleanup_dregs (void) + { ++ struct i386_dr_mirror *dr_mirror = i386_dr_mirror_get (); + int i; + + ALL_DEBUG_REGISTERS(i) + { +- dr_mirror[i] = 0; +- dr_ref_count[i] = 0; ++ dr_mirror->addr[i] = 0; ++ dr_mirror->ref_count[i] = 0; + } +- dr_control_mirror = 0; +- dr_status_mirror = 0; ++ dr_mirror->addr_preset = 0; ++ dr_mirror->control = 0; ++ dr_mirror->status = 0; + } + + /* Print the values of the mirrored debug registers. This is called +@@ -220,6 +290,7 @@ static void + i386_show_dr (const char *func, CORE_ADDR addr, + int len, enum target_hw_bp_type type) + { ++ struct i386_dr_mirror *dr_mirror = i386_dr_mirror_get (); + int addr_size = gdbarch_addr_bit (target_gdbarch) / 8; + int i; + +@@ -239,13 +310,16 @@ i386_show_dr (const char *func, CORE_ADDR addr, + : "??unknown??")))); + puts_unfiltered (":\n"); + printf_unfiltered ("\tCONTROL (DR7): %s STATUS (DR6): %s\n", +- phex (dr_control_mirror, 8), phex (dr_status_mirror, 8)); ++ phex (dr_mirror->control, 8), ++ phex (dr_mirror->status, 8)); + ALL_DEBUG_REGISTERS(i) + { + printf_unfiltered ("\ + \tDR%d: addr=0x%s, ref.count=%d DR%d: addr=0x%s, ref.count=%d\n", +- i, phex (dr_mirror[i], addr_size), dr_ref_count[i], +- i+1, phex (dr_mirror[i+1], addr_size), dr_ref_count[i+1]); ++ i, phex (dr_mirror->addr[i], addr_size), ++ dr_mirror->ref_count[i], i + 1, ++ phex (dr_mirror->addr[i + 1], addr_size), ++ dr_mirror->ref_count[i + 1]); + i++; + } + } +@@ -311,6 +385,7 @@ Invalid hardware breakpoint length %d in i386_length_and_rw_bits.\n"), len); + static int + i386_insert_aligned_watchpoint (CORE_ADDR addr, unsigned len_rw_bits) + { ++ struct i386_dr_mirror *dr_mirror = i386_dr_mirror_get (); + int i; + + if (!i386_dr_low.set_addr || !i386_dr_low.set_control) +@@ -321,11 +396,10 @@ i386_insert_aligned_watchpoint (CORE_ADDR addr, unsigned len_rw_bits) + reuse it for this watchpoint as well (and save a register). */ + ALL_DEBUG_REGISTERS(i) + { +- if (!I386_DR_VACANT (i) +- && dr_mirror[i] == addr +- && I386_DR_GET_RW_LEN (i) == len_rw_bits) ++ if (!i386_dr_vacant (dr_mirror, i) && dr_mirror->addr[i] == addr ++ && i386_dr_get_rw_len (dr_mirror, i) == len_rw_bits) + { +- dr_ref_count[i]++; ++ dr_mirror->ref_count[i]++; + return 0; + } + } +@@ -333,7 +407,7 @@ i386_insert_aligned_watchpoint (CORE_ADDR addr, unsigned len_rw_bits) + /* Next, look for a vacant debug register. */ + ALL_DEBUG_REGISTERS(i) + { +- if (I386_DR_VACANT (i)) ++ if (i386_dr_vacant (dr_mirror, i)) + break; + } + +@@ -344,9 +418,9 @@ i386_insert_aligned_watchpoint (CORE_ADDR addr, unsigned len_rw_bits) + /* Now set up the register I to watch our region. */ + + /* Record the info in our local mirrored array. */ +- dr_mirror[i] = addr; +- dr_ref_count[i] = 1; +- I386_DR_SET_RW_LEN (i, len_rw_bits); ++ dr_mirror->addr[i] = addr; ++ dr_mirror->ref_count[i] = 1; ++ i386_dr_set_rw_len (dr_mirror, i, len_rw_bits); + /* Note: we only enable the watchpoint locally, i.e. in the current + task. Currently, no i386 target allows or supports global + watchpoints; however, if any target would want that in the +@@ -354,13 +428,13 @@ i386_insert_aligned_watchpoint (CORE_ADDR addr, unsigned len_rw_bits) + to enable watchpoints globally or locally, and the code below + should use global or local enable and slow-down flags as + appropriate. */ +- I386_DR_LOCAL_ENABLE (i); +- dr_control_mirror |= DR_LOCAL_SLOWDOWN; +- dr_control_mirror &= I386_DR_CONTROL_MASK; ++ i386_dr_local_enable (dr_mirror, i); ++ dr_mirror->control |= DR_LOCAL_SLOWDOWN; ++ dr_mirror->control &= I386_DR_CONTROL_MASK; + + /* Finally, actually pass the info to the inferior. */ + i386_dr_low.set_addr (i, addr); +- i386_dr_low.set_control (dr_control_mirror); ++ i386_dr_low.set_control (dr_mirror->control); + + /* Only a sanity check for leftover bits (set possibly only by inferior). */ + if (i386_dr_low.unset_status) +@@ -378,21 +452,21 @@ i386_insert_aligned_watchpoint (CORE_ADDR addr, unsigned len_rw_bits) + static int + i386_remove_aligned_watchpoint (CORE_ADDR addr, unsigned len_rw_bits) + { ++ struct i386_dr_mirror *dr_mirror = i386_dr_mirror_get (); + int i, retval = -1; + + ALL_DEBUG_REGISTERS(i) + { +- if (!I386_DR_VACANT (i) +- && dr_mirror[i] == addr +- && I386_DR_GET_RW_LEN (i) == len_rw_bits) ++ if (!i386_dr_vacant (dr_mirror, i) && dr_mirror->addr[i] == addr ++ && i386_dr_get_rw_len (dr_mirror, i) == len_rw_bits) + { +- if (--dr_ref_count[i] == 0) /* no longer in use? */ ++ if (--dr_mirror->ref_count[i] == 0) /* no longer in use? */ + { + /* Reset our mirror. */ +- dr_mirror[i] = 0; +- I386_DR_DISABLE (i); ++ dr_mirror->addr[i] = 0; ++ i386_dr_disable (dr_mirror, i); + /* Reset it in the inferior. */ +- i386_dr_low.set_control (dr_control_mirror); ++ i386_dr_low.set_control (dr_mirror->control); + if (i386_dr_low.reset_addr) + i386_dr_low.reset_addr (i); + } +@@ -554,26 +628,27 @@ i386_region_ok_for_watchpoint (CORE_ADDR addr, int len) + static int + i386_stopped_data_address (struct target_ops *ops, CORE_ADDR *addr_p) + { ++ struct i386_dr_mirror *dr_mirror = i386_dr_mirror_get (); + CORE_ADDR addr = 0; + int i; + int rc = 0; + +- dr_status_mirror = i386_dr_low.get_status (); ++ dr_mirror->status = i386_dr_low.get_status (); + + ALL_DEBUG_REGISTERS(i) + { +- if (I386_DR_WATCH_HIT (i) ++ if (i386_dr_watch_hit (dr_mirror, i) + /* This second condition makes sure DRi is set up for a data + watchpoint, not a hardware breakpoint. The reason is + that GDB doesn't call the target_stopped_data_address + method except for data watchpoints. In other words, I'm + being paranoiac. */ +- && I386_DR_GET_RW_LEN (i) != 0 ++ && i386_dr_get_rw_len (dr_mirror, i) != 0 + /* This third condition makes sure DRi is not vacant, this + avoids false positives in windows-nat.c. */ +- && !I386_DR_VACANT (i)) ++ && !i386_dr_vacant (dr_mirror, i)) + { +- addr = dr_mirror[i]; ++ addr = dr_mirror->addr[i]; + rc = 1; + if (maint_show_dr) + i386_show_dr ("watchpoint_hit", addr, -1, hw_write); +@@ -687,6 +762,10 @@ i386_use_watchpoints (struct target_ops *t) + t->to_remove_watchpoint = i386_remove_watchpoint; + t->to_insert_hw_breakpoint = i386_insert_hw_breakpoint; + t->to_remove_hw_breakpoint = i386_remove_hw_breakpoint; ++ ++ if (i386_inferior_data == NULL) ++ i386_inferior_data ++ = register_inferior_data_with_cleanup (i386_inferior_data_cleanup); + } + + void +diff --git a/gdb/i386-nat.h b/gdb/i386-nat.h +index 7317e7d..65cd326 100644 +--- a/gdb/i386-nat.h ++++ b/gdb/i386-nat.h +@@ -78,6 +78,28 @@ struct i386_dr_low_type + + extern struct i386_dr_low_type i386_dr_low; + ++/* The number of debug address registers. */ ++#define DR_NADDR 4 ++ ++/* Copy of hardware debug registers for performance reasons. */ ++ ++struct i386_dr_mirror ++ { ++ /* Mirror the inferior's DRi registers. We keep the status and ++ control registers separated because they don't hold addresses. */ ++ CORE_ADDR addr[DR_NADDR]; ++ ++ /* All the ADDR hardware registers have been written at least once. */ ++ unsigned addr_preset : 1; ++ ++ /* Reference counts for each debug register. */ ++ int ref_count[DR_NADDR]; ++ ++ unsigned long status, control; ++ }; ++ ++extern struct i386_dr_mirror *i386_dr_mirror_get (void); ++ + /* Use this function to set i386_dr_low debug_register_length field + rather than setting it directly to check that the length is only + set once. It also enables the 'maint set/show show-debug-regs' +diff --git a/gdb/infcall.c b/gdb/infcall.c +index 6eb1bbf..7323c4b 100644 +--- a/gdb/infcall.c ++++ b/gdb/infcall.c +@@ -225,6 +225,56 @@ value_arg_coerce (struct gdbarch *gdbarch, struct value *arg, + return value_cast (type, arg); + } + ++/* Call gnu-ifunc (STT_GNU_IFUNC - a function returning addresss of a real ++ function to call). PC is the gnu-ifunc function entry. Function returns ++ function entry of the gnu-ifunc-resolved function to call. If RETVAL_TYPEP ++ is not NULL fill in *RETVAL_TYPEP with return type of the gnu-ifunc-resolved ++ function to call. Keep *RETVAL_TYPEP intact if the return type could not be ++ found. */ ++ ++static CORE_ADDR ++gnu_ifunc_resolve (struct gdbarch *gdbarch, CORE_ADDR pc) ++{ ++ char *name_at_pc; ++ CORE_ADDR start_at_pc, address; ++ struct type *func_func_type = builtin_type (gdbarch)->builtin_func_func; ++ struct value *function, *address_val; ++ ++ if (find_pc_partial_function (pc, &name_at_pc, &start_at_pc, NULL) ++ && start_at_pc == pc) ++ { ++ if (resolve_gnu_ifunc (name_at_pc, &address)) ++ return address; ++ } ++ else ++ name_at_pc = NULL; + + function = allocate_value (func_func_type); + set_value_address (function, pc); @@ -4445,98 +5132,91 @@ index 7f60e56..b7acfc6 100644 { /* Handle the case of functions lacking debugging info. Their values are characters since their addresses are char */ -diff --git a/gdb/infrun.c b/gdb/infrun.c -index f6b00da..56e558b 100644 ---- a/gdb/infrun.c -+++ b/gdb/infrun.c -@@ -3267,6 +3267,10 @@ handle_inferior_event (struct execution_control_state *ecs) - - stop_pc = regcache_read_pc (get_thread_regcache (ecs->ptid)); - -+ /* Clear WATCHPOINT_TRIGGERED values from previous stop which could -+ confuse bpstat_stop_status and bpstat_explains_signal. */ -+ watchpoints_triggered (&ecs->ws); -+ - ecs->event_thread->stop_bpstat - = bpstat_stop_status (get_regcache_aspace (get_current_regcache ()), - stop_pc, ecs->ptid); -@@ -3354,6 +3358,10 @@ handle_inferior_event (struct execution_control_state *ecs) - - stop_pc = regcache_read_pc (get_thread_regcache (ecs->ptid)); - -+ /* Clear WATCHPOINT_TRIGGERED values from previous stop which could -+ confuse bpstat_stop_status and bpstat_explains_signal. */ -+ watchpoints_triggered (&ecs->ws); -+ - /* Do whatever is necessary to the parent branch of the vfork. */ - handle_vfork_child_exec_or_exit (1); - diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c -index 0e18034..96895db 100644 +index 56490cc..c4d1c28 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c -@@ -2607,6 +2607,39 @@ linux_nat_stopped_data_address (struct target_ops *ops, CORE_ADDR *addr_p) - return lp->stopped_data_address_p; +@@ -1243,6 +1243,64 @@ iterate_over_lwps (ptid_t filter, + return NULL; } -+/* In `set follow-fork-mode child' with multithreaded parent we need to detach -+ watchpoints from all the LWPs. In such case INFERIOR_PTID will be the -+ non-threaded new child while LWP_LIST will still contain all the threads of -+ the parent being detached. */ ++/* Helper for linux_nat_iterate_watchpoint_lwps. */ ++ ++struct iterate_watchpoint_lwps_data ++ { ++ linux_nat_iterate_watchpoint_lwps_ftype callback; ++ void *callback_data; ++ }; + +static int -+linux_nat_detach_watchpoints (void) ++iterate_watchpoint_lwps_callback (struct lwp_info *lp, void *datap_voidp) +{ -+ struct lwp_info *lp; -+ int found = 0, retval = 0; -+ ptid_t filter = pid_to_ptid (ptid_get_pid (inferior_ptid)); -+ struct cleanup *old_chain = save_inferior_ptid (); ++ struct iterate_watchpoint_lwps_data *datap = datap_voidp; ++ int tid; + -+ for (lp = lwp_list; lp; lp = lp->next) -+ if (ptid_match (lp->ptid, filter)) -+ { -+ inferior_ptid = lp->ptid; -+ retval |= linux_ops->to_detach_watchpoints (); -+ found = 1; -+ } ++ tid = TIDGET (lp->ptid); ++ if (tid == 0) ++ tid = PIDGET (lp->ptid); + -+ do_cleanups (old_chain); ++ datap->callback (tid, datap->callback_data); ++ ++ /* Continue the traversal. */ ++ return 0; ++} + -+ if (!found) ++/* Iterate like iterate_over_lwps does except when forking-off a child call ++ CALLBACK with CALLBACK_DATA specifically only for that new child PID. ++ ++ During `set follow-fork-mode child' the call is also made for the new child ++ PID; parent watchpoints get detached elsewhere (during target_detach). */ ++ ++void ++linux_nat_iterate_watchpoint_lwps ++ (linux_nat_iterate_watchpoint_lwps_ftype callback, void *callback_data) ++{ ++ struct iterate_watchpoint_lwps_data data; ++ int inferior_pid = ptid_get_pid (inferior_ptid); ++ struct inferior *inf = current_inferior (); ++ ++ data.callback = callback; ++ data.callback_data = callback_data; ++ ++ if (inf->pid == inferior_pid) + { -+ gdb_assert (!is_lwp (inferior_ptid)); ++ /* Standard mode. Iterate all the threads of the current inferior. ++ Without specifying INFERIOR_PID it would iterate all the threads of ++ all the inferiors, which is inappropriate for watchpoints. */ + -+ retval |= linux_ops->to_detach_watchpoints (); ++ iterate_over_lwps (pid_to_ptid (inferior_pid), ++ iterate_watchpoint_lwps_callback, &data); + } ++ else ++ { ++ /* Detaching a new child PID temporarily present in INFERIOR_PID. */ + -+ return retval; ++ callback (inferior_pid, callback_data); ++ } +} + - /* Commonly any breakpoint / watchpoint generate only SIGTRAP. */ - - static int -@@ -5660,6 +5693,8 @@ linux_nat_add_target (struct target_ops *t) - t->to_thread_address_space = linux_nat_thread_address_space; - t->to_stopped_by_watchpoint = linux_nat_stopped_by_watchpoint; - t->to_stopped_data_address = linux_nat_stopped_data_address; -+ if (linux_ops->to_detach_watchpoints) -+ t->to_detach_watchpoints = linux_nat_detach_watchpoints; - - t->to_can_async_p = linux_nat_can_async_p; - t->to_is_async_p = linux_nat_is_async_p; -diff --git a/gdb/linux-tdep.c b/gdb/linux-tdep.c -index c51ede9..ef8cbda 100644 ---- a/gdb/linux-tdep.c -+++ b/gdb/linux-tdep.c -@@ -24,6 +24,8 @@ - #include "target.h" - #include "elf/common.h" - #include "inferior.h" -+#include "value.h" -+#include "infcall.h" - - static struct gdbarch_data *linux_gdbarch_data_handle; + /* Update our internal state when changing from one checkpoint to + another indicated by NEW_PTID. We can only switch single-threaded + applications, so we only create one new LWP, and the previous list +diff --git a/gdb/linux-nat.h b/gdb/linux-nat.h +index 64393fd..a053cbd 100644 +--- a/gdb/linux-nat.h ++++ b/gdb/linux-nat.h +@@ -139,6 +139,11 @@ struct lwp_info *iterate_over_lwps (ptid_t filter, + void *), + void *data); ++typedef void (*linux_nat_iterate_watchpoint_lwps_ftype) (int tid, void *data); ++ ++extern void linux_nat_iterate_watchpoint_lwps ++ (linux_nat_iterate_watchpoint_lwps_ftype callback, void *callback_data); ++ + /* Create a prototype generic GNU/Linux target. The client can + override it with local methods. */ + struct target_ops * linux_target (void); diff --git a/gdb/mi/mi-cmd-var.c b/gdb/mi/mi-cmd-var.c index 310ade9..d8710a1 100644 --- a/gdb/mi/mi-cmd-var.c @@ -4601,7 +5281,7 @@ index 0a57e77..6be74df 100644 SYMBOL_LINKAGE_NAME (tsymbol)) == 0) return SYMBOL_VALUE_ADDRESS (msymbol); diff --git a/gdb/p-valprint.c b/gdb/p-valprint.c -index 44a2d72..e3aead4 100644 +index 47663bd..d9fb878 100644 --- a/gdb/p-valprint.c +++ b/gdb/p-valprint.c @@ -38,6 +38,7 @@ @@ -4860,42 +5540,146 @@ index 1625575..d072f86 100644 + #endif /* PARSER_DEFS_H */ diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c -index 18ddee7..652b02a 100644 +index 18ddee7..ebb0022 100644 --- a/gdb/ppc-linux-nat.c +++ b/gdb/ppc-linux-nat.c -@@ -2010,6 +2010,24 @@ ppc_linux_remove_watchpoint (CORE_ADDR addr, int len, int rw, - return ret; +@@ -1620,12 +1620,18 @@ booke_remove_point (struct ppc_hw_breakpoint *b, int tid) + hw_breaks[i].hw_break = NULL; } -+/* See target_detach_watchpoints. Do not use wrapper -+ ppc_linux_remove_watchpoint as it would modify the register cache -+ (saved_dabr_value). */ ++static void ++booke_insert_point_callback (int tid, void *pp_voidp) ++{ ++ struct ppc_hw_breakpoint *pp = pp_voidp; + -+static int -+ppc_linux_detach_watchpoints (void) ++ booke_insert_point (pp, tid); ++} ++ + static int + ppc_linux_insert_hw_breakpoint (struct gdbarch *gdbarch, + struct bp_target_info *bp_tgt) + { +- ptid_t ptid; +- struct lwp_info *lp; + struct ppc_hw_breakpoint p; + + if (!have_ptrace_booke_interface ()) +@@ -1639,18 +1645,23 @@ ppc_linux_insert_hw_breakpoint (struct gdbarch *gdbarch, + p.addr2 = 0; + p.condition_value = 0; + +- ALL_LWPS (lp, ptid) +- booke_insert_point (&p, TIDGET (ptid)); ++ linux_nat_iterate_watchpoint_lwps (booke_insert_point_callback, &p); + + return 0; + } + ++static void ++booke_remove_point_callback (int tid, void *pp_voidp) +{ -+ pid_t tid; ++ struct ppc_hw_breakpoint *pp = pp_voidp; + -+ tid = TIDGET (inferior_ptid); -+ if (tid == 0) -+ tid = PIDGET (inferior_ptid); ++ booke_remove_point (pp, tid); ++} + -+ if (ptrace (PTRACE_SET_DEBUGREG, tid, NULL, NULL) < 0) -+ return -1; -+ return 0; + static int + ppc_linux_remove_hw_breakpoint (struct gdbarch *gdbarch, + struct bp_target_info *bp_tgt) + { +- ptid_t ptid; +- struct lwp_info *lp; + struct ppc_hw_breakpoint p; + + if (!have_ptrace_booke_interface ()) +@@ -1664,8 +1675,7 @@ ppc_linux_remove_hw_breakpoint (struct gdbarch *gdbarch, + p.addr2 = 0; + p.condition_value = 0; + +- ALL_LWPS (lp, ptid) +- booke_remove_point (&p, TIDGET (ptid)); ++ linux_nat_iterate_watchpoint_lwps (booke_remove_point_callback, &p); + + return 0; + } +@@ -1878,12 +1888,19 @@ ppc_linux_can_accel_watchpoint_condition (CORE_ADDR addr, int len, int rw, + && check_condition (addr, cond, &data_value)); + } + ++static void ++set_saved_dabr_value_callback (int tid, void *retp_voidp) ++{ ++ int *retp = retp_voidp; ++ ++ if (ptrace (PTRACE_SET_DEBUGREG, tid, 0, saved_dabr_value) < 0) ++ *retp = -1; +} + - static void - ppc_linux_new_thread (ptid_t ptid) + static int + ppc_linux_insert_watchpoint (CORE_ADDR addr, int len, int rw, + struct expression *cond) { -@@ -2349,6 +2367,7 @@ _initialize_ppc_linux_nat (void) - t->to_region_ok_for_hw_watchpoint = ppc_linux_region_ok_for_hw_watchpoint; - t->to_insert_watchpoint = ppc_linux_insert_watchpoint; - t->to_remove_watchpoint = ppc_linux_remove_watchpoint; -+ t->to_detach_watchpoints = ppc_linux_detach_watchpoints; - t->to_stopped_by_watchpoint = ppc_linux_stopped_by_watchpoint; - t->to_stopped_data_address = ppc_linux_stopped_data_address; - t->to_watchpoint_addr_within_range = ppc_linux_watchpoint_addr_within_range; +- struct lwp_info *lp; +- ptid_t ptid; + int ret = -1; + + if (have_ptrace_booke_interface ()) +@@ -1907,8 +1924,7 @@ ppc_linux_insert_watchpoint (CORE_ADDR addr, int len, int rw, + p.addr = (uint64_t) addr; + p.addr2 = 0; + +- ALL_LWPS (lp, ptid) +- booke_insert_point (&p, TIDGET (ptid)); ++ linux_nat_iterate_watchpoint_lwps (booke_insert_point_callback, &p); + + ret = 0; + } +@@ -1951,12 +1967,8 @@ ppc_linux_insert_watchpoint (CORE_ADDR addr, int len, int rw, + + saved_dabr_value = dabr_value; + +- ALL_LWPS (lp, ptid) +- if (ptrace (PTRACE_SET_DEBUGREG, TIDGET (ptid), 0, +- saved_dabr_value) < 0) +- return -1; +- + ret = 0; ++ linux_nat_iterate_watchpoint_lwps (set_saved_dabr_value_callback, &ret); + } + + return ret; +@@ -1966,8 +1978,6 @@ static int + ppc_linux_remove_watchpoint (CORE_ADDR addr, int len, int rw, + struct expression *cond) + { +- struct lwp_info *lp; +- ptid_t ptid; + int ret = -1; + + if (have_ptrace_booke_interface ()) +@@ -1991,20 +2001,16 @@ ppc_linux_remove_watchpoint (CORE_ADDR addr, int len, int rw, + p.addr = (uint64_t) addr; + p.addr2 = 0; + +- ALL_LWPS (lp, ptid) +- booke_remove_point (&p, TIDGET (ptid)); ++ linux_nat_iterate_watchpoint_lwps (booke_remove_point_callback, &p); + + ret = 0; + } + else + { + saved_dabr_value = 0; +- ALL_LWPS (lp, ptid) +- if (ptrace (PTRACE_SET_DEBUGREG, TIDGET (ptid), 0, +- saved_dabr_value) < 0) +- return -1; + + ret = 0; ++ linux_nat_iterate_watchpoint_lwps (set_saved_dabr_value_callback, &ret); + } + + return ret; diff --git a/gdb/printcmd.c b/gdb/printcmd.c index 5586767..144e851 100644 --- a/gdb/printcmd.c @@ -5129,7 +5913,7 @@ index 8232436..e9fc8aa 100644 diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c -index 4445655..8b06fd8 100644 +index 3ade512..70e00e9 100644 --- a/gdb/python/py-value.c +++ b/gdb/python/py-value.c @@ -28,6 +28,7 @@ @@ -5168,7 +5952,7 @@ index 4445655..8b06fd8 100644 diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c -index db21360..1897d10 100644 +index 60efc4a..824a076 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -1276,7 +1276,8 @@ svr4_in_dynsym_resolve_code (CORE_ADDR pc) @@ -5181,6 +5965,32 @@ index db21360..1897d10 100644 } /* Given an executable's ABFD and target, compute the entry-point +diff --git a/gdb/stack.c b/gdb/stack.c +index 1e0c2e6..23f7f56 100644 +--- a/gdb/stack.c ++++ b/gdb/stack.c +@@ -366,6 +366,7 @@ print_frame_args (struct symbol *func, struct frame_info *frame, + { + const struct language_defn *language; + struct value_print_options opts; ++ struct cleanup *old_chain; + + /* Use the appropriate language to display our symbol, + unless the user forced the language to a specific +@@ -378,7 +379,13 @@ print_frame_args (struct symbol *func, struct frame_info *frame, + get_raw_print_options (&opts); + opts.deref_ref = 0; + opts.summary = summary; ++ ++ /* Frame may be needed for check_typedef of TYPE_DYNAMIC. */ ++ old_chain = make_cleanup_restore_selected_frame (); ++ select_frame (frame); + common_val_print (val, stb->stream, 2, &opts, language); ++ do_cleanups (old_chain); ++ + ui_out_field_stream (uiout, "value", stb); + } + else diff --git a/gdb/symmisc.c b/gdb/symmisc.c index ef63216..1cc9082 100644 --- a/gdb/symmisc.c @@ -5259,93 +6069,6 @@ index a4032f8..944dd33 100644 extern struct minimal_symbol * lookup_minimal_symbol_and_objfile (const char *, struct objfile **); -diff --git a/gdb/target.c b/gdb/target.c -index 5984125..06589d4 100644 ---- a/gdb/target.c -+++ b/gdb/target.c -@@ -123,6 +123,8 @@ static int debug_to_insert_watchpoint (CORE_ADDR, int, int, - static int debug_to_remove_watchpoint (CORE_ADDR, int, int, - struct expression *); - -+static int debug_to_detach_watchpoints (void); -+ - static int debug_to_stopped_by_watchpoint (void); - - static int debug_to_stopped_data_address (struct target_ops *, CORE_ADDR *); -@@ -606,6 +608,7 @@ update_current_target (void) - INHERIT (to_remove_hw_breakpoint, t); - INHERIT (to_insert_watchpoint, t); - INHERIT (to_remove_watchpoint, t); -+ INHERIT (to_detach_watchpoints, t); - INHERIT (to_stopped_data_address, t); - INHERIT (to_have_steppable_watchpoint, t); - INHERIT (to_have_continuable_watchpoint, t); -@@ -739,6 +742,9 @@ update_current_target (void) - de_fault (to_remove_watchpoint, - (int (*) (CORE_ADDR, int, int, struct expression *)) - return_minus_one); -+ de_fault (to_detach_watchpoints, -+ (int (*) (void)) -+ return_zero); - de_fault (to_stopped_by_watchpoint, - (int (*) (void)) - return_zero); -@@ -3570,6 +3576,19 @@ debug_to_remove_watchpoint (CORE_ADDR addr, int len, int type, - return retval; - } - -+static int -+debug_to_detach_watchpoints (void) -+{ -+ int retval; -+ -+ retval = debug_target.to_detach_watchpoints (); -+ -+ fprintf_unfiltered (gdb_stdlog, -+ "target_detach_watchpoints () = %ld\n", -+ (unsigned long) retval); -+ return retval; -+} -+ - static void - debug_to_terminal_init (void) - { -@@ -3817,6 +3836,7 @@ setup_target_debug (void) - current_target.to_remove_hw_breakpoint = debug_to_remove_hw_breakpoint; - current_target.to_insert_watchpoint = debug_to_insert_watchpoint; - current_target.to_remove_watchpoint = debug_to_remove_watchpoint; -+ current_target.to_detach_watchpoints = debug_to_detach_watchpoints; - current_target.to_stopped_by_watchpoint = debug_to_stopped_by_watchpoint; - current_target.to_stopped_data_address = debug_to_stopped_data_address; - current_target.to_watchpoint_addr_within_range = debug_to_watchpoint_addr_within_range; -diff --git a/gdb/target.h b/gdb/target.h -index 7290d90..c026d76 100644 ---- a/gdb/target.h -+++ b/gdb/target.h -@@ -445,6 +445,7 @@ struct target_ops - provided with the corresponding target_* macros. */ - int (*to_remove_watchpoint) (CORE_ADDR, int, int, struct expression *); - int (*to_insert_watchpoint) (CORE_ADDR, int, int, struct expression *); -+ int (*to_detach_watchpoints) (void); - - int (*to_stopped_by_watchpoint) (void); - int to_have_steppable_watchpoint; -@@ -1324,6 +1325,15 @@ extern char *normal_pid_to_str (ptid_t ptid); - #define target_remove_watchpoint(addr, len, type, cond) \ - (*current_target.to_remove_watchpoint) (addr, len, type, cond) - -+/* Clear all debug registers without affecting any register caches. Function -+ acts on INFERIOR_PTID which should be the forked-off process, either the -+ non-threaded child one or the threaded parent one, depending on `set -+ follow-fork-mode'. Both watchpoints and hardware breakpoints get removed. -+ Return 0 on success, -1 on failure. */ -+ -+#define target_detach_watchpoints() \ -+ (*current_target.to_detach_watchpoints) () -+ - #define target_insert_hw_breakpoint(gdbarch, bp_tgt) \ - (*current_target.to_insert_hw_breakpoint) (gdbarch, bp_tgt) - diff --git a/gdb/testsuite/gdb.arch/x86_64-vla-pointer-foo.S b/gdb/testsuite/gdb.arch/x86_64-vla-pointer-foo.S new file mode 100644 index 0000000..83faaf6 @@ -7823,6 +8546,121 @@ index 0000000..e492b3a + print *, c40pt ! break-here + +end program repro +diff --git a/gdb/testsuite/gdb.fortran/dynamic-other-frame-stub.f90 b/gdb/testsuite/gdb.fortran/dynamic-other-frame-stub.f90 +new file mode 100644 +index 0000000..261ce17 +--- /dev/null ++++ b/gdb/testsuite/gdb.fortran/dynamic-other-frame-stub.f90 +@@ -0,0 +1,24 @@ ++! Copyright 2010 Free Software Foundation, Inc. ++! ++! This program is free software; you can redistribute it and/or modify ++! it under the terms of the GNU General Public License as published by ++! the Free Software Foundation; either version 2 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, write to the Free Software ++! Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++! ++! Ihis file is the Fortran source file for dynamic.exp. ++! Original file written by Jakub Jelinek . ++! Modified for the GDB testcase by Jan Kratochvil . ++ ++subroutine bar ++ real :: dummy ++ dummy = 1 ++end subroutine bar +diff --git a/gdb/testsuite/gdb.fortran/dynamic-other-frame.exp b/gdb/testsuite/gdb.fortran/dynamic-other-frame.exp +new file mode 100644 +index 0000000..4fdd5ee +--- /dev/null ++++ b/gdb/testsuite/gdb.fortran/dynamic-other-frame.exp +@@ -0,0 +1,37 @@ ++# Copyright 2010 Free Software Foundation, Inc. ++ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 2 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, write to the Free Software ++# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ ++set testfile "dynamic-other-frame" ++set srcfile1 ${testfile}.f90 ++set srcfile2 ${testfile}-stub.f90 ++set objfile2 ${objdir}/${subdir}/${testfile}-stub.o ++set executable ${testfile} ++set binfile ${objdir}/${subdir}/${executable} ++ ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile2}" "${objfile2}" object {f77}] != "" ++ || [gdb_compile "${srcdir}/${subdir}/${srcfile1} ${objfile2}" "${binfile}" executable {debug f77}] != "" } { ++ untested "Couldn't compile ${srcfile1} or ${srcfile2}" ++ return -1 ++} ++ ++clean_restart ${executable} ++ ++if ![runto bar_] then { ++ perror "couldn't run to bar_" ++ continue ++} ++ ++gdb_test "bt" {foo \(string='hello'.*} +diff --git a/gdb/testsuite/gdb.fortran/dynamic-other-frame.f90 b/gdb/testsuite/gdb.fortran/dynamic-other-frame.f90 +new file mode 100644 +index 0000000..2bc637d +--- /dev/null ++++ b/gdb/testsuite/gdb.fortran/dynamic-other-frame.f90 +@@ -0,0 +1,36 @@ ++! Copyright 2010 Free Software Foundation, Inc. ++! ++! This program is free software; you can redistribute it and/or modify ++! it under the terms of the GNU General Public License as published by ++! the Free Software Foundation; either version 2 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, write to the Free Software ++! Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++! ++! Ihis file is the Fortran source file for dynamic.exp. ++! Original file written by Jakub Jelinek . ++! Modified for the GDB testcase by Jan Kratochvil . ++ ++subroutine foo (string) ++ interface ++ subroutine bar ++ end subroutine ++ end interface ++ character string*(*) ++ call bar ! stop-here ++end subroutine foo ++program test ++ interface ++ subroutine foo (string) ++ character string*(*) ++ end subroutine ++ end interface ++ call foo ('hello') ++end diff --git a/gdb/testsuite/gdb.fortran/dynamic.exp b/gdb/testsuite/gdb.fortran/dynamic.exp new file mode 100644 index 0000000..0ccebe0 @@ -8169,23 +9007,207 @@ index 0000000..226dc5d +! Original file written by Jakub Jelinek . +! Modified for the GDB testcase by Jan Kratochvil . + -+subroutine foo (e, f) -+ character (len=1) :: c -+ character (len=8) :: d -+ character (len=*) :: e -+ character (len=*) :: f (1:7, 8:10) -+ c = 'c' -+ d = 'd' -+ e = 'e' ! var-init -+ f = 'f' -+ f(1,9) = 'f2' -+ c = 'c' ! var-finish -+end subroutine foo -+ character (len=4) :: g, h (1:7, 8:10) -+ g = 'g' -+ h = 'h' -+ call foo (g, h) -+end ++subroutine foo (e, f) ++ character (len=1) :: c ++ character (len=8) :: d ++ character (len=*) :: e ++ character (len=*) :: f (1:7, 8:10) ++ c = 'c' ++ d = 'd' ++ e = 'e' ! var-init ++ f = 'f' ++ f(1,9) = 'f2' ++ c = 'c' ! var-finish ++end subroutine foo ++ character (len=4) :: g, h (1:7, 8:10) ++ g = 'g' ++ h = 'h' ++ call foo (g, h) ++end +diff --git a/gdb/testsuite/gdb.multi/watchpoint-multi.c b/gdb/testsuite/gdb.multi/watchpoint-multi.c +new file mode 100644 +index 0000000..153c18b +--- /dev/null ++++ b/gdb/testsuite/gdb.multi/watchpoint-multi.c +@@ -0,0 +1,59 @@ ++/* This testcase is part of GDB, the GNU debugger. ++ ++ Copyright 2010 Free Software Foundation, Inc. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . */ ++ ++#include ++#include ++ ++static volatile int a, b, c; ++ ++static void ++marker_exit1 (void) ++{ ++ a = 1; ++} ++ ++/* Workaround PR breakpoints/12272 by two different breakpoint locations. */ ++static void ++marker_exit2 (void) ++{ ++ a = 1; ++} ++ ++static void * ++start (void *arg) ++{ ++ b = 2; ++ c = 3; ++ ++ return NULL; ++} ++ ++int ++main (void) ++{ ++ pthread_t thread; ++ int i; ++ ++ i = pthread_create (&thread, NULL, start, NULL); ++ assert (i == 0); ++ i = pthread_join (thread, NULL); ++ assert (i == 0); ++ ++ marker_exit1 (); ++ marker_exit2 (); ++ return 0; ++} +diff --git a/gdb/testsuite/gdb.multi/watchpoint-multi.exp b/gdb/testsuite/gdb.multi/watchpoint-multi.exp +new file mode 100644 +index 0000000..3b5d040 +--- /dev/null ++++ b/gdb/testsuite/gdb.multi/watchpoint-multi.exp +@@ -0,0 +1,113 @@ ++# Copyright 2010 Free Software Foundation, Inc. ++ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++if { [is_remote target] || ![isnative] } then { ++ continue ++} ++ ++set testfile "watchpoint-multi" ++ ++set executable ${testfile} ++set srcfile ${testfile}.c ++set binfile ${objdir}/${subdir}/${executable} ++ ++if { [gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { ++ untested ${testfile}.exp ++ return -1 ++} ++ ++clean_restart $executable ++ ++if ![runto_main] { ++ return ++} ++# Never keep/use any non-hw breakpoints to workaround a multi-inferior bug. ++delete_breakpoints ++ ++gdb_test "add-inferior" "Added inferior 2" ++gdb_test "inferior 2" "witching to inferior 2 .*" ++gdb_load $binfile ++ ++if ![runto_main] { ++ return ++} ++delete_breakpoints ++ ++# Simulate non-stop+target-async which also uses breakpoint always-inserted. ++gdb_test_no_output "set breakpoint always-inserted on" ++# displaced-stepping is also needed as other GDB sometimes still removes the ++# breakpoints, even with always-inserted on. ++gdb_test_no_output "set displaced-stepping on" ++ ++# Debugging of this testcase: ++#gdb_test_no_output "maintenance set show-debug-regs on" ++#gdb_test_no_output "set debug infrun 1" ++ ++# Do not use simple hardware watchpoint ("watch") as its false hit may be ++# unnoticed by GDB if it reads it still has the same value. ++gdb_test "awatch c" "Hardware access \\(read/write\\) watchpoint \[0-9\]+: c" ++# Never keep/use any non-hw breakpoints to workaround a multi-inferior bug. ++# Use `*' to workaround a multi-inferior bug. ++set test "hbreak *marker_exit2" ++gdb_test_multiple $test $test { ++ -re "Hardware assisted breakpoint \[0-9\]+ at .*\r\n$gdb_prompt $" { ++ pass $test ++ } ++ -re "(No hardware breakpoint support in the target\\.|Hardware breakpoints used exceeds limit\\.)\r\n$gdb_prompt $" { ++ pass $test ++ untested ${testfile}.exp ++ return ++ } ++} ++ ++gdb_test "inferior 1" "witching to inferior 1 .*" ++ ++gdb_test "awatch b" "Hardware access \\(read/write\\) watchpoint \[0-9\]+: b" ++gdb_test "hbreak *marker_exit1" {Hardware assisted breakpoint [0-9]+ at .*} ++ ++gdb_test "inferior 2" "witching to inferior 2 .*" ++ ++# FAIL would be a hit on watchpoint for `b' - that one is for the other ++# inferior. ++gdb_test "continue" "Hardware access \\(read/write\\) watchpoint \[0-9\]+: c\r\n\r\nOld value = 0\r\nNew value = 3\r\n.*" "catch c" ++ ++set test "catch marker_exit2" ++gdb_test_multiple "continue" $test { ++ -re "Breakpoint \[0-9\]+, marker_exit2 .*\r\n$gdb_prompt $" { ++ setup_kfail breakpoints/12312 *-*-* ++ pass $test ++ } ++ -re "Hardware access \\(read/write\\) watchpoint \[0-9\]+: c\r\n\r\nValue = 3\r\n.* in __nptl_death_event .*\r\n$gdb_prompt $" { ++ setup_kfail breakpoints/12312 *-*-* ++ fail $test ++ } ++} ++ ++gdb_test "inferior 1" "witching to inferior 1 .*" ++ ++gdb_test "continue" "Hardware access \\(read/write\\) watchpoint \[0-9\]+: b\r\n\r\nOld value = 0\r\nNew value = 2\r\n.*" "catch b" ++ ++set test "catch marker_exit1" ++gdb_test_multiple "continue" $test { ++ -re "Breakpoint \[0-9\]+, marker_exit1 .*\r\n$gdb_prompt $" { ++ setup_kfail breakpoints/12312 *-*-* ++ pass $test ++ } ++ -re "Hardware access \\(read/write\\) watchpoint \[0-9\]+: b\r\n\r\nValue = 2\r\n.* in __nptl_death_event .*\r\n$gdb_prompt $" { ++ setup_kfail breakpoints/12312 *-*-* ++ fail $test ++ } ++} ++ diff --git a/gdb/testsuite/gdb.opt/array-from-register-func.c b/gdb/testsuite/gdb.opt/array-from-register-func.c new file mode 100644 index 0000000..729f457 @@ -8564,15 +9586,15 @@ index 0000000..295602d + s := 'test'#0'string'; + writeln(s); { set breakpoint 2 here } +end. -diff --git a/gdb/testsuite/gdb.threads/watchpoint-fork-forkoff.c b/gdb/testsuite/gdb.threads/watchpoint-fork-forkoff.c +diff --git a/gdb/testsuite/gdb.threads/watchpoint-fork-child.c b/gdb/testsuite/gdb.threads/watchpoint-fork-child.c new file mode 100644 -index 0000000..4dc308b +index 0000000..a2ad29a --- /dev/null -+++ b/gdb/testsuite/gdb.threads/watchpoint-fork-forkoff.c -@@ -0,0 +1,175 @@ ++++ b/gdb/testsuite/gdb.threads/watchpoint-fork-child.c +@@ -0,0 +1,127 @@ +/* Test case for forgotten hw-watchpoints after fork()-off of a process. + -+ Copyright 2008, 2009 Free Software Foundation, Inc. ++ Copyright 2008, 2009, 2010 Free Software Foundation, Inc. + + This file is part of GDB. + @@ -8593,61 +9615,12 @@ index 0000000..4dc308b + +#include +#include ++#include ++#include ++#include ++#include + -+static void -+delay (void) -+{ -+ int i = usleep (1000000 / 100); -+ assert (i == 0 || errno == EINTR); -+} -+ -+#if defined FOLLOW_PARENT -+ -+static void -+forkoff (int nr) -+{ -+ pid_t child, pid_got; -+ int exit_code = 42 + nr; -+ int status, i; -+ -+ child = fork (); -+ switch (child) -+ { -+ case -1: -+ assert (0); -+ case 0: -+ printf ("child%d: %d\n", nr, (int) getpid ()); -+ /* Delay to get both the "child%d" and "parent%d" message printed without -+ a race breaking expect by its endless wait on `$gdb_prompt$': -+ Breakpoint 3, breakpoint () at ../../../gdb/testsuite/gdb.threads/watchpoint-fork.c:33 -+ 33 } -+ (gdb) parent2: 14223 */ -+ i = sleep (1); -+ assert (i == 0); -+ -+ /* We must not get caught here (against a forgotten breakpoint). */ -+ var++; -+ breakpoint (); -+ -+ _exit (exit_code); -+ default: -+ printf ("parent%d: %d\n", nr, (int) child); -+ /* Delay to get both the "child%d" and "parent%d" message printed, see -+ above. */ -+ i = sleep (1); -+ assert (i == 0); -+ -+ pid_got = wait (&status); -+ assert (pid_got == child); -+ assert (WIFEXITED (status)); -+ assert (WEXITSTATUS (status) == exit_code); -+ -+ /* We must get caught here (against a false watchpoint removal). */ -+ breakpoint (); -+ } -+} -+ -+#elif defined FOLLOW_CHILD ++#include "watchpoint-fork.h" + +static volatile int usr1_got; + @@ -8657,11 +9630,11 @@ index 0000000..4dc308b + usr1_got++; +} + -+static void ++void +forkoff (int nr) +{ -+ pid_t child; -+ int i, loop; ++ pid_t child, save_parent = getpid (); ++ int i; + struct sigaction act, oldact; +#ifdef THREAD + void *thread_result; @@ -8692,7 +9665,7 @@ index 0000000..4dc308b + /* We must not get caught here (against a forgotten breakpoint). */ + + var++; -+ breakpoint (); ++ marker (); + +#ifdef THREAD + /* And neither got caught our thread. */ @@ -8720,40 +9693,41 @@ index 0000000..4dc308b + + /* Let the parent signal us about its success. Be careful of races. */ + -+ for (loop = 0; loop < 1000; loop++) ++ for (;;) + { + /* Parent either died (and USR1_GOT is zero) or it succeeded. */ ++ if (getppid () != save_parent) ++ break; + if (kill (getppid (), 0) != 0) + break; + /* Parent succeeded? */ + if (usr1_got) + break; + -+ delay (); ++#ifdef THREAD ++ i = pthread_yield (); ++ assert (i == 0); ++#endif + } + assert (usr1_got); + + /* We must get caught here (against a false watchpoint removal). */ + -+ breakpoint (); ++ marker (); + } + + i = sigaction (SIGUSR1, &oldact, NULL); + assert (i == 0); +} -+ -+#else -+# error "!FOLLOW_PARENT && !FOLLOW_CHILD" -+#endif diff --git a/gdb/testsuite/gdb.threads/watchpoint-fork-mt.c b/gdb/testsuite/gdb.threads/watchpoint-fork-mt.c new file mode 100644 -index 0000000..edacfc0 +index 0000000..08a5aff --- /dev/null +++ b/gdb/testsuite/gdb.threads/watchpoint-fork-mt.c -@@ -0,0 +1,157 @@ +@@ -0,0 +1,174 @@ +/* Test case for forgotten hw-watchpoints after fork()-off of a process. + -+ Copyright 2008, 2009 Free Software Foundation, Inc. ++ Copyright 2008, 2009, 2010 Free Software Foundation, Inc. + + This file is part of GDB. + @@ -8783,49 +9757,56 @@ index 0000000..edacfc0 +#include +#define gettid() syscall (__NR_gettid) + ++#include "watchpoint-fork.h" ++ +/* Non-atomic `var++' should not hurt as we synchronize the threads by the STEP + variable. Hit-comments need to be duplicite there to catch both at-stops + and behind-stops, depending on the target. */ + -+static volatile int var; ++volatile int var; + -+static void -+dummy (void) ++void ++marker (void) +{ +} + +static void -+breakpoint (void) ++empty (void) +{ +} + -+/* Include here the functions: -+ static void forkoff (int nr); -+ static void delay (void); */ -+ -+static pthread_t thread; -+static volatile int step; -+#define THREAD ++static void ++mark_exit (void) ++{ ++} + -+#include "watchpoint-fork-forkoff.c" ++pthread_t thread; ++volatile int step; + +static void * +start (void *arg) +{ ++ int i; ++ + if (step >= 3) + goto step_3; + + while (step != 1) -+ delay (); ++ { ++ i = pthread_yield (); ++ assert (i == 0); ++ } + + var++; /* validity-thread-B */ -+ dummy (); /* validity-thread-B */ ++ empty (); /* validity-thread-B */ + step = 2; + while (step != 3) + { + if (step == 99) + goto step_99; -+ delay (); ++ ++ i = pthread_yield (); ++ assert (i == 0); + } + +step_3: @@ -8833,24 +9814,26 @@ index 0000000..edacfc0 + goto step_5; + + var++; /* after-fork1-B */ -+ dummy (); /* after-fork1-B */ ++ empty (); /* after-fork1-B */ + step = 4; + while (step != 5) + { + if (step == 99) + goto step_99; -+ delay (); ++ ++ i = pthread_yield (); ++ assert (i == 0); + } + +step_5: + var++; /* after-fork2-B */ -+ dummy (); /* after-fork2-B */ ++ empty (); /* after-fork2-B */ + return (void *) 5UL; + +step_99: + /* We must not get caught here (against a forgotten breakpoint). */ + var++; -+ breakpoint (); ++ marker (); + return (void *) 99UL; +} + @@ -8863,24 +9846,28 @@ index 0000000..edacfc0 + setbuf (stdout, NULL); + printf ("main: %d\n", (int) gettid ()); + -+ /* General watchpoints validity. */ ++ /* General hardware breakpoints and watchpoints validity. */ ++ marker (); + var++; /* validity-first */ -+ dummy (); /* validity-first */ ++ empty (); /* validity-first */ + + i = pthread_create (&thread, NULL, start, NULL); + assert (i == 0); + + var++; /* validity-thread-A */ -+ dummy (); /* validity-thread-A */ ++ empty (); /* validity-thread-A */ + step = 1; + while (step != 2) -+ delay (); ++ { ++ i = pthread_yield (); ++ assert (i == 0); ++ } + + /* Hardware watchpoints got disarmed here. */ + forkoff (1); + + var++; /* after-fork1-A */ -+ dummy (); /* after-fork1-A */ ++ empty (); /* after-fork1-A */ + step = 3; +#ifdef FOLLOW_CHILD + /* Spawn new thread as it was deleted in the child of FORK. */ @@ -8888,13 +9875,16 @@ index 0000000..edacfc0 + assert (i == 0); +#endif + while (step != 4) -+ delay (); ++ { ++ i = pthread_yield (); ++ assert (i == 0); ++ } + + /* A sanity check for double hardware watchpoints removal. */ + forkoff (2); + + var++; /* after-fork2-A */ -+ dummy (); /* after-fork2-A */ ++ empty (); /* after-fork2-A */ + step = 5; +#ifdef FOLLOW_CHILD + /* Spawn new thread as it was deleted in the child of FORK. */ @@ -8906,17 +9896,98 @@ index 0000000..edacfc0 + assert (i == 0); + assert (thread_result == (void *) 5UL); + ++ mark_exit (); + return 0; +} -diff --git a/gdb/testsuite/gdb.threads/watchpoint-fork.c b/gdb/testsuite/gdb.threads/watchpoint-fork.c +diff --git a/gdb/testsuite/gdb.threads/watchpoint-fork-parent.c b/gdb/testsuite/gdb.threads/watchpoint-fork-parent.c +new file mode 100644 +index 0000000..82d1182 +--- /dev/null ++++ b/gdb/testsuite/gdb.threads/watchpoint-fork-parent.c +@@ -0,0 +1,74 @@ ++/* Test case for forgotten hw-watchpoints after fork()-off of a process. ++ ++ Copyright 2008, 2009, 2010 Free Software Foundation, Inc. ++ ++ This file is part of GDB. ++ ++ 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 2 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, write to the Free Software ++ Foundation, Inc., 59 Temple Place - Suite 330, ++ Boston, MA 02111-1307, USA. */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "watchpoint-fork.h" ++ ++void ++forkoff (int nr) ++{ ++ pid_t child, pid_got; ++ int exit_code = 42 + nr; ++ int status, i; ++ ++ child = fork (); ++ switch (child) ++ { ++ case -1: ++ assert (0); ++ case 0: ++ printf ("child%d: %d\n", nr, (int) getpid ()); ++ /* Delay to get both the "child%d" and "parent%d" message printed without ++ a race breaking expect by its endless wait on `$gdb_prompt$': ++ Breakpoint 3, marker () at ../../../gdb/testsuite/gdb.threads/watchpoint-fork.c:33 ++ 33 } ++ (gdb) parent2: 14223 */ ++ i = sleep (1); ++ assert (i == 0); ++ ++ /* We must not get caught here (against a forgotten breakpoint). */ ++ var++; ++ marker (); ++ ++ _exit (exit_code); ++ default: ++ printf ("parent%d: %d\n", nr, (int) child); ++ /* Delay to get both the "child%d" and "parent%d" message printed, see ++ above. */ ++ i = sleep (1); ++ assert (i == 0); ++ ++ pid_got = wait (&status); ++ assert (pid_got == child); ++ assert (WIFEXITED (status)); ++ assert (WEXITSTATUS (status) == exit_code); ++ ++ /* We must get caught here (against a false watchpoint removal). */ ++ marker (); ++ } ++} +diff --git a/gdb/testsuite/gdb.threads/watchpoint-fork-st.c b/gdb/testsuite/gdb.threads/watchpoint-fork-st.c new file mode 100644 -index 0000000..5f62e7f +index 0000000..a7eeedd --- /dev/null -+++ b/gdb/testsuite/gdb.threads/watchpoint-fork.c -@@ -0,0 +1,57 @@ ++++ b/gdb/testsuite/gdb.threads/watchpoint-fork-st.c +@@ -0,0 +1,61 @@ +/* Test case for forgotten hw-watchpoints after fork()-off of a process. + -+ Copyright 2008, 2009 Free Software Foundation, Inc. ++ Copyright 2008, 2009, 2010 Free Software Foundation, Inc. + + This file is part of GDB. + @@ -8941,17 +10012,19 @@ index 0000000..5f62e7f +#include +#include + -+static volatile int var; ++#include "watchpoint-fork.h" + -+static void -+breakpoint (void) ++volatile int var; ++ ++void ++marker (void) +{ +} + -+/* Include here the function: -+ static void forkoff (int nr); */ -+ -+#include "watchpoint-fork-forkoff.c" ++static void ++mark_exit (void) ++{ ++} + +int +main (void) @@ -8959,7 +10032,8 @@ index 0000000..5f62e7f + setbuf (stdout, NULL); + printf ("main: %d\n", (int) getpid ()); + -+ /* General watchpoints validity. */ ++ /* General hardware breakpoints and watchpoints validity. */ ++ marker (); + var++; + /* Hardware watchpoints got disarmed here. */ + forkoff (1); @@ -8969,15 +10043,16 @@ index 0000000..5f62e7f + forkoff (2); + var++; + ++ mark_exit (); + return 0; +} diff --git a/gdb/testsuite/gdb.threads/watchpoint-fork.exp b/gdb/testsuite/gdb.threads/watchpoint-fork.exp new file mode 100644 -index 0000000..1dc93ab +index 0000000..117700b --- /dev/null +++ b/gdb/testsuite/gdb.threads/watchpoint-fork.exp -@@ -0,0 +1,130 @@ -+# Copyright 2008, 2009 Free Software Foundation, Inc. +@@ -0,0 +1,149 @@ ++# Copyright 2008, 2009, 2010 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by @@ -8995,56 +10070,72 @@ index 0000000..1dc93ab +# Test case for forgotten hw-watchpoints after fork()-off of a process. + +proc test {type symbol} { -+ global objdir subdir srcdir ++ global objdir subdir srcdir gdb_prompt + -+ set test watchpoint-fork ++ set testfile watchpoint-fork + + global pf_prefix + set prefix_test $pf_prefix + lappend pf_prefix "$type:" + set prefix_mt $pf_prefix + ++ set srcfile_type ${srcdir}/${subdir}/${testfile}-${type}.c ++ ++ + # no threads + + set pf_prefix $prefix_mt + lappend pf_prefix "singlethreaded:" + -+ set executable ${test}-${type} -+ if { [gdb_compile ${srcdir}/${subdir}/${test}.c ${objdir}/${subdir}/${executable} executable [list debug additional_flags=-D$symbol]] != "" } { -+ untested ${test}.exp -+ return -1 ++ set executable ${testfile}-${type}-st ++ set srcfile_main ${srcdir}/${subdir}/${testfile}-st.c ++ if { [gdb_compile "${srcfile_main} ${srcfile_type}" ${objdir}/${subdir}/${executable} executable [list debug additional_flags=-D$symbol]] != "" } { ++ untested ${testfile}.exp ++ return + } + clean_restart $executable + -+ gdb_test "show detach-on-fork" "Whether gdb will detach the child of a fork is on." -+ gdb_test "set follow-fork-mode $type" -+ gdb_test "show follow-fork-mode" "Debugger response to a program call of fork or vfork is \"$type\"." ++ gdb_test "show detach-on-fork" "Whether gdb will detach the child of a fork is on\\." ++ gdb_test_no_output "set follow-fork-mode $type" ++ gdb_test "show follow-fork-mode" "Debugger response to a program call of fork or vfork is \"$type\"\\." + # Testcase uses it for the `follow-fork-mode child' type. -+ gdb_test "handle SIGUSR1 nostop noprint pass" ++ gdb_test "handle SIGUSR1 nostop noprint pass" "No\[ \t\]+No\[ \t\]+Yes.*" + -+ if { ![runto_main] } then { -+ gdb_suppress_tests ++ if ![runto_main] { + return + } + -+ # Install the watchpoint only after getting into MAIN - workaround some PPC -+ # problem. -+ gdb_test "watch var" "atchpoint 2: var" "Set the watchpoint" ++ gdb_test "watch var" "atchpoint \[0-9\]+: var" "Set the watchpoint" + + # It is never hit but it should not be left over in the fork()ed-off child. -+ gdb_breakpoint "breakpoint" ++ set hbreak "hbreak" ++ set test "hbreak marker" ++ gdb_test_multiple $test $test { ++ -re "Hardware assisted breakpoint \[0-9\]+ at .*\r\n$gdb_prompt $" { ++ pass $test ++ } ++ -re "(No hardware breakpoint support in the target\\.|Hardware breakpoints used exceeds limit\\.)\r\n$gdb_prompt $" { ++ pass $test ++ set hbreak "break" ++ gdb_test "break marker" ++ } ++ } ++ ++ gdb_breakpoint "mark_exit" + + gdb_test "continue" \ -+ "atchpoint 2: var.*Old value = 0.*New value = 1.*forkoff *\\(1\\).*" "watchpoints work" ++ "reakpoint \[0-9\]+, marker.*" "hardware breakpoints work" + gdb_test "continue" \ -+ "reakpoint 3, breakpoint.*" "breakpoint after the first fork" ++ "atchpoint \[0-9\]+: var.*Old value = 0.*New value = 1.*forkoff *\\(1\\).*" "watchpoints work" + gdb_test "continue" \ -+ "atchpoint 2: var.*Old value = 1.*New value = 2.*forkoff *\\(2\\).*" "watchpoint after the first fork" ++ "reakpoint \[0-9\]+, marker.*" "breakpoint after the first fork" + gdb_test "continue" \ -+ "reakpoint 3, breakpoint.*" "breakpoint after the second fork" ++ "atchpoint \[0-9\]+: var.*Old value = 1.*New value = 2.*forkoff *\\(2\\).*" "watchpoint after the first fork" + gdb_test "continue" \ -+ "atchpoint 2: var.*Old value = 2.*New value = 3.*return *0;" "watchpoint after the second fork" -+ gdb_test "continue" "Continuing..*Program exited normally." "finish" ++ "reakpoint \[0-9\]+, marker.*" "breakpoint after the second fork" ++ gdb_test "continue" \ ++ "atchpoint \[0-9\]+: var.*Old value = 2.*New value = 3.*mark_exit \\(\\);" "watchpoint after the second fork" ++ gdb_test "continue" "Continuing\\..*\r\nBreakpoint \[0-9\]+, mark_exit .*" "finish" + + + # threads @@ -9052,61 +10143,102 @@ index 0000000..1dc93ab + set pf_prefix $prefix_mt + lappend pf_prefix "multithreaded:" + -+ set executable ${test}-mt-${type} -+ if { [gdb_compile_pthreads ${srcdir}/${subdir}/${test}-mt.c ${objdir}/${subdir}/${executable} executable [list debug additional_flags=-D$symbol]] != "" } { -+ untested ${test}.exp -+ return -1 ++ set executable ${testfile}-${type}-mt ++ set srcfile_main ${srcdir}/${subdir}/${testfile}-mt.c ++ if { [gdb_compile_pthreads "${srcfile_main} ${srcfile_type}" ${objdir}/${subdir}/${executable} executable [list debug "additional_flags=-D$symbol -DTHREAD"]] != "" } { ++ untested ${testfile}.exp ++ return + } + clean_restart $executable + -+ gdb_test "set follow-fork-mode $type" ++ gdb_test_no_output "set follow-fork-mode $type" + # Testcase uses it for the `follow-fork-mode child' type. -+ gdb_test "handle SIGUSR1 nostop noprint pass" ++ gdb_test "handle SIGUSR1 nostop noprint pass" "No\[ \t\]+No\[ \t\]+Yes.*" + -+ if { ![runto_main] } then { -+ gdb_suppress_tests ++ if ![runto_main] { + return + } + -+ # Install the watchpoint only after getting into MAIN - workaround some PPC -+ # problem. -+ gdb_test "watch var" "atchpoint 2: var" "Set the watchpoint" ++ gdb_test "watch var" "atchpoint \[0-9\]+: var" "Set the watchpoint" + -+ # It is never hit but it should not be left over in the fork()ed-off child. -+ gdb_breakpoint "breakpoint" ++ # It should not be left over in the fork()ed-off child. ++ gdb_test "$hbreak marker" {reakpoint [0-9]+.*} ++ ++ gdb_breakpoint "mark_exit" + + gdb_test "continue" \ -+ "atchpoint 2: var.*Old value = 0.*New value = 1.*validity-first.*" "singlethread watchpoints work" ++ "reakpoint \[0-9\]+, marker.*" "hardware breakpoints work" + gdb_test "continue" \ -+ "atchpoint 2: var.*Old value = 1.*New value = 2.*validity-thread-A.*" "multithreaded watchpoints work at A" ++ "atchpoint \[0-9\]+: var.*Old value = 0.*New value = 1.*validity-first.*" "singlethread watchpoints work" + gdb_test "continue" \ -+ "atchpoint 2: var.*Old value = 2.*New value = 3.*validity-thread-B.*" "multithreaded watchpoints work at B" ++ "atchpoint \[0-9\]+: var.*Old value = 1.*New value = 2.*validity-thread-A.*" "multithreaded watchpoints work at A" + gdb_test "continue" \ -+ "reakpoint 3, breakpoint.*" "breakpoint (A) after the first fork" ++ "atchpoint \[0-9\]+: var.*Old value = 2.*New value = 3.*validity-thread-B.*" "multithreaded watchpoints work at B" + gdb_test "continue" \ -+ "atchpoint 2: var.*Old value = 3.*New value = 4.*after-fork1-A.*" "watchpoint A after the first fork" ++ "reakpoint \[0-9\]+, marker.*" "breakpoint (A) after the first fork" + gdb_test "continue" \ -+ "atchpoint 2: var.*Old value = 4.*New value = 5.*after-fork1-B.*" "watchpoint B after the first fork" ++ "atchpoint \[0-9\]+: var.*Old value = 3.*New value = 4.*after-fork1-A.*" "watchpoint A after the first fork" + gdb_test "continue" \ -+ "reakpoint 3, breakpoint.*" "breakpoint (A) after the second fork" ++ "atchpoint \[0-9\]+: var.*Old value = 4.*New value = 5.*after-fork1-B.*" "watchpoint B after the first fork" + gdb_test "continue" \ -+ "atchpoint 2: var.*Old value = 5.*New value = 6.*after-fork2-A.*" "watchpoint A after the second fork" ++ "reakpoint \[0-9\]+, marker.*" "breakpoint (A) after the second fork" + gdb_test "continue" \ -+ "atchpoint 2: var.*Old value = 6.*New value = 7.*after-fork2-B.*" "watchpoint B after the second fork" -+ gdb_test "continue" "Continuing..*Program exited normally." "finish" ++ "atchpoint \[0-9\]+: var.*Old value = 5.*New value = 6.*after-fork2-A.*" "watchpoint A after the second fork" ++ gdb_test "continue" \ ++ "atchpoint \[0-9\]+: var.*Old value = 6.*New value = 7.*after-fork2-B.*" "watchpoint B after the second fork" ++ gdb_test "continue" "Continuing\\..*\r\nBreakpoint \[0-9\]+, mark_exit .*" "finish" + + + # cleanup -+ + set pf_prefix $prefix_test +} + +test parent FOLLOW_PARENT + +# Only GNU/Linux is known to support `set follow-fork-mode child'. -+if {[istarget "*-*-linux*"]} { ++if {[istarget "*-*-linux*"] && ![is_remote target]} { + test child FOLLOW_CHILD ++} else { ++ untested "child" +} +diff --git a/gdb/testsuite/gdb.threads/watchpoint-fork.h b/gdb/testsuite/gdb.threads/watchpoint-fork.h +new file mode 100644 +index 0000000..31f7656 +--- /dev/null ++++ b/gdb/testsuite/gdb.threads/watchpoint-fork.h +@@ -0,0 +1,32 @@ ++/* Test case for forgotten hw-watchpoints after fork()-off of a process. ++ ++ Copyright 2008, 2009, 2010 Free Software Foundation, Inc. ++ ++ This file is part of GDB. ++ ++ 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 2 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, write to the Free Software ++ Foundation, Inc., 59 Temple Place - Suite 330, ++ Boston, MA 02111-1307, USA. */ ++ ++#ifdef THREAD ++#include ++ ++extern volatile int step; ++extern pthread_t thread; ++#endif /* THREAD */ ++ ++extern volatile int var; ++ ++extern void marker (void); ++extern void forkoff (int nr); diff --git a/gdb/testsuite/lib/pascal.exp b/gdb/testsuite/lib/pascal.exp index af0b00d..e1a8dc4 100644 --- a/gdb/testsuite/lib/pascal.exp @@ -9143,17 +10275,17 @@ index af0b00d..e1a8dc4 100644 set pascal_init_done 1 } diff --git a/gdb/top.c b/gdb/top.c -index 6680c38..38d1cc2 100644 +index 45c9259..8856322 100644 --- a/gdb/top.c +++ b/gdb/top.c -@@ -338,6 +338,7 @@ void +@@ -343,6 +343,7 @@ void prepare_execute_command (void) { free_all_values (); + free_all_types (); - /* With multiple threads running while the one we're examining is stopped, - the dcache can get stale without us being able to detect it. + /* With multiple threads running while the one we're examining is + stopped, the dcache can get stale without us being able to detect diff --git a/gdb/typeprint.c b/gdb/typeprint.c index ce9f551..5f9d739 100644 --- a/gdb/typeprint.c @@ -9211,11 +10343,52 @@ index ce9f551..5f9d739 100644 } static void +diff --git a/gdb/utils.c b/gdb/utils.c +index 02c7a37..894be69 100644 +--- a/gdb/utils.c ++++ b/gdb/utils.c +@@ -2198,6 +2198,36 @@ set_batch_flag_and_make_cleanup_restore_page_info (void) + return back_to; + } + ++/* Helper for make_cleanup_restore_page_info. */ ++ ++static void ++do_restore_selected_frame_cleanup (void *arg) ++{ ++ struct frame_id *frame_idp = arg; ++ ++ select_frame (frame_find_by_id (*frame_idp)); ++ ++ xfree (frame_idp); ++} ++ ++/* Provide cleanup for restoring currently selected frame. Use frame_id for ++ the case the current frame becomes stale in the meantime. */ ++ ++struct cleanup * ++make_cleanup_restore_selected_frame (void) ++{ ++ struct frame_id *frame_idp; ++ ++ /* get_selected_frame->get_current_frame would error otherwise. */ ++ if (!has_stack_frames ()) ++ return make_cleanup (null_cleanup, NULL); ++ ++ frame_idp = xmalloc (sizeof (*frame_idp)); ++ *frame_idp = get_frame_id (get_selected_frame (NULL)); ++ ++ return make_cleanup (do_restore_selected_frame_cleanup, frame_idp); ++} ++ + /* Set the screen size based on LINES_PER_PAGE and CHARS_PER_LINE. */ + + static void diff --git a/gdb/valarith.c b/gdb/valarith.c -index 7c553d1..80be82f 100644 +index 6b212b2..c6b4843 100644 --- a/gdb/valarith.c +++ b/gdb/valarith.c -@@ -161,12 +161,26 @@ value_subscript (struct value *array, LONGEST index) +@@ -165,12 +165,26 @@ value_subscript (struct value *array, LONGEST index) get_discrete_bounds (range_type, &lowerbound, &upperbound); if (VALUE_LVAL (array) != lval_memory) @@ -9244,7 +10417,7 @@ index 7c553d1..80be82f 100644 /* Emit warning unless we have an array of unknown size. An array of unknown size has lowerbound 0 and upperbound -1. */ if (upperbound > -1) -@@ -185,34 +199,37 @@ value_subscript (struct value *array, LONGEST index) +@@ -189,34 +203,37 @@ value_subscript (struct value *array, LONGEST index) error (_("not an array or string")); } @@ -9294,7 +10467,7 @@ index 7c553d1..80be82f 100644 return v; } -@@ -292,6 +309,10 @@ int +@@ -296,6 +313,10 @@ int binop_user_defined_p (enum exp_opcode op, struct value *arg1, struct value *arg2) { @@ -9306,7 +10479,7 @@ index 7c553d1..80be82f 100644 } diff --git a/gdb/valops.c b/gdb/valops.c -index 932e311..5ce565f 100644 +index 7ea6315..ad3dacf 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -38,6 +38,7 @@ @@ -9317,7 +10490,7 @@ index 932e311..5ce565f 100644 #include #include "gdb_string.h" -@@ -897,6 +898,65 @@ value_one (struct type *type, enum lval_type lv) +@@ -901,6 +902,65 @@ value_one (struct type *type, enum lval_type lv) return val; } @@ -9383,7 +10556,7 @@ index 932e311..5ce565f 100644 /* Helper function for value_at, value_at_lazy, and value_at_lazy_stack. */ static struct value * -@@ -995,15 +1055,21 @@ value_fetch_lazy (struct value *val) +@@ -999,15 +1059,21 @@ value_fetch_lazy (struct value *val) } else if (VALUE_LVAL (val) == lval_memory) { @@ -9412,7 +10585,7 @@ index 932e311..5ce565f 100644 } } else if (VALUE_LVAL (val) == lval_register) -@@ -1407,7 +1473,18 @@ address_of_variable (struct symbol *var, struct block *b) +@@ -1418,7 +1484,18 @@ address_of_variable (struct symbol *var, struct block *b) if ((VALUE_LVAL (val) == lval_memory && value_lazy (val)) || TYPE_CODE (type) == TYPE_CODE_FUNC) { @@ -9432,7 +10605,7 @@ index 932e311..5ce565f 100644 return value_from_pointer (lookup_pointer_type (type), addr); } -@@ -1515,6 +1592,7 @@ struct value * +@@ -1526,6 +1603,7 @@ struct value * value_coerce_array (struct value *arg1) { struct type *type = check_typedef (value_type (arg1)); @@ -9440,7 +10613,7 @@ index 932e311..5ce565f 100644 /* If the user tries to do something requiring a pointer with an array that has not yet been pushed to the target, then this would -@@ -1524,8 +1602,12 @@ value_coerce_array (struct value *arg1) +@@ -1535,8 +1613,12 @@ value_coerce_array (struct value *arg1) if (VALUE_LVAL (arg1) != lval_memory) error (_("Attempt to take address of value not located in memory.")); @@ -9455,7 +10628,7 @@ index 932e311..5ce565f 100644 /* Given a value which is a function, return a value which is a pointer diff --git a/gdb/valprint.c b/gdb/valprint.c -index ddb16e4..c4c2969 100644 +index 5cba023..4ef5e5a 100644 --- a/gdb/valprint.c +++ b/gdb/valprint.c @@ -36,6 +36,7 @@ @@ -9474,7 +10647,7 @@ index ddb16e4..c4c2969 100644 case TYPE_CODE_BITSTRING: return 0; default: -@@ -1104,6 +1104,7 @@ val_print_array_elements (struct type *type, const gdb_byte *valaddr, +@@ -1111,6 +1111,7 @@ val_print_array_elements (struct type *type, const gdb_byte *valaddr, { unsigned int things_printed = 0; unsigned len; @@ -9482,7 +10655,7 @@ index ddb16e4..c4c2969 100644 struct type *elttype, *index_type; unsigned eltlen; /* Position of the array element we are examining to see -@@ -1112,9 +1113,33 @@ val_print_array_elements (struct type *type, const gdb_byte *valaddr, +@@ -1119,9 +1120,33 @@ val_print_array_elements (struct type *type, const gdb_byte *valaddr, /* Number of repetitions we have detected so far. */ unsigned int reps; LONGEST low_bound, high_bound; @@ -9518,7 +10691,7 @@ index ddb16e4..c4c2969 100644 index_type = TYPE_INDEX_TYPE (type); if (get_array_bounds (type, &low_bound, &high_bound)) -@@ -1189,6 +1214,8 @@ val_print_array_elements (struct type *type, const gdb_byte *valaddr, +@@ -1196,6 +1221,8 @@ val_print_array_elements (struct type *type, const gdb_byte *valaddr, { fprintf_filtered (stream, "..."); } @@ -9528,7 +10701,7 @@ index ddb16e4..c4c2969 100644 /* Read LEN bytes of target memory at address MEMADDR, placing the diff --git a/gdb/value.c b/gdb/value.c -index 85cb62a..013a9fc 100644 +index c7de323..645fef2 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -39,6 +39,7 @@ @@ -9539,7 +10712,7 @@ index 85cb62a..013a9fc 100644 #include "python/python.h" -@@ -850,12 +851,15 @@ void +@@ -864,12 +865,15 @@ void set_value_component_location (struct value *component, const struct value *whole) { @@ -9555,7 +10728,7 @@ index 85cb62a..013a9fc 100644 if (whole->lval == lval_computed) { struct lval_funcs *funcs = whole->location.computed.funcs; -@@ -863,6 +867,12 @@ set_value_component_location (struct value *component, +@@ -877,6 +881,12 @@ set_value_component_location (struct value *component, if (funcs->copy_closure) component->location.computed.closure = funcs->copy_closure (whole); } @@ -9568,7 +10741,7 @@ index 85cb62a..013a9fc 100644 } -@@ -995,6 +1005,29 @@ show_values (char *num_exp, int from_tty) +@@ -1009,6 +1019,29 @@ show_values (char *num_exp, int from_tty) num_exp[1] = '\0'; } } @@ -9598,7 +10771,7 @@ index 85cb62a..013a9fc 100644 /* Internal variables. These are variables within the debugger that hold values assigned by debugger commands. -@@ -1473,6 +1506,40 @@ call_internal_function (struct gdbarch *gdbarch, +@@ -1503,6 +1536,40 @@ call_internal_function (struct gdbarch *gdbarch, return (*ifn->handler) (gdbarch, language, ifn->cookie, argc, argv); } @@ -9639,7 +10812,7 @@ index 85cb62a..013a9fc 100644 /* The 'function' command. This does nothing -- it is just a placeholder to let "help function NAME" work. This is also used as the implementation of the sub-command that is created when -@@ -1520,11 +1587,10 @@ preserve_one_value (struct value *value, struct objfile *objfile, +@@ -1550,11 +1617,10 @@ preserve_one_value (struct value *value, struct objfile *objfile, htab_t copied_types) { if (TYPE_OBJFILE (value->type) == objfile) @@ -9653,7 +10826,7 @@ index 85cb62a..013a9fc 100644 copied_types); } -@@ -1539,13 +1605,13 @@ preserve_one_internalvar (struct internalvar *var, struct objfile *objfile, +@@ -1569,13 +1635,13 @@ preserve_one_internalvar (struct internalvar *var, struct objfile *objfile, case INTERNALVAR_INTEGER: if (var->u.integer.type && TYPE_OBJFILE (var->u.integer.type) == objfile) var->u.integer.type @@ -9669,7 +10842,7 @@ index 85cb62a..013a9fc 100644 break; case INTERNALVAR_VALUE: -@@ -2399,7 +2465,24 @@ value_from_decfloat (struct type *type, const gdb_byte *dec) +@@ -2438,7 +2504,24 @@ value_from_decfloat (struct type *type, const gdb_byte *dec) struct value * coerce_ref (struct value *arg) { @@ -9695,7 +10868,7 @@ index 85cb62a..013a9fc 100644 if (TYPE_CODE (value_type_arg_tmp) == TYPE_CODE_REF) arg = value_at_lazy (TYPE_TARGET_TYPE (value_type_arg_tmp), -@@ -2497,4 +2580,8 @@ VARIABLE is already initialized.")); +@@ -2536,4 +2619,8 @@ VARIABLE is already initialized.")); add_prefix_cmd ("function", no_class, function_command, _("\ Placeholder command for showing help on convenience functions."), &functionlist, "function ", 0, &cmdlist); @@ -9705,10 +10878,10 @@ index 85cb62a..013a9fc 100644 + observer_attach_mark_used (value_types_mark_used); } diff --git a/gdb/value.h b/gdb/value.h -index ef2cb4f..ac99a4b 100644 +index cf089be..0fb89f1 100644 --- a/gdb/value.h +++ b/gdb/value.h -@@ -373,6 +373,10 @@ extern struct value *value_from_double (struct type *type, DOUBLEST num); +@@ -389,6 +389,10 @@ extern struct value *value_from_double (struct type *type, DOUBLEST num); extern struct value *value_from_decfloat (struct type *type, const gdb_byte *decbytes); @@ -9719,7 +10892,7 @@ index ef2cb4f..ac99a4b 100644 extern struct value *value_at (struct type *type, CORE_ADDR addr); extern struct value *value_at_lazy (struct type *type, CORE_ADDR addr); -@@ -733,7 +737,7 @@ extern struct value *value_allocate_space_in_inferior (int); +@@ -749,7 +753,7 @@ extern struct value *value_allocate_space_in_inferior (int); extern struct value *value_of_local (const char *name, int complain); extern struct value *value_subscripted_rvalue (struct value *array, @@ -9729,7 +10902,7 @@ index ef2cb4f..ac99a4b 100644 /* User function handler. */ diff --git a/gdb/varobj.c b/gdb/varobj.c -index 25518d4..cb5d8a2 100644 +index e87d399..0ea54f5 100644 --- a/gdb/varobj.c +++ b/gdb/varobj.c @@ -26,6 +26,8 @@ diff --git a/gdb-bz533176-fortran-omp-step.patch b/gdb-bz533176-fortran-omp-step.patch index 39cac0d..b9aefd5 100644 --- a/gdb-bz533176-fortran-omp-step.patch +++ b/gdb-bz533176-fortran-omp-step.patch @@ -21,11 +21,13 @@ debugging problem of GOMP outside of the scope of this Bug. ---- ./gdb/infrun.c 2009-12-09 22:03:33.000000000 +0100 -+++ ./gdb/infrun.c 2009-12-09 22:29:56.000000000 +0100 -@@ -3994,6 +3994,12 @@ infrun: not switching back to stepped th +Index: gdb-7.2.50.20101231/gdb/infrun.c +=================================================================== +--- gdb-7.2.50.20101231.orig/gdb/infrun.c 2011-01-01 01:02:45.000000000 +0100 ++++ gdb-7.2.50.20101231/gdb/infrun.c 2011-01-01 01:10:22.000000000 +0100 +@@ -4585,6 +4585,12 @@ infrun: not switching back to stepped th - if (ecs->event_thread->step_over_calls == STEP_OVER_ALL) + if (ecs->event_thread->control.step_over_calls == STEP_OVER_ALL) { + struct symbol *stop_fn = find_pc_function (stop_pc); + @@ -36,7 +38,7 @@ debugging problem of GOMP outside of the scope of this Bug. /* We're doing a "next". Normal (forward) execution: set a breakpoint at the -@@ -4020,6 +4026,7 @@ infrun: not switching back to stepped th +@@ -4612,6 +4618,7 @@ infrun: not switching back to stepped th keep_going (ecs); return; @@ -44,8 +46,10 @@ debugging problem of GOMP outside of the scope of this Bug. } /* If we are in a function call trampoline (a stub between the ---- ./gdb/testsuite/gdb.fortran/omp-step.exp 1970-01-01 01:00:00.000000000 +0100 -+++ ./gdb/testsuite/gdb.fortran/omp-step.exp 2009-12-09 22:31:04.000000000 +0100 +Index: gdb-7.2.50.20101231/gdb/testsuite/gdb.fortran/omp-step.exp +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ gdb-7.2.50.20101231/gdb/testsuite/gdb.fortran/omp-step.exp 2011-01-01 01:09:58.000000000 +0100 @@ -0,0 +1,31 @@ +# Copyright 2009 Free Software Foundation, Inc. + @@ -78,8 +82,10 @@ debugging problem of GOMP outside of the scope of this Bug. + +gdb_breakpoint [gdb_get_line_number "success"] +gdb_continue_to_breakpoint "success" ".*success.*" ---- ./gdb/testsuite/gdb.fortran/omp-step.f90 1970-01-01 01:00:00.000000000 +0100 -+++ ./gdb/testsuite/gdb.fortran/omp-step.f90 2009-12-09 22:25:35.000000000 +0100 +Index: gdb-7.2.50.20101231/gdb/testsuite/gdb.fortran/omp-step.f90 +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ gdb-7.2.50.20101231/gdb/testsuite/gdb.fortran/omp-step.f90 2011-01-01 01:09:58.000000000 +0100 @@ -0,0 +1,32 @@ +! Copyright 2009 Free Software Foundation, Inc. + diff --git a/gdb-bz642879-elfread-sigint-stale.patch b/gdb-bz642879-elfread-sigint-stale.patch deleted file mode 100644 index 5a079ef..0000000 --- a/gdb-bz642879-elfread-sigint-stale.patch +++ /dev/null @@ -1,85 +0,0 @@ -http://sourceware.org/ml/gdb-patches/2010-09/msg00192.html -Subject: [patch] Fix ELF stale reference [Re: [patch] .gdb_index: Do not crash on NOBITS] - -On Wed, 08 Sep 2010 21:40:12 +0200, Tom Tromey wrote: -> >>>>> "Jan" == Jan Kratochvil writes: -> -> Jan> which should not be fatal but due to some other bugs therein it can -> Jan> crash GDB. -> -> I am curious about these other bugs. - -+ /* Memory gets permanently referenced from ABFD after -+ bfd_get_synthetic_symtab so it must not get freed before ABFD gets. -+ It happens only in the case when elf_slurp_reloc_table sees -+ asection->relocation NULL. Determining which section is asection is -+ done by _bfd_elf_get_synthetic_symtab which is all a bfd -+ implementation detail, though. */ - -That is from: - -#0 in elf_slurp_reloc_table_from_section (abfd, asect, rel_hdr, reloc_count=1170, relents, symbols, dynamic=1) at elfcode.h:1482 -#1 in bfd_elf64_slurp_reloc_table (abfd, asect, symbols, dynamic=1) at elfcode.h:1563 -#2 in _bfd_elf_get_synthetic_symtab (abfd, symcount=0, syms, dynsymcount=1792, dynsyms, ret) at elf.c:9269 -#3 in elf_symfile_read (objfile, symfile_flags=6) at elfread.c:809 - -Where - elfcode.h:elf_slurp_reloc_table_from_section -contains - ps = symbols + ELF_R_SYM (rela.r_info) - 1; - relent->sym_ptr_ptr = ps; - -`symbols' here is elf_symfile_read's `dyn_symbol_table'. `dyn_symbol_table' -got immediately xfree'd but the freed memory remained referenced by -asect->relocation (containing the RELENT memory above, stored there by -elf_slurp_reloc_table). - -asect->relocation probably does not get used if ABFD is not being read-in the -second time, which happens only if OBJFILE is being created the second time, -which happens due to the error call in the previous mail. - - -I was curious there elf_symfile_read uses 0 for COPY_NAMES in a similar case: - elf_symtab_read (objfile, ST_REGULAR, symcount, symbol_table, 0); -where SYMBOL_TABLE is also immediately xfreed. But that seems to be correct as -elf_slurp_symbol_table uses - symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt); -for the content where later elfread.c's SYMBOL_TABLE points to. Only the -pointers get xfreed which is OK. - - -No regressions on {x86_64,x86_64-m32,i686}-fedora14snapshot-linux-gnu. - - -Thanks, -Jan - - -gdb/ -2010-09-09 Jan Kratochvil - - Fix stale memory references. - * elfread.c: Include libbfd.h. - (elf_symfile_read): Replace xmalloc by bfd_alloc, drop xfree, new - comment. - ---- a/gdb/elfread.c -+++ b/gdb/elfread.c -@@ -792,8 +793,14 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags) - - if (storage_needed > 0) - { -- dyn_symbol_table = (asymbol **) xmalloc (storage_needed); -- make_cleanup (xfree, dyn_symbol_table); -+ /* Memory gets permanently referenced from ABFD after -+ bfd_get_synthetic_symtab so it must not get freed before ABFD gets. -+ It happens only in the case when elf_slurp_reloc_table sees -+ asection->relocation NULL. Determining which section is asection is -+ done by _bfd_elf_get_synthetic_symtab which is all a bfd -+ implementation detail, though. */ -+ -+ dyn_symbol_table = bfd_alloc (abfd, storage_needed); - dynsymcount = bfd_canonicalize_dynamic_symtab (objfile->obfd, - dyn_symbol_table); - - diff --git a/gdb-next-over-throw.patch b/gdb-next-over-throw.patch deleted file mode 100644 index acfeef2..0000000 --- a/gdb-next-over-throw.patch +++ /dev/null @@ -1,1283 +0,0 @@ -http://sourceware.org/ml/gdb-patches/2010-10/msg00109.html -Subject: RFC: next/finish/etc -vs- exceptions - -This is a refresh of: - - http://www.sourceware.org/ml/gdb-patches/2009-05/msg00635.html - -(The thread continues in the following month.) - -I rebased the patch and addressed Pedro's comments. - -I did not add the user notification that Doug asked for. - -This version does work if an exception is thrown from a signal handler. -The included Java test case checks that (on most platforms). - -Built and regtested on x86-64 (compile farm). -Tests for the new functionality are included. - -I'd appreciate comments. I don't want to commit this without a review, -as my experience is that I usually err when touching breakpoints or -infrun. - -If you want to try this yourself, you will need a new-enough libgcc, one -that includes the necessary debugging hook. - -Tom - -2010-10-06 Tom Tromey - - * infrun.c (handle_inferior_event): Handle exception breakpoints. - (handle_inferior_event): Likewise. - (insert_exception_resume_breakpoint): New function. - (check_exception_resume): Likewise. - * inferior.h (delete_longjmp_breakpoint_cleanup): Declare. - * infcmd.c (delete_longjmp_breakpoint_cleanup): No longer static. - (step_1): Set thread's initiating frame. - (until_next_continuation): New function. - (until_next_command): Support exception breakpoints. - (finish_command_continuation): Delete longjmp breakpoint. - (finish_forward): Support exception breakpoints. - * gdbthread.h (struct thread_info) : New field. - * breakpoint.h (enum bptype) : New constants. - (struct bpstat_what) : New field. - * breakpoint.c (create_exception_master_breakpoint): New function. - (update_breakpoints_after_exec): Handle bp_exception_master. Call - create_exception_master_breakpoint. - (print_it_typical): Handle bp_exception_master, bp_exception. - (bpstat_stop_status): Handle bp_exception_master. - (bpstat_what): Handle bp_exception_master, bp_exception, - bp_exception_resume. - (bptype_string): Likewise. - (print_one_breakpoint_location): Likewise. - (allocate_bp_location): Likewise. - (set_longjmp_breakpoint): Handle exception breakpoints. - (delete_longjmp_breakpoint): Likewise. - (mention): Likewise. - (struct until_break_command_continuation_args) : New - field. - (until_break_command_continuation): Call - delete_longjmp_breakpoint. - (until_break_command): Support exception breakpoints. - (delete_command): Likewise. - (breakpoint_re_set_one): Likewise. - (breakpoint_re_set): Likewise. - -2010-10-06 Tom Tromey - - * gdb.java/jnpe.java: New file. - * gdb.java/jnpe.exp: New file. - * gdb.cp/gdb9593.exp: New file. - * gdb.cp/gdb9593.cc: New file. - -Index: gdb-7.2.50.20101116/gdb/breakpoint.c -=================================================================== ---- gdb-7.2.50.20101116.orig/gdb/breakpoint.c 2010-11-17 02:38:59.000000000 +0100 -+++ gdb-7.2.50.20101116/gdb/breakpoint.c 2010-11-17 02:41:53.000000000 +0100 -@@ -2232,6 +2232,33 @@ create_std_terminate_master_breakpoint ( - do_cleanups (old_chain); - } - -+/* Install a master breakpoint on the unwinder's debug hook. */ -+ -+void -+create_exception_master_breakpoint (void) -+{ -+ struct objfile *objfile; -+ -+ ALL_OBJFILES (objfile) -+ { -+ struct minimal_symbol *debug_hook; -+ -+ debug_hook = lookup_minimal_symbol_text ("_Unwind_DebugHook", objfile); -+ if (debug_hook != NULL) -+ { -+ struct breakpoint *b; -+ -+ b = create_internal_breakpoint (get_objfile_arch (objfile), -+ SYMBOL_VALUE_ADDRESS (debug_hook), -+ bp_exception_master); -+ b->addr_string = xstrdup ("_Unwind_DebugHook"); -+ b->enable_state = bp_disabled; -+ } -+ } -+ -+ update_global_location_list (1); -+} -+ - void - update_breakpoints_after_exec (void) - { -@@ -2273,7 +2300,8 @@ update_breakpoints_after_exec (void) - /* Thread event breakpoints must be set anew after an exec(), - as must overlay event and longjmp master breakpoints. */ - if (b->type == bp_thread_event || b->type == bp_overlay_event -- || b->type == bp_longjmp_master || b->type == bp_std_terminate_master) -+ || b->type == bp_longjmp_master || b->type == bp_std_terminate_master -+ || b->type == bp_exception_master) - { - delete_breakpoint (b); - continue; -@@ -2288,7 +2316,8 @@ update_breakpoints_after_exec (void) - - /* Longjmp and longjmp-resume breakpoints are also meaningless - after an exec. */ -- if (b->type == bp_longjmp || b->type == bp_longjmp_resume) -+ if (b->type == bp_longjmp || b->type == bp_longjmp_resume -+ || b->type == bp_exception || b->type == bp_exception_resume) - { - delete_breakpoint (b); - continue; -@@ -2350,6 +2379,7 @@ update_breakpoints_after_exec (void) - create_longjmp_master_breakpoint ("siglongjmp"); - create_longjmp_master_breakpoint ("_siglongjmp"); - create_std_terminate_master_breakpoint ("std::terminate()"); -+ create_exception_master_breakpoint (); - } - - int -@@ -3275,6 +3305,12 @@ print_it_typical (bpstat bs) - result = PRINT_NOTHING; - break; - -+ case bp_exception_master: -+ /* These should never be enabled. */ -+ printf_filtered (_("Exception Master Breakpoint: gdb should not stop!\n")); -+ result = PRINT_NOTHING; -+ break; -+ - case bp_watchpoint: - case bp_hardware_watchpoint: - annotate_watchpoint (b->number); -@@ -3362,6 +3398,8 @@ print_it_typical (bpstat bs) - case bp_none: - case bp_longjmp: - case bp_longjmp_resume: -+ case bp_exception: -+ case bp_exception_resume: - case bp_step_resume: - case bp_watchpoint_scope: - case bp_call_dummy: -@@ -4164,7 +4202,8 @@ bpstat_stop_status (struct address_space - - if (b->type == bp_thread_event || b->type == bp_overlay_event - || b->type == bp_longjmp_master -- || b->type == bp_std_terminate_master) -+ || b->type == bp_std_terminate_master -+ || b->type == bp_exception_master) - /* We do not stop for these. */ - bs->stop = 0; - else -@@ -4260,6 +4299,7 @@ bpstat_what (bpstat bs_head) - - retval.main_action = BPSTAT_WHAT_KEEP_CHECKING; - retval.call_dummy = STOP_NONE; -+ retval.is_longjmp = 0; - - for (bs = bs_head; bs != NULL; bs = bs->next) - { -@@ -4315,10 +4355,14 @@ bpstat_what (bpstat bs_head) - } - break; - case bp_longjmp: -+ case bp_exception: - this_action = BPSTAT_WHAT_SET_LONGJMP_RESUME; -+ retval.is_longjmp = bptype == bp_longjmp; - break; - case bp_longjmp_resume: -+ case bp_exception_resume: - this_action = BPSTAT_WHAT_CLEAR_LONGJMP_RESUME; -+ retval.is_longjmp = bptype == bp_longjmp_resume; - break; - case bp_step_resume: - if (bs->stop) -@@ -4334,6 +4378,7 @@ bpstat_what (bpstat bs_head) - case bp_overlay_event: - case bp_longjmp_master: - case bp_std_terminate_master: -+ case bp_exception_master: - this_action = BPSTAT_WHAT_SINGLE; - break; - case bp_catchpoint: -@@ -4556,6 +4601,8 @@ bptype_string (enum bptype type) - {bp_access_watchpoint, "acc watchpoint"}, - {bp_longjmp, "longjmp"}, - {bp_longjmp_resume, "longjmp resume"}, -+ {bp_exception, "exception"}, -+ {bp_exception_resume, "exception resume"}, - {bp_step_resume, "step resume"}, - {bp_watchpoint_scope, "watchpoint scope"}, - {bp_call_dummy, "call dummy"}, -@@ -4565,6 +4612,7 @@ bptype_string (enum bptype type) - {bp_overlay_event, "overlay events"}, - {bp_longjmp_master, "longjmp master"}, - {bp_std_terminate_master, "std::terminate master"}, -+ {bp_exception_master, "exception master"}, - {bp_catchpoint, "catchpoint"}, - {bp_tracepoint, "tracepoint"}, - {bp_fast_tracepoint, "fast tracepoint"}, -@@ -4705,6 +4753,8 @@ print_one_breakpoint_location (struct br - case bp_finish: - case bp_longjmp: - case bp_longjmp_resume: -+ case bp_exception: -+ case bp_exception_resume: - case bp_step_resume: - case bp_watchpoint_scope: - case bp_call_dummy: -@@ -4714,6 +4764,7 @@ print_one_breakpoint_location (struct br - case bp_overlay_event: - case bp_longjmp_master: - case bp_std_terminate_master: -+ case bp_exception_master: - case bp_tracepoint: - case bp_fast_tracepoint: - case bp_static_tracepoint: -@@ -5457,6 +5508,8 @@ allocate_bp_location (struct breakpoint - case bp_finish: - case bp_longjmp: - case bp_longjmp_resume: -+ case bp_exception: -+ case bp_exception_resume: - case bp_step_resume: - case bp_watchpoint_scope: - case bp_call_dummy: -@@ -5469,6 +5522,7 @@ allocate_bp_location (struct breakpoint - case bp_std_terminate_master: - case bp_gnu_ifunc_resolver: - case bp_gnu_ifunc_resolver_return: -+ case bp_exception_master: - loc->loc_type = bp_loc_software_breakpoint; - break; - case bp_hardware_breakpoint: -@@ -5708,8 +5762,7 @@ make_breakpoint_permanent (struct breakp - } - - /* Call this routine when stepping and nexting to enable a breakpoint -- if we do a longjmp() in THREAD. When we hit that breakpoint, call -- set_longjmp_resume_breakpoint() to figure out where we are going. */ -+ if we do a longjmp() or 'throw' in THREAD. */ - - void - set_longjmp_breakpoint (int thread) -@@ -5722,11 +5775,12 @@ set_longjmp_breakpoint (int thread) - clones of those and enable them for the requested thread. */ - ALL_BREAKPOINTS_SAFE (b, temp) - if (b->pspace == current_program_space -- && b->type == bp_longjmp_master) -+ && (b->type == bp_longjmp_master -+ || b->type == bp_exception_master)) - { - struct breakpoint *clone = clone_momentary_breakpoint (b); - -- clone->type = bp_longjmp; -+ clone->type = b->type == bp_longjmp_master ? bp_longjmp : bp_exception; - clone->thread = thread; - } - } -@@ -5738,7 +5792,7 @@ delete_longjmp_breakpoint (int thread) - struct breakpoint *b, *temp; - - ALL_BREAKPOINTS_SAFE (b, temp) -- if (b->type == bp_longjmp) -+ if (b->type == bp_longjmp || b->type == bp_exception) - { - if (b->thread == thread) - delete_breakpoint (b); -@@ -6913,6 +6967,8 @@ mention (struct breakpoint *b) - case bp_finish: - case bp_longjmp: - case bp_longjmp_resume: -+ case bp_exception: -+ case bp_exception_resume: - case bp_step_resume: - case bp_call_dummy: - case bp_std_terminate: -@@ -6924,6 +6980,7 @@ mention (struct breakpoint *b) - case bp_longjmp_master: - case bp_std_terminate_master: - case bp_gnu_ifunc_resolver_return: -+ case bp_exception_master: - break; - } - -@@ -8598,6 +8655,7 @@ struct until_break_command_continuation_ - { - struct breakpoint *breakpoint; - struct breakpoint *breakpoint2; -+ int thread_num; - }; - - /* This function is called by fetch_inferior_event via the -@@ -8612,6 +8670,7 @@ until_break_command_continuation (void * - delete_breakpoint (a->breakpoint); - if (a->breakpoint2) - delete_breakpoint (a->breakpoint2); -+ delete_longjmp_breakpoint (a->thread_num); - } - - void -@@ -8623,6 +8682,8 @@ until_break_command (char *arg, int from - struct breakpoint *breakpoint; - struct breakpoint *breakpoint2 = NULL; - struct cleanup *old_chain; -+ int thread; -+ struct thread_info *tp; - - clear_proceed_status (); - -@@ -8661,6 +8722,9 @@ until_break_command (char *arg, int from - - old_chain = make_cleanup_delete_breakpoint (breakpoint); - -+ tp = inferior_thread (); -+ thread = tp->num; -+ - /* Keep within the current frame, or in frames called by the current - one. */ - -@@ -8673,6 +8737,10 @@ until_break_command (char *arg, int from - frame_unwind_caller_id (frame), - bp_until); - make_cleanup_delete_breakpoint (breakpoint2); -+ -+ set_longjmp_breakpoint (thread); -+ tp->initiating_frame = frame_unwind_caller_id (frame); -+ make_cleanup (delete_longjmp_breakpoint_cleanup, &thread); - } - - proceed (-1, TARGET_SIGNAL_DEFAULT, 0); -@@ -8689,6 +8757,7 @@ until_break_command (char *arg, int from - - args->breakpoint = breakpoint; - args->breakpoint2 = breakpoint2; -+ args->thread_num = thread; - - discard_cleanups (old_chain); - add_continuation (inferior_thread (), -@@ -9940,6 +10009,7 @@ delete_command (char *arg, int from_tty) - && b->type != bp_overlay_event - && b->type != bp_longjmp_master - && b->type != bp_std_terminate_master -+ && b->type != bp_exception_master - && b->number >= 0) - { - breaks_to_delete = 1; -@@ -9961,6 +10031,7 @@ delete_command (char *arg, int from_tty) - && b->type != bp_overlay_event - && b->type != bp_longjmp_master - && b->type != bp_std_terminate_master -+ && b->type != bp_exception_master - && b->number >= 0) - delete_breakpoint (b); - } -@@ -10470,6 +10541,7 @@ breakpoint_re_set_one (void *bint) - case bp_overlay_event: - case bp_longjmp_master: - case bp_std_terminate_master: -+ case bp_exception_master: - delete_breakpoint (b); - break; - -@@ -10493,6 +10565,8 @@ breakpoint_re_set_one (void *bint) - case bp_step_resume: - case bp_longjmp: - case bp_longjmp_resume: -+ case bp_exception: -+ case bp_exception_resume: - case bp_jit_event: - case bp_gnu_ifunc_resolver_return: - break; -@@ -10537,6 +10611,7 @@ breakpoint_re_set (void) - create_longjmp_master_breakpoint ("siglongjmp"); - create_longjmp_master_breakpoint ("_siglongjmp"); - create_std_terminate_master_breakpoint ("std::terminate()"); -+ create_exception_master_breakpoint (); - } - - /* Reset the thread number of this breakpoint: -Index: gdb-7.2.50.20101116/gdb/breakpoint.h -=================================================================== ---- gdb-7.2.50.20101116.orig/gdb/breakpoint.h 2010-11-17 02:38:59.000000000 +0100 -+++ gdb-7.2.50.20101116/gdb/breakpoint.h 2010-11-17 02:39:19.000000000 +0100 -@@ -61,6 +61,13 @@ enum bptype - bp_longjmp, /* secret breakpoint to find longjmp() */ - bp_longjmp_resume, /* secret breakpoint to escape longjmp() */ - -+ /* An internal breakpoint that is installed on the unwinder's -+ debug hook. */ -+ bp_exception, -+ /* An internal breakpoint that is set at the point where an -+ exception will land. */ -+ bp_exception_resume, -+ - /* Used by wait_for_inferior for stepping over subroutine calls, for - stepping over signal handlers, and for skipping prologues. */ - bp_step_resume, -@@ -130,6 +137,9 @@ enum bptype - /* Master copies of std::terminate breakpoints. */ - bp_std_terminate_master, - -+ /* Like bp_longjmp_master, but for exceptions. */ -+ bp_exception_master, -+ - bp_catchpoint, - - bp_tracepoint, -@@ -672,6 +682,10 @@ struct bpstat_what - continuing from a call dummy without popping the frame is not a - useful one). */ - enum stop_stack_kind call_dummy; -+ -+ /* Used for BPSTAT_WHAT_SET_LONGJMP_RESUME. True if we are -+ handling a longjmp, false if we are handling an exception. */ -+ int is_longjmp; - }; - - /* The possible return values for print_bpstat, print_it_normal, -Index: gdb-7.2.50.20101116/gdb/gdbthread.h -=================================================================== ---- gdb-7.2.50.20101116.orig/gdb/gdbthread.h 2010-11-02 02:37:31.000000000 +0100 -+++ gdb-7.2.50.20101116/gdb/gdbthread.h 2010-11-17 02:39:19.000000000 +0100 -@@ -185,6 +185,10 @@ struct thread_info - /* True if this thread has been explicitly requested to stop. */ - int stop_requested; - -+ /* The initiating frame of a nexting operation, used for deciding -+ which exceptions to intercept. */ -+ struct frame_id initiating_frame; -+ - /* Private data used by the target vector implementation. */ - struct private_thread_info *private; - -Index: gdb-7.2.50.20101116/gdb/infcmd.c -=================================================================== ---- gdb-7.2.50.20101116.orig/gdb/infcmd.c 2010-07-01 17:36:15.000000000 +0200 -+++ gdb-7.2.50.20101116/gdb/infcmd.c 2010-11-17 02:39:19.000000000 +0100 -@@ -822,7 +822,7 @@ nexti_command (char *count_string, int f - step_1 (1, 1, count_string); - } - --static void -+void - delete_longjmp_breakpoint_cleanup (void *arg) - { - int thread = * (int *) arg; -@@ -862,10 +862,13 @@ step_1 (int skip_subroutines, int single - - if (!single_inst || skip_subroutines) /* leave si command alone */ - { -+ struct thread_info *tp = inferior_thread (); -+ - if (in_thread_list (inferior_ptid)) - thread = pid_to_thread_id (inferior_ptid); - - set_longjmp_breakpoint (thread); -+ tp->initiating_frame = get_frame_id (get_current_frame ()); - - make_cleanup (delete_longjmp_breakpoint_cleanup, &thread); - } -@@ -1219,6 +1222,15 @@ signal_command (char *signum_exp, int fr - proceed ((CORE_ADDR) -1, oursig, 0); - } - -+/* A continuation callback for until_next_command. */ -+ -+static void -+until_next_continuation (void *arg) -+{ -+ struct thread_info *tp = arg; -+ delete_longjmp_breakpoint (tp->num); -+} -+ - /* Proceed until we reach a different source line with pc greater than - our current one or exit the function. We skip calls in both cases. - -@@ -1235,6 +1247,8 @@ until_next_command (int from_tty) - struct symbol *func; - struct symtab_and_line sal; - struct thread_info *tp = inferior_thread (); -+ int thread = tp->num; -+ struct cleanup *old_chain; - - clear_proceed_status (); - set_step_frame (); -@@ -1270,7 +1284,19 @@ until_next_command (int from_tty) - - tp->step_multi = 0; /* Only one call to proceed */ - -+ set_longjmp_breakpoint (thread); -+ tp->initiating_frame = get_frame_id (frame); -+ old_chain = make_cleanup (delete_longjmp_breakpoint_cleanup, &thread); -+ - proceed ((CORE_ADDR) -1, TARGET_SIGNAL_DEFAULT, 1); -+ -+ if (target_can_async_p () && is_running (inferior_ptid)) -+ { -+ discard_cleanups (old_chain); -+ add_continuation (tp, until_next_continuation, tp, NULL); -+ } -+ else -+ do_cleanups (old_chain); - } - - static void -@@ -1463,6 +1489,7 @@ finish_command_continuation (void *arg) - if (bs != NULL && tp->proceed_to_finish) - observer_notify_normal_stop (bs, 1 /* print frame */); - delete_breakpoint (a->breakpoint); -+ delete_longjmp_breakpoint (inferior_thread ()->num); - } - - static void -@@ -1546,6 +1573,7 @@ finish_forward (struct symbol *function, - struct breakpoint *breakpoint; - struct cleanup *old_chain; - struct finish_command_continuation_args *cargs; -+ int thread = tp->num; - - sal = find_pc_line (get_frame_pc (frame), 0); - sal.pc = get_frame_pc (frame); -@@ -1556,6 +1584,10 @@ finish_forward (struct symbol *function, - - old_chain = make_cleanup_delete_breakpoint (breakpoint); - -+ set_longjmp_breakpoint (thread); -+ tp->initiating_frame = get_frame_id (frame); -+ make_cleanup (delete_longjmp_breakpoint_cleanup, &thread); -+ - tp->proceed_to_finish = 1; /* We want stop_registers, please... */ - cargs = xmalloc (sizeof (*cargs)); - -Index: gdb-7.2.50.20101116/gdb/inferior.h -=================================================================== ---- gdb-7.2.50.20101116.orig/gdb/inferior.h 2010-11-17 02:38:55.000000000 +0100 -+++ gdb-7.2.50.20101116/gdb/inferior.h 2010-11-17 02:39:19.000000000 +0100 -@@ -299,6 +299,8 @@ extern void interrupt_target_command (ch - - extern void interrupt_target_1 (int all_threads); - -+extern void delete_longjmp_breakpoint_cleanup (void *arg); -+ - extern void detach_command (char *, int); - - extern void notice_new_inferior (ptid_t, int, int); -Index: gdb-7.2.50.20101116/gdb/infrun.c -=================================================================== ---- gdb-7.2.50.20101116.orig/gdb/infrun.c 2010-11-17 02:38:59.000000000 +0100 -+++ gdb-7.2.50.20101116/gdb/infrun.c 2010-11-17 02:39:19.000000000 +0100 -@@ -45,6 +45,8 @@ - #include "language.h" - #include "solib.h" - #include "main.h" -+#include "dictionary.h" -+#include "block.h" - #include "gdb_assert.h" - #include "mi/mi-common.h" - #include "event-top.h" -@@ -2229,6 +2231,8 @@ static void insert_step_resume_breakpoin - struct symtab_and_line sr_sal, - struct frame_id sr_id); - static void insert_longjmp_resume_breakpoint (struct gdbarch *, CORE_ADDR); -+static void check_exception_resume (struct execution_control_state *, -+ struct frame_info *, struct symbol *); - - static void stop_stepping (struct execution_control_state *ecs); - static void prepare_to_wait (struct execution_control_state *ecs); -@@ -4121,23 +4125,33 @@ process_event_stop_test: - - ecs->event_thread->stepping_over_breakpoint = 1; - -- if (!gdbarch_get_longjmp_target_p (gdbarch) -- || !gdbarch_get_longjmp_target (gdbarch, frame, &jmp_buf_pc)) -+ if (what.is_longjmp) - { -- if (debug_infrun) -- fprintf_unfiltered (gdb_stdlog, "\ -+ if (!gdbarch_get_longjmp_target_p (gdbarch) -+ || !gdbarch_get_longjmp_target (gdbarch, -+ frame, &jmp_buf_pc)) -+ { -+ if (debug_infrun) -+ fprintf_unfiltered (gdb_stdlog, "\ - infrun: BPSTAT_WHAT_SET_LONGJMP_RESUME (!gdbarch_get_longjmp_target)\n"); -- keep_going (ecs); -- return; -- } -+ keep_going (ecs); -+ return; -+ } - -- /* We're going to replace the current step-resume breakpoint -- with a longjmp-resume breakpoint. */ -- delete_step_resume_breakpoint (ecs->event_thread); -+ /* We're going to replace the current step-resume breakpoint -+ with a longjmp-resume breakpoint. */ -+ delete_step_resume_breakpoint (ecs->event_thread); - -- /* Insert a breakpoint at resume address. */ -- insert_longjmp_resume_breakpoint (gdbarch, jmp_buf_pc); -+ /* Insert a breakpoint at resume address. */ -+ insert_longjmp_resume_breakpoint (gdbarch, jmp_buf_pc); -+ } -+ else -+ { -+ struct symbol *func = get_frame_function (frame); - -+ if (func) -+ check_exception_resume (ecs, frame, func); -+ } - keep_going (ecs); - return; - -@@ -4149,6 +4163,53 @@ infrun: BPSTAT_WHAT_SET_LONGJMP_RESUME ( - gdb_assert (ecs->event_thread->step_resume_breakpoint != NULL); - delete_step_resume_breakpoint (ecs->event_thread); - -+ if (!what.is_longjmp) -+ { -+ /* There are several cases to consider. -+ -+ 1. The initiating frame no longer exists. In this case -+ we must stop, because the exception has gone too far. -+ -+ 2. The initiating frame exists, and is the same as the -+ current frame. -+ -+ 2.1. If we are stepping, defer to the stepping logic. -+ -+ 2.2. Otherwise, we are not stepping, so we are doing a -+ "finish" and we have reached the calling frame. So, -+ stop. -+ -+ 3. The initiating frame exists and is different from -+ the current frame. This means the exception has been -+ caught beneath the initiating frame, so keep going. */ -+ struct frame_info *init_frame -+ = frame_find_by_id (ecs->event_thread->initiating_frame); -+ if (init_frame) -+ { -+ struct frame_id current_id -+ = get_frame_id (get_current_frame ()); -+ if (frame_id_eq (current_id, -+ ecs->event_thread->initiating_frame)) -+ { -+ if (ecs->event_thread->step_range_start) -+ { -+ /* Case 2.1. */ -+ break; -+ } -+ else -+ { -+ /* Case 2.2: fall through. */ -+ } -+ } -+ else -+ { -+ /* Case 3. */ -+ keep_going (ecs); -+ return; -+ } -+ } -+ } -+ - ecs->event_thread->stop_step = 1; - print_end_stepping_range_reason (); - stop_stepping (ecs); -@@ -5127,6 +5188,100 @@ insert_longjmp_resume_breakpoint (struct - set_momentary_breakpoint_at_pc (gdbarch, pc, bp_longjmp_resume); - } - -+/* Insert an exception resume breakpoint. TP is the thread throwing -+ the exception. The block B is the block of the unwinder debug hook -+ function. FRAME is the frame corresponding to the call to this -+ function. SYM is the symbol of the function argument holding the -+ target PC of the exception. */ -+ -+static void -+insert_exception_resume_breakpoint (struct thread_info *tp, -+ struct block *b, -+ struct frame_info *frame, -+ struct symbol *sym) -+{ -+ struct gdb_exception e; -+ -+ /* We want to ignore errors here. */ -+ TRY_CATCH (e, RETURN_MASK_ALL) -+ { -+ struct symbol *vsym; -+ struct value *value; -+ CORE_ADDR handler; -+ struct breakpoint *bp; -+ -+ vsym = lookup_symbol (SYMBOL_LINKAGE_NAME (sym), b, VAR_DOMAIN, NULL); -+ value = read_var_value (vsym, frame); -+ /* If the value was optimized out, revert to the old behavior. */ -+ if (! value_optimized_out (value)) -+ { -+ handler = value_as_address (value); -+ -+ /* We're going to replace the current step-resume breakpoint -+ with an exception-resume breakpoint. */ -+ delete_step_resume_breakpoint (tp); -+ -+ if (debug_infrun) -+ fprintf_unfiltered (gdb_stdlog, -+ "infrun: exception resume at %lx\n", -+ (unsigned long) handler); -+ -+ bp = set_momentary_breakpoint_at_pc (get_frame_arch (frame), -+ handler, bp_exception_resume); -+ inferior_thread ()->step_resume_breakpoint = bp; -+ } -+ } -+} -+ -+/* This is called when an exception has been intercepted. Check to -+ see whether the exception's destination is of interest, and if so, -+ set an exception resume breakpoint there. */ -+ -+static void -+check_exception_resume (struct execution_control_state *ecs, -+ struct frame_info *frame, struct symbol *func) -+{ -+ struct gdb_exception e; -+ -+ TRY_CATCH (e, RETURN_MASK_ALL) -+ { -+ struct block *b; -+ struct dict_iterator iter; -+ struct symbol *sym; -+ int argno = 0; -+ -+ /* The exception breakpoint is a thread-specific breakpoint on -+ the unwinder's debug hook, declared as: -+ -+ void _Unwind_DebugHook (void *cfa, void *handler); -+ -+ The CFA argument indicates the frame to which control is -+ about to be transferred. HANDLER is the destination PC. -+ -+ We ignore the CFA and set a temporary breakpoint at HANDLER. -+ This is not extremely efficient but it avoids issues in gdb -+ with computing the DWARF CFA, and it also works even in weird -+ cases such as throwing an exception from inside a signal -+ handler. */ -+ -+ b = SYMBOL_BLOCK_VALUE (func); -+ ALL_BLOCK_SYMBOLS (b, iter, sym) -+ { -+ if (!SYMBOL_IS_ARGUMENT (sym)) -+ continue; -+ -+ if (argno == 0) -+ ++argno; -+ else -+ { -+ insert_exception_resume_breakpoint (ecs->event_thread, -+ b, frame, sym); -+ break; -+ } -+ } -+ } -+} -+ - static void - stop_stepping (struct execution_control_state *ecs) - { -Index: gdb-7.2.50.20101116/gdb/testsuite/gdb.cp/gdb9593.cc -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-7.2.50.20101116/gdb/testsuite/gdb.cp/gdb9593.cc 2010-11-17 02:39:19.000000000 +0100 -@@ -0,0 +1,180 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2008, 2009 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 . -+ */ -+#include -+ -+using namespace std; -+ -+class NextOverThrowDerivates -+{ -+ -+public: -+ -+ -+ // Single throw an exception in this function. -+ void function1() -+ { -+ throw 20; -+ } -+ -+ // Throw an exception in another function. -+ void function2() -+ { -+ function1(); -+ } -+ -+ // Throw an exception in another function, but handle it -+ // locally. -+ void function3 () -+ { -+ { -+ try -+ { -+ function1 (); -+ } -+ catch (...) -+ { -+ cout << "Caught and handled function1 exception" << endl; -+ } -+ } -+ } -+ -+ void rethrow () -+ { -+ try -+ { -+ function1 (); -+ } -+ catch (...) -+ { -+ throw; -+ } -+ } -+ -+ void finish () -+ { -+ // We use this to test that a "finish" here does not end up in -+ // this frame, but in the one above. -+ try -+ { -+ function1 (); -+ } -+ catch (int x) -+ { -+ } -+ function1 (); // marker for until -+ } -+ -+ void until () -+ { -+ function1 (); -+ function1 (); // until here -+ } -+ -+}; -+NextOverThrowDerivates next_cases; -+ -+ -+int main () -+{ -+ try -+ { -+ next_cases.function1 (); -+ } -+ catch (...) -+ { -+ // Discard -+ } -+ -+ try -+ { -+ next_cases.function2 (); -+ } -+ catch (...) -+ { -+ // Discard -+ } -+ -+ try -+ { -+ // This is duplicated so we can next over one but step into -+ // another. -+ next_cases.function2 (); -+ } -+ catch (...) -+ { -+ // Discard -+ } -+ -+ next_cases.function3 (); -+ -+ try -+ { -+ next_cases.rethrow (); -+ } -+ catch (...) -+ { -+ // Discard -+ } -+ -+ try -+ { -+ // Another duplicate so we can test "finish". -+ next_cases.function2 (); -+ } -+ catch (...) -+ { -+ // Discard -+ } -+ -+ // Another test for "finish". -+ try -+ { -+ next_cases.finish (); -+ } -+ catch (...) -+ { -+ } -+ -+ // Test of "until". -+ try -+ { -+ next_cases.finish (); -+ } -+ catch (...) -+ { -+ } -+ -+ // Test of "until" with an argument. -+ try -+ { -+ next_cases.until (); -+ } -+ catch (...) -+ { -+ } -+ -+ // Test of "advance". -+ try -+ { -+ next_cases.until (); -+ } -+ catch (...) -+ { -+ } -+} -+ -Index: gdb-7.2.50.20101116/gdb/testsuite/gdb.cp/gdb9593.exp -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-7.2.50.20101116/gdb/testsuite/gdb.cp/gdb9593.exp 2010-11-17 02:39:19.000000000 +0100 -@@ -0,0 +1,182 @@ -+# Copyright 2008, 2009, 2010 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+ -+if $tracelevel then { -+ strace $tracelevel -+} -+ -+if { [skip_cplus_tests] } { continue } -+ -+set testfile "gdb9593" -+set srcfile ${testfile}.cc -+set binfile $objdir/$subdir/$testfile -+ -+# Create and source the file that provides information about the compiler -+# used to compile the test case. -+if [get_compiler_info ${binfile} "c++"] { -+ untested gdb9593.exp -+ return -1 -+} -+ -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { -+ untested gdb9593.exp -+ return -1 -+} -+ -+# Some targets can't do function calls, so don't even bother with this -+# test. -+if [target_info exists gdb,cannot_call_functions] { -+ setup_xfail "*-*-*" 9593 -+ fail "This target can not call functions" -+ continue -+} -+ -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} -+ -+if ![runto_main] then { -+ perror "couldn't run to main" -+ continue -+} -+ -+# See whether we have the needed unwinder hooks. -+set ok 1 -+gdb_test_multiple "print _Unwind_DebugHook" "check for unwinder hook" { -+ -re "= .*_Unwind_DebugHook.*\r\n$gdb_prompt $" { -+ pass "check for unwinder hook" -+ } -+ -re "No symbol .* in current context.\r\n$gdb_prompt $" { -+ # Pass the test so we don't get bogus fails in the results. -+ pass "check for unwinder hook" -+ set ok 0 -+ } -+} -+if {!$ok} { -+ untested gdb9593.exp -+ return -1 -+} -+ -+# See http://sourceware.org/bugzilla/show_bug.cgi?id=9593 -+ -+gdb_test "next" \ -+ ".*catch (...).*" \ -+ "next over a throw 1" -+ -+gdb_test "next" \ -+ ".*next_cases.function2.*" \ -+ "next past catch 1" -+ -+gdb_test "next" \ -+ ".*catch (...).*" \ -+ "next over a throw 2" -+ -+gdb_test "next" \ -+ ".*next_cases.function2.*" \ -+ "next past catch 2" -+ -+gdb_test "step" \ -+ ".*function1().*" \ -+ "step into function2 1" -+ -+gdb_test "next" \ -+ ".*catch (...).*" \ -+ "next over a throw 3" -+ -+gdb_test "next" \ -+ ".*next_cases.function3.*" \ -+ "next past catch 3" -+ -+gdb_test "next" \ -+ ".*next_cases.rethrow.*" \ -+ "next over a throw 4" -+ -+gdb_test "next" \ -+ ".*catch (...).*" \ -+ "next over a rethrow" -+ -+gdb_test "next" \ -+ ".*next_cases.function2.*" \ -+ "next after a rethrow" -+ -+gdb_test "step" \ -+ ".*function1().*" \ -+ "step into function2 2" -+ -+gdb_test "finish" \ -+ ".*catch (...).*" \ -+ "finish 1" -+ -+gdb_test "next" \ -+ ".*next_cases.finish ().*" \ -+ "next past catch 4" -+ -+gdb_test "step" \ -+ ".*function1 ().*" \ -+ "step into finish method" -+ -+gdb_test "finish" \ -+ ".*catch (...).*" \ -+ "finish 2" -+ -+gdb_test "next" \ -+ ".*next_cases.finish ().*" \ -+ "next past catch 5" -+ -+gdb_test "step" \ -+ ".*function1 ().*" \ -+ "step into finish, for until" -+ -+gdb_test "until" \ -+ ".*catch .int x.*" \ -+ "until with no argument 1" -+ -+set line [gdb_get_line_number "marker for until" $testfile.cc] -+ -+gdb_test "until $line" \ -+ ".*function1 ().*" \ -+ "next past catch 6" -+ -+gdb_test "until" \ -+ ".*catch (...).*" \ -+ "until with no argument 2" -+ -+set line [gdb_get_line_number "until here" $testfile.cc] -+ -+gdb_test "next" \ -+ ".*next_cases.until ().*" \ -+ "next past catch 6" -+ -+gdb_test "step" \ -+ ".*function1 ().*" \ -+ "step into until" -+ -+gdb_test "until $line" \ -+ ".*catch (...).*" \ -+ "until-over-throw" -+ -+gdb_test "next" \ -+ ".*next_cases.until ().*" \ -+ "next past catch 7" -+ -+gdb_test "step" \ -+ ".*function1 ().*" \ -+ "step into until, for advance" -+ -+gdb_test "advance $line" \ -+ ".*catch (...).*" \ -+ "advance-over-throw" -Index: gdb-7.2.50.20101116/gdb/testsuite/gdb.java/jnpe.exp -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-7.2.50.20101116/gdb/testsuite/gdb.java/jnpe.exp 2010-11-17 02:39:19.000000000 +0100 -@@ -0,0 +1,74 @@ -+# Copyright 2009, 2010 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+if $tracelevel then { -+ strace $tracelevel -+} -+ -+load_lib "java.exp" -+ -+set testfile "jnpe" -+set srcfile ${testfile}.java -+set binfile ${objdir}/${subdir}/${testfile} -+if { [compile_java_from_source ${srcdir}/$subdir/${srcfile} ${binfile} "-g"] != "" } { -+ untested "Couldn't compile ${srcdir}/$subdir/${srcfile}" -+ return -1 -+} -+ -+# Start with a fresh gdb. -+ -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} -+ -+set line [gdb_get_line_number "break here" $testfile.java] -+gdb_test "break $testfile.java:$line" "" -+ -+gdb_test "run" \ -+ "// break here.*" \ -+ "run java next-over-throw" -+ -+# See whether we have the needed unwinder hooks. -+set ok 1 -+gdb_test_multiple "print _Unwind_DebugHook" "check for unwinder hook in java" { -+ -re "= .*_Unwind_DebugHook.*\r\n$gdb_prompt $" { -+ pass "check for unwinder hook in java" -+ } -+ -re "No symbol .* in current context.?\r\n$gdb_prompt $" { -+ # Pass the test so we don't get bogus fails in the results. -+ setup_xfail *-*-* -+ fail "check for unwinder hook in java" -+ set ok 0 -+ } -+} -+if {!$ok} { -+ untested jnpe.exp -+ return -1 -+} -+ -+gdb_test "handle SIGSEGV nostop noprint" \ -+ "SIGSEGV.*fault" \ -+ "disable SIGSEGV for next-over-NPE" -+ -+# The line where we stop differ according to gcj; check just we did not already -+# execute the catch point. -+ -+gdb_test "next" \ -+ "" \ -+ "next over NPE" -+ -+gdb_breakpoint [gdb_get_line_number "catch point"] -+gdb_continue_to_breakpoint "catch point" ".*// catch point.*" -Index: gdb-7.2.50.20101116/gdb/testsuite/gdb.java/jnpe.java -=================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ gdb-7.2.50.20101116/gdb/testsuite/gdb.java/jnpe.java 2010-11-17 02:39:19.000000000 +0100 -@@ -0,0 +1,38 @@ -+// Test next-over-NPE. -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2009 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 . -+ */ -+ -+public class jnpe -+{ -+ public static String npe () -+ { -+ return ((Object) null).toString(); -+ } -+ -+ public static void main (String[] args) -+ { -+ try -+ { -+ System.out.println (npe ()); // break here -+ } -+ catch (NullPointerException n) -+ { -+ System.out.println ("success"); // catch point -+ } -+ } -+} diff --git a/gdb.spec b/gdb.spec index 2610d48..e292673 100644 --- a/gdb.spec +++ b/gdb.spec @@ -23,11 +23,11 @@ Name: gdb%{?_with_debug:-debug} # Set version to contents of gdb/version.in. # NOTE: the FSF gdb versions are numbered N.M for official releases, like 6.3 # and, since January 2005, X.Y.Z.date for daily snapshots, like 6.3.50.20050112 # (daily snapshot from mailine), or 6.3.0.20040112 (head of the release branch). -Version: 7.2.50.20101117 +Version: 7.2.50.20101231 # The release always contains a leading reserved number, start it at 1. # `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing. -Release: 4%{?_with_upstream:.upstream}%{dist} +Release: 5%{?_with_upstream:.upstream}%{dist} License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and GFDL and BSD and Public Domain Group: Development/Debuggers @@ -203,11 +203,6 @@ Patch169: gdb-6.3-ia64-sigill-20051115.patch #=push+work: There was some mail thread about it, this patch may be a hack. Patch188: gdb-6.5-bz203661-emit-relocs.patch -# Security patch: avoid stack overflows in dwarf expression computation. -# CVE-2006-4146 -#=push -Patch190: gdb-6.5-dwarf-stack-overflow.patch - # Support TLS symbols (+`errno' suggestion if no pthread is found) (BZ 185337). #=push+work: It should be replaced by existing uncommitted Roland's glibc patch for TLS without libpthreads. Patch194: gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch @@ -272,10 +267,6 @@ Patch234: gdb-6.6-bz230000-power6-disassembly-test.patch #=push+work: Upstream should have backward compat. API: libc-alpha: <20070127104539.GA9444@.*> Patch235: gdb-6.3-bz231832-obstack-2gb.patch -# Fix debugging GDB itself - the compiled in source files paths (BZ 225783). -#=push -Patch241: gdb-6.6-bz225783-gdb-debuginfo-paths.patch - # Allow running `/usr/bin/gcore' with provided but inaccessible tty (BZ 229517). #=fedoratest Patch245: gdb-6.6-bz229517-gcore-without-terminal.patch @@ -292,10 +283,6 @@ Patch254: gdb-6.6-testsuite-timeouts.patch #=fedoratest Patch258: gdb-6.6-bz237572-ppc-atomic-sequence-test.patch -# Link with libreadline provided by the operating system. -#=push -Patch261: gdb-6.6-readline-system.patch - # Test kernel VDSO decoding while attaching to an i386 process. #=fedoratest Patch263: gdb-6.3-attach-see-vdso-test.patch @@ -516,14 +503,6 @@ Patch510: gdb-bz592031-siginfo-lost-4of5.patch #=push Patch511: gdb-bz592031-siginfo-lost-5of5.patch -# Fix crash on CTRL-C while reading an ELF symbol file (BZ 642879). -#=push -Patch520: gdb-bz642879-elfread-sigint-stale.patch - -# Fix next/finish/etc -vs- exceptions (Tom Tromey). -#=push -Patch525: gdb-next-over-throw.patch - # Verify GDB Python built-in function gdb.solib_address exists (BZ # 634108). Patch526: gdb-bz634108-solib_address.patch @@ -689,7 +668,6 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c %patch164 -p1 %patch169 -p1 %patch188 -p1 -%patch190 -p1 %patch194 -p1 %patch196 -p1 %patch199 -p1 @@ -705,13 +683,11 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c %patch231 -p1 %patch234 -p1 %patch235 -p1 -%patch241 -p1 %patch245 -p1 %patch247 -p1 %patch254 -p1 %patch258 -p1 %patch260 -p1 -%patch261 -p1 %patch263 -p1 %patch265 -p1 %patch266 -p1 @@ -768,8 +744,6 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c %patch504 -p1 %patch510 -p1 %patch511 -p1 -%patch520 -p1 -%patch525 -p1 %patch526 -p1 %patch393 -p1 @@ -1147,6 +1121,16 @@ fi %endif %changelog +* Sat Jan 1 2011 Jan Kratochvil - 7.2.50.20101231-5.fc15 +- Rebase to FSF GDB 7.2.50.20101231 (which is a 7.3 pre-release). +- Remove gdb-6.3-bt-past-zero-20051201.patch, gdb-archer-ada.patch and + gdb-6.3-framepczero-20040927.patch already removed from .spec before. +- Remove gdb-6.5-dwarf-stack-overflow.patch, upstreamed (Tom Tromey). +- Remove gdb-6.6-bz225783-gdb-debuginfo-paths.patch, upstreamed (Tom Tromey). +- Remove gdb-6.6-readline-system.patch, reimplemented upstream (Tom Tromey). +- Remove gdb-bz642879-elfread-sigint-stale.patch, upstreamed (Jan Kratochvil). +- Remove gdb-next-over-throw.patch, upstreamed (Tom Tromey). + * Mon Dec 27 2010 Jan Kratochvil - 7.2.50.20101117-4.fc15 - Provide stub %%{_sysconfdir}/gdbinit (BZ 651232). diff --git a/sources b/sources index c5eb9de..1d119b6 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -b13143c7c7e70f929c86c3f363247909 gdb-7.2.50.20101117.tar.bz2 +bac361434830ddc3e83c40e187b60a96 gdb-7.2.50.20101231.tar.bz2