From 43b0bce1db25f51fc4bd7b400f42984c8bca466b Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Thu, 30 Oct 2014 22:21:18 +0100 Subject: [PATCH] Rebase to FSF GDB 7.8.1. --- .gitignore | 2 +- gdb-async-stopped-on-pid-arg-1of2.patch | 350 ---- gdb-async-stopped-on-pid-arg-2of2.patch | 217 --- gdb-async-stopped-on-pid-arg-testsuite.patch | 23 +- gdb-attach-fail-reasons-5of5.patch | 78 +- gdb-babeltrace-configure.patch | 85 - gdb-babeltrace-minsize.patch | 237 --- gdb-upstream.patch | 1803 ------------------ gdb.spec | 26 +- python-framefilter-invalidarg.patch | 596 ------ sources | 2 +- 11 files changed, 58 insertions(+), 3361 deletions(-) delete mode 100644 gdb-async-stopped-on-pid-arg-1of2.patch delete mode 100644 gdb-async-stopped-on-pid-arg-2of2.patch delete mode 100644 gdb-babeltrace-configure.patch delete mode 100644 gdb-babeltrace-minsize.patch delete mode 100644 python-framefilter-invalidarg.patch diff --git a/.gitignore b/.gitignore index 39bc2d8..e450f7a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ /gdb-libstdc++-v3-python-r155978.tar.bz2 -/gdb-7.8.tar.gz +/gdb-7.8.1.tar.xz diff --git a/gdb-async-stopped-on-pid-arg-1of2.patch b/gdb-async-stopped-on-pid-arg-1of2.patch deleted file mode 100644 index 5c312e3..0000000 --- a/gdb-async-stopped-on-pid-arg-1of2.patch +++ /dev/null @@ -1,350 +0,0 @@ -http://sourceware.org/ml/gdb-patches/2014-09/msg00102.html -Subject: Re: Regression: GDB stopped on run with attached process (PR 17347) [Re: [pushed+7.8] Re: [PATCH] Fix "attach" command vs user input race - -On 09/03/2014 08:58 AM, Jan Kratochvil wrote: - -> https://sourceware.org/bugzilla/show_bug.cgi?id=17347 - -Thanks Jan. - -Here's a fix, test included. Comments? - -Thanks, -Pedro Alves - --------------------------- -[PATCH] gdb/17347 - Regression: GDB stopped on run with attached process - -Doing: - - gdb --pid=PID -ex run - -Results in GDB getting a SIGTTIN, and thus ending stopped. That's -usually indicative of a missing target_terminal_ours call. - -E.g., from the PR: - - $ sleep 1h & p=$!; sleep 0.1; gdb -batch sleep $p -ex run - [1] 28263 - [1] Killed sleep 1h - - [2]+ Stopped gdb -batch sleep $p -ex run - -The workaround is doing: - - gdb -ex "attach $PID" -ex "run" - -instead of - - gdb [-p] $PID -ex "run" - -With the former, gdb waits for the attach command to complete before -moving on to the "run" command, because the interpreter is in sync -mode at this point, within execute_command. But for the latter, -attach_command is called directly from captured_main, and thus misses -that waiting. IOW, "run" is running before the attach continuation -has run, before the program stops and attach completes. The broken -terminal settings are just one symptom of that. Any command that -queries or requires input results in the same. - -The fix is to wait in catch_command_errors (which is specific to -main.c nowadays), just like we wait in execute_command. - -gdb/ChangeLog: -2014-09-03 Pedro Alves - - PR gdb/17347 - * main.c: Include "infrun.h". - (catch_command_errors, catch_command_errors_const): Wait for the - foreground command to complete. - * top.c (maybe_wait_sync_command_done): New function, factored out - from ... - (maybe_wait_sync_command_done): ... here. - * top.h (maybe_wait_sync_command_done): New declaration. - -gdb/testsuite/ChangeLog: -2014-09-03 Pedro Alves - - PR gdb/17347 - * gdb.base/attach.exp (spawn_test_prog): New, factored out from - ... - (do_attach_tests, do_call_attach_tests, do_command_attach_tests): - ... here. - (gdb_spawn_with_cmdline_opts): New procedure. - (test_command_line_attach_run): New procedure. - (top level): Call it. ---- - gdb/main.c | 9 +++ - gdb/testsuite/gdb.base/attach.exp | 118 ++++++++++++++++++++++++++------------ - gdb/top.c | 26 +++++---- - gdb/top.h | 8 +++ - 4 files changed, 114 insertions(+), 47 deletions(-) - -Index: gdb-7.8/gdb/main.c -=================================================================== ---- gdb-7.8.orig/gdb/main.c 2014-09-07 19:12:45.066981588 +0200 -+++ gdb-7.8/gdb/main.c 2014-09-07 19:14:22.613095201 +0200 -@@ -47,6 +47,7 @@ - #include "filenames.h" - #include "filestuff.h" - #include "event-top.h" -+#include "infrun.h" - - /* The selected interpreter. This will be used as a set command - variable, so it should always be malloc'ed - since -@@ -350,7 +351,11 @@ catch_command_errors (catch_command_erro - - TRY_CATCH (e, mask) - { -+ int was_sync = sync_execution; -+ - command (arg, from_tty); -+ -+ maybe_wait_sync_command_done (was_sync); - } - return handle_command_errors (e); - } -@@ -369,7 +374,11 @@ catch_command_errors_const (catch_comman - - TRY_CATCH (e, mask) - { -+ int was_sync = sync_execution; -+ - command (arg, from_tty); -+ -+ maybe_wait_sync_command_done (was_sync); - } - return handle_command_errors (e); - } -Index: gdb-7.8/gdb/testsuite/gdb.base/attach.exp -=================================================================== ---- gdb-7.8.orig/gdb/testsuite/gdb.base/attach.exp 2014-09-07 19:12:45.067981589 +0200 -+++ gdb-7.8/gdb/testsuite/gdb.base/attach.exp 2014-09-07 19:12:48.601985706 +0200 -@@ -58,6 +58,37 @@ if [get_compiler_info] { - return -1 - } - -+# Start the program running and then wait for a bit, to be sure that -+# it can be attached to. Return the process's PID. -+ -+proc spawn_test_prog { executable } { -+ set testpid [eval exec $executable &] -+ exec sleep 2 -+ if { [istarget "*-*-cygwin*"] } { -+ # testpid is the Cygwin PID, GDB uses the Windows PID, which might be -+ # different due to the way fork/exec works. -+ set testpid [ exec ps -e | gawk "{ if (\$1 == $testpid) print \$4; }" ] -+ } -+ -+ return $testpid -+} -+ -+# Spawn GDB with CMDLINE_FLAGS appended to the GDBFLAGS global. -+ -+proc gdb_spawn_with_cmdline_opts { cmdline_flags } { -+ global GDBFLAGS -+ -+ set saved_gdbflags $GDBFLAGS -+ -+ append GDBFLAGS $cmdline_flags -+ -+ set res [gdb_spawn] -+ -+ set GDBFLAGS $saved_gdbflags -+ -+ return $res -+} -+ - proc do_attach_tests {} { - global gdb_prompt - global binfile -@@ -70,13 +101,7 @@ proc do_attach_tests {} { - # Start the program running and then wait for a bit, to be sure - # that it can be attached to. - -- set testpid [eval exec $binfile &] -- exec sleep 2 -- if { [istarget "*-*-cygwin*"] } { -- # testpid is the Cygwin PID, GDB uses the Windows PID, which might be -- # different due to the way fork/exec works. -- set testpid [ exec ps -e | gawk "{ if (\$1 == $testpid) print \$4; }" ] -- } -+ set testpid [spawn_test_prog $binfile] - - # Verify that we cannot attach to nonsense. - -@@ -279,16 +304,7 @@ proc do_attach_tests {} { - - remote_exec build "kill -9 ${testpid}" - -- # Start the program running and then wait for a bit, to be sure -- # that it can be attached to. -- -- set testpid [eval exec $binfile &] -- exec sleep 2 -- if { [istarget "*-*-cygwin*"] } { -- # testpid is the Cygwin PID, GDB uses the Windows PID, which might be -- # different due to the way fork/exec works. -- set testpid [ exec ps -e | gawk "{ if (\$1 == $testpid) print \$4; }" ] -- } -+ set testpid [spawn_test_prog $binfile] - - # Verify that we can attach to the process, and find its a.out - # when we're cd'd to some directory that doesn't contain the -@@ -335,16 +351,7 @@ proc do_call_attach_tests {} { - global gdb_prompt - global binfile2 - -- # Start the program running and then wait for a bit, to be sure -- # that it can be attached to. -- -- set testpid [eval exec $binfile2 &] -- exec sleep 2 -- if { [istarget "*-*-cygwin*"] } { -- # testpid is the Cygwin PID, GDB uses the Windows PID, which might be -- # different due to the way fork/exec works. -- set testpid [ exec ps -e | gawk "{ if (\$1 == $testpid) print \$4; }" ] -- } -+ set testpid [spawn_test_prog $binfile2] - - # Attach - -@@ -397,16 +404,7 @@ proc do_command_attach_tests {} { - return 0 - } - -- # Start the program running and then wait for a bit, to be sure -- # that it can be attached to. -- -- set testpid [eval exec $binfile &] -- exec sleep 2 -- if { [istarget "*-*-cygwin*"] } { -- # testpid is the Cygwin PID, GDB uses the Windows PID, which might be -- # different due to the way fork/exec works. -- set testpid [ exec ps -e | gawk "{ if (\$1 == $testpid) print \$4; }" ] -- } -+ set testpid [spawn_test_prog $binfile] - - gdb_exit - if $verbose>1 then { -@@ -429,6 +427,50 @@ proc do_command_attach_tests {} { - remote_exec build "kill -9 ${testpid}" - } - -+# Test ' gdb --pid PID -ex "run" '. GDB used to have a bug where -+# "run" would run before the attach finished - PR17347. -+ -+proc test_command_line_attach_run {} { -+ global gdb_prompt -+ global binfile -+ global verbose -+ global GDB -+ global INTERNAL_GDBFLAGS -+ -+ if ![isnative] then { -+ unsupported "commandline attach run test" -+ return 0 -+ } -+ -+ with_test_prefix "cmdline attach run" { -+ set testpid [spawn_test_prog $binfile] -+ -+ set test "run to prompt" -+ gdb_exit -+ set res [gdb_spawn_with_cmdline_opts "--pid=$testpid -ex \"start\""] -+ if { $res != 0} { -+ fail $test -+ return $res -+ } -+ gdb_test_multiple "" $test { -+ -re {Attaching to.*Start it from the beginning\? \(y or n\) } { -+ pass $test -+ } -+ } -+ -+ send_gdb "y\n" -+ -+ set test "run to main" -+ gdb_test_multiple "" $test { -+ -re "Temporary breakpoint .* main .*$gdb_prompt $" { -+ pass $test -+ } -+ } -+ -+ # Get rid of the process -+ remote_exec build "kill -9 ${testpid}" -+ } -+} - - # Start with a fresh gdb - -@@ -453,4 +495,6 @@ do_call_attach_tests - - do_command_attach_tests - -+test_command_line_attach_run -+ - return 0 -Index: gdb-7.8/gdb/top.c -=================================================================== ---- gdb-7.8.orig/gdb/top.c 2014-09-07 19:12:45.067981589 +0200 -+++ gdb-7.8/gdb/top.c 2014-09-07 19:12:48.601985706 +0200 -@@ -375,6 +375,21 @@ check_frame_language_change (void) - } - } - -+void -+maybe_wait_sync_command_done (int was_sync) -+{ -+ /* If the interpreter is in sync mode (we're running a user -+ command's list, running command hooks or similars), and we -+ just ran a synchronous command that started the target, wait -+ for that command to end. */ -+ if (!interpreter_async && !was_sync && sync_execution) -+ { -+ while (gdb_do_one_event () >= 0) -+ if (!sync_execution) -+ break; -+ } -+} -+ - /* Execute the line P as a command, in the current user context. - Pass FROM_TTY as second argument to the defining function. */ - -@@ -461,16 +476,7 @@ execute_command (char *p, int from_tty) - else - cmd_func (c, arg, from_tty); - -- /* If the interpreter is in sync mode (we're running a user -- command's list, running command hooks or similars), and we -- just ran a synchronous command that started the target, wait -- for that command to end. */ -- if (!interpreter_async && !was_sync && sync_execution) -- { -- while (gdb_do_one_event () >= 0) -- if (!sync_execution) -- break; -- } -+ maybe_wait_sync_command_done (was_sync); - - /* If this command has been post-hooked, run the hook last. */ - execute_cmd_post_hook (c); -Index: gdb-7.8/gdb/top.h -=================================================================== ---- gdb-7.8.orig/gdb/top.h 2014-09-07 19:12:45.068981590 +0200 -+++ gdb-7.8/gdb/top.h 2014-09-07 19:12:48.601985706 +0200 -@@ -42,6 +42,14 @@ extern void quit_command (char *, int); - extern void quit_cover (void); - extern void execute_command (char *, int); - -+/* If the interpreter is in sync mode (we're running a user command's -+ list, running command hooks or similars), and we just ran a -+ synchronous command that started the target, wait for that command -+ to end. WAS_SYNC indicates whether sync_execution was set before -+ the command was run. */ -+ -+extern void maybe_wait_sync_command_done (int was_sync); -+ - extern void check_frame_language_change (void); - - /* Prepare for execution of a command. diff --git a/gdb-async-stopped-on-pid-arg-2of2.patch b/gdb-async-stopped-on-pid-arg-2of2.patch deleted file mode 100644 index 6683326..0000000 --- a/gdb-async-stopped-on-pid-arg-2of2.patch +++ /dev/null @@ -1,217 +0,0 @@ -http://sourceware.org/ml/gdb-patches/2014-09/msg00174.html -Subject: Re: Regression: GDB stopped on run with attached process (PR 17347) [Re: [pushed+7.8] Re: [PATCH] Fix "attach" command vs user input race - - ---a8Wt8u1KmwUX3Y2C -Content-Type: text/plain; charset=us-ascii -Content-Disposition: inline - -On Wed, 03 Sep 2014 22:11:03 +0200, Pedro Alves wrote: -> On 09/03/2014 08:58 AM, Jan Kratochvil wrote: -> -> > https://sourceware.org/bugzilla/show_bug.cgi?id=17347 -> -> Thanks Jan. -> -> Here's a fix, test included. Comments? - -In the testsuite run from the Fedora rpm packaging I get: - -GNU gdb (GDB) Fedora 7.8-21.fc21^M -Copyright (C) 2014 Free Software Foundation, Inc.^M -License GPLv3+: GNU GPL version 3 or later ^M -This is free software: you are free to change and redistribute it.^M -There is NO WARRANTY, to the extent permitted by law. Type "show copying"^M -and "show warranty" for details.^M -This GDB was configured as "i686-redhat-linux-gnu".^M -Type "show configuration" for configuration details.^M -For bug reporting instructions, please see:^M -.^M -Find the GDB manual and other documentation resources online at:^M -.^M -For help, type "help".^M -Type "apropos word" to search for commands related to "word".^M -Attaching to process 27028^M -Reading symbols from /unsafebuild-i686-redhat-linux-gnu/gdb/testsuite.unix.-m32/outputs/gdb.base/attach/attach...done.^M -Reading symbols from /lib/libm.so.6...Reading symbols from /usr/lib/debug/usr/lib/libm-2.19.90.so.debug...done.^M -done.^M -Loaded symbols for /lib/libm.so.6^M -Reading symbols from /lib/libc.so.6...Reading symbols from /usr/lib/debug/usr/lib/libc-2.19.90.so.debug...done.^M -done.^M -Loaded symbols for /lib/libc.so.6^M -Reading symbols from /lib/ld-linux.so.2...Reading symbols from /usr/lib/debug/usr/lib/ld-2.19.90.so.debug...done.^M -done.^M -Loaded symbols for /lib/ld-linux.so.2^M -main ()^M - at gdb/testsuite/gdb.base/attach.c:15^M -15 while (! should_exit)^M -The program being debugged has been started already.^M -Start it from the beginning? (y or n) PASS: gdb.base/attach.exp: cmdline attach run: run to prompt -y^M -^M -Temporary breakpoint 1 at 0x8048481: file gdb/testsuite/gdb.base/attach.c, line 13.^M -Starting program: /unsafe/home/jkratoch/hammock/20140907fedorarel21-f21/fedora-2---Type to continue, or q to quit---ERROR: Window too small. -UNRESOLVED: gdb.base/attach.exp: cmdline attach run: run to main - - -While I do not fully understand why that happens in every run of that Fedora -testsuite while it never happens during my reproducibility attempts by hand -I find it understandable and the Fedora testsuite issues does get fixed by the -attached patch. - - -> --- a/gdb/testsuite/gdb.base/attach.exp -> +++ b/gdb/testsuite/gdb.base/attach.exp -> @@ -58,6 +58,37 @@ if [get_compiler_info] { -> return -1 -> } -> -> +# Start the program running and then wait for a bit, to be sure that -> +# it can be attached to. Return the process's PID. -> + -> +proc spawn_test_prog { executable } { -> + set testpid [eval exec $executable &] -> + exec sleep 2 - -Unrelated to this patch - this patch only moved the code. Also the code move -could be a separate patch: - -I do not see why the testsuite commonly uses "exec sleep" while it also uses -"sleep" itself which also works fine. - - -> + if { [istarget "*-*-cygwin*"] } { -> + # testpid is the Cygwin PID, GDB uses the Windows PID, which might be -> + # different due to the way fork/exec works. -> + set testpid [ exec ps -e | gawk "{ if (\$1 == $testpid) print \$4; }" ] -> + } -> + -> + return $testpid -> +} -[...] -> @@ -429,6 +427,50 @@ proc do_command_attach_tests {} { -> remote_exec build "kill -9 ${testpid}" -> } -> -> +# Test ' gdb --pid PID -ex "run" '. GDB used to have a bug where -> +# "run" would run before the attach finished - PR17347. -> + -> +proc test_command_line_attach_run {} { -> + global gdb_prompt -> + global binfile - -> + global verbose -> + global GDB -> + global INTERNAL_GDBFLAGS - -These 3 lines are unused. - - -> + -> + if ![isnative] then { -> + unsupported "commandline attach run test" -> + return 0 -> + } -> + -> + with_test_prefix "cmdline attach run" { -> + set testpid [spawn_test_prog $binfile] -> + -> + set test "run to prompt" -> + gdb_exit -> + set res [gdb_spawn_with_cmdline_opts "--pid=$testpid -ex \"start\""] - -Here see the attachment. - - -> + if { $res != 0} { -> + fail $test -> + return $res -> + } -> + gdb_test_multiple "" $test { -> + -re {Attaching to.*Start it from the beginning\? \(y or n\) } { -> + pass $test -> + } -> + } -> + -> + send_gdb "y\n" -> + -> + set test "run to main" -> + gdb_test_multiple "" $test { -> + -re "Temporary breakpoint .* main .*$gdb_prompt $" { -> + pass $test -> + } -> + } -> + -> + # Get rid of the process -> + remote_exec build "kill -9 ${testpid}" -> + } -> +} -> -> # Start with a fresh gdb -> -> @@ -453,4 +495,6 @@ do_call_attach_tests -> -> do_command_attach_tests -> -> +test_command_line_attach_run -> + -> return 0 -> diff --git a/gdb/top.c b/gdb/top.c -> index fc2b84d..ba71f8f 100644 -> --- a/gdb/top.c -> +++ b/gdb/top.c -> @@ -373,6 +373,21 @@ check_frame_language_change (void) -> } -> } -> - -Missing: -/* See top.h. */ - -Unless that rule from me has been abandoned. - - -> +void -> +maybe_wait_sync_command_done (int was_sync) -> +{ -> + /* If the interpreter is in sync mode (we're running a user -> + command's list, running command hooks or similars), and we -> + just ran a synchronous command that started the target, wait -> + for that command to end. */ -> + if (!interpreter_async && !was_sync && sync_execution) -> + { -> + while (gdb_do_one_event () >= 0) -> + if (!sync_execution) -> + break; -> + } -> +} -> + -> /* Execute the line P as a command, in the current user context. -> Pass FROM_TTY as second argument to the defining function. */ -> - - -Thanks, -Jan - ---a8Wt8u1KmwUX3Y2C -Content-Type: text/plain; charset=us-ascii -Content-Disposition: inline; filename=1 - -diff --git a/gdb/testsuite/gdb.base/attach.exp b/gdb/testsuite/gdb.base/attach.exp -index c94c127..6e566a3 100644 ---- a/gdb/testsuite/gdb.base/attach.exp -+++ b/gdb/testsuite/gdb.base/attach.exp -@@ -447,7 +444,8 @@ proc test_command_line_attach_run {} { - - set test "run to prompt" - gdb_exit -- set res [gdb_spawn_with_cmdline_opts "--pid=$testpid -ex \"start\""] -+ set res [gdb_spawn_with_cmdline_opts \ -+ "-iex set\\ height\\ 0 -iex set\\ width\\ 0 --pid=$testpid -ex \"start\""] - if { $res != 0} { - fail $test - return $res - ---a8Wt8u1KmwUX3Y2C-- - diff --git a/gdb-async-stopped-on-pid-arg-testsuite.patch b/gdb-async-stopped-on-pid-arg-testsuite.patch index f50ead1..d516695 100644 --- a/gdb-async-stopped-on-pid-arg-testsuite.patch +++ b/gdb-async-stopped-on-pid-arg-testsuite.patch @@ -33,10 +33,10 @@ gdb/testsuite/ gdb_breakpoint, gdb_continue_to_breakpoint. (test_command_line_attach_run): Kill ${testpid} in one exit path. -diff --git a/gdb/testsuite/gdb.base/attach.c b/gdb/testsuite/gdb.base/attach.c -index 0041b47..91b180c 100644 ---- a/gdb/testsuite/gdb.base/attach.c -+++ b/gdb/testsuite/gdb.base/attach.c +Index: gdb-7.8.1/gdb/testsuite/gdb.base/attach.c +=================================================================== +--- gdb-7.8.1.orig/gdb/testsuite/gdb.base/attach.c 2014-10-30 20:23:01.311595725 +0100 ++++ gdb-7.8.1/gdb/testsuite/gdb.base/attach.c 2014-10-30 20:23:38.653574999 +0100 @@ -5,6 +5,7 @@ exit unless/until gdb sets the variable to non-zero.) */ @@ -58,10 +58,10 @@ index 0041b47..91b180c 100644 - return 0; + return 0; /* postloop */ } -diff --git a/gdb/testsuite/gdb.base/attach.exp b/gdb/testsuite/gdb.base/attach.exp -index 6340496..5fb5c53 100644 ---- a/gdb/testsuite/gdb.base/attach.exp -+++ b/gdb/testsuite/gdb.base/attach.exp +Index: gdb-7.8.1/gdb/testsuite/gdb.base/attach.exp +=================================================================== +--- gdb-7.8.1.orig/gdb/testsuite/gdb.base/attach.exp 2014-10-30 20:23:01.311595725 +0100 ++++ gdb-7.8.1/gdb/testsuite/gdb.base/attach.exp 2014-10-30 20:23:54.151562867 +0100 @@ -256,11 +256,8 @@ proc do_attach_tests {} { # Verify that the modification really happened. @@ -76,14 +76,11 @@ index 6340496..5fb5c53 100644 # Allow the test process to exit, to cleanup after ourselves. -@@ -451,6 +448,7 @@ proc test_command_line_attach_run {} { - "-iex set\\ height\\ 0 -iex set\\ width\\ 0 --pid=$testpid -ex \"start\""] +@@ -418,6 +415,7 @@ proc test_command_line_attach_run {} { + "-iex \"set height 0\" -iex \"set width 0\" --pid=$testpid -ex \"start\""] if { $res != 0} { fail $test + remote_exec build "kill -9 ${testpid}" return $res } gdb_test_multiple "" $test { - ---RnlQjJ0d97Da+TV1-- - diff --git a/gdb-attach-fail-reasons-5of5.patch b/gdb-attach-fail-reasons-5of5.patch index 1bb028b..75a7a5f 100644 --- a/gdb-attach-fail-reasons-5of5.patch +++ b/gdb-attach-fail-reasons-5of5.patch @@ -37,10 +37,10 @@ gdb/gdbserver/ (linux_create_inferior, linux_tracefork_child): Call it instead of direct ptrace. -Index: gdb-7.8/gdb/common/linux-ptrace.c +Index: gdb-7.8.1/gdb/common/linux-ptrace.c =================================================================== ---- gdb-7.8.orig/gdb/common/linux-ptrace.c 2014-07-29 19:31:01.893149317 +0200 -+++ gdb-7.8/gdb/common/linux-ptrace.c 2014-07-29 19:31:05.806154887 +0200 +--- gdb-7.8.1.orig/gdb/common/linux-ptrace.c 2014-10-30 18:33:37.271097644 +0100 ++++ gdb-7.8.1/gdb/common/linux-ptrace.c 2014-10-30 18:33:39.641092763 +0100 @@ -32,6 +32,10 @@ #include @@ -81,10 +81,10 @@ Index: gdb-7.8/gdb/common/linux-ptrace.c + "(gdb) shell sudo setsebool deny_ptrace=0")); +#endif /* HAVE_LIBSELINUX */ +} -Index: gdb-7.8/gdb/common/linux-ptrace.h +Index: gdb-7.8.1/gdb/common/linux-ptrace.h =================================================================== ---- gdb-7.8.orig/gdb/common/linux-ptrace.h 2014-07-29 19:31:01.893149317 +0200 -+++ gdb-7.8/gdb/common/linux-ptrace.h 2014-07-29 19:31:05.807154887 +0200 +--- gdb-7.8.1.orig/gdb/common/linux-ptrace.h 2014-10-30 18:33:37.271097644 +0100 ++++ gdb-7.8.1/gdb/common/linux-ptrace.h 2014-10-30 18:33:39.642092761 +0100 @@ -85,6 +85,7 @@ struct buffer; extern void linux_ptrace_attach_fail_reason (pid_t pid, struct buffer *buffer); @@ -93,11 +93,11 @@ Index: gdb-7.8/gdb/common/linux-ptrace.h extern void linux_enable_event_reporting (pid_t pid); extern void linux_disable_event_reporting (pid_t pid); extern int linux_supports_tracefork (void); -Index: gdb-7.8/gdb/configure.ac +Index: gdb-7.8.1/gdb/configure.ac =================================================================== ---- gdb-7.8.orig/gdb/configure.ac 2014-07-29 19:31:01.894149319 +0200 -+++ gdb-7.8/gdb/configure.ac 2014-07-29 19:31:05.807154887 +0200 -@@ -2158,6 +2158,10 @@ case $host_os in +--- gdb-7.8.1.orig/gdb/configure.ac 2014-10-30 18:33:37.272097642 +0100 ++++ gdb-7.8.1/gdb/configure.ac 2014-10-30 18:33:39.643092759 +0100 +@@ -2161,6 +2161,10 @@ case $host_os in esac AC_DEFINE_UNQUOTED(GDBINIT,"$gdbinit",[The .gdbinit filename.]) @@ -108,10 +108,10 @@ Index: gdb-7.8/gdb/configure.ac dnl Handle optional features that can be enabled. # Support for --with-sysroot is a copy of GDB_AC_WITH_DIR, -Index: gdb-7.8/gdb/gdbserver/configure.ac +Index: gdb-7.8.1/gdb/gdbserver/configure.ac =================================================================== ---- gdb-7.8.orig/gdb/gdbserver/configure.ac 2014-07-29 19:31:01.895149320 +0200 -+++ gdb-7.8/gdb/gdbserver/configure.ac 2014-07-29 19:31:05.808154887 +0200 +--- gdb-7.8.1.orig/gdb/gdbserver/configure.ac 2014-10-30 18:33:37.273097640 +0100 ++++ gdb-7.8.1/gdb/gdbserver/configure.ac 2014-10-30 18:33:39.643092759 +0100 @@ -454,6 +454,10 @@ if $want_ipa ; then fi fi @@ -123,10 +123,10 @@ Index: gdb-7.8/gdb/gdbserver/configure.ac AC_SUBST(GDBSERVER_DEPFILES) AC_SUBST(GDBSERVER_LIBS) AC_SUBST(srv_xmlbuiltin) -Index: gdb-7.8/gdb/gdbserver/linux-low.c +Index: gdb-7.8.1/gdb/gdbserver/linux-low.c =================================================================== ---- gdb-7.8.orig/gdb/gdbserver/linux-low.c 2014-07-29 19:31:01.897149323 +0200 -+++ gdb-7.8/gdb/gdbserver/linux-low.c 2014-07-29 19:31:05.809154889 +0200 +--- gdb-7.8.1.orig/gdb/gdbserver/linux-low.c 2014-10-30 18:33:37.275097636 +0100 ++++ gdb-7.8.1/gdb/gdbserver/linux-low.c 2014-10-30 18:33:39.644092757 +0100 @@ -541,6 +541,29 @@ add_lwp (ptid_t ptid) return lwp; } @@ -166,10 +166,10 @@ Index: gdb-7.8/gdb/gdbserver/linux-low.c #ifndef __ANDROID__ /* Bionic doesn't use SIGRTMIN the way glibc does. */ signal (__SIGRTMIN + 1, SIG_DFL); -Index: gdb-7.8/gdb/inf-ptrace.c +Index: gdb-7.8.1/gdb/inf-ptrace.c =================================================================== ---- gdb-7.8.orig/gdb/inf-ptrace.c 2014-07-29 19:31:01.898149324 +0200 -+++ gdb-7.8/gdb/inf-ptrace.c 2014-07-29 19:31:05.809154889 +0200 +--- gdb-7.8.1.orig/gdb/inf-ptrace.c 2014-10-30 18:33:37.276097634 +0100 ++++ gdb-7.8.1/gdb/inf-ptrace.c 2014-10-30 18:33:39.645092755 +0100 @@ -105,7 +105,15 @@ static void inf_ptrace_me (void) { @@ -186,10 +186,10 @@ Index: gdb-7.8/gdb/inf-ptrace.c } /* Start a new inferior Unix child process. EXEC_FILE is the file to -Index: gdb-7.8/gdb/linux-nat.c +Index: gdb-7.8.1/gdb/linux-nat.c =================================================================== ---- gdb-7.8.orig/gdb/linux-nat.c 2014-07-29 19:31:01.899149326 +0200 -+++ gdb-7.8/gdb/linux-nat.c 2014-07-29 19:31:05.811154893 +0200 +--- gdb-7.8.1.orig/gdb/linux-nat.c 2014-10-30 18:33:37.277097631 +0100 ++++ gdb-7.8.1/gdb/linux-nat.c 2014-10-30 18:33:39.646092753 +0100 @@ -1291,6 +1291,7 @@ linux_nat_create_inferior (struct target #ifdef HAVE_PERSONALITY int personality_orig = 0, personality_set = 0; @@ -235,11 +235,11 @@ Index: gdb-7.8/gdb/linux-nat.c } static void -Index: gdb-7.8/gdb/config.in +Index: gdb-7.8.1/gdb/config.in =================================================================== ---- gdb-7.8.orig/gdb/config.in 2014-07-29 19:31:01.900149327 +0200 -+++ gdb-7.8/gdb/config.in 2014-07-29 19:31:44.600210090 +0200 -@@ -219,6 +219,9 @@ +--- gdb-7.8.1.orig/gdb/config.in 2014-10-30 18:33:37.278097630 +0100 ++++ gdb-7.8.1/gdb/config.in 2014-10-30 18:34:36.165976366 +0100 +@@ -216,6 +216,9 @@ /* Define if librpm library is being used. */ #undef HAVE_LIBRPM @@ -249,21 +249,21 @@ Index: gdb-7.8/gdb/config.in /* Define to 1 if you have the header file. */ #undef HAVE_LIBUNWIND_IA64_H -@@ -354,6 +357,9 @@ +@@ -351,6 +354,9 @@ /* Define to 1 if you have the `scm_new_smob' function. */ #undef HAVE_SCM_NEW_SMOB +/* Define to 1 if you have the header file. */ +#undef HAVE_SELINUX_SELINUX_H + - /* Define to 1 if you have the `setenv' function. */ - #undef HAVE_SETENV + /* Define to 1 if you have the `setlocale' function. */ + #undef HAVE_SETLOCALE -Index: gdb-7.8/gdb/configure +Index: gdb-7.8.1/gdb/configure =================================================================== ---- gdb-7.8.orig/gdb/configure 2014-07-29 19:31:01.903149331 +0200 -+++ gdb-7.8/gdb/configure 2014-07-29 19:31:05.815154898 +0200 -@@ -13392,6 +13392,64 @@ cat >>confdefs.h <<_ACEOF +--- gdb-7.8.1.orig/gdb/configure 2014-10-30 18:33:37.281097623 +0100 ++++ gdb-7.8.1/gdb/configure 2014-10-30 18:33:39.649092747 +0100 +@@ -13400,6 +13400,64 @@ cat >>confdefs.h <<_ACEOF _ACEOF @@ -328,10 +328,10 @@ Index: gdb-7.8/gdb/configure # Support for --with-sysroot is a copy of GDB_AC_WITH_DIR, # except that the argument to --with-sysroot is optional. -Index: gdb-7.8/gdb/gdbserver/config.in +Index: gdb-7.8.1/gdb/gdbserver/config.in =================================================================== ---- gdb-7.8.orig/gdb/gdbserver/config.in 2014-07-29 19:31:01.904149333 +0200 -+++ gdb-7.8/gdb/gdbserver/config.in 2014-07-29 19:31:05.815154898 +0200 +--- gdb-7.8.1.orig/gdb/gdbserver/config.in 2014-10-30 18:33:37.282097621 +0100 ++++ gdb-7.8.1/gdb/gdbserver/config.in 2014-10-30 18:33:39.649092747 +0100 @@ -81,6 +81,9 @@ /* Define to 1 if you have the `mcheck' library (-lmcheck). */ #undef HAVE_LIBMCHECK @@ -352,10 +352,10 @@ Index: gdb-7.8/gdb/gdbserver/config.in /* Define to 1 if you have the header file. */ #undef HAVE_SGTTY_H -Index: gdb-7.8/gdb/gdbserver/configure +Index: gdb-7.8.1/gdb/gdbserver/configure =================================================================== ---- gdb-7.8.orig/gdb/gdbserver/configure 2014-07-29 19:31:01.905149334 +0200 -+++ gdb-7.8/gdb/gdbserver/configure 2014-07-29 19:31:05.817154901 +0200 +--- gdb-7.8.1.orig/gdb/gdbserver/configure 2014-10-30 18:33:37.283097619 +0100 ++++ gdb-7.8.1/gdb/gdbserver/configure 2014-10-30 18:33:39.650092745 +0100 @@ -6170,6 +6170,64 @@ if $want_ipa ; then fi fi diff --git a/gdb-babeltrace-configure.patch b/gdb-babeltrace-configure.patch deleted file mode 100644 index 3ac029d..0000000 --- a/gdb-babeltrace-configure.patch +++ /dev/null @@ -1,85 +0,0 @@ -http://sourceware.org/ml/gdb-patches/2014-08/msg00045.html -Subject: [patch] Fix --with-babeltrace with gcc-4.9.1 - - ---qMm9M+Fa2AknHoGS -Content-Type: text/plain; charset=us-ascii -Content-Disposition: inline - -Hi, - -when I tried to use --with-babeltrace on Fedora Rawhide x86_64 -using gcc-4.9.1-3.fc22.x86_64 I got: - -checking for libbabeltrace... no -configure: error: babeltrace is missing or unusable -Makefile:7973: recipe for target 'configure-gdb' failed - -configure:15890: checking for libbabeltrace -configure:15918: gcc -o conftest -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -Werror -static-libstdc++ -static-libgcc -Wl,-z,relro conftest.c -lselinux -lncurses -lz -lm -ldl /usr/lib64/libbabeltrace.so /usr/lib64/libbabeltrace-ctf.so >&5 -conftest.c: In function 'main': -conftest.c:198:21: error: unused variable 'pos' [-Werror=unused-variable] - struct bt_iter_pos *pos = bt_iter_get_pos (bt_ctf_get_iter (NULL)); - ^ -cc1: all warnings being treated as errors -configure:15918: $? = 1 -configure: failed program was: - -The patch below fixes it for me. - -In configure.ac there is above this check: - # Append -Werror to CFLAGS so that configure can catch the warning - # "assignment from incompatible pointer type", which is related to - # the babeltrace change from 1.0.3 to 1.1.0. Babeltrace 1.1.0 works - # in GDB, while babeltrace 1.0.3 is broken. - # AC_LIB_HAVE_LINKFLAGS may modify CPPFLAGS in it, so it should be - # safe to save and restore CFLAGS here. - saved_CFLAGS=$CFLAGS - CFLAGS="$CFLAGS -Werror" - -Maybe it would be easier to use there: - CFLAGS="$CFLAGS -Werror -Wno-unused-variable" - -But maybe -Werror is cross-compiler compatible while -Wno-unused-variable is -not, I have no idea. - - -Jan - ---qMm9M+Fa2AknHoGS -Content-Type: text/plain; charset=us-ascii -Content-Disposition: inline; filename="gdb-babeltrace-configure.patch" - -gdb/ -2014-08-04 Jan Kratochvil - - * configure.ac (--with-babeltrace): Use 'pos'. - * configure: Regenerate. - -diff --git a/gdb/configure.ac b/gdb/configure.ac -index 70d0964..07d2f00 100644 ---- a/gdb/configure.ac -+++ b/gdb/configure.ac -@@ -2437,6 +2437,7 @@ else - struct bt_ctf_event *event = NULL; - const struct bt_definition *scope; - -+ (void) pos; /* Prevent -Werror=unused-variable. */ - scope = bt_ctf_get_top_level_scope (event, - BT_STREAM_EVENT_HEADER); - bt_ctf_get_uint64 (bt_ctf_get_field (event, scope, "id")); -diff --git a/gdb/configure b/gdb/configure -index 809326a..b983d16 100755 ---- a/gdb/configure -+++ b/gdb/configure -@@ -15344,6 +15344,7 @@ struct bt_iter_pos *pos = bt_iter_get_pos (bt_ctf_get_iter (NULL)); - struct bt_ctf_event *event = NULL; - const struct bt_definition *scope; - -+ (void) pos; /* Prevent -Werror=unused-variable. */ - scope = bt_ctf_get_top_level_scope (event, - BT_STREAM_EVENT_HEADER); - bt_ctf_get_uint64 (bt_ctf_get_field (event, scope, "id")); - ---qMm9M+Fa2AknHoGS-- - diff --git a/gdb-babeltrace-minsize.patch b/gdb-babeltrace-minsize.patch deleted file mode 100644 index d261277..0000000 --- a/gdb-babeltrace-minsize.patch +++ /dev/null @@ -1,237 +0,0 @@ -http://sourceware.org/ml/gdb-patches/2014-08/msg00376.html -Subject: Re: --with-babeltrace generates many FAILs - -On 08/19/2014 10:07 PM, Jan Kratochvil wrote: -> * '#if HAVE_LIBBABELTRACE1_1_0' could have a comment that >=1.1.1 rejects the -> faked packet (what you described in the mail but not in the patch). - -Fixed. To be precise, >= 1.1.2 rejects the faked packet, 1.1.1 -doesn't. See the table I posted. - -> * It is always better to check for feature/defect than to check for version. -> For example because various distros backport various fixes (unfortunately -> including their possible regressions/defects) and so version checks may be -> misleading then. At least in this case it seems to me as possible to check -> how libbacktrace behaves from configure; although maybe it is not easy -> enough, not sure. - -In order to check libbabeltrace's behaviour in configure, we have to write -a c program to generate CTF data and read the trace data via -babeltrace or any program (using libbabeltrace) written by ourselves. -It is not easy to do so. - -The patch is updated. OK to apply? - --- -Yao (齐尧) - -Subject: [PATCH] Check babeltrace 1.1.0 -Subject: [PATCH] Check babeltrace 1.1.0 - -When GDB uses recent version of babeltrace, such as 1.2.x, we'll see -such error emitted from babeltrace library, - - (gdb) target ctf .../gdb/testsuite/gdb.trace/actions.ctf - [error] Invalid CTF stream: content size is smaller than -packet headers. - [error] Stream index creation error. - [error] Open file stream error. - -The problem can be reproduce out of GDB too, using babeltrace, - - $ babeltrace ./fake-packet.ctf/ - [error] Invalid CTF stream: content size is smaller than packet headers. - [error] Stream index creation error. - [error] Open file stream error. - -Recent babeltrace library becomes more strict on CTF, and complains -about one "faked packet" GDB adds, when saving trace data in ctf -format from GDB. babeltrace 1.1.0 has a bug that it can't read trace -data smaller than a certain size (see https://bugs.lttng.org/issues/450). -We workaround it in GDB to append some meaningless data in a faked -packet to make sure trace file is large enough (see ctf.c:ctf_end). -The babeltrace issue was fixed in 1.1.1 release. However, babeltrace -recent release (since 1.1.2) starts to complain about such faked -packet. Here is a table shows that whether faked packet or no faked -packet is supported by various babeltrace releases, - - faked packet no faked packet -1.1.0 Yes No -1.1.1 Yes Yes -1.1.2 No Yes -1.2.0 No Yes - -We decide to include the code to workaround 1.1.0 issue only if 1.1.0 -is used. We choose pkg-config to check babeltrace's version in -configure. - -gdb: - -2014-08-20 Yao Qi - - * configure.ac: Disable babeltrace support if pkg-config is - missing. Use pkg-config to check whether libbabeltrace is - 1.1.0. - * config.in: Regenerate. - * configure: Regenerate. - * ctf.c (CTF_FILE_MIN_SIZE): Remove. - (ctf_end): Wrap the code with - #if HAVE_LIBBABELTRACE1_1_0 #endif. - [HAVE_LIBBABELTRACE1_1_0] (CTF_FILE_MIN_SIZE): New macro. ---- - gdb/config.in | 3 +++ - gdb/configure | 25 +++++++++++++++++++++++++ - gdb/configure.ac | 22 ++++++++++++++++++++++ - gdb/ctf.c | 25 ++++++++++++++++--------- - 4 files changed, 66 insertions(+), 9 deletions(-) - -diff --git a/gdb/config.in b/gdb/config.in -index b853412..54152cd 100644 ---- a/gdb/config.in -+++ b/gdb/config.in -@@ -183,6 +183,9 @@ - /* Define if you have the babeltrace library. */ - #undef HAVE_LIBBABELTRACE - -+/* Define to 1 if you have libbabeltrace 1.1.0 */ -+#undef HAVE_LIBBABELTRACE1_1_0 -+ - /* Define to 1 if you have the `dl' library (-ldl). */ - #undef HAVE_LIBDL - -diff --git a/gdb/configure b/gdb/configure -index 9253e28..d4e2c6e 100755 ---- a/gdb/configure -+++ b/gdb/configure -@@ -14817,6 +14817,11 @@ $as_echo "$with_babeltrace" >&6; } - if test "x$with_babeltrace" = "xno"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: babletrace support disabled; GDB is unable to read CTF data." >&5 - $as_echo "$as_me: WARNING: babletrace support disabled; GDB is unable to read CTF data." >&2;} -+elif test "${pkg_config_prog_path}" = "missing"; then -+ # pkg-config is used to check the version of libbabeltrace. If pkg-config -+ # is missing, we have to disable babeltrace support. -+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: pkg-config not found, babletrace support disabled" >&5 -+$as_echo "$as_me: WARNING: pkg-config not found, babletrace support disabled" >&2;} - else - # Append -Werror to CFLAGS so that configure can catch the warning - # "assignment from incompatible pointer type", which is related to -@@ -15307,6 +15312,26 @@ $as_echo "$LIBBABELTRACE" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: babeltrace is missing or unusable; GDB is unable to read CTF data." >&5 - $as_echo "$as_me: WARNING: babeltrace is missing or unusable; GDB is unable to read CTF data." >&2;} - fi -+ else -+ # Need to know whether libbabeltrace is 1.1.0. -+ pkg_config_path= -+ for x in $LTLIBBABELTRACE; do -+ case "$x" in -+ -L*) -+ dir=`echo "X$x" | sed -e 's/^X-L//'` -+ if test -d "$dir/pkgconfig"; then -+ pkg_config_path="${pkg_config_path}${pkg_config_path:+:}$dir/pkgconfig" -+ fi -+ ;; -+ esac -+ done -+ -+ `PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$pkg_config_path ${pkg_config_prog_path} babeltrace = 1.1.0` -+ if test "$?" -eq 0 ; then -+ -+$as_echo "#define HAVE_LIBBABELTRACE1_1_0 1" >>confdefs.h -+ -+ fi - fi - fi - -diff --git a/gdb/configure.ac b/gdb/configure.ac -index 61919b4..1d8d400 100644 ---- a/gdb/configure.ac -+++ b/gdb/configure.ac -@@ -2420,6 +2420,10 @@ AC_MSG_RESULT([$with_babeltrace]) - - if test "x$with_babeltrace" = "xno"; then - AC_MSG_WARN([babletrace support disabled; GDB is unable to read CTF data.]) -+elif test "${pkg_config_prog_path}" = "missing"; then -+ # pkg-config is used to check the version of libbabeltrace. If pkg-config -+ # is missing, we have to disable babeltrace support. -+ AC_MSG_WARN([pkg-config not found, babletrace support disabled]) - else - # Append -Werror to CFLAGS so that configure can catch the warning - # "assignment from incompatible pointer type", which is related to -@@ -2450,6 +2454,24 @@ else - else - AC_MSG_WARN([babeltrace is missing or unusable; GDB is unable to read CTF data.]) - fi -+ else -+ # Need to know whether libbabeltrace is 1.1.0. -+ pkg_config_path= -+ for x in $LTLIBBABELTRACE; do -+ case "$x" in -+ -L*) -+ dir=`echo "X$x" | sed -e 's/^X-L//'` -+ if test -d "$dir/pkgconfig"; then -+ pkg_config_path="${pkg_config_path}${pkg_config_path:+:}$dir/pkgconfig" -+ fi -+ ;; -+ esac -+ done -+ -+ `PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$pkg_config_path ${pkg_config_prog_path} babeltrace = 1.1.0` -+ if test "$?" -eq 0 ; then -+ AC_DEFINE([HAVE_LIBBABELTRACE1_1_0], [1], [Define to 1 if you have libbabeltrace 1.1.0]) -+ fi - fi - fi - -diff --git a/gdb/ctf.c b/gdb/ctf.c -index df645c0..684da50 100644 ---- a/gdb/ctf.c -+++ b/gdb/ctf.c -@@ -623,11 +623,6 @@ ctf_write_definition_end (struct trace_file_writer *self) - self->ops->frame_ops->end (self); - } - --/* The minimal file size of data stream. It is required by -- babeltrace. */ -- --#define CTF_FILE_MIN_SIZE 4096 -- - /* This is the implementation of trace_file_write_ops method - end. */ - -@@ -637,10 +632,21 @@ ctf_end (struct trace_file_writer *self) - struct ctf_trace_file_writer *writer = (struct ctf_trace_file_writer *) self; - - gdb_assert (writer->tcs.content_size == 0); -- /* The babeltrace requires or assumes that the size of datastream -- file is greater than 4096 bytes. If we don't generate enough -- packets and events, create a fake packet which has zero event, -- to use up the space. */ -+ -+#if HAVE_LIBBABELTRACE1_1_0 -+ /* The babeltrace-1.1.0 requires or assumes that the size of datastream -+ file is greater than 4096 bytes. This was fixed after 1.1.0 release. -+ See https://bugs.lttng.org/issues/450 -+ If we don't generate enough packets and events, create a fake packet -+ which has zero event, to use up the space. However, babeltrace -+ release (since 1.1.2) starts to complain about such faked packet, -+ we include this workaround only for babeltrace 1.1.0. */ -+ -+ /* The minimal file size of data stream. It is required by -+ babeltrace. */ -+ -+#define CTF_FILE_MIN_SIZE 4096 -+ - if (writer->tcs.packet_start < CTF_FILE_MIN_SIZE) - { - uint32_t u32; -@@ -681,6 +687,7 @@ ctf_end (struct trace_file_writer *self) - ctf_save_write (&writer->tcs, &b, 1); - } - } -+#endif /* HAVE_LIBBABELTRACE1_1_0 */ - } - - /* This is the implementation of trace_frame_write_ops method --- -1.9.3 - diff --git a/gdb-upstream.patch b/gdb-upstream.patch index 2c0cfc9..028fe7a 100644 --- a/gdb-upstream.patch +++ b/gdb-upstream.patch @@ -65,1806 +65,3 @@ index 0e0202d..d849b4c 100644 # gdbserver does not have this issue. if ![is_remote target] { setup_kfail "*-*-*" gdb/15934 -From 63fcc8bcd98a8cd9672dd8672f663662f8caa811 Mon Sep 17 00:00:00 2001 -From: Pedro Alves -Date: Wed, 1 Oct 2014 10:44:08 +0100 -Subject: [PATCH 13/37] Aarch64: Make CPSR a 32-bit register again in the - target description - -This reverts commit a4d9ba85 - 'AARCH64: Change cpsr type to be -64bit.'. - -Even though Linux's ptrace exposes CPSR as 64-bit, CPSR is really -32-bit, and basing GDB's fundamentals on a particular OS's ptrace(2) -implementation is a bad idea. - -In addition, while that commit intended to fix big endian Aarch64, it -ended up breaking floating point debugging against GDBserver, for both -big and little endian, because it changed the CPSR to be 64-bit in the -features/aarch64-core.xml file, but missed regenerating the -regformats/aarch64.dat file. If we generate it now, we see this: - - diff --git c/gdb/regformats/aarch64.dat w/gdb/regformats/aarch64.dat - index afe1028..0d32183 100644 - --- c/gdb/regformats/aarch64.dat - +++ w/gdb/regformats/aarch64.dat - @@ -35,7 +35,7 @@ expedite:x29,sp,pc - 64:x30 - 64:sp - 64:pc - -32:cpsr - +64:cpsr - 128:v0 - 128:v1 - 128:v2 - -IOW, that commit left regformats/aarch64.dat still considering CPSR as -32-bits. regformats/aarch64.dat is used by GDBserver for its internal -regcache layout, and for the g/G packet register block. See the -generated aarch64.c file in GDBserver's build dir. - -So the target description xml file that GDBserver reports to GDB is -now claiming that CPSR is 64-bit, but what GDBserver actually puts in -the g/G register packets is 32-bits. Because GDB thinks CPSR is -64-bit (because that's what the XML description says), GDB will be -reading the remaining 32-bit bits of CPSR out of v0 (the register -immediately afterwards), and then all the registers that follow CPSR -in the register packet end up wrong in GDB, because they're being read -from the wrong offsets... - -gdb/ -2014-10-01 Pedro Alves - - * features/aarch64-core.xml (cpsr): Change back to 32-bit. - * features/aarch64.c: Regenerate. ---- - gdb/ChangeLog | 5 +++++ - gdb/features/aarch64-core.xml | 2 +- - gdb/features/aarch64.c | 2 +- - 3 files changed, 7 insertions(+), 2 deletions(-) - -### a/gdb/ChangeLog -### b/gdb/ChangeLog -## -1,3 +1,8 @@ -+2014-10-01 Pedro Alves -+ -+ * features/aarch64-core.xml (cpsr): Change back to 32-bit. -+ * features/aarch64.c: Regenerate. -+ - 2014-09-11 Pedro Alves - - PR gdb/17347 ---- a/gdb/features/aarch64-core.xml -+++ b/gdb/features/aarch64-core.xml -@@ -42,5 +42,5 @@ - - - -- -+ - ---- a/gdb/features/aarch64.c -+++ b/gdb/features/aarch64.c -@@ -50,7 +50,7 @@ initialize_tdesc_aarch64 (void) - tdesc_create_reg (feature, "x30", 30, 1, NULL, 64, "int"); - tdesc_create_reg (feature, "sp", 31, 1, NULL, 64, "data_ptr"); - tdesc_create_reg (feature, "pc", 32, 1, NULL, 64, "code_ptr"); -- tdesc_create_reg (feature, "cpsr", 33, 1, NULL, 64, "int"); -+ tdesc_create_reg (feature, "cpsr", 33, 1, NULL, 32, "int"); - - feature = tdesc_create_feature (result, "org.gnu.gdb.aarch64.fpu"); - field_type = tdesc_named_type (feature, "ieee_double"); --- -1.9.3 - -From 244fe82b9c6542557a1c2d4d21af1092692d377f Mon Sep 17 00:00:00 2001 -From: Doug Evans -Date: Wed, 15 Oct 2014 13:23:23 -0700 -Subject: [PATCH 29/37] PR python/17364 - -gdb/ChangeLog: - - * python/lib/gdb/__init__.py (packages): Add "printer". - * python/lib/gdb/command/bound_registers.py: Moved to ... - * python/lib/gdb/printer/bound_registers.py: ... here. - Add printer to global set of builtin printers. Rename printer from - "bound" to "mpx_bound128". - * python/lib/gdb/printing.py (_builtin_pretty_printers): New global, - registered as global "builtin" printer. - (add_builtin_pretty_printer): New function. - * data-directory/Makefile.in (PYTHON_FILE_LIST): Update, and add - gdb/printer/__init__.py. ---- - gdb/ChangeLog | 15 +++++++++ - gdb/data-directory/Makefile.in | 5 +-- - gdb/python/lib/gdb/__init__.py | 3 +- - gdb/python/lib/gdb/command/bound_registers.py | 45 --------------------------- - gdb/python/lib/gdb/printer/__init__.py | 14 +++++++++ - gdb/python/lib/gdb/printer/bound_registers.py | 36 +++++++++++++++++++++ - gdb/python/lib/gdb/printing.py | 14 +++++++++ - 7 files changed, 84 insertions(+), 48 deletions(-) - delete mode 100644 gdb/python/lib/gdb/command/bound_registers.py - create mode 100644 gdb/python/lib/gdb/printer/__init__.py - create mode 100644 gdb/python/lib/gdb/printer/bound_registers.py - -### a/gdb/ChangeLog -### b/gdb/ChangeLog -## -1,3 +1,18 @@ -+2014-10-15 Doug Evans -+ Walfred Tedeschi -+ -+ PR python/17364 -+ * python/lib/gdb/__init__.py (packages): Add "printer". -+ * python/lib/gdb/command/bound_registers.py: Moved to ... -+ * python/lib/gdb/printer/bound_registers.py: ... here. -+ Add printer to global set of builtin printers. Rename printer from -+ "bound" to "mpx_bound128". -+ * python/lib/gdb/printing.py (_builtin_pretty_printers): New global, -+ registered as global "builtin" printer. -+ (add_builtin_pretty_printer): New function. -+ * data-directory/Makefile.in (PYTHON_FILE_LIST): Update, and add -+ gdb/printer/__init__.py. -+ - 2014-10-01 Pedro Alves - - * features/aarch64-core.xml (cpsr): Change back to 32-bit. ---- a/gdb/data-directory/Makefile.in -+++ b/gdb/data-directory/Makefile.in -@@ -64,7 +64,6 @@ PYTHON_FILE_LIST = \ - gdb/printing.py \ - gdb/prompt.py \ - gdb/xmethod.py \ -- gdb/command/bound_registers.py \ - gdb/command/__init__.py \ - gdb/command/xmethods.py \ - gdb/command/frame_filters.py \ -@@ -73,7 +72,9 @@ PYTHON_FILE_LIST = \ - gdb/command/prompt.py \ - gdb/command/explore.py \ - gdb/function/__init__.py \ -- gdb/function/strfns.py -+ gdb/function/strfns.py \ -+ gdb/printer/__init__.py \ -+ gdb/printer/bound_registers.py - - @HAVE_PYTHON_TRUE@PYTHON_FILES = $(PYTHON_FILE_LIST) - @HAVE_PYTHON_FALSE@PYTHON_FILES = ---- a/gdb/python/lib/gdb/__init__.py -+++ b/gdb/python/lib/gdb/__init__.py -@@ -81,7 +81,8 @@ PYTHONDIR = os.path.dirname(os.path.dirname(__file__)) - - packages = [ - 'function', -- 'command' -+ 'command', -+ 'printer' - ] - - # pkgutil.iter_modules is not available prior to Python 2.6. Instead, ---- a/gdb/python/lib/gdb/command/bound_registers.py -+++ /dev/null -@@ -1,45 +0,0 @@ --# Pretty-printer utilities. --# Copyright (C) 2013-2014 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 . -- --import gdb.printing -- --class BoundPrinter: -- """Adds size field to a _rawbound128 type.""" -- -- def __init__ (self, val): -- self.val = val -- -- def to_string (self): -- upper = self.val["ubound"] -- lower = self.val["lbound"] -- size = (long) ((upper) - (lower)) -- if size > -1: -- size = size + 1 -- result = '{lbound = %s, ubound = %s} : size %s' % (lower, upper, size) -- return result -- --# There are two pattern matching used: first one is related to a library --# second is related to the type. Since we are displaying a register all --# libraries are accepted. Type to be processed is the same present --# in the xml file. -- --def build_pretty_printer (): -- pp = gdb.printing.RegexpCollectionPrettyPrinter (".*") -- pp.add_printer ('bound', '^__gdb_builtin_type_bound128', BoundPrinter) -- return pp -- --gdb.printing.register_pretty_printer (gdb.current_objfile (), -- build_pretty_printer ()) ---- /dev/null -+++ b/gdb/python/lib/gdb/printer/__init__.py -@@ -0,0 +1,14 @@ -+# Copyright (C) 2014 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 . ---- /dev/null -+++ b/gdb/python/lib/gdb/printer/bound_registers.py -@@ -0,0 +1,36 @@ -+# Pretty-printers for bounds registers. -+# Copyright (C) 2013-2014 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 . -+ -+import gdb.printing -+ -+class MpxBound128Printer: -+ """Adds size field to a mpx __gdb_builtin_type_bound128 type.""" -+ -+ def __init__ (self, val): -+ self.val = val -+ -+ def to_string (self): -+ upper = self.val["ubound"] -+ lower = self.val["lbound"] -+ size = (long) ((upper) - (lower)) -+ if size > -1: -+ size = size + 1 -+ result = '{lbound = %s, ubound = %s} : size %s' % (lower, upper, size) -+ return result -+ -+gdb.printing.add_builtin_pretty_printer ('mpx_bound128', -+ '^__gdb_builtin_type_bound128', -+ MpxBound128Printer) ---- a/gdb/python/lib/gdb/printing.py -+++ b/gdb/python/lib/gdb/printing.py -@@ -263,3 +263,17 @@ class FlagEnumerationPrinter(PrettyPrinter): - return _EnumInstance(self.enumerators, val) - else: - return None -+ -+ -+# Builtin pretty-printers. -+# The set is defined as empty, and files in printing/*.py add their printers -+# to this with add_builtin_pretty_printer. -+ -+_builtin_pretty_printers = RegexpCollectionPrettyPrinter("builtin") -+ -+register_pretty_printer(None, _builtin_pretty_printers) -+ -+# Add a builtin pretty-printer. -+ -+def add_builtin_pretty_printer(name, regexp, printer): -+ _builtin_pretty_printers.add_printer(name, regexp, printer) --- -1.9.3 - -From 92e08c0d191908b7315603558226c7ca0bfa86a5 Mon Sep 17 00:00:00 2001 -From: Pedro Alves -Date: Fri, 17 Oct 2014 13:49:28 +0100 -Subject: [PATCH 32/37] Make common code handle target_terminal_* idempotency - -I found a place that should be giving back the terminal to the target, -but only if the target was already owning it. So I need to add a -getter for who owns the terminal. - -The trouble is that several places/target have their own globals to -track this state: - - - inflow.c:terminal_is_ours - - remote.c:remote_async_terminal_ours_p - - linux-nat.c:async_terminal_is_ours - - go32-nat.c:terminal_is_ours - -While one might think of adding a new target_ops method to query this, -conceptually, this state isn't really part of a particular target_ops. -Considering multi-target, the core shouldn't have to ask all targets -to know whether it's GDB that owns the terminal. There's only one GDB -(or rather, only one top level interpreter). - -So what this comment does is add a new global that is tracked by the -core instead. A subsequent pass may later remove the other globals. - -Tested on x86_64 Fedora 20, native and gdbserver. - -gdb/ -2014-10-17 Pedro Alves - - * target.c (enum terminal_state): New enum. - (terminal_state): New global. - (target_terminal_init): New function. - (target_terminal_inferior): Skip if inferior already owns the - terminal. - (target_terminal_ours, target_terminal_ours_for_output): New - functions. - * target.h (target_terminal_init): Convert to function prototype. - (target_terminal_ours_for_output): Convert to function prototype - and tweak comment. - (target_terminal_ours): Convert to function prototype and tweak - comment. - * windows-nat.c (do_initial_windows_stuff): Call - target_terminal_init instead of child_terminal_init_with_pgrp. ---- - gdb/ChangeLog | 17 +++++++++++++++++ - gdb/target.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ - gdb/target.h | 20 +++++++------------- - gdb/windows-nat.c | 2 +- - 4 files changed, 81 insertions(+), 14 deletions(-) - -### a/gdb/ChangeLog -### b/gdb/ChangeLog -## -1,3 +1,20 @@ -+2014-10-17 Pedro Alves -+ -+ * target.c (enum terminal_state): New enum. -+ (terminal_state): New global. -+ (target_terminal_init): New function. -+ (target_terminal_inferior): Skip if inferior already owns the -+ terminal. -+ (target_terminal_ours, target_terminal_ours_for_output): New -+ functions. -+ * target.h (target_terminal_init): Convert to function prototype. -+ (target_terminal_ours_for_output): Convert to function prototype -+ and tweak comment. -+ (target_terminal_ours): Convert to function prototype and tweak -+ comment. -+ * windows-nat.c (do_initial_windows_stuff): Call -+ target_terminal_init instead of child_terminal_init_with_pgrp. -+ - 2014-10-15 Doug Evans - Walfred Tedeschi - ---- a/gdb/target.c -+++ b/gdb/target.c -@@ -482,6 +482,35 @@ target_load (char *arg, int from_tty) - (*current_target.to_load) (¤t_target, arg, from_tty); - } - -+/* Possible terminal states. */ -+ -+enum terminal_state -+ { -+ /* The inferior's terminal settings are in effect. */ -+ terminal_is_inferior = 0, -+ -+ /* Some of our terminal settings are in effect, enough to get -+ proper output. */ -+ terminal_is_ours_for_output = 1, -+ -+ /* Our terminal settings are in effect, for output and input. */ -+ terminal_is_ours = 2 -+ }; -+ -+static enum terminal_state terminal_state; -+ -+/* See target.h. */ -+ -+void -+target_terminal_init (void) -+{ -+ (*current_target.to_terminal_init) (¤t_target); -+ -+ terminal_state = terminal_is_ours; -+} -+ -+/* See target.h. */ -+ - void - target_terminal_inferior (void) - { -@@ -492,9 +521,36 @@ target_terminal_inferior (void) - if (target_can_async_p () && !sync_execution) - return; - -+ if (terminal_state == terminal_is_inferior) -+ return; -+ - /* If GDB is resuming the inferior in the foreground, install - inferior's terminal modes. */ - (*current_target.to_terminal_inferior) (¤t_target); -+ terminal_state = terminal_is_inferior; -+} -+ -+/* See target.h. */ -+ -+void -+target_terminal_ours (void) -+{ -+ if (terminal_state == terminal_is_ours) -+ return; -+ -+ (*current_target.to_terminal_ours) (¤t_target); -+ terminal_state = terminal_is_ours; -+} -+ -+/* See target.h. */ -+ -+void -+target_terminal_ours_for_output (void) -+{ -+ if (terminal_state != terminal_is_inferior) -+ return; -+ (*current_target.to_terminal_ours_for_output) (¤t_target); -+ terminal_state = terminal_is_ours_for_output; - } - - static void ---- a/gdb/target.h -+++ b/gdb/target.h -@@ -1359,31 +1359,25 @@ extern int target_remove_breakpoint (struct gdbarch *gdbarch, - /* Initialize the terminal settings we record for the inferior, - before we actually run the inferior. */ - --#define target_terminal_init() \ -- (*current_target.to_terminal_init) (¤t_target) -+extern void target_terminal_init (void); - - /* Put the inferior's terminal settings into effect. - This is preparation for starting or resuming the inferior. */ - - extern void target_terminal_inferior (void); - --/* Put some of our terminal settings into effect, -- enough to get proper results from our output, -- but do not change into or out of RAW mode -- so that no input is discarded. -+/* Put some of our terminal settings into effect, enough to get proper -+ results from our output, but do not change into or out of RAW mode -+ so that no input is discarded. This is a no-op if terminal_ours -+ was most recently called. */ - -- After doing this, either terminal_ours or terminal_inferior -- should be called to get back to a normal state of affairs. */ -- --#define target_terminal_ours_for_output() \ -- (*current_target.to_terminal_ours_for_output) (¤t_target) -+extern void target_terminal_ours_for_output (void); - - /* Put our terminal settings into effect. - First record the inferior's terminal settings - so they can be restored properly later. */ - --#define target_terminal_ours() \ -- (*current_target.to_terminal_ours) (¤t_target) -+extern void target_terminal_ours (void); - - /* Save our terminal settings. - This is called from TUI after entering or leaving the curses ---- a/gdb/windows-nat.c -+++ b/gdb/windows-nat.c -@@ -1744,7 +1744,7 @@ do_initial_windows_stuff (struct target_ops *ops, DWORD pid, int attaching) - current thread until we report an event out of windows_wait. */ - inferior_ptid = pid_to_ptid (pid); - -- child_terminal_init_with_pgrp (pid); -+ target_terminal_init (); - target_terminal_inferior (); - - windows_initialization_done = 0; --- -1.9.3 - -From 04f0515702a6e5711d71203fcc0ea488161ba086 Mon Sep 17 00:00:00 2001 -From: Pedro Alves -Date: Fri, 17 Oct 2014 13:31:25 +0100 -Subject: [PATCH 33/37] PR gdb/17472: With annotations, input while executing - in the foreground crashes readline/GDB -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Jan caught an intermittent GDB crash with the annota1.exp test: - - Starting program: .../gdb/testsuite/gdb.base/annota1 ^M - [...] - FAIL: gdb.base/annota1.exp: run until main breakpoint (timeout) - [...] - readline: readline_callback_read_char() called with no handler!^M - ERROR: Process no longer exists - -All we need to is to continue the inferior in the foreground, and type -a command while the inferior is running. E.g.: - - (gdb) set annotate 2 - - ▒▒pre-prompt - (gdb) - ▒▒prompt - c - - ▒▒post-prompt - Continuing. - - ▒▒starting - - ▒▒frames-invalid - - *inferior is running now* - - p 1 - - readline: readline_callback_read_char() called with no handler! - Aborted (core dumped) - $ - - -When we run a foreground execution command we call -target_terminal_inferior to stop GDB from processing input, and to put -the inferior's terminal settings in effect. Then we tell readline to -hide the prompt with display_gdb_prompt, which clears readline's input -callback too. When the target stops, we call target_terminal_ours, -which re-installs stdin in the event loop, and then we redisplay the -prompt, reinstalling the readline callbacks. - -However, when annotations are in effect, the "frames-invalid" -annotation code calls target_terminal_ours after 'resume' had already -called target_terminal_inferior: - - (top-gdb) bt - #0 0x000000000056b82f in annotate_frames_invalid () at gdb/annotate.c:219 - #1 0x000000000072e6cc in reinit_frame_cache () at gdb/frame.c:1705 - #2 0x0000000000594bb9 in registers_changed_ptid (ptid=...) at gdb/regcache.c:612 - #3 0x000000000064cca1 in target_resume (ptid=..., step=1, signal=GDB_SIGNAL_0) at gdb/target.c:2136 - #4 0x00000000005f57af in resume (step=1, sig=GDB_SIGNAL_0) at gdb/infrun.c:2263 - #5 0x00000000005f6051 in proceed (addr=18446744073709551615, siggnal=GDB_SIGNAL_DEFAULT, step=1) at gdb/infrun.c:2613 - -And then once we hide the prompt and remove readline's input handler -callback, we're in a bad state. We end up with the target running -supposedly in the foreground, but with stdin still installed on the -event loop. Any input then calls into readline, which aborts because -no rl_linefunc callback handler is installed: - - Program received signal SIGABRT, Aborted. - 0x0000003b36a35877 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 - 56 return INLINE_SYSCALL (tgkill, 3, pid, selftid, sig); - - (top-gdb) bt - #0 0x0000003b36a35877 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 - #1 0x0000003b36a36f68 in __GI_abort () at abort.c:89 - During symbol reading, debug info gives source 9 included from file at zero line 0. - During symbol reading, debug info gives command-line macro definition with non-zero line 19: _STDC_PREDEF_H 1. - #2 0x0000000000784a25 in rl_callback_read_char () at src/readline/callback.c:116 - #3 0x0000000000619111 in rl_callback_read_char_wrapper (client_data=0x0) at src/gdb/event-top.c:167 - #4 0x00000000006194e7 in stdin_event_handler (error=0, client_data=0x0) at src/gdb/event-top.c:373 - #5 0x00000000006180da in handle_file_event (data=...) at src/gdb/event-loop.c:763 - #6 0x00000000006175c1 in process_event () at src/gdb/event-loop.c:340 - #7 0x0000000000617688 in gdb_do_one_event () at src/gdb/event-loop.c:404 - #8 0x00000000006176d8 in start_event_loop () at src/gdb/event-loop.c:429 - #9 0x0000000000619143 in cli_command_loop (data=0x0) at src/gdb/event-top.c:182 - #10 0x000000000060f4c8 in current_interp_command_loop () at src/gdb/interps.c:318 - #11 0x0000000000610691 in captured_command_loop (data=0x0) at src/gdb/main.c:323 - #12 0x000000000060c385 in catch_errors (func=0x610676 , func_args=0x0, errstring=0x900241 "", mask=RETURN_MASK_ALL) - at src/gdb/exceptions.c:237 - #13 0x0000000000611b8f in captured_main (data=0x7fffffffd7b0) at src/gdb/main.c:1151 - #14 0x000000000060c385 in catch_errors (func=0x610a8e , func_args=0x7fffffffd7b0, errstring=0x900241 "", mask=RETURN_MASK_ALL) - at src/gdb/exceptions.c:237 - #15 0x0000000000611bb8 in gdb_main (args=0x7fffffffd7b0) at src/gdb/main.c:1159 - #16 0x000000000045ef57 in main (argc=3, argv=0x7fffffffd8b8) at src/gdb/gdb.c:32 - -The fix is to make the annotation code call target_terminal_inferior -again after printing, if the inferior's settings were in effect. - -While at it, when we're doing output only, instead of -target_terminal_ours, we should call target_terminal_ours_for_output. -The latter doesn't actually remove stdin from the event loop, and also -leaves SIGINT forwarded to the target. - -New test included. - -Tested on x86_64 Fedora 20, native and gdbserver. - -gdb/ -2014-10-17 Pedro Alves - - PR gdb/17472 - * annotate.c (annotate_breakpoints_invalid): Use - target_terminal_our_for_output instead of target_terminal_ours. - Give back the terminal to the target. - (annotate_frames_invalid): Likewise. - -gdb/testsuite/ -2014-10-17 Pedro Alves - - PR gdb/17472 - * gdb.base/annota-input-while-running.c: New file. - * gdb.base/annota-input-while-running.exp: New file. ---- - gdb/ChangeLog | 8 ++ - gdb/annotate.c | 22 +++- - gdb/target.c | 8 ++ - gdb/target.h | 5 + - gdb/testsuite/ChangeLog | 6 + - .../gdb.base/annota-input-while-running.c | 25 ++++ - .../gdb.base/annota-input-while-running.exp | 130 +++++++++++++++++++++ - 7 files changed, 202 insertions(+), 2 deletions(-) - create mode 100644 gdb/testsuite/gdb.base/annota-input-while-running.c - create mode 100644 gdb/testsuite/gdb.base/annota-input-while-running.exp - -### a/gdb/ChangeLog -### b/gdb/ChangeLog -## -1,5 +1,13 @@ - 2014-10-17 Pedro Alves - -+ PR gdb/17472 -+ * annotate.c (annotate_breakpoints_invalid): Use -+ target_terminal_our_for_output instead of target_terminal_ours. -+ Give back the terminal to the target. -+ (annotate_frames_invalid): Likewise. -+ -+2014-10-17 Pedro Alves -+ - * target.c (enum terminal_state): New enum. - (terminal_state): New global. - (target_terminal_init): New function. ---- a/gdb/annotate.c -+++ b/gdb/annotate.c -@@ -72,8 +72,17 @@ annotate_breakpoints_invalid (void) - && (!breakpoints_invalid_emitted - || async_background_execution_p ())) - { -- target_terminal_ours (); -+ /* If the inferior owns the terminal (e.g., we're resuming), -+ make sure to leave with the inferior still owning it. */ -+ int was_inferior = target_terminal_is_inferior (); -+ -+ target_terminal_ours_for_output (); -+ - printf_unfiltered (("\n\032\032breakpoints-invalid\n")); -+ -+ if (was_inferior) -+ target_terminal_inferior (); -+ - breakpoints_invalid_emitted = 1; - } - } -@@ -210,8 +219,17 @@ annotate_frames_invalid (void) - && (!frames_invalid_emitted - || async_background_execution_p ())) - { -- target_terminal_ours (); -+ /* If the inferior owns the terminal (e.g., we're resuming), -+ make sure to leave with the inferior still owning it. */ -+ int was_inferior = target_terminal_is_inferior (); -+ -+ target_terminal_ours_for_output (); -+ - printf_unfiltered (("\n\032\032frames-invalid\n")); -+ -+ if (was_inferior) -+ target_terminal_inferior (); -+ - frames_invalid_emitted = 1; - } - } ---- a/gdb/target.c -+++ b/gdb/target.c -@@ -511,6 +511,14 @@ target_terminal_init (void) - - /* See target.h. */ - -+int -+target_terminal_is_inferior (void) -+{ -+ return (terminal_state == terminal_is_inferior); -+} -+ -+/* See target.h. */ -+ - void - target_terminal_inferior (void) - { ---- a/gdb/target.h -+++ b/gdb/target.h -@@ -1356,6 +1356,11 @@ extern int target_insert_breakpoint (struct gdbarch *gdbarch, - extern int target_remove_breakpoint (struct gdbarch *gdbarch, - struct bp_target_info *bp_tgt); - -+/* Returns true if the terminal settings of the inferior are in -+ effect. */ -+ -+extern int target_terminal_is_inferior (void); -+ - /* Initialize the terminal settings we record for the inferior, - before we actually run the inferior. */ - -### a/gdb/testsuite/ChangeLog -### b/gdb/testsuite/ChangeLog -## -1,3 +1,9 @@ -+2014-10-17 Pedro Alves -+ -+ PR gdb/17472 -+ * gdb.base/annota-input-while-running.c: New file. -+ * gdb.base/annota-input-while-running.exp: New file. -+ - 2014-09-11 Pedro Alves - - PR gdb/17347 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/annota-input-while-running.c -@@ -0,0 +1,25 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2014 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 -+ -+int -+main (void) -+{ -+ sleep (5); -+ return 0; /* set break here */ -+} ---- /dev/null -+++ b/gdb/testsuite/gdb.base/annota-input-while-running.exp -@@ -0,0 +1,130 @@ -+# Copyright 1999-2014 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 . -+ -+# Test that annotations support doesn't leave GDB's terminal settings -+# into effect when we run a foreground command. -+ -+if [is_remote target] then { -+ # We cannot use runto_main because of the different prompt we get -+ # when using annotation level 2. -+ return 0 -+} -+ -+standard_testfile -+ -+if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug] == -1} { -+ return -1 -+} -+ -+# Break at main -+ -+gdb_test "break main" \ -+ "Breakpoint.*at.* file .*$srcfile.*\\." \ -+ "breakpoint main" -+ -+# NOTE: this prompt is OK only when the annotation level is > 1 -+# NOTE: When this prompt is in use the gdb_test procedure cannot be -+# used because it assumes that the last char after the gdb_prompt is a -+# white space. This is not true with this annotated prompt. So we -+# must use the gdb_annota_test replacement below, or -+# gdb_test_multiple. -+ -+set old_gdb_prompt $gdb_prompt -+set gdb_prompt "\r\n\032\032pre-prompt\r\n$gdb_prompt \r\n\032\032prompt\r\n" -+ -+# Like gdb_test, but cope with the annotation prompt. -+proc gdb_annota_test {command pattern message} { -+ global gdb_prompt -+ -+ gdb_test_multiple $command $message { -+ -re "$pattern$gdb_prompt$" { -+ pass "$message" -+ } -+ -re "$gdb_prompt$" { -+ fail "$message" -+ } -+ } -+} -+ -+# Set the annotation level to 2. -+ -+set test "annotation set at level 2" -+gdb_annota_test "set annotate 2" ".*" "annotation set at level 2" -+ -+# Run to main. -+ -+gdb_annota_test "run" \ -+ "\r\n\032\032post-prompt.*\r\n\r\n\032\032stopped.*" \ -+ "run until main breakpoint" -+ -+set test "delete breakpoints" -+gdb_test_multiple "delete" $test { -+ -re "Delete all breakpoints. .y or n." { -+ send_gdb "y\n" -+ exp_continue -+ } -+ -re "$gdb_prompt$" { -+ pass $test -+ } -+} -+ -+# Set the target running, and then type something. GDB used to have a -+# bug where it'd be accepting input even though the target was -+# supposedly resumed in the foreground. This ultimately resulted in -+# readline aborting. -+ -+set linenum [gdb_get_line_number "set break here"] -+ -+gdb_annota_test "break $linenum" \ -+ "Breakpoint .*$srcfile, line .*" \ -+ "break after sleep" -+ -+# Continue, and wait a bit to make sure the inferior really starts -+# running. Wait less than much the program sleeps, which is 5 -+# seconds, though. -+set saw_continuing 0 -+set test "continue" -+gdb_test_multiple $test $test { -+ -timeout 2 -+ -re "Continuing\\." { -+ set saw_continuing 1 -+ exp_continue -+ } -+ timeout { -+ gdb_assert $saw_continuing $test -+ } -+} -+ -+# Type something. -+send_gdb "print 1\n" -+ -+# Poor buggy GDB would crash before the breakpoint was hit. -+set test "breakpoint hit" -+gdb_test_multiple "" $test { -+ -re "stopped\r\n$gdb_prompt" { -+ pass $test -+ } -+} -+ -+set test "print command result" -+gdb_test_multiple "" $test { -+ -re "\r\n1\r\n\r\n\032\032value-history-end\r\n$gdb_prompt" { -+ pass $test -+ } -+} -+ -+# Restore the original prompt for the rest of the testsuite. -+ -+set gdb_prompt $old_gdb_prompt --- -1.9.3 - -From e37951dc10da6940ef354f062fc43ee03687c571 Mon Sep 17 00:00:00 2001 -From: Pedro Alves -Date: Fri, 17 Oct 2014 13:31:25 +0100 -Subject: [PATCH 34/37] PR gdb/17300: Input after "c -a" crashes readline/GDB - -If all threads in the target were already running when the user does -"c -a", nothing puts the inferior's terminal settings in effect and -removes stdin from the event loop, which we must when running a -foreground command. The result is that user input afterwards crashes -readline/gdb: - - (gdb) start - Temporary breakpoint 1 at 0x4005d4: file continue-all-already-running.c, line 23. - Starting program: continue-all-already-running - - Temporary breakpoint 1, main () at continue-all-already-running.c:23 - 23 sleep (10); - (gdb) c -a& - Continuing. - (gdb) c -a - Continuing. - p 1 - readline: readline_callback_read_char() called with no handler! - Aborted (core dumped) - $ - -Backtrace: - - Program received signal SIGABRT, Aborted. - 0x0000003b36a35877 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 - 56 return INLINE_SYSCALL (tgkill, 3, pid, selftid, sig); - (top-gdb) p 1 - $1 = 1 - (top-gdb) bt - #0 0x0000003b36a35877 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 - #1 0x0000003b36a36f68 in __GI_abort () at abort.c:89 - #2 0x0000000000784aa9 in rl_callback_read_char () at readline/callback.c:116 - #3 0x0000000000619181 in rl_callback_read_char_wrapper (client_data=0x0) at gdb/event-top.c:167 - #4 0x0000000000619557 in stdin_event_handler (error=0, client_data=0x0) at gdb/event-top.c:373 - #5 0x000000000061814a in handle_file_event (data=...) at gdb/event-loop.c:763 - #6 0x0000000000617631 in process_event () at gdb/event-loop.c:340 - #7 0x00000000006176f8 in gdb_do_one_event () at gdb/event-loop.c:404 - #8 0x0000000000617748 in start_event_loop () at gdb/event-loop.c:429 - #9 0x00000000006191b3 in cli_command_loop (data=0x0) at gdb/event-top.c:182 - #10 0x000000000060f538 in current_interp_command_loop () at gdb/interps.c:318 - #11 0x0000000000610701 in captured_command_loop (data=0x0) at gdb/main.c:323 - #12 0x000000000060c3f5 in catch_errors (func=0x6106e6 , func_args=0x0, errstring=0x9002c1 "", mask=RETURN_MASK_ALL) - at gdb/exceptions.c:237 - #13 0x0000000000611bff in captured_main (data=0x7fffffffd780) at gdb/main.c:1151 - #14 0x000000000060c3f5 in catch_errors (func=0x610afe , func_args=0x7fffffffd780, errstring=0x9002c1 "", mask=RETURN_MASK_ALL) - at gdb/exceptions.c:237 - #15 0x0000000000611c28 in gdb_main (args=0x7fffffffd780) at gdb/main.c:1159 - #16 0x000000000045ef97 in main (argc=5, argv=0x7fffffffd888) at gdb/gdb.c:32 - (top-gdb) - -Tested on x86_64 Fedora 20, native and gdbserver. - -gdb/ -2014-10-17 Pedro Alves - - PR gdb/17300 - * infcmd.c (continue_1): If continuing all threads in the - foreground, make sure the inferior's terminal settings are put in - effect. - -gdb/testsuite/ -2014-10-17 Pedro Alves - - PR gdb/17300 - * gdb.base/continue-all-already-running.c: New file. - * gdb.base/continue-all-already-running.exp: New file. ---- - gdb/ChangeLog | 7 ++ - gdb/infcmd.c | 18 +++++ - gdb/testsuite/ChangeLog | 6 ++ - .../gdb.base/continue-all-already-running.c | 25 +++++++ - .../gdb.base/continue-all-already-running.exp | 79 ++++++++++++++++++++++ - 5 files changed, 135 insertions(+) - create mode 100644 gdb/testsuite/gdb.base/continue-all-already-running.c - create mode 100644 gdb/testsuite/gdb.base/continue-all-already-running.exp - -### a/gdb/ChangeLog -### b/gdb/ChangeLog -## -1,5 +1,12 @@ - 2014-10-17 Pedro Alves - -+ PR gdb/17300 -+ * infcmd.c (continue_1): If continuing all threads in the -+ foreground, make sure the inferior's terminal settings are put in -+ effect. -+ -+2014-10-17 Pedro Alves -+ - PR gdb/17472 - * annotate.c (annotate_breakpoints_invalid): Use - target_terminal_our_for_output instead of target_terminal_ours. ---- a/gdb/infcmd.c -+++ b/gdb/infcmd.c -@@ -738,6 +738,24 @@ continue_1 (int all_threads) - - iterate_over_threads (proceed_thread_callback, NULL); - -+ if (sync_execution) -+ { -+ /* If all threads in the target were already running, -+ proceed_thread_callback ends up never calling proceed, -+ and so nothing calls this to put the inferior's terminal -+ settings in effect and remove stdin from the event loop, -+ which we must when running a foreground command. E.g.: -+ -+ (gdb) c -a& -+ Continuing. -+ -+ (gdb) c -a -+ Continuing. -+ -+ */ -+ target_terminal_inferior (); -+ } -+ - /* Restore selected ptid. */ - do_cleanups (old_chain); - } -### a/gdb/testsuite/ChangeLog -### b/gdb/testsuite/ChangeLog -## -1,5 +1,11 @@ - 2014-10-17 Pedro Alves - -+ PR gdb/17300 -+ * gdb.base/continue-all-already-running.c: New file. -+ * gdb.base/continue-all-already-running.exp: New file. -+ -+2014-10-17 Pedro Alves -+ - PR gdb/17472 - * gdb.base/annota-input-while-running.c: New file. - * gdb.base/annota-input-while-running.exp: New file. ---- /dev/null -+++ b/gdb/testsuite/gdb.base/continue-all-already-running.c -@@ -0,0 +1,25 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2014 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 -+ -+int -+main (void) -+{ -+ sleep (10); -+ return 0; /* set break here */ -+} ---- /dev/null -+++ b/gdb/testsuite/gdb.base/continue-all-already-running.exp -@@ -0,0 +1,79 @@ -+# Copyright (C) 2014 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 . -+ -+# Test that "c -a" doesn't leave GDB processing input, even if all -+# threads were already running. PR gdb/17300. -+ -+standard_testfile -+ -+if { [prepare_for_testing ${testfile}.exp ${testfile} $srcfile] } { -+ return -1 -+} -+ -+gdb_test_no_output "set non-stop on" -+ -+if ![runto_main] { -+ return -+} -+ -+set linenum [gdb_get_line_number "set break here"] -+gdb_breakpoint "$linenum" -+ -+gdb_test "c -a&" "Continuing\\." -+ -+set test "no stop" -+gdb_test_multiple "" $test { -+ -timeout 1 -+ timeout { -+ pass $test -+ } -+} -+ -+# Paranoia. Check that input works after bg command. -+gdb_test "print 1" " = 1" -+ -+# Continue in the foreground, and wait one second to make sure the -+# inferior really starts running. If we get a prompt to soon (e.g., -+# the program stops), this issues a fail. -+set saw_continuing 0 -+set test "c -a" -+gdb_test_multiple "c -a" $test { -+ -timeout 1 -+ -re "Continuing\\." { -+ set saw_continuing 1 -+ exp_continue -+ } -+ timeout { -+ gdb_assert $saw_continuing $test -+ } -+} -+ -+# Type something while the inferior is running in the foreground. -+send_gdb "print 2\n" -+ -+# Poor buggy GDB would crash before the breakpoint was hit. -+set test "breakpoint hit" -+gdb_test_multiple "" $test { -+ -re "set break here ..\r\n$gdb_prompt " { -+ pass $test -+ } -+} -+ -+set test "print command result" -+gdb_test_multiple "" $test { -+ -re " = 2\r\n$gdb_prompt $" { -+ pass $test -+ } -+} --- -1.9.3 - -From 36c57a3ceeb2260913f7d2d349e994dd844cbcae Mon Sep 17 00:00:00 2001 -From: Pedro Alves -Date: Fri, 17 Oct 2014 13:31:26 +0100 -Subject: [PATCH 35/37] PR gdb/17471: Repeating a background command makes it - foreground - -When we repeat a command, by just pressing , the input from the -previous command is reused for the new command invocation. - -When an execution command strips the "&" out of its incoming argument -string, to detect background execution, we poke a '\0' directly to the -incoming argument string. - -Combine both, and a repeat of a background command loses the "&". - -This is actually only visible if args other than "&" are specified -(e.g., "c 1&" or "next 2&" or "c -a&"), as in the special case of "&" -alone (e.g. "c&") doesn't actually clobber the incoming string. - -Fix this by making strip_bg_char return a new string instead of poking -a hole in the input string. - -New test included. - -Tested on x86_64 Fedora 20, native and gdbserver. - -gdb/ -2014-10-17 Pedro Alves - - PR gdb/17471 - * infcmd.c (strip_bg_char): Change prototype and rewrite. Now - returns a copy of the input. - (run_command_1, continue_command, step_1, jump_command) - (signal_command, until_command, advance_command, finish_command) - (attach_command): Adjust and install a cleanup to free the - stripped args. - -gdb/testsuite/ -2014-10-17 Pedro Alves - - PR gdb/17471 - * gdb.base/bg-execution-repeat.c: New file. - * gdb.base/bg-execution-repeat.exp: New file. ---- - gdb/ChangeLog | 10 ++ - gdb/infcmd.c | 142 ++++++++++++++++--------- - gdb/testsuite/ChangeLog | 6 ++ - gdb/testsuite/gdb.base/bg-execution-repeat.c | 33 ++++++ - gdb/testsuite/gdb.base/bg-execution-repeat.exp | 86 +++++++++++++++ - 5 files changed, 224 insertions(+), 53 deletions(-) - create mode 100644 gdb/testsuite/gdb.base/bg-execution-repeat.c - create mode 100644 gdb/testsuite/gdb.base/bg-execution-repeat.exp - -### a/gdb/ChangeLog -### b/gdb/ChangeLog -## -1,5 +1,15 @@ - 2014-10-17 Pedro Alves - -+ PR gdb/17471 -+ * infcmd.c (strip_bg_char): Change prototype and rewrite. Now -+ returns a copy of the input. -+ (run_command_1, continue_command, step_1, jump_command) -+ (signal_command, until_command, advance_command, finish_command) -+ (attach_command): Adjust and install a cleanup to free the -+ stripped args. -+ -+2014-10-17 Pedro Alves -+ - PR gdb/17300 - * infcmd.c (continue_1): If continuing all threads in the - foreground, make sure the inferior's terminal settings are put in ---- a/gdb/infcmd.c -+++ b/gdb/infcmd.c -@@ -107,8 +107,6 @@ static void run_no_args_command (char *args, int from_tty); - - static void go_command (char *line_no, int from_tty); - --static int strip_bg_char (char **); -- - void _initialize_infcmd (void); - - #define ERROR_NO_INFERIOR \ -@@ -373,35 +371,40 @@ construct_inferior_arguments (int argc, char **argv) - } - - --/* This function detects whether or not a '&' character (indicating -- background execution) has been added as *the last* of the arguments ARGS -- of a command. If it has, it removes it and returns 1. Otherwise it -- does nothing and returns 0. */ -+/* This function strips the '&' character (indicating background -+ execution) that is added as *the last* of the arguments ARGS of a -+ command. A copy of the incoming ARGS without the '&' is returned, -+ unless the resulting string after stripping is empty, in which case -+ NULL is returned. *BG_CHAR_P is an output boolean that indicates -+ whether the '&' character was found. */ - --static int --strip_bg_char (char **args) -+static char * -+strip_bg_char (const char *args, int *bg_char_p) - { -- char *p = NULL; -+ const char *p; - -- p = strchr (*args, '&'); -+ if (args == NULL || *args == '\0') -+ { -+ *bg_char_p = 0; -+ return NULL; -+ } - -- if (p) -+ p = args + strlen (args); -+ if (p[-1] == '&') - { -- if (p == (*args + strlen (*args) - 1)) -- { -- if (strlen (*args) > 1) -- { -- do -- p--; -- while (*p == ' ' || *p == '\t'); -- *(p + 1) = '\0'; -- } -- else -- *args = 0; -- return 1; -- } -+ p--; -+ while (p > args && isspace (p[-1])) -+ p--; -+ -+ *bg_char_p = 1; -+ if (p != args) -+ return savestring (args, p - args); -+ else -+ return NULL; - } -- return 0; -+ -+ *bg_char_p = 0; -+ return xstrdup (args); - } - - /* Common actions to take after creating any sort of inferior, by any -@@ -530,7 +533,8 @@ run_command_1 (char *args, int from_tty, int tbreak_at_main) - ptid_t ptid; - struct ui_out *uiout = current_uiout; - struct target_ops *run_target; -- int async_exec = 0; -+ int async_exec; -+ struct cleanup *args_chain; - - dont_repeat (); - -@@ -553,8 +557,8 @@ run_command_1 (char *args, int from_tty, int tbreak_at_main) - reopen_exec_file (); - reread_symbols (); - -- if (args != NULL) -- async_exec = strip_bg_char (&args); -+ args = strip_bg_char (args, &async_exec); -+ args_chain = make_cleanup (xfree, args); - - /* Do validation and preparation before possibly changing anything - in the inferior. */ -@@ -600,6 +604,9 @@ run_command_1 (char *args, int from_tty, int tbreak_at_main) - ui_out_flush (uiout); - } - -+ /* Done with ARGS. */ -+ do_cleanups (args_chain); -+ - /* We call get_inferior_args() because we might need to compute - the value now. */ - run_target->to_create_inferior (run_target, exec_file, get_inferior_args (), -@@ -773,13 +780,15 @@ continue_1 (int all_threads) - static void - continue_command (char *args, int from_tty) - { -- int async_exec = 0; -+ int async_exec; - int all_threads = 0; -+ struct cleanup *args_chain; -+ - ERROR_NO_INFERIOR; - - /* Find out whether we must run in the background. */ -- if (args != NULL) -- async_exec = strip_bg_char (&args); -+ args = strip_bg_char (args, &async_exec); -+ args_chain = make_cleanup (xfree, args); - - prepare_execution_command (¤t_target, async_exec); - -@@ -843,6 +852,9 @@ continue_command (char *args, int from_tty) - } - } - -+ /* Done with ARGS. */ -+ do_cleanups (args_chain); -+ - if (from_tty) - printf_filtered (_("Continuing.\n")); - -@@ -902,21 +914,25 @@ step_1 (int skip_subroutines, int single_inst, char *count_string) - { - int count = 1; - struct cleanup *cleanups = make_cleanup (null_cleanup, NULL); -- int async_exec = 0; -+ int async_exec; - int thread = -1; -+ struct cleanup *args_chain; - - ERROR_NO_INFERIOR; - ensure_not_tfind_mode (); - ensure_valid_thread (); - ensure_not_running (); - -- if (count_string) -- async_exec = strip_bg_char (&count_string); -+ count_string = strip_bg_char (count_string, &async_exec); -+ args_chain = make_cleanup (xfree, count_string); - - prepare_execution_command (¤t_target, async_exec); - - count = count_string ? parse_and_eval_long (count_string) : 1; - -+ /* Done with ARGS. */ -+ do_cleanups (args_chain); -+ - if (!single_inst || skip_subroutines) /* Leave si command alone. */ - { - struct thread_info *tp = inferior_thread (); -@@ -1137,7 +1153,8 @@ jump_command (char *arg, int from_tty) - struct symtab_and_line sal; - struct symbol *fn; - struct symbol *sfn; -- int async_exec = 0; -+ int async_exec; -+ struct cleanup *args_chain; - - ERROR_NO_INFERIOR; - ensure_not_tfind_mode (); -@@ -1145,8 +1162,8 @@ jump_command (char *arg, int from_tty) - ensure_not_running (); - - /* Find out whether we must run in the background. */ -- if (arg != NULL) -- async_exec = strip_bg_char (&arg); -+ arg = strip_bg_char (arg, &async_exec); -+ args_chain = make_cleanup (xfree, arg); - - prepare_execution_command (¤t_target, async_exec); - -@@ -1162,6 +1179,9 @@ jump_command (char *arg, int from_tty) - sal = sals.sals[0]; - xfree (sals.sals); - -+ /* Done with ARGS. */ -+ do_cleanups (args_chain); -+ - if (sal.symtab == 0 && sal.pc == 0) - error (_("No source file has been specified.")); - -@@ -1230,7 +1250,8 @@ static void - signal_command (char *signum_exp, int from_tty) - { - enum gdb_signal oursig; -- int async_exec = 0; -+ int async_exec; -+ struct cleanup *args_chain; - - dont_repeat (); /* Too dangerous. */ - ERROR_NO_INFERIOR; -@@ -1239,8 +1260,8 @@ signal_command (char *signum_exp, int from_tty) - ensure_not_running (); - - /* Find out whether we must run in the background. */ -- if (signum_exp != NULL) -- async_exec = strip_bg_char (&signum_exp); -+ signum_exp = strip_bg_char (signum_exp, &async_exec); -+ args_chain = make_cleanup (xfree, signum_exp); - - prepare_execution_command (¤t_target, async_exec); - -@@ -1372,7 +1393,8 @@ until_next_command (int from_tty) - static void - until_command (char *arg, int from_tty) - { -- int async_exec = 0; -+ int async_exec; -+ struct cleanup *args_chain; - - ERROR_NO_INFERIOR; - ensure_not_tfind_mode (); -@@ -1380,8 +1402,8 @@ until_command (char *arg, int from_tty) - ensure_not_running (); - - /* Find out whether we must run in the background. */ -- if (arg != NULL) -- async_exec = strip_bg_char (&arg); -+ arg = strip_bg_char (arg, &async_exec); -+ args_chain = make_cleanup (xfree, arg); - - prepare_execution_command (¤t_target, async_exec); - -@@ -1389,12 +1411,16 @@ until_command (char *arg, int from_tty) - until_break_command (arg, from_tty, 0); - else - until_next_command (from_tty); -+ -+ /* Done with ARGS. */ -+ do_cleanups (args_chain); - } - - static void - advance_command (char *arg, int from_tty) - { -- int async_exec = 0; -+ int async_exec; -+ struct cleanup *args_chain; - - ERROR_NO_INFERIOR; - ensure_not_tfind_mode (); -@@ -1405,12 +1431,15 @@ advance_command (char *arg, int from_tty) - error_no_arg (_("a location")); - - /* Find out whether we must run in the background. */ -- if (arg != NULL) -- async_exec = strip_bg_char (&arg); -+ arg = strip_bg_char (arg, &async_exec); -+ args_chain = make_cleanup (xfree, arg); - - prepare_execution_command (¤t_target, async_exec); - - until_break_command (arg, from_tty, 1); -+ -+ /* Done with ARGS. */ -+ do_cleanups (args_chain); - } - - /* Return the value of the result of a function at the end of a 'finish' -@@ -1686,8 +1715,8 @@ finish_command (char *arg, int from_tty) - { - struct frame_info *frame; - struct symbol *function; -- -- int async_exec = 0; -+ int async_exec; -+ struct cleanup *args_chain; - - ERROR_NO_INFERIOR; - ensure_not_tfind_mode (); -@@ -1695,14 +1724,17 @@ finish_command (char *arg, int from_tty) - ensure_not_running (); - - /* Find out whether we must run in the background. */ -- if (arg != NULL) -- async_exec = strip_bg_char (&arg); -+ arg = strip_bg_char (arg, &async_exec); -+ args_chain = make_cleanup (xfree, arg); - - prepare_execution_command (¤t_target, async_exec); - - if (arg) - error (_("The \"finish\" command does not take any arguments.")); - -+ /* Done with ARGS. */ -+ do_cleanups (args_chain); -+ - frame = get_prev_frame (get_selected_frame (_("No selected frame."))); - if (frame == 0) - error (_("\"finish\" not meaningful in the outermost frame.")); -@@ -2476,7 +2508,8 @@ attach_command_continuation_free_args (void *args) - void - attach_command (char *args, int from_tty) - { -- int async_exec = 0; -+ int async_exec; -+ struct cleanup *args_chain; - struct target_ops *attach_target; - - dont_repeat (); /* Not for the faint of heart */ -@@ -2497,8 +2530,8 @@ attach_command (char *args, int from_tty) - this function should probably be moved into target_pre_inferior. */ - target_pre_inferior (from_tty); - -- if (args != NULL) -- async_exec = strip_bg_char (&args); -+ args = strip_bg_char (args, &async_exec); -+ args_chain = make_cleanup (xfree, args); - - attach_target = find_attach_target (); - -@@ -2512,6 +2545,9 @@ attach_command (char *args, int from_tty) - shouldn't refer to attach_target again. */ - attach_target = NULL; - -+ /* Done with ARGS. */ -+ do_cleanups (args_chain); -+ - /* Set up the "saved terminal modes" of the inferior - based on what modes we are starting it with. */ - target_terminal_init (); -### a/gdb/testsuite/ChangeLog -### b/gdb/testsuite/ChangeLog -## -1,5 +1,11 @@ - 2014-10-17 Pedro Alves - -+ PR gdb/17471 -+ * gdb.base/bg-execution-repeat.c: New file. -+ * gdb.base/bg-execution-repeat.exp: New file. -+ -+2014-10-17 Pedro Alves -+ - PR gdb/17300 - * gdb.base/continue-all-already-running.c: New file. - * gdb.base/continue-all-already-running.exp: New file. ---- /dev/null -+++ b/gdb/testsuite/gdb.base/bg-execution-repeat.c -@@ -0,0 +1,33 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2014 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 -+ -+int -+foo (void) -+{ -+ return 0; /* set break here */ -+} -+ -+int -+main (void) -+{ -+ foo (); -+ sleep (5); -+ foo (); -+ return 0; -+} ---- /dev/null -+++ b/gdb/testsuite/gdb.base/bg-execution-repeat.exp -@@ -0,0 +1,86 @@ -+# Copyright (C) 2014 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 . -+ -+# Test that repeating a background command doesn't lose the "&" in the -+# repeat, turning a background command into a foreground command. See -+# PR gdb/17471. -+ -+standard_testfile -+ -+if { [build_executable "failed to prepare" ${testfile} $srcfile] } { -+ return -1 -+} -+ -+set linenum [gdb_get_line_number "set break here"] -+ -+# Run the test proper. CONTINUE_CMD is the background continue -+# command to issue. -+ -+proc test {continue_cmd} { -+ global gdb_prompt -+ global binfile -+ global linenum -+ -+ clean_restart $binfile -+ -+ if ![runto_main] { -+ return -+ } -+ -+ gdb_breakpoint "$linenum" -+ -+ set test $continue_cmd -+ gdb_test_multiple $test $test { -+ -re "Continuing\\.\r\n$gdb_prompt " { -+ # Note no end anchor. If the breakpoint triggers soon enough -+ # enough we see further output after the prompt. -+ pass $test -+ } -+ } -+ -+ # Wait for the stop. Don't expect a prompt, as we had resumed the -+ # inferior in the background. -+ set test "breakpoint hit 1" -+ gdb_test_multiple "" $test { -+ -re "set break here" { -+ pass $test -+ } -+ } -+ -+ # Trigger a repeat. Buggy GDB used to lose the "&", making this a -+ # foreground command... -+ send_gdb "\n" -+ gdb_test "" "Continuing\\." "repeat bg command" -+ -+ # ... and thus further input wouldn't be processed until the target -+ # stopped. -+ gdb_test "print 1" " = 1" "input still accepted" -+ -+ # Make sure we see a stop after the print, and not before. Don't -+ # expect a prompt, as we had resumed the inferior in the background. -+ set test "breakpoint hit 2" -+ gdb_test_multiple "" $test { -+ -re "set break here ..\r\n" { -+ pass $test -+ } -+ } -+} -+ -+# Test with and without extra arguments. -+foreach cmd {"c&" "c 1&"} { -+ with_test_prefix $cmd { -+ test $cmd -+ } -+} --- -1.9.3 - - - -commit 54fbc750b54271efb75ae11ce49f14c4234a9476 -Author: Jan Kratochvil -Date: Thu Sep 18 08:21:40 2014 +0200 - - Fix regression for Linux vDSO in GDB (PR gdb/17407). - - since - 5979d6b69b20a8355ea94b75fad97415fce4788c - https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=5979d6b69b20a8355ea94b75fad97415fce4788c - vdso handling - https://sourceware.org/ml/binutils/2014-03/msg00082.html - https://sourceware.org/ml/binutils/2014-04/msg00003.html - Message-ID: - I get on - kernel-3.16.2-200.fc20.x86_64 - https://koji.fedoraproject.org/koji/buildinfo?buildID=575860 - attaching its vdso.bin.gz - GDB (FSF HEAD 5e43d46791c4c66fd83947a12d4f716b561a9103) regression: - reproducer: - ./gdb -ex start ./gdb - actual result / FAIL: - Got object file from memory but can't read symbols: File truncated. - expected result / PASS: - - or / PASS: - warning: Could not load shared library symbols for linux-vdso.so.1. - Do you need "set solib-search-path" or "set sysroot"? - - That "warning: Could not load shared library..." is mostly harmless (it is - a bug in GDB), in the FAIL case it is not printed just because - bfd_check_format() fails there. - - It seems logical to me this way when the 'size' parameter has been already - added. - Alan Modra: - I was wrongly thinking that the section headers were - always last when I wrote that code. (They are now! If you relink - that vdso with current binutils master you won't hit this problem, but - that of course doesn't help existing kernels.) - - I do not see a regression for add-symbol-file-from-memory for libncurses.so.5 - from the original thread above. - - Start of section headers: 1080 (bytes into file) - Size of section headers: 64 (bytes) - Number of section headers: 13 - Section header string table index: 8 - Section Headers: - [Nr] Name Type Address Off Size ES Flg Lk Inf Al - [ 8] .fake_shstrtab STRTAB 0000000000000780 000780 000076 00 A 0 0 32 - Program Headers: - Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align - LOAD 0x000000 0x0000000000000000 0x0000000000000000 0x0012fe 0x0012fe R E 0x1000 - - size == 0x2000 - shdr_end == 0x778 == 1080 + 13 * 64 - high_offset == 0x12fe - - else if (size >= shdr_end) - - high_offset = shdr_end; - + high_offset = size; - - But then 0x778 < 0x780 for "Section header string table index" so whole - bfd_check_format() fails because section headers were not cleared here: - /* If the segments visible in memory didn't include the section headers, - then clear them from the file header. */ - if (high_offset < shdr_end) - - bfd/ChangeLog - 2014-09-18 Jan Kratochvil - - PR gdb/17407 - * elfcode.h (bfd_from_remote_memory): Use SIZE for HIGH_OFFSET. - -### a/bfd/ChangeLog -### b/bfd/ChangeLog -## -1,3 +1,8 @@ -+2014-09-18 Jan Kratochvil -+ -+ PR gdb/17407 -+ * elfcode.h (bfd_from_remote_memory): Use SIZE for HIGH_OFFSET. -+ - 2014-07-16 H.J. Lu - - * elf32-i386.c (elf_i386_plt_sym_val): Match PLT entry only for ---- a/bfd/elfcode.h -+++ b/bfd/elfcode.h -@@ -1749,7 +1749,7 @@ NAME(_bfd_elf,bfd_from_remote_memory) - headers. */ - } - else if (size >= shdr_end) -- high_offset = shdr_end; -+ high_offset = size; - else - { - bfd_vma page_size = get_elf_backend_data (templ)->minpagesize; diff --git a/gdb.spec b/gdb.spec index 691bbef..3fb14c4 100644 --- a/gdb.spec +++ b/gdb.spec @@ -22,17 +22,17 @@ Name: %{?scl_prefix}gdb # See timestamp of source gnulib installed into gdb/gnulib/ . %global snapgnulib 20121213 %global tarname gdb-%{version} -Version: 7.8 +Version: 7.8.1 # 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: 29%{?dist} +Release: 30%{?dist} License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and BSD and Public Domain and GFDL Group: Development/Debuggers # Do not provide URL for snapshots as the file lasts there only for 2 days. -# ftp://sourceware.org/pub/gdb/releases/gdb-%{version}.tar.gz -Source: %{tarname}.tar.gz +# ftp://sourceware.org/pub/gdb/releases/gdb-%{version}.tar.xz +Source: ftp://sourceware.org/pub/gdb/releases/%{tarname}.tar.xz Buildroot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) URL: http://gnu.org/software/gdb/ @@ -524,20 +524,10 @@ Patch921: gdb-python-completer-2of2.patch # Display Fortran strings in backtraces. Patch925: gdb-fortran-frame-string.patch -# Fix -Werror=unused-variable error configuring babeltrace. -# Fix babeltrace errors (Yao Qi). -Patch926: gdb-babeltrace-configure.patch -Patch928: gdb-babeltrace-minsize.patch - # Fix Python GIL with gdb.execute("continue") (Phil Muldoon, BZ 1116957). Patch927: gdb-python-gil.patch -# Fix crash on Python frame filters with unreadable arg (BZ 1126177). -Patch929: python-framefilter-invalidarg.patch - # Fix GDB SIGTT* Stopped when using the PID argument (BZ 1136704, Pedro Alves). -Patch930: gdb-async-stopped-on-pid-arg-1of2.patch -Patch931: gdb-async-stopped-on-pid-arg-2of2.patch Patch970: gdb-async-stopped-on-pid-arg-testsuite.patch # Fix "save breakpoints" for signal catchpoints and disabled breakpoints @@ -833,12 +823,7 @@ find -name "*.info*"|xargs rm -f %patch920 -p1 %patch921 -p1 %patch925 -p1 -%patch926 -p1 -%patch928 -p1 %patch927 -p1 -%patch929 -p1 -%patch930 -p1 -%patch931 -p1 %patch970 -p1 %patch971 -p1 %patch973 -p1 @@ -1343,6 +1328,9 @@ then fi %changelog +* Thu Oct 30 2014 Jan Kratochvil - 7.8.1-30.fc21 +- Rebase to FSF GDB 7.8.1. + * Mon Oct 27 2014 Jan Kratochvil - 7.8-29.fc21 - Backport vDSO regression. - Revert the makeinfo workaround from 7.8-27.fc21. diff --git a/python-framefilter-invalidarg.patch b/python-framefilter-invalidarg.patch deleted file mode 100644 index 4c1f16b..0000000 --- a/python-framefilter-invalidarg.patch +++ /dev/null @@ -1,596 +0,0 @@ -http://sourceware.org/ml/gdb-patches/2014-08/msg00364.html -Subject: [patch+7.8?] Fix crash on Python frame filters with unreadable arg - - ---d6Gm4EdcadzBjdND -Content-Type: text/plain; charset=us-ascii -Content-Disposition: inline - -Hi, - -https://bugzilla.redhat.com/show_bug.cgi?id=1126177 - -ERROR: AddressSanitizer: SEGV on unknown address 0x000000000050 (pc 0x000000992bef sp 0x7ffff9039530 bp 0x7ffff9039540 T0) - #0 0x992bee in value_type .../gdb/value.c:925 - #1 0x87c951 in py_print_single_arg python/py-framefilter.c:445 - #2 0x87cfae in enumerate_args python/py-framefilter.c:596 - #3 0x87e0b0 in py_print_args python/py-framefilter.c:968 - -It crashes because frame_arg::val is documented it may contain NULL -(frame_arg::error is then non-NULL) but the code does not handle it. - -Another bug is that py_print_single_arg() calls goto out of its TRY_CATCH -which messes up GDB cleanup chain crashing GDB later. - -I tried to somehow separate it to two patches first but it in the end kept -them merged. - -No regressions on {x86_64,x86_64-m32,i686}-fedorarawhide-linux-gnu. - -It is probably 7.7 regression (I have not verified it) due to the introduction -of Python frame filters. - -I am not sure if it is more suitable for gdb.arch/ or gdb.python/ , used the -latter. - - -Thanks, -Jan - ---d6Gm4EdcadzBjdND -Content-Type: text/plain; charset=us-ascii -Content-Disposition: inline; filename="pyinvalidarg.patch" - -gdb/ -2014-08-19 Jan Kratochvil - - * python/py-framefilter.c (py_print_single_arg): Handle NULL FA->VAL. - Fix goto out of TRY_CATCH. - -gdb/testsuite/ -2014-08-19 Jan Kratochvil - - * gdb.python/amd64-py-framefilter-invalidarg.S: New file. - * gdb.python/py-framefilter-invalidarg-gdb.py.in: New file. - * gdb.python/py-framefilter-invalidarg.exp: New file. - * gdb.python/py-framefilter-invalidarg.py: New file. - -diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c -index 9db83c7..d53282f 100644 ---- a/gdb/python/py-framefilter.c -+++ b/gdb/python/py-framefilter.c -@@ -365,9 +365,12 @@ py_print_single_arg (struct ui_out *out, - { - struct value *val; - volatile struct gdb_exception except; -+ enum ext_lang_bt_status retval = EXT_LANG_BT_OK; - - if (fa != NULL) - { -+ if (fa->val == NULL && fa->error == NULL) -+ return EXT_LANG_BT_OK; - language = language_def (SYMBOL_LANGUAGE (fa->sym)); - val = fa->val; - } -@@ -433,16 +436,18 @@ py_print_single_arg (struct ui_out *out, - /* For MI print the type, but only for simple values. This seems - weird, but this is how MI choose to format the various output - types. */ -- if (args_type == MI_PRINT_SIMPLE_VALUES) -+ if (args_type == MI_PRINT_SIMPLE_VALUES && val != NULL) - { - if (py_print_type (out, val) == EXT_LANG_BT_ERROR) - { -+ retval = EXT_LANG_BT_ERROR; - do_cleanups (cleanups); -- goto error; -+ continue; - } - } - -- annotate_arg_value (value_type (val)); -+ if (val != NULL) -+ annotate_arg_value (value_type (val)); - - /* If the output is to the CLI, and the user option "set print - frame-arguments" is set to none, just output "...". */ -@@ -454,27 +459,25 @@ py_print_single_arg (struct ui_out *out, - for the case of MI_PRINT_NO_VALUES. */ - if (args_type != NO_VALUES) - { -- if (py_print_value (out, val, opts, 0, args_type, language) -- == EXT_LANG_BT_ERROR) -+ if (val == NULL) - { -- do_cleanups (cleanups); -- goto error; -+ gdb_assert (fa != NULL && fa->error != NULL); -+ ui_out_field_fmt (out, "value", -+ _(""), -+ fa->error); - } -+ else if (py_print_value (out, val, opts, 0, args_type, language) -+ == EXT_LANG_BT_ERROR) -+ retval = EXT_LANG_BT_ERROR; - } - } - - do_cleanups (cleanups); - } - if (except.reason < 0) -- { -- gdbpy_convert_exception (except); -- goto error; -- } -- -- return EXT_LANG_BT_OK; -+ gdbpy_convert_exception (except); - -- error: -- return EXT_LANG_BT_ERROR; -+ return retval; - } - - /* Helper function to loop over frame arguments provided by the -diff --git a/gdb/testsuite/gdb.python/amd64-py-framefilter-invalidarg.S b/gdb/testsuite/gdb.python/amd64-py-framefilter-invalidarg.S -new file mode 100755 -index 0000000..3ac1b23 ---- /dev/null -+++ b/gdb/testsuite/gdb.python/amd64-py-framefilter-invalidarg.S -@@ -0,0 +1,261 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2014 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 . */ -+ -+/* This file is compiled from a single line -+ int main (int argc, char **argv) { return 0; } -+ using -g -dA -S -O2 and patched as #if-ed below. */ -+ -+ .file "py-framefilter-invalidarg.c" -+ .text -+.Ltext0: -+ .globl main -+ .type main, @function -+main: -+.LFB0: -+ .file 1 "py-framefilter-invalidarg.c" -+ # py-framefilter-invalidarg.c:1 -+ .loc 1 1 0 -+ .cfi_startproc -+# BLOCK 2 seq:0 -+# PRED: ENTRY (FALLTHRU) -+ pushq %rbp -+ .cfi_def_cfa_offset 16 -+ .cfi_offset 6, -16 -+ movq %rsp, %rbp -+ .cfi_def_cfa_register 6 -+ movl %edi, -4(%rbp) -+ movq %rsi, -16(%rbp) -+ # py-framefilter-invalidarg.c:2 -+ .loc 1 2 0 -+ movl $0, %eax -+ # py-framefilter-invalidarg.c:3 -+ .loc 1 3 0 -+ popq %rbp -+ .cfi_def_cfa 7, 8 -+# SUCC: EXIT [100.0%] -+ ret -+ .cfi_endproc -+.LFE0: -+ .size main, .-main -+.Letext0: -+ .section .debug_info,"",@progbits -+.Ldebug_info0: -+ .long .Le - .Ls # Length of Compilation Unit Info -+.Ls: -+ .value 0x4 # DWARF version number -+ .long .Ldebug_abbrev0 # Offset Into Abbrev. Section -+ .byte 0x8 # Pointer Size (in bytes) -+ .uleb128 0x1 # (DIE (0xb) DW_TAG_compile_unit) -+ .long .LASF3 # DW_AT_producer: "GNU C 4.9.1 20140813 (Red Hat 4.9.1-7) -mtune=generic -march=x86-64 -g" -+ .byte 0x1 # DW_AT_language -+ .long .LASF4 # DW_AT_name: "py-framefilter-invalidarg.c" -+ .long .LASF5 # DW_AT_comp_dir: "" -+ .quad .Ltext0 # DW_AT_low_pc -+ .quad .Letext0-.Ltext0 # DW_AT_high_pc -+ .long .Ldebug_line0 # DW_AT_stmt_list -+die2d: -+ .uleb128 0x2 # (DIE (0x2d) DW_TAG_subprogram) -+ # DW_AT_external -+ .long .LASF6 # DW_AT_name: "main" -+ .byte 0x1 # DW_AT_decl_file (py-framefilter-invalidarg.c) -+ .byte 0x1 # DW_AT_decl_line -+ # DW_AT_prototyped -+ .long die6b-.Ldebug_info0 # DW_AT_type -+ .quad .LFB0 # DW_AT_low_pc -+ .quad .LFE0-.LFB0 # DW_AT_high_pc -+ .uleb128 0x1 # DW_AT_frame_base -+ .byte 0x9c # DW_OP_call_frame_cfa -+ # DW_AT_GNU_all_call_sites -+die4e: -+ .uleb128 0x3 # (DIE (0x4e) DW_TAG_formal_parameter) -+ .long .LASF0 # DW_AT_name: "argc" -+ .byte 0x1 # DW_AT_decl_file (py-framefilter-invalidarg.c) -+ .byte 0x1 # DW_AT_decl_line -+ .long die6b-.Ldebug_info0 # DW_AT_type -+#if 0 -+ .uleb128 0x2 # DW_AT_location -+ .byte 0x91 # DW_OP_fbreg -+ .sleb128 -20 -+#endif -+#if 0 -+ .uleb128 1f - 2f # DW_AT_location -+2: -+ .byte 0x03 # DW_OP_addr -+ .quad 0 -+1: -+#endif -+#if 1 -+ .uleb128 1f - 2f # DW_AT_location -+2: -+ .byte 0x13 # DW_OP_drop -+ .quad 0 -+1: -+#endif -+die5c: -+ .uleb128 0x3 # (DIE (0x5c) DW_TAG_formal_parameter) -+ .long .LASF1 # DW_AT_name: "argv" -+ .byte 0x1 # DW_AT_decl_file (py-framefilter-invalidarg.c) -+ .byte 0x1 # DW_AT_decl_line -+ .long die72-.Ldebug_info0 # DW_AT_type -+ .uleb128 0x2 # DW_AT_location -+ .byte 0x91 # DW_OP_fbreg -+ .sleb128 -32 -+ .byte 0 # end of children of DIE 0x2d -+die6b: -+ .uleb128 0x4 # (DIE (0x6b) DW_TAG_base_type) -+ .byte 0x4 # DW_AT_byte_size -+ .byte 0x5 # DW_AT_encoding -+ .ascii "int\0" # DW_AT_name -+die72: -+ .uleb128 0x5 # (DIE (0x72) DW_TAG_pointer_type) -+ .byte 0x8 # DW_AT_byte_size -+ .long die78-.Ldebug_info0 # DW_AT_type -+die78: -+ .uleb128 0x5 # (DIE (0x78) DW_TAG_pointer_type) -+ .byte 0x8 # DW_AT_byte_size -+ .long die7e-.Ldebug_info0 # DW_AT_type -+die7e: -+ .uleb128 0x6 # (DIE (0x7e) DW_TAG_base_type) -+ .byte 0x1 # DW_AT_byte_size -+ .byte 0x6 # DW_AT_encoding -+ .long .LASF2 # DW_AT_name: "char" -+ .byte 0 # end of children of DIE 0xb -+.Le: -+ .section .debug_abbrev,"",@progbits -+.Ldebug_abbrev0: -+ .uleb128 0x1 # (abbrev code) -+ .uleb128 0x11 # (TAG: DW_TAG_compile_unit) -+ .byte 0x1 # DW_children_yes -+ .uleb128 0x25 # (DW_AT_producer) -+ .uleb128 0xe # (DW_FORM_strp) -+ .uleb128 0x13 # (DW_AT_language) -+ .uleb128 0xb # (DW_FORM_data1) -+ .uleb128 0x3 # (DW_AT_name) -+ .uleb128 0xe # (DW_FORM_strp) -+ .uleb128 0x1b # (DW_AT_comp_dir) -+ .uleb128 0xe # (DW_FORM_strp) -+ .uleb128 0x11 # (DW_AT_low_pc) -+ .uleb128 0x1 # (DW_FORM_addr) -+ .uleb128 0x12 # (DW_AT_high_pc) -+ .uleb128 0x7 # (DW_FORM_data8) -+ .uleb128 0x10 # (DW_AT_stmt_list) -+ .uleb128 0x17 # (DW_FORM_sec_offset) -+ .byte 0 -+ .byte 0 -+ .uleb128 0x2 # (abbrev code) -+ .uleb128 0x2e # (TAG: DW_TAG_subprogram) -+ .byte 0x1 # DW_children_yes -+ .uleb128 0x3f # (DW_AT_external) -+ .uleb128 0x19 # (DW_FORM_flag_present) -+ .uleb128 0x3 # (DW_AT_name) -+ .uleb128 0xe # (DW_FORM_strp) -+ .uleb128 0x3a # (DW_AT_decl_file) -+ .uleb128 0xb # (DW_FORM_data1) -+ .uleb128 0x3b # (DW_AT_decl_line) -+ .uleb128 0xb # (DW_FORM_data1) -+ .uleb128 0x27 # (DW_AT_prototyped) -+ .uleb128 0x19 # (DW_FORM_flag_present) -+ .uleb128 0x49 # (DW_AT_type) -+ .uleb128 0x13 # (DW_FORM_ref4) -+ .uleb128 0x11 # (DW_AT_low_pc) -+ .uleb128 0x1 # (DW_FORM_addr) -+ .uleb128 0x12 # (DW_AT_high_pc) -+ .uleb128 0x7 # (DW_FORM_data8) -+ .uleb128 0x40 # (DW_AT_frame_base) -+ .uleb128 0x18 # (DW_FORM_exprloc) -+ .uleb128 0x2117 # (DW_AT_GNU_all_call_sites) -+ .uleb128 0x19 # (DW_FORM_flag_present) -+ .byte 0 -+ .byte 0 -+ .uleb128 0x3 # (abbrev code) -+ .uleb128 0x5 # (TAG: DW_TAG_formal_parameter) -+ .byte 0 # DW_children_no -+ .uleb128 0x3 # (DW_AT_name) -+ .uleb128 0xe # (DW_FORM_strp) -+ .uleb128 0x3a # (DW_AT_decl_file) -+ .uleb128 0xb # (DW_FORM_data1) -+ .uleb128 0x3b # (DW_AT_decl_line) -+ .uleb128 0xb # (DW_FORM_data1) -+ .uleb128 0x49 # (DW_AT_type) -+ .uleb128 0x13 # (DW_FORM_ref4) -+ .uleb128 0x2 # (DW_AT_location) -+ .uleb128 0x18 # (DW_FORM_exprloc) -+ .byte 0 -+ .byte 0 -+ .uleb128 0x4 # (abbrev code) -+ .uleb128 0x24 # (TAG: DW_TAG_base_type) -+ .byte 0 # DW_children_no -+ .uleb128 0xb # (DW_AT_byte_size) -+ .uleb128 0xb # (DW_FORM_data1) -+ .uleb128 0x3e # (DW_AT_encoding) -+ .uleb128 0xb # (DW_FORM_data1) -+ .uleb128 0x3 # (DW_AT_name) -+ .uleb128 0x8 # (DW_FORM_string) -+ .byte 0 -+ .byte 0 -+ .uleb128 0x5 # (abbrev code) -+ .uleb128 0xf # (TAG: DW_TAG_pointer_type) -+ .byte 0 # DW_children_no -+ .uleb128 0xb # (DW_AT_byte_size) -+ .uleb128 0xb # (DW_FORM_data1) -+ .uleb128 0x49 # (DW_AT_type) -+ .uleb128 0x13 # (DW_FORM_ref4) -+ .byte 0 -+ .byte 0 -+ .uleb128 0x6 # (abbrev code) -+ .uleb128 0x24 # (TAG: DW_TAG_base_type) -+ .byte 0 # DW_children_no -+ .uleb128 0xb # (DW_AT_byte_size) -+ .uleb128 0xb # (DW_FORM_data1) -+ .uleb128 0x3e # (DW_AT_encoding) -+ .uleb128 0xb # (DW_FORM_data1) -+ .uleb128 0x3 # (DW_AT_name) -+ .uleb128 0xe # (DW_FORM_strp) -+ .byte 0 -+ .byte 0 -+ .byte 0 -+ .section .debug_aranges,"",@progbits -+ .long 0x2c # Length of Address Ranges Info -+ .value 0x2 # DWARF Version -+ .long .Ldebug_info0 # Offset of Compilation Unit Info -+ .byte 0x8 # Size of Address -+ .byte 0 # Size of Segment Descriptor -+ .value 0 # Pad to 16 byte boundary -+ .value 0 -+ .quad .Ltext0 # Address -+ .quad .Letext0-.Ltext0 # Length -+ .quad 0 -+ .quad 0 -+ .section .debug_line,"",@progbits -+.Ldebug_line0: -+ .section .debug_str,"MS",@progbits,1 -+.LASF1: -+ .string "argv" -+.LASF4: -+ .string "py-framefilter-invalidarg.c" -+.LASF5: -+ .string "" -+.LASF0: -+ .string "argc" -+.LASF3: -+ .string "GNU C 4.9.1 20140813 (Red Hat 4.9.1-7) -mtune=generic -march=x86-64 -g" -+.LASF6: -+ .string "main" -+.LASF2: -+ .string "char" -+ .ident "GCC: (GNU) 4.9.1 20140813 (Red Hat 4.9.1-7)" -+ .section .note.GNU-stack,"",@progbits -diff --git a/gdb/testsuite/gdb.python/py-framefilter-invalidarg-gdb.py.in b/gdb/testsuite/gdb.python/py-framefilter-invalidarg-gdb.py.in -new file mode 100644 -index 0000000..1fa6ffc ---- /dev/null -+++ b/gdb/testsuite/gdb.python/py-framefilter-invalidarg-gdb.py.in -@@ -0,0 +1,48 @@ -+# Copyright (C) 2014 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 . -+ -+# This file is part of the GDB testsuite. It tests Python-based -+# frame-filters. -+import gdb -+import itertools -+from gdb.FrameDecorator import FrameDecorator -+ -+ -+class FrameObjFile (): -+ -+ def __init__ (self): -+ self.name = "Filter1" -+ self.priority = 1 -+ self.enabled = False -+ gdb.current_progspace().frame_filters ["Progspace" + self.name] = self -+ gdb.current_objfile().frame_filters ["ObjectFile" + self.name] = self -+ -+ def filter (self, frame_iter): -+ return frame_iter -+ -+class FrameObjFile2 (): -+ -+ def __init__ (self): -+ self.name = "Filter2" -+ self.priority = 100 -+ self.enabled = True -+ gdb.current_progspace().frame_filters ["Progspace" + self.name] = self -+ gdb.current_objfile().frame_filters ["ObjectFile" + self.name] = self -+ -+ def filter (self, frame_iter): -+ return frame_iter -+ -+FrameObjFile() -+FrameObjFile2() -diff --git a/gdb/testsuite/gdb.python/py-framefilter-invalidarg.exp b/gdb/testsuite/gdb.python/py-framefilter-invalidarg.exp -new file mode 100644 -index 0000000..f70d16e ---- /dev/null -+++ b/gdb/testsuite/gdb.python/py-framefilter-invalidarg.exp -@@ -0,0 +1,67 @@ -+# Copyright (C) 2014 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 . -+ -+load_lib gdb-python.exp -+ -+standard_testfile amd64-py-framefilter-invalidarg.S -+ -+if { ![istarget x86_64-*-* ] || ![is_lp64_target] } { -+ verbose "Skipping py-framefilter-invalidarg." -+ return -+} -+ -+# We cannot use prepare_for_testing as we have to set the safe-patch -+# to check objfile and progspace printers. -+if {[build_executable $testfile.exp $testfile $srcfile {}] == -1} { -+ return -1 -+} -+ -+# Start with a fresh gdb. -+gdb_exit -+gdb_start -+ -+# Skip all tests if Python scripting is not enabled. -+if { [skip_python_tests] } { continue } -+ -+# Make the -gdb.py script available to gdb, it is automagically loaded by gdb. -+# Care is taken to put it in the same directory as the binary so that -+# gdb will find it. -+set remote_obj_python_file \ -+ [remote_download \ -+ host ${srcdir}/${subdir}/${testfile}-gdb.py.in \ -+ [standard_output_file ${testfile}-gdb.py]] -+ -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_test_no_output "set auto-load safe-path ${remote_obj_python_file}" \ -+ "set auto-load safe-path" -+gdb_load ${binfile} -+# Verify gdb loaded the script. -+gdb_test "info auto-load python-scripts" "Yes.*/${testfile}-gdb.py.*" \ -+ "Test auto-load had loaded python scripts" -+ -+if ![runto_main] then { -+ perror "couldn't run to breakpoint" -+ return -+} -+gdb_test_no_output "set python print-stack full" \ -+ "Set python print-stack to full" -+ -+# Load global frame-filters -+set remote_python_file [gdb_remote_download host \ -+ ${srcdir}/${subdir}/${testfile}.py] -+gdb_test_no_output "python exec (open ('${remote_python_file}').read ())" \ -+ "Load python file" -+ -+gdb_test "bt" " in niam \\(argc=, argv=0x\[0-9a-f\]+\\) at py-framefilter-invalidarg.c:\[0-9\]+" "bt full with filters" -diff --git a/gdb/testsuite/gdb.python/py-framefilter-invalidarg.py b/gdb/testsuite/gdb.python/py-framefilter-invalidarg.py -new file mode 100644 -index 0000000..d5f92cb ---- /dev/null -+++ b/gdb/testsuite/gdb.python/py-framefilter-invalidarg.py -@@ -0,0 +1,59 @@ -+# Copyright (C) 2014 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 . -+ -+# This file is part of the GDB testsuite. It tests Python-based -+# frame-filters. -+import gdb -+import itertools -+from gdb.FrameDecorator import FrameDecorator -+import copy -+ -+class Reverse_Function (FrameDecorator): -+ -+ def __init__(self, fobj): -+ super(Reverse_Function, self).__init__(fobj) -+ self.fobj = fobj -+ -+ def function (self): -+ fname = str (self.fobj.function()) -+ if (fname == None or fname == ""): -+ return None -+ if fname == 'end_func': -+ extra = self.fobj.inferior_frame().read_var('str').string() -+ else: -+ extra = '' -+ fname = fname[::-1] + extra -+ return fname -+ -+class FrameFilter (): -+ -+ def __init__ (self): -+ self.name = "Reverse" -+ self.priority = 100 -+ self.enabled = True -+ gdb.frame_filters [self.name] = self -+ -+ def filter (self, frame_iter): -+ # Python 3.x moved the itertools.imap functionality to map(), -+ # so check if it is available. -+ if hasattr(itertools, "imap"): -+ frame_iter = itertools.imap (Reverse_Function, -+ frame_iter) -+ else: -+ frame_iter = map(Reverse_Function, frame_iter) -+ -+ return frame_iter -+ -+FrameFilter() - ---d6Gm4EdcadzBjdND-- - diff --git a/sources b/sources index b7836be..e48805d 100644 --- a/sources +++ b/sources @@ -1,2 +1,2 @@ 4981307aa9619bbec5b73261e4e41c8d gdb-libstdc++-v3-python-r155978.tar.bz2 -38d816d641093db2e13ba284e26090b4 gdb-7.8.tar.gz +8072be87a94be0936bc3b4b6941b0862 gdb-7.8.1.tar.xz