Accepting request 734341 from home:tomdevries:branches:devel:gcc-gdb-8.3.1-upgrade
- Add gdb-testsuite-8.3-kfail-xfail-unsupported.patch - Drop ChangeLog part of patch: * gdb-rhbz1708192-parse_macro_definition-crash.patch * gdb-rhbz1704406-disable-style-log-output-1of3.patch * gdb-rhbz1704406-disable-style-log-output-2of3.patch * gdb-rhbz1704406-disable-style-log-output-3of3.patch * gdb-rhbz1723564-gdb-crash-PYTHONMALLOC-debug.patch * gdb-rhbz1553086-binutils-warning-loadable-section-outside-elf.patch - Update to gdb-8.3.1. * Drop "Testsuite: Ensure pie is disabled on some tests" part of gdb-testsuite-pie-no-pie.patch * Drop: - gdb-7.10-swo18929.patch - gdb-handle-vfork-in-thread-with-follow-fork-mode-child.patch - gdb-x86_64-i386-syscall-restart-master.patch - gdb-suppress-sigttou-when-handling-errors.patch - gdb-fix-breakpoints-on-file-reloads-for-pie-binaries.patch - gdb-symtab-fix-symbol-loading-performance-regression.patch - Fix macro in comment warning OBS-URL: https://build.opensuse.org/request/show/734341 OBS-URL: https://build.opensuse.org/package/show/devel:gcc/gdb?expand=0&rev=229
This commit is contained in:
parent
0ecc5e2c59
commit
814eaf999d
@ -1,37 +0,0 @@
|
|||||||
https://sourceware.org/bugzilla/show_bug.cgi?id=18929
|
|
||||||
|
|
||||||
---
|
|
||||||
gdb/cp-valprint.c | 8 ++++----
|
|
||||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
Index: gdb-7.11/gdb/cp-valprint.c
|
|
||||||
===================================================================
|
|
||||||
--- gdb-7.11.orig/gdb/cp-valprint.c 2016-03-21 10:04:07.845131361 +0100
|
|
||||||
+++ gdb-7.11/gdb/cp-valprint.c 2016-03-21 10:04:49.089597879 +0100
|
|
||||||
@@ -313,11 +313,13 @@ cp_print_value_fields (struct type *type
|
|
||||||
}
|
|
||||||
else if (field_is_static (&TYPE_FIELD (type, i)))
|
|
||||||
{
|
|
||||||
- struct value *v = NULL;
|
|
||||||
-
|
|
||||||
TRY
|
|
||||||
{
|
|
||||||
+ struct value *v = NULL;
|
|
||||||
v = value_static_field (type, i);
|
|
||||||
+ cp_print_static_field (TYPE_FIELD_TYPE (type, i),
|
|
||||||
+ v, stream, recurse + 1,
|
|
||||||
+ options);
|
|
||||||
}
|
|
||||||
|
|
||||||
CATCH (ex, RETURN_MASK_ERROR)
|
|
||||||
@@ -327,10 +329,6 @@ cp_print_value_fields (struct type *type
|
|
||||||
ex.message);
|
|
||||||
}
|
|
||||||
END_CATCH
|
|
||||||
-
|
|
||||||
- cp_print_static_field (TYPE_FIELD_TYPE (type, i),
|
|
||||||
- v, stream, recurse + 1,
|
|
||||||
- options);
|
|
||||||
}
|
|
||||||
else if (i == vptr_fieldno && type == vptr_basetype)
|
|
||||||
{
|
|
3
gdb-8.3.1.tar.bz2
Normal file
3
gdb-8.3.1.tar.bz2
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:05c64ab7298487fde1aac402026ef0569cf7e703054d2a42e272292a0b096fdf
|
||||||
|
size 29382553
|
@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:e722dd64f86742c5be2da15dea9f8906f44f20dd89f7f98bcad93767ffaf7638
|
|
||||||
size 29368870
|
|
@ -1,154 +0,0 @@
|
|||||||
Fix breakpoints on file reloads for PIE binaries
|
|
||||||
|
|
||||||
When a binary is built using PIE, reloading the file will cause GDB to error
|
|
||||||
on restart. For example:
|
|
||||||
gdb ./a.out
|
|
||||||
(gdb) break main
|
|
||||||
(gdb) run
|
|
||||||
(gdb) file ./a.out
|
|
||||||
(gdb) continue
|
|
||||||
|
|
||||||
Will cause GDB to error with:
|
|
||||||
Continuing.
|
|
||||||
Warning:
|
|
||||||
Cannot insert breakpoint 1.
|
|
||||||
Cannot access memory at address 0x9e0
|
|
||||||
Command aborted.
|
|
||||||
|
|
||||||
This is due to the symbol offsets not being relocated after reloading the file.
|
|
||||||
|
|
||||||
Fix is to ensure solib_create_inferior_hook is called, in the same manner as
|
|
||||||
infrun.c:follow_exec().
|
|
||||||
|
|
||||||
Expand the idempotent test to cover PIE scenarios.
|
|
||||||
|
|
||||||
gdb/ChangeLog:
|
|
||||||
|
|
||||||
* symfile.c (symbol_file_command): Call solib_create_inferior_hook.
|
|
||||||
|
|
||||||
gdb/testsuite/ChangeLog:
|
|
||||||
|
|
||||||
* gdb.base/break-idempotent.exp: Test both PIE and non PIE.
|
|
||||||
|
|
||||||
---
|
|
||||||
gdb/ChangeLog | 4 ++
|
|
||||||
gdb/symfile.c | 12 ++++++
|
|
||||||
gdb/testsuite/ChangeLog | 4 ++
|
|
||||||
gdb/testsuite/gdb.base/break-idempotent.exp | 66 ++++++++++++++++-------------
|
|
||||||
4 files changed, 56 insertions(+), 30 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/gdb/symfile.c b/gdb/symfile.c
|
|
||||||
index bd79315687..a03ac29541 100644
|
|
||||||
--- a/gdb/symfile.c
|
|
||||||
+++ b/gdb/symfile.c
|
|
||||||
@@ -1672,7 +1672,19 @@ symbol_file_command (const char *args, int from_tty)
|
|
||||||
|
|
||||||
validate_readnow_readnever (flags);
|
|
||||||
|
|
||||||
+ /* Set SYMFILE_DEFER_BP_RESET because the proper displacement for a PIE
|
|
||||||
+ (Position Independent Executable) main symbol file will only be
|
|
||||||
+ computed by the solib_create_inferior_hook below. Without it,
|
|
||||||
+ breakpoint_re_set would fail to insert the breakpoints with the zero
|
|
||||||
+ displacement. */
|
|
||||||
+ add_flags |= SYMFILE_DEFER_BP_RESET;
|
|
||||||
+
|
|
||||||
symbol_file_add_main_1 (name, add_flags, flags, offset);
|
|
||||||
+
|
|
||||||
+ solib_create_inferior_hook (from_tty);
|
|
||||||
+
|
|
||||||
+ /* Now it's safe to re-add the breakpoints. */
|
|
||||||
+ breakpoint_re_set ();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/gdb/testsuite/gdb.base/break-idempotent.exp b/gdb/testsuite/gdb.base/break-idempotent.exp
|
|
||||||
index 902a5f818b..96f91c50f9 100644
|
|
||||||
--- a/gdb/testsuite/gdb.base/break-idempotent.exp
|
|
||||||
+++ b/gdb/testsuite/gdb.base/break-idempotent.exp
|
|
||||||
@@ -36,23 +36,6 @@
|
|
||||||
|
|
||||||
standard_testfile
|
|
||||||
|
|
||||||
-if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} {
|
|
||||||
- return -1
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-if ![runto_main] then {
|
|
||||||
- fail "can't run to main"
|
|
||||||
- return 0
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-if [is_remote host] {
|
|
||||||
- set arg [remote_download host $binfile]
|
|
||||||
- if { $arg == "" } {
|
|
||||||
- perror "download failed"
|
|
||||||
- return -1
|
|
||||||
- }
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
# Force a breakpoint re-set in GDB. Currently this is done by
|
|
||||||
# reloading symbols with the "file" command.
|
|
||||||
|
|
||||||
@@ -123,7 +106,7 @@ proc set_breakpoint { break_command } {
|
|
||||||
proc test_break { always_inserted break_command } {
|
|
||||||
set cmd [lindex [split "$break_command"] 0]
|
|
||||||
|
|
||||||
- with_test_prefix "always-inserted $always_inserted: $cmd" {
|
|
||||||
+ with_test_prefix "$cmd" {
|
|
||||||
delete_breakpoints
|
|
||||||
|
|
||||||
if ![runto_main] then {
|
|
||||||
@@ -163,20 +146,43 @@ proc test_break { always_inserted break_command } {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
-foreach always_inserted { "off" "on" } {
|
|
||||||
- test_break $always_inserted "break"
|
|
||||||
+# The testcase uses the "file" command to force breakpoint re-set in
|
|
||||||
+# GDB. Test both with and without PIE, as GDB used to mishandle
|
|
||||||
+# breakpoint re-set when reloading PIEs.
|
|
||||||
+foreach_with_prefix pie { "nopie" "pie" } {
|
|
||||||
+
|
|
||||||
+ set opts {debug}
|
|
||||||
+ lappend opts $pie
|
|
||||||
|
|
||||||
- if {![skip_hw_breakpoint_tests]} {
|
|
||||||
- test_break $always_inserted "hbreak"
|
|
||||||
+ set binfile [standard_output_file $testfile-$pie]
|
|
||||||
+
|
|
||||||
+ if {[prepare_for_testing "failed to prepare" $binfile $srcfile $opts]} {
|
|
||||||
+ continue
|
|
||||||
}
|
|
||||||
|
|
||||||
- if {![skip_hw_watchpoint_tests]} {
|
|
||||||
- test_break $always_inserted "watch"
|
|
||||||
+ if [is_remote host] {
|
|
||||||
+ set arg [remote_download host $binfile]
|
|
||||||
+ if { $arg == "" } {
|
|
||||||
+ untested "download failed"
|
|
||||||
+ continue
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
- if {![skip_hw_watchpoint_access_tests]
|
|
||||||
- && ![skip_hw_watchpoint_multi_tests]} {
|
|
||||||
- test_break $always_inserted "rwatch"
|
|
||||||
- test_break $always_inserted "awatch"
|
|
||||||
+ foreach_with_prefix always_inserted { "off" "on" } {
|
|
||||||
+ test_break $always_inserted "break"
|
|
||||||
+
|
|
||||||
+ if {![skip_hw_breakpoint_tests]} {
|
|
||||||
+ test_break $always_inserted "hbreak"
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if {![skip_hw_watchpoint_tests]} {
|
|
||||||
+ test_break $always_inserted "watch"
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if {![skip_hw_watchpoint_access_tests]
|
|
||||||
+ && ![skip_hw_watchpoint_multi_tests]} {
|
|
||||||
+ test_break $always_inserted "rwatch"
|
|
||||||
+ test_break $always_inserted "awatch"
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,431 +0,0 @@
|
|||||||
commit b73715df01e6e9b3de5a49cd7bf4170deef48461
|
|
||||||
Author: Tom de Vries <tdevries@suse.de>
|
|
||||||
Date: Thu Apr 18 17:05:43 2019 +0100
|
|
||||||
|
|
||||||
[gdb] Handle vfork in thread with follow-fork-mode child
|
|
||||||
|
|
||||||
When debugging any of the testcases added by this commit, which do a
|
|
||||||
vfork in a thread with "set follow-fork-mode child" + "set
|
|
||||||
detach-on-fork on", we run into this assertion:
|
|
||||||
|
|
||||||
...
|
|
||||||
src/gdb/nat/x86-linux-dregs.c:146: internal-error: \
|
|
||||||
void x86_linux_update_debug_registers(lwp_info*): \
|
|
||||||
Assertion `lwp_is_stopped (lwp)' failed.
|
|
||||||
...
|
|
||||||
|
|
||||||
The assert is caused by the following: the vfork-child exit or exec
|
|
||||||
event is handled by handle_vfork_child_exec_or_exit, which calls
|
|
||||||
target_detach to detach from the vfork parent. During target_detach
|
|
||||||
we call linux_nat_target::detach, which:
|
|
||||||
|
|
||||||
#1 - stops all the threads
|
|
||||||
#2 - waits for all the threads to be stopped
|
|
||||||
#3 - detaches all the threads
|
|
||||||
|
|
||||||
However, during the second step we run into this code in
|
|
||||||
stop_wait_callback:
|
|
||||||
|
|
||||||
...
|
|
||||||
/* If this is a vfork parent, bail out, it is not going to report
|
|
||||||
any SIGSTOP until the vfork is done with. */
|
|
||||||
if (inf->vfork_child != NULL)
|
|
||||||
return 0;
|
|
||||||
...
|
|
||||||
|
|
||||||
and we don't wait for the threads to be stopped, which results in this
|
|
||||||
assert in x86_linux_update_debug_registers triggering during the third
|
|
||||||
step:
|
|
||||||
|
|
||||||
...
|
|
||||||
gdb_assert (lwp_is_stopped (lwp));
|
|
||||||
...
|
|
||||||
|
|
||||||
The fix is to reset the vfork parent's vfork_child field before
|
|
||||||
calling target_detach in handle_vfork_child_exec_or_exit. There's
|
|
||||||
already similar code for the other paths handled by
|
|
||||||
handle_vfork_child_exec_or_exit, so this commit refactors the code a
|
|
||||||
bit so that all paths share the same code.
|
|
||||||
|
|
||||||
The new tests cover both a vfork child exiting, and a vfork child
|
|
||||||
execing, since both cases would trigger the assertion.
|
|
||||||
|
|
||||||
The new testcases also exercise following the vfork children with "set
|
|
||||||
detach-on-fork off", since it doesn't seem to be tested anywhere.
|
|
||||||
|
|
||||||
Tested on x86_64-linux, using native and native-gdbserver.
|
|
||||||
|
|
||||||
gdb/ChangeLog:
|
|
||||||
2019-04-18 Tom de Vries <tdevries@suse.de>
|
|
||||||
Pedro Alves <palves@redhat.com>
|
|
||||||
|
|
||||||
PR gdb/24454
|
|
||||||
* infrun.c (handle_vfork_child_exec_or_exit): Reset vfork parent's
|
|
||||||
vfork_child field before calling target_detach.
|
|
||||||
|
|
||||||
gdb/testsuite/ChangeLog:
|
|
||||||
2019-04-18 Tom de Vries <tdevries@suse.de>
|
|
||||||
Pedro Alves <palves@redhat.com>
|
|
||||||
|
|
||||||
PR gdb/24454
|
|
||||||
* gdb.threads/vfork-follow-child-exec.c: New file.
|
|
||||||
* gdb.threads/vfork-follow-child-exec.exp: New file.
|
|
||||||
* gdb.threads/vfork-follow-child-exit.c: New file.
|
|
||||||
* gdb.threads/vfork-follow-child-exit.exp: New file.
|
|
||||||
|
|
||||||
diff --git a/gdb/infrun.c b/gdb/infrun.c
|
|
||||||
index 37713b24fe..37df561de0 100644
|
|
||||||
--- a/gdb/infrun.c
|
|
||||||
+++ b/gdb/infrun.c
|
|
||||||
@@ -915,10 +915,14 @@ handle_vfork_child_exec_or_exit (int exec)
|
|
||||||
int resume_parent = -1;
|
|
||||||
|
|
||||||
/* This exec or exit marks the end of the shared memory region
|
|
||||||
- between the parent and the child. If the user wanted to
|
|
||||||
- detach from the parent, now is the time. */
|
|
||||||
+ between the parent and the child. Break the bonds. */
|
|
||||||
+ inferior *vfork_parent = inf->vfork_parent;
|
|
||||||
+ inf->vfork_parent->vfork_child = NULL;
|
|
||||||
+ inf->vfork_parent = NULL;
|
|
||||||
|
|
||||||
- if (inf->vfork_parent->pending_detach)
|
|
||||||
+ /* If the user wanted to detach from the parent, now is the
|
|
||||||
+ time. */
|
|
||||||
+ if (vfork_parent->pending_detach)
|
|
||||||
{
|
|
||||||
struct thread_info *tp;
|
|
||||||
struct program_space *pspace;
|
|
||||||
@@ -926,7 +930,7 @@ handle_vfork_child_exec_or_exit (int exec)
|
|
||||||
|
|
||||||
/* follow-fork child, detach-on-fork on. */
|
|
||||||
|
|
||||||
- inf->vfork_parent->pending_detach = 0;
|
|
||||||
+ vfork_parent->pending_detach = 0;
|
|
||||||
|
|
||||||
gdb::optional<scoped_restore_exited_inferior>
|
|
||||||
maybe_restore_inferior;
|
|
||||||
@@ -941,7 +945,7 @@ handle_vfork_child_exec_or_exit (int exec)
|
|
||||||
maybe_restore_thread.emplace ();
|
|
||||||
|
|
||||||
/* We're letting loose of the parent. */
|
|
||||||
- tp = any_live_thread_of_inferior (inf->vfork_parent);
|
|
||||||
+ tp = any_live_thread_of_inferior (vfork_parent);
|
|
||||||
switch_to_thread (tp);
|
|
||||||
|
|
||||||
/* We're about to detach from the parent, which implicitly
|
|
||||||
@@ -964,7 +968,7 @@ handle_vfork_child_exec_or_exit (int exec)
|
|
||||||
if (print_inferior_events)
|
|
||||||
{
|
|
||||||
const char *pidstr
|
|
||||||
- = target_pid_to_str (ptid_t (inf->vfork_parent->pid));
|
|
||||||
+ = target_pid_to_str (ptid_t (vfork_parent->pid));
|
|
||||||
|
|
||||||
target_terminal::ours_for_output ();
|
|
||||||
|
|
||||||
@@ -982,7 +986,7 @@ handle_vfork_child_exec_or_exit (int exec)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- target_detach (inf->vfork_parent, 0);
|
|
||||||
+ target_detach (vfork_parent, 0);
|
|
||||||
|
|
||||||
/* Put it back. */
|
|
||||||
inf->pspace = pspace;
|
|
||||||
@@ -997,10 +1001,7 @@ handle_vfork_child_exec_or_exit (int exec)
|
|
||||||
inf->removable = 1;
|
|
||||||
set_current_program_space (inf->pspace);
|
|
||||||
|
|
||||||
- resume_parent = inf->vfork_parent->pid;
|
|
||||||
-
|
|
||||||
- /* Break the bonds. */
|
|
||||||
- inf->vfork_parent->vfork_child = NULL;
|
|
||||||
+ resume_parent = vfork_parent->pid;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
@@ -1030,17 +1031,13 @@ handle_vfork_child_exec_or_exit (int exec)
|
|
||||||
set_current_program_space (pspace);
|
|
||||||
inf->removable = 1;
|
|
||||||
inf->symfile_flags = SYMFILE_NO_READ;
|
|
||||||
- clone_program_space (pspace, inf->vfork_parent->pspace);
|
|
||||||
+ clone_program_space (pspace, vfork_parent->pspace);
|
|
||||||
inf->pspace = pspace;
|
|
||||||
inf->aspace = pspace->aspace;
|
|
||||||
|
|
||||||
- resume_parent = inf->vfork_parent->pid;
|
|
||||||
- /* Break the bonds. */
|
|
||||||
- inf->vfork_parent->vfork_child = NULL;
|
|
||||||
+ resume_parent = vfork_parent->pid;
|
|
||||||
}
|
|
||||||
|
|
||||||
- inf->vfork_parent = NULL;
|
|
||||||
-
|
|
||||||
gdb_assert (current_program_space == inf->pspace);
|
|
||||||
|
|
||||||
if (non_stop && resume_parent != -1)
|
|
||||||
diff --git a/gdb/testsuite/gdb.threads/vfork-follow-child-exec.c b/gdb/testsuite/gdb.threads/vfork-follow-child-exec.c
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..80632d1772
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/gdb/testsuite/gdb.threads/vfork-follow-child-exec.c
|
|
||||||
@@ -0,0 +1,66 @@
|
|
||||||
+/* This testcase is part of GDB, the GNU debugger.
|
|
||||||
+
|
|
||||||
+ Copyright 2019 Free Software Foundation, Inc.
|
|
||||||
+
|
|
||||||
+ This program is free software; you can redistribute it and/or modify
|
|
||||||
+ it under the terms of the GNU General Public License as published by
|
|
||||||
+ the Free Software Foundation; either version 3 of the License, or
|
|
||||||
+ (at your option) any later version.
|
|
||||||
+
|
|
||||||
+ This program is distributed in the hope that it will be useful,
|
|
||||||
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
+ GNU General Public License for more details.
|
|
||||||
+
|
|
||||||
+ You should have received a copy of the GNU General Public License
|
|
||||||
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
||||||
+
|
|
||||||
+#include <stdio.h>
|
|
||||||
+#include <unistd.h>
|
|
||||||
+#include <pthread.h>
|
|
||||||
+#include <string.h>
|
|
||||||
+#include <stdlib.h>
|
|
||||||
+
|
|
||||||
+static char *program_name;
|
|
||||||
+
|
|
||||||
+static void *
|
|
||||||
+f (void *arg)
|
|
||||||
+{
|
|
||||||
+ int res = vfork ();
|
|
||||||
+
|
|
||||||
+ if (res == -1)
|
|
||||||
+ {
|
|
||||||
+ perror ("vfork");
|
|
||||||
+ return NULL;
|
|
||||||
+ }
|
|
||||||
+ else if (res == 0)
|
|
||||||
+ {
|
|
||||||
+ /* Child. */
|
|
||||||
+ execl (program_name, program_name, "1", NULL);
|
|
||||||
+ perror ("exec");
|
|
||||||
+ abort ();
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ /* Parent. */
|
|
||||||
+ return NULL;
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int
|
|
||||||
+main (int argc, char **argv)
|
|
||||||
+{
|
|
||||||
+ pthread_t tid;
|
|
||||||
+
|
|
||||||
+ if (argc > 1)
|
|
||||||
+ {
|
|
||||||
+ /* Getting here via execl. */
|
|
||||||
+ return 0;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ program_name = argv[0];
|
|
||||||
+
|
|
||||||
+ pthread_create (&tid, NULL, f, NULL);
|
|
||||||
+ pthread_join (tid, NULL);
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
diff --git a/gdb/testsuite/gdb.threads/vfork-follow-child-exec.exp b/gdb/testsuite/gdb.threads/vfork-follow-child-exec.exp
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..5a28715fa0
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/gdb/testsuite/gdb.threads/vfork-follow-child-exec.exp
|
|
||||||
@@ -0,0 +1,64 @@
|
|
||||||
+# Copyright (C) 2019 Free Software Foundation, Inc.
|
|
||||||
+
|
|
||||||
+# This program is free software; you can redistribute it and/or modify
|
|
||||||
+# it under the terms of the GNU General Public License as published by
|
|
||||||
+# the Free Software Foundation; either version 3 of the License, or
|
|
||||||
+# (at your option) any later version.
|
|
||||||
+#
|
|
||||||
+# This program is distributed in the hope that it will be useful,
|
|
||||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
+# GNU General Public License for more details.
|
|
||||||
+#
|
|
||||||
+# You should have received a copy of the GNU General Public License
|
|
||||||
+# along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
||||||
+
|
|
||||||
+# Test following a vfork child that execs, when the vfork parent is a
|
|
||||||
+# threaded program, and it's a non-main thread that vforks.
|
|
||||||
+
|
|
||||||
+standard_testfile
|
|
||||||
+
|
|
||||||
+if {[build_executable "failed to prepare" $testfile $srcfile {debug pthreads}]} {
|
|
||||||
+ return -1
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+# DETACH indicates whether "set detach-on-fork" is enabled. It is
|
|
||||||
+# either "on" or "off".
|
|
||||||
+
|
|
||||||
+proc test_vfork {detach} {
|
|
||||||
+ global binfile
|
|
||||||
+
|
|
||||||
+ clean_restart $binfile
|
|
||||||
+
|
|
||||||
+ if ![runto_main] then {
|
|
||||||
+ fail "can't run to main"
|
|
||||||
+ return 0
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ delete_breakpoints
|
|
||||||
+
|
|
||||||
+ gdb_test_no_output "set follow-fork-mode child"
|
|
||||||
+ gdb_test_no_output "set detach-on-fork $detach"
|
|
||||||
+
|
|
||||||
+ if {$detach == "off"} {
|
|
||||||
+ gdb_test "continue" \
|
|
||||||
+ [multi_line \
|
|
||||||
+ "Attaching after .* vfork to child .*" \
|
|
||||||
+ ".*New inferior 2 .*" \
|
|
||||||
+ ".* is executing new program: .*" \
|
|
||||||
+ ".*Inferior 2 .* exited normally.*"]
|
|
||||||
+ } else {
|
|
||||||
+ gdb_test "continue" \
|
|
||||||
+ [multi_line \
|
|
||||||
+ "Attaching after .* vfork to child .*" \
|
|
||||||
+ ".*New inferior 2 .*" \
|
|
||||||
+ ".*Detaching vfork parent process .* after child exec.*" \
|
|
||||||
+ ".*Inferior 1 .* detached.*" \
|
|
||||||
+ ".*is executing new program: .*" \
|
|
||||||
+ ".*Inferior 2 .*exited normally.*"]
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+foreach_with_prefix detach-on-fork {"off" "on"} {
|
|
||||||
+ test_vfork ${detach-on-fork}
|
|
||||||
+}
|
|
||||||
diff --git a/gdb/testsuite/gdb.threads/vfork-follow-child-exit.c b/gdb/testsuite/gdb.threads/vfork-follow-child-exit.c
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..6ae254cce9
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/gdb/testsuite/gdb.threads/vfork-follow-child-exit.c
|
|
||||||
@@ -0,0 +1,52 @@
|
|
||||||
+/* This testcase is part of GDB, the GNU debugger.
|
|
||||||
+
|
|
||||||
+ Copyright 2019 Free Software Foundation, Inc.
|
|
||||||
+
|
|
||||||
+ This program is free software; you can redistribute it and/or modify
|
|
||||||
+ it under the terms of the GNU General Public License as published by
|
|
||||||
+ the Free Software Foundation; either version 3 of the License, or
|
|
||||||
+ (at your option) any later version.
|
|
||||||
+
|
|
||||||
+ This program is distributed in the hope that it will be useful,
|
|
||||||
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
+ GNU General Public License for more details.
|
|
||||||
+
|
|
||||||
+ You should have received a copy of the GNU General Public License
|
|
||||||
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
||||||
+
|
|
||||||
+#include <stdio.h>
|
|
||||||
+#include <unistd.h>
|
|
||||||
+#include <pthread.h>
|
|
||||||
+
|
|
||||||
+static void *
|
|
||||||
+f (void *arg)
|
|
||||||
+{
|
|
||||||
+ int res = vfork ();
|
|
||||||
+
|
|
||||||
+ if (res == -1)
|
|
||||||
+ {
|
|
||||||
+ perror ("vfork");
|
|
||||||
+ return NULL;
|
|
||||||
+ }
|
|
||||||
+ else if (res == 0)
|
|
||||||
+ {
|
|
||||||
+ /* Child. */
|
|
||||||
+ _exit (0);
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ /* Parent. */
|
|
||||||
+ return NULL;
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int
|
|
||||||
+main (void)
|
|
||||||
+{
|
|
||||||
+ pthread_t tid;
|
|
||||||
+
|
|
||||||
+ pthread_create (&tid, NULL, f, NULL);
|
|
||||||
+ pthread_join (tid, NULL);
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
diff --git a/gdb/testsuite/gdb.threads/vfork-follow-child-exit.exp b/gdb/testsuite/gdb.threads/vfork-follow-child-exit.exp
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..f07215d41c
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/gdb/testsuite/gdb.threads/vfork-follow-child-exit.exp
|
|
||||||
@@ -0,0 +1,60 @@
|
|
||||||
+# Copyright (C) 2019 Free Software Foundation, Inc.
|
|
||||||
+
|
|
||||||
+# This program is free software; you can redistribute it and/or modify
|
|
||||||
+# it under the terms of the GNU General Public License as published by
|
|
||||||
+# the Free Software Foundation; either version 3 of the License, or
|
|
||||||
+# (at your option) any later version.
|
|
||||||
+#
|
|
||||||
+# This program is distributed in the hope that it will be useful,
|
|
||||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
+# GNU General Public License for more details.
|
|
||||||
+#
|
|
||||||
+# You should have received a copy of the GNU General Public License
|
|
||||||
+# along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
||||||
+
|
|
||||||
+# Test following a vfork child that exits, when the vfork parent is a
|
|
||||||
+# threaded program, and it's a non-main thread that vforks.
|
|
||||||
+
|
|
||||||
+standard_testfile
|
|
||||||
+
|
|
||||||
+if {[build_executable "failed to prepare" $testfile $srcfile {debug pthreads}]} {
|
|
||||||
+ return -1
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+# DETACH indicates whether "set detach-on-fork" is enabled. It is
|
|
||||||
+# either "on" or "off".
|
|
||||||
+
|
|
||||||
+proc test_vfork {detach} {
|
|
||||||
+ global binfile
|
|
||||||
+
|
|
||||||
+ clean_restart $binfile
|
|
||||||
+
|
|
||||||
+ if ![runto_main] then {
|
|
||||||
+ fail "can't run to main"
|
|
||||||
+ return 0
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ gdb_test_no_output "set follow-fork-mode child"
|
|
||||||
+ gdb_test_no_output "set detach-on-fork $detach"
|
|
||||||
+
|
|
||||||
+ if {$detach == "off"} {
|
|
||||||
+ gdb_test "continue" \
|
|
||||||
+ [multi_line \
|
|
||||||
+ "Attaching after .* vfork to child .*" \
|
|
||||||
+ ".*New inferior 2 .*" \
|
|
||||||
+ ".*Inferior 2 .*exited normally.*"]
|
|
||||||
+ } else {
|
|
||||||
+ gdb_test "continue" \
|
|
||||||
+ [multi_line \
|
|
||||||
+ "Attaching after .* vfork to child .*" \
|
|
||||||
+ ".*New inferior 2 .*" \
|
|
||||||
+ ".*Detaching vfork parent process .* after child exit.*" \
|
|
||||||
+ ".*Inferior 1 .* detached.*" \
|
|
||||||
+ ".*Inferior 2 .*exited normally.*"]
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+foreach_with_prefix detach-on-fork {"off" "on"} {
|
|
||||||
+ test_vfork ${detach-on-fork}
|
|
||||||
+}
|
|
@ -16,22 +16,6 @@ Stop the BFD library from issuing a warning message when processing allocated se
|
|||||||
in a debuginfo file.
|
in a debuginfo file.
|
||||||
* elf-bfd.h (is_debuginfo_file): Prototype.
|
* elf-bfd.h (is_debuginfo_file): Prototype.
|
||||||
|
|
||||||
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
|
|
||||||
--- a/bfd/ChangeLog
|
|
||||||
+++ b/bfd/ChangeLog
|
|
||||||
@@ -1,3 +1,12 @@
|
|
||||||
+2019-07-02 Nick Clifton <nickc@redhat.com>
|
|
||||||
+
|
|
||||||
+ PR 24717
|
|
||||||
+ * elf.c (is_debuginfo_file): New function.
|
|
||||||
+ (assign_file_positions_for_non_load_sections): Do not warn about
|
|
||||||
+ allocated sections outside of loadable segments if they are found
|
|
||||||
+ in a debuginfo file.
|
|
||||||
+ * elf-bfd.h (is_debuginfo_file): Prototype.
|
|
||||||
+
|
|
||||||
2019-05-02 Nick Clifton <nickc@redhat.com>
|
|
||||||
|
|
||||||
PR 24493
|
|
||||||
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
|
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
|
||||||
--- a/bfd/elf-bfd.h
|
--- a/bfd/elf-bfd.h
|
||||||
+++ b/bfd/elf-bfd.h
|
+++ b/bfd/elf-bfd.h
|
||||||
|
@ -20,19 +20,6 @@ gdb/testsuite/ChangeLog
|
|||||||
* gdb.base/style.exp: Use "style".
|
* gdb.base/style.exp: Use "style".
|
||||||
* lib/gdb-utils.exp (style): New proc.
|
* lib/gdb-utils.exp (style): New proc.
|
||||||
|
|
||||||
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
|
|
||||||
--- a/gdb/testsuite/ChangeLog
|
|
||||||
+++ b/gdb/testsuite/ChangeLog
|
|
||||||
@@ -1,3 +1,9 @@
|
|
||||||
+2019-05-22 Tom Tromey <tromey@adacore.com>
|
|
||||||
+
|
|
||||||
+ * gdb.base/info-shared.exp (check_info_shared): Use "style".
|
|
||||||
+ * gdb.base/style.exp: Use "style".
|
|
||||||
+ * lib/gdb-utils.exp (style): New proc.
|
|
||||||
+
|
|
||||||
2019-04-30 Tom Tromey <tromey@adacore.com>
|
|
||||||
|
|
||||||
PR c++/24470:
|
|
||||||
diff --git a/gdb/testsuite/gdb.base/style.exp b/gdb/testsuite/gdb.base/style.exp
|
diff --git a/gdb/testsuite/gdb.base/style.exp b/gdb/testsuite/gdb.base/style.exp
|
||||||
--- a/gdb/testsuite/gdb.base/style.exp
|
--- a/gdb/testsuite/gdb.base/style.exp
|
||||||
+++ b/gdb/testsuite/gdb.base/style.exp
|
+++ b/gdb/testsuite/gdb.base/style.exp
|
||||||
|
@ -36,23 +36,6 @@ gdb/testsuite/ChangeLog
|
|||||||
PR gdb/24502:
|
PR gdb/24502:
|
||||||
* gdb.base/style-logging.exp: New file.
|
* gdb.base/style-logging.exp: New file.
|
||||||
|
|
||||||
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
|
|
||||||
--- a/gdb/ChangeLog
|
|
||||||
+++ b/gdb/ChangeLog
|
|
||||||
@@ -1,3 +1,13 @@
|
|
||||||
+2019-06-14 Tom Tromey <tromey@adacore.com>
|
|
||||||
+
|
|
||||||
+ PR gdb/24502:
|
|
||||||
+ * ui-style.h (skip_ansi_escape): Update comment.
|
|
||||||
+ * ui-file.h (class no_terminal_escape_file): New class.
|
|
||||||
+ * ui-file.c (no_terminal_escape_file::write)
|
|
||||||
+ (no_terminal_escape_file::puts): New methods.
|
|
||||||
+ * cli/cli-logging.c (handle_redirections): Use
|
|
||||||
+ no_terminal_escape_file.
|
|
||||||
+
|
|
||||||
2019-05-15 Sergio Durigan Junior <sergiodj@redhat.com>
|
|
||||||
|
|
||||||
Ref.: https://bugzilla.redhat.com/show_bug.cgi?id=1708192
|
|
||||||
diff --git a/gdb/cli/cli-logging.c b/gdb/cli/cli-logging.c
|
diff --git a/gdb/cli/cli-logging.c b/gdb/cli/cli-logging.c
|
||||||
--- a/gdb/cli/cli-logging.c
|
--- a/gdb/cli/cli-logging.c
|
||||||
+++ b/gdb/cli/cli-logging.c
|
+++ b/gdb/cli/cli-logging.c
|
||||||
@ -65,18 +48,6 @@ diff --git a/gdb/cli/cli-logging.c b/gdb/cli/cli-logging.c
|
|||||||
if (!log->open (logging_filename, logging_overwrite ? "w" : "a"))
|
if (!log->open (logging_filename, logging_overwrite ? "w" : "a"))
|
||||||
perror_with_name (_("set logging"));
|
perror_with_name (_("set logging"));
|
||||||
|
|
||||||
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
|
|
||||||
--- a/gdb/testsuite/ChangeLog
|
|
||||||
+++ b/gdb/testsuite/ChangeLog
|
|
||||||
@@ -1,3 +1,8 @@
|
|
||||||
+2019-06-14 Tom Tromey <tromey@adacore.com>
|
|
||||||
+
|
|
||||||
+ PR gdb/24502:
|
|
||||||
+ * gdb.base/style-logging.exp: New file.
|
|
||||||
+
|
|
||||||
2019-05-22 Tom Tromey <tromey@adacore.com>
|
|
||||||
|
|
||||||
* gdb.base/info-shared.exp (check_info_shared): Use "style".
|
|
||||||
diff --git a/gdb/testsuite/gdb.base/style-logging.exp b/gdb/testsuite/gdb.base/style-logging.exp
|
diff --git a/gdb/testsuite/gdb.base/style-logging.exp b/gdb/testsuite/gdb.base/style-logging.exp
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
|
@ -15,17 +15,6 @@ gdb/testsuite/ChangeLog:
|
|||||||
|
|
||||||
* gdb.base/style-logging.exp: Remove path from test name.
|
* gdb.base/style-logging.exp: Remove path from test name.
|
||||||
|
|
||||||
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
|
|
||||||
--- a/gdb/testsuite/ChangeLog
|
|
||||||
+++ b/gdb/testsuite/ChangeLog
|
|
||||||
@@ -1,3 +1,7 @@
|
|
||||||
+2019-06-15 Andrew Burgess <andrew.burgess@embecosm.com>
|
|
||||||
+
|
|
||||||
+ * gdb.base/style-logging.exp: Remove path from test name.
|
|
||||||
+
|
|
||||||
2019-06-14 Tom Tromey <tromey@adacore.com>
|
|
||||||
|
|
||||||
PR gdb/24502:
|
|
||||||
diff --git a/gdb/testsuite/gdb.base/style-logging.exp b/gdb/testsuite/gdb.base/style-logging.exp
|
diff --git a/gdb/testsuite/gdb.base/style-logging.exp b/gdb/testsuite/gdb.base/style-logging.exp
|
||||||
--- a/gdb/testsuite/gdb.base/style-logging.exp
|
--- a/gdb/testsuite/gdb.base/style-logging.exp
|
||||||
+++ b/gdb/testsuite/gdb.base/style-logging.exp
|
+++ b/gdb/testsuite/gdb.base/style-logging.exp
|
||||||
|
@ -41,19 +41,6 @@ gdb/ChangeLog:
|
|||||||
* dwarf2read.c (dwarf_decode_macro_bytes): Check whether 'body' is
|
* dwarf2read.c (dwarf_decode_macro_bytes): Check whether 'body' is
|
||||||
NULL, and complain if that's the case.
|
NULL, and complain if that's the case.
|
||||||
|
|
||||||
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
|
|
||||||
--- a/gdb/ChangeLog
|
|
||||||
+++ b/gdb/ChangeLog
|
|
||||||
@@ -1,3 +1,9 @@
|
|
||||||
+2019-05-15 Sergio Durigan Junior <sergiodj@redhat.com>
|
|
||||||
+
|
|
||||||
+ Ref.: https://bugzilla.redhat.com/show_bug.cgi?id=1708192
|
|
||||||
+ * dwarf2read.c (parse_macro_definition): Check whether 'body' is
|
|
||||||
+ NULL, and complain/return if that's the case.
|
|
||||||
+
|
|
||||||
2019-05-11 Joel Brobecker <brobecker@adacore.com>
|
|
||||||
|
|
||||||
* version.in: Set GDB version number to 8.3.
|
|
||||||
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
|
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
|
||||||
--- a/gdb/dwarf2read.c
|
--- a/gdb/dwarf2read.c
|
||||||
+++ b/gdb/dwarf2read.c
|
+++ b/gdb/dwarf2read.c
|
||||||
|
@ -96,20 +96,6 @@ gdb/ChangeLog:
|
|||||||
* python/python.c (do_start_initialization): Use 'xmalloc'
|
* python/python.c (do_start_initialization): Use 'xmalloc'
|
||||||
instead of 'PyMem_Malloc'.
|
instead of 'PyMem_Malloc'.
|
||||||
|
|
||||||
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
|
|
||||||
--- a/gdb/ChangeLog
|
|
||||||
+++ b/gdb/ChangeLog
|
|
||||||
@@ -1,3 +1,10 @@
|
|
||||||
+2019-06-28 Sergio Durigan Junior <sergiodj@redhat.com>
|
|
||||||
+
|
|
||||||
+ PR python/24742
|
|
||||||
+ https://bugzilla.redhat.com/show_bug.cgi?id=1723564
|
|
||||||
+ * python/python.c (do_start_initialization): Use 'xmalloc'
|
|
||||||
+ instead of 'PyMem_Malloc'.
|
|
||||||
+
|
|
||||||
2019-06-14 Tom Tromey <tromey@adacore.com>
|
|
||||||
|
|
||||||
PR gdb/24502:
|
|
||||||
diff --git a/gdb/python/python.c b/gdb/python/python.c
|
diff --git a/gdb/python/python.c b/gdb/python/python.c
|
||||||
--- a/gdb/python/python.c
|
--- a/gdb/python/python.c
|
||||||
+++ b/gdb/python/python.c
|
+++ b/gdb/python/python.c
|
||||||
|
@ -1,173 +0,0 @@
|
|||||||
From 766f883622ef008230250aa5aecef9fb9b29f233 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Alan Hayward <alan.hayward@arm.com>
|
|
||||||
Date: Tue, 28 May 2019 10:07:54 +0100
|
|
||||||
Subject: [PATCH] Suppress SIGTTOU when handling errors
|
|
||||||
|
|
||||||
Calls to error () can cause SIGTTOU to send gdb to the background.
|
|
||||||
|
|
||||||
For example, on an Arm build:
|
|
||||||
(gdb) b main
|
|
||||||
Breakpoint 1 at 0x10774: file /build/gdb/testsuite/../../../src/binutils-gdb/gdb/testsuite/gdb.base/watchpoint.c, line 174.
|
|
||||||
(gdb) r
|
|
||||||
Starting program: /build/gdb/testsuite/outputs/gdb.base/watchpoint/watchpoint
|
|
||||||
|
|
||||||
[1]+ Stopped ../gdb ./outputs/gdb.base/watchpoint/watchpoint
|
|
||||||
localhost$ fg
|
|
||||||
../gdb ./outputs/gdb.base/watchpoint/watchpoint
|
|
||||||
Cannot parse expression `.L1199 4@r4'.
|
|
||||||
warning: Probes-based dynamic linker interface failed.
|
|
||||||
Reverting to original interface.
|
|
||||||
|
|
||||||
The SIGTTOU is raised whilst inside a syscall during the call to tcdrain.
|
|
||||||
Fix is to use scoped_ignore_sigttou to ensure SIGTTOU is blocked.
|
|
||||||
|
|
||||||
In addition fix include comments - job_control is not included via terminal.h
|
|
||||||
|
|
||||||
gdb/ChangeLog:
|
|
||||||
|
|
||||||
* event-top.c: Remove include comment.
|
|
||||||
* inflow.c (class scoped_ignore_sigttou): Move from here...
|
|
||||||
* inflow.h (class scoped_ignore_sigttou): ...to here.
|
|
||||||
* ser-unix.c (hardwire_drain_output): Block SIGTTOU during drain.
|
|
||||||
* top.c: Remove include comment.
|
|
||||||
---
|
|
||||||
gdb/ChangeLog | 8 ++++++++
|
|
||||||
gdb/event-top.c | 2 +-
|
|
||||||
gdb/inflow.c | 29 -----------------------------
|
|
||||||
gdb/inflow.h | 31 +++++++++++++++++++++++++++++++
|
|
||||||
gdb/ser-unix.c | 4 ++++
|
|
||||||
gdb/top.c | 2 +-
|
|
||||||
6 files changed, 45 insertions(+), 31 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/gdb/event-top.c b/gdb/event-top.c
|
|
||||||
index 3ccf136ff12..93b7d2d28bc 100644
|
|
||||||
--- a/gdb/event-top.c
|
|
||||||
+++ b/gdb/event-top.c
|
|
||||||
@@ -24,7 +24,7 @@
|
|
||||||
#include "inferior.h"
|
|
||||||
#include "infrun.h"
|
|
||||||
#include "target.h"
|
|
||||||
-#include "terminal.h" /* for job_control */
|
|
||||||
+#include "terminal.h"
|
|
||||||
#include "event-loop.h"
|
|
||||||
#include "event-top.h"
|
|
||||||
#include "interps.h"
|
|
||||||
diff --git a/gdb/inflow.c b/gdb/inflow.c
|
|
||||||
index 339b55c0bc6..eba7a931f46 100644
|
|
||||||
--- a/gdb/inflow.c
|
|
||||||
+++ b/gdb/inflow.c
|
|
||||||
@@ -106,35 +106,6 @@ static serial_ttystate initial_gdb_ttystate;
|
|
||||||
|
|
||||||
static struct terminal_info *get_inflow_inferior_data (struct inferior *);
|
|
||||||
|
|
||||||
-/* RAII class used to ignore SIGTTOU in a scope. */
|
|
||||||
-
|
|
||||||
-class scoped_ignore_sigttou
|
|
||||||
-{
|
|
||||||
-public:
|
|
||||||
- scoped_ignore_sigttou ()
|
|
||||||
- {
|
|
||||||
-#ifdef SIGTTOU
|
|
||||||
- if (job_control)
|
|
||||||
- m_osigttou = signal (SIGTTOU, SIG_IGN);
|
|
||||||
-#endif
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- ~scoped_ignore_sigttou ()
|
|
||||||
- {
|
|
||||||
-#ifdef SIGTTOU
|
|
||||||
- if (job_control)
|
|
||||||
- signal (SIGTTOU, m_osigttou);
|
|
||||||
-#endif
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- DISABLE_COPY_AND_ASSIGN (scoped_ignore_sigttou);
|
|
||||||
-
|
|
||||||
-private:
|
|
||||||
-#ifdef SIGTTOU
|
|
||||||
- sighandler_t m_osigttou = NULL;
|
|
||||||
-#endif
|
|
||||||
-};
|
|
||||||
-
|
|
||||||
/* While the inferior is running, we want SIGINT and SIGQUIT to go to the
|
|
||||||
inferior only. If we have job control, that takes care of it. If not,
|
|
||||||
we save our handlers in these two variables and set SIGINT and SIGQUIT
|
|
||||||
diff --git a/gdb/inflow.h b/gdb/inflow.h
|
|
||||||
index c32aa144331..5dd5c37bd2b 100644
|
|
||||||
--- a/gdb/inflow.h
|
|
||||||
+++ b/gdb/inflow.h
|
|
||||||
@@ -21,5 +21,36 @@
|
|
||||||
#define INFLOW_H
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
+#include <signal.h>
|
|
||||||
+#include "common/job-control.h"
|
|
||||||
+
|
|
||||||
+/* RAII class used to ignore SIGTTOU in a scope. */
|
|
||||||
+
|
|
||||||
+class scoped_ignore_sigttou
|
|
||||||
+{
|
|
||||||
+public:
|
|
||||||
+ scoped_ignore_sigttou ()
|
|
||||||
+ {
|
|
||||||
+#ifdef SIGTTOU
|
|
||||||
+ if (job_control)
|
|
||||||
+ m_osigttou = signal (SIGTTOU, SIG_IGN);
|
|
||||||
+#endif
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ ~scoped_ignore_sigttou ()
|
|
||||||
+ {
|
|
||||||
+#ifdef SIGTTOU
|
|
||||||
+ if (job_control)
|
|
||||||
+ signal (SIGTTOU, m_osigttou);
|
|
||||||
+#endif
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ DISABLE_COPY_AND_ASSIGN (scoped_ignore_sigttou);
|
|
||||||
+
|
|
||||||
+private:
|
|
||||||
+#ifdef SIGTTOU
|
|
||||||
+ sighandler_t m_osigttou = NULL;
|
|
||||||
+#endif
|
|
||||||
+};
|
|
||||||
|
|
||||||
#endif /* inflow.h */
|
|
||||||
diff --git a/gdb/ser-unix.c b/gdb/ser-unix.c
|
|
||||||
index 5a9965bf744..3492619f2d6 100644
|
|
||||||
--- a/gdb/ser-unix.c
|
|
||||||
+++ b/gdb/ser-unix.c
|
|
||||||
@@ -32,6 +32,7 @@
|
|
||||||
#include "gdbcmd.h"
|
|
||||||
#include "common/filestuff.h"
|
|
||||||
#include <termios.h>
|
|
||||||
+#include "inflow.h"
|
|
||||||
|
|
||||||
struct hardwire_ttystate
|
|
||||||
{
|
|
||||||
@@ -164,6 +165,9 @@ hardwire_print_tty_state (struct serial *scb,
|
|
||||||
static int
|
|
||||||
hardwire_drain_output (struct serial *scb)
|
|
||||||
{
|
|
||||||
+ /* Ignore SIGTTOU which may occur during the drain. */
|
|
||||||
+ scoped_ignore_sigttou ignore_sigttou;
|
|
||||||
+
|
|
||||||
return tcdrain (scb->fd);
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/gdb/top.c b/gdb/top.c
|
|
||||||
index bacd684dbaa..1e17ebee87c 100644
|
|
||||||
--- a/gdb/top.c
|
|
||||||
+++ b/gdb/top.c
|
|
||||||
@@ -34,7 +34,7 @@
|
|
||||||
#include "expression.h"
|
|
||||||
#include "value.h"
|
|
||||||
#include "language.h"
|
|
||||||
-#include "terminal.h" /* For job_control. */
|
|
||||||
+#include "terminal.h"
|
|
||||||
#include "common/job-control.h"
|
|
||||||
#include "annotate.h"
|
|
||||||
#include "completer.h"
|
|
||||||
--
|
|
||||||
2.21.0
|
|
||||||
|
|
@ -1,97 +0,0 @@
|
|||||||
commit ed483764bd189d61714aa6b07104abe35469175a
|
|
||||||
Author: Tom de Vries <tdevries@suse.de>
|
|
||||||
Date: Fri May 10 18:46:28 2019 +0200
|
|
||||||
|
|
||||||
[gdb/symtab] Fix symbol loading performance regression
|
|
||||||
|
|
||||||
The commit "[gdb/symtab] Fix language of duplicate static minimal symbol"
|
|
||||||
introduces a performance regression, when loading a cc1 executable build with
|
|
||||||
-O0 -g and gcc 7.4.0. The performance regression, measured in 'real' time is
|
|
||||||
about 175%.
|
|
||||||
|
|
||||||
The slower execution comes from the fact that the fix in symbol_set_names
|
|
||||||
makes the call to symbol_find_demangled_name unconditional.
|
|
||||||
|
|
||||||
Fix this by reverting the commit, and redoing the fix as follows.
|
|
||||||
|
|
||||||
Recapturing the original problem, the first time symbol_set_names is called
|
|
||||||
with gsymbol.language == lang_auto and linkage_name == "_ZL3foov", the name is
|
|
||||||
not present in the per_bfd->demangled_names_hash hash table, so
|
|
||||||
symbol_find_demangled_name is called to demangle the name, after which the
|
|
||||||
mangled/demangled pair is added to the hashtable. The call to
|
|
||||||
symbol_find_demangled_name also sets gsymbol.language to lang_cplus.
|
|
||||||
The second time symbol_set_names is called with gsymbol.language == lang_auto
|
|
||||||
and linkage_name == "_ZL3foov", the name is present in the hash table, so the
|
|
||||||
demangled name from the hash table is used. However, the language of the
|
|
||||||
symbol remains lang_auto.
|
|
||||||
|
|
||||||
Fix this by adding a field language in struct demangled_name_entry, and using
|
|
||||||
the field in symbol_set_names to set the language of gsymbol, if necessary.
|
|
||||||
|
|
||||||
Tested on x86_64-linux.
|
|
||||||
|
|
||||||
gdb/ChangeLog:
|
|
||||||
|
|
||||||
2019-05-11 Tom de Vries <tdevries@suse.de>
|
|
||||||
|
|
||||||
PR symtab/24545
|
|
||||||
* symtab.c (struct demangled_name_entry): Add language field.
|
|
||||||
(symbol_set_names): Revert "[gdb/symtab] Fix language of duplicate
|
|
||||||
static minimal symbol". Set and use language field.
|
|
||||||
|
|
||||||
diff --git a/gdb/symtab.c b/gdb/symtab.c
|
|
||||||
index 130d5cd48f..44964533ee 100644
|
|
||||||
--- a/gdb/symtab.c
|
|
||||||
+++ b/gdb/symtab.c
|
|
||||||
@@ -713,6 +713,7 @@ symbol_set_language (struct general_symbol_info *gsymbol,
|
|
||||||
struct demangled_name_entry
|
|
||||||
{
|
|
||||||
const char *mangled;
|
|
||||||
+ ENUM_BITFIELD(language) language : LANGUAGE_BITS;
|
|
||||||
char demangled[1];
|
|
||||||
};
|
|
||||||
|
|
||||||
@@ -853,11 +854,6 @@ symbol_set_names (struct general_symbol_info *gsymbol,
|
|
||||||
else
|
|
||||||
linkage_name_copy = linkage_name;
|
|
||||||
|
|
||||||
- /* Set the symbol language. */
|
|
||||||
- char *demangled_name_ptr
|
|
||||||
- = symbol_find_demangled_name (gsymbol, linkage_name_copy);
|
|
||||||
- gdb::unique_xmalloc_ptr<char> demangled_name (demangled_name_ptr);
|
|
||||||
-
|
|
||||||
entry.mangled = linkage_name_copy;
|
|
||||||
slot = ((struct demangled_name_entry **)
|
|
||||||
htab_find_slot (per_bfd->demangled_names_hash,
|
|
||||||
@@ -870,7 +866,9 @@ symbol_set_names (struct general_symbol_info *gsymbol,
|
|
||||||
|| (gsymbol->language == language_go
|
|
||||||
&& (*slot)->demangled[0] == '\0'))
|
|
||||||
{
|
|
||||||
- int demangled_len = demangled_name ? strlen (demangled_name.get ()) : 0;
|
|
||||||
+ char *demangled_name = symbol_find_demangled_name (gsymbol,
|
|
||||||
+ linkage_name_copy);
|
|
||||||
+ int demangled_len = demangled_name ? strlen (demangled_name) : 0;
|
|
||||||
|
|
||||||
/* Suppose we have demangled_name==NULL, copy_name==0, and
|
|
||||||
linkage_name_copy==linkage_name. In this case, we already have the
|
|
||||||
@@ -906,12 +904,19 @@ symbol_set_names (struct general_symbol_info *gsymbol,
|
|
||||||
strcpy (mangled_ptr, linkage_name_copy);
|
|
||||||
(*slot)->mangled = mangled_ptr;
|
|
||||||
}
|
|
||||||
+ (*slot)->language = gsymbol->language;
|
|
||||||
|
|
||||||
if (demangled_name != NULL)
|
|
||||||
- strcpy ((*slot)->demangled, demangled_name.get());
|
|
||||||
+ {
|
|
||||||
+ strcpy ((*slot)->demangled, demangled_name);
|
|
||||||
+ xfree (demangled_name);
|
|
||||||
+ }
|
|
||||||
else
|
|
||||||
(*slot)->demangled[0] = '\0';
|
|
||||||
}
|
|
||||||
+ else if (gsymbol->language == language_unknown
|
|
||||||
+ || gsymbol->language == language_auto)
|
|
||||||
+ gsymbol->language = (*slot)->language;
|
|
||||||
|
|
||||||
gsymbol->name = (*slot)->mangled;
|
|
||||||
if ((*slot)->demangled[0] != '\0')
|
|
948
gdb-testsuite-8.3-kfail-xfail-unsupported.patch
Normal file
948
gdb-testsuite-8.3-kfail-xfail-unsupported.patch
Normal file
@ -0,0 +1,948 @@
|
|||||||
|
- [gdb/testsuite] Add -early pattern flag for gdb_test_multiple
|
||||||
|
- [gdb/testsuite] Mark watchthreads-reorder.exp FAIL as KFAIL
|
||||||
|
- [gdb/testsuite] Allow some tests in gdb.base/restore.exp to be unsupported
|
||||||
|
- [gdb/testsuite] Allow some tests in gdb.base/store.exp to be unsupported
|
||||||
|
- [gdb/testsuite] Require gnatmake 8 for gdb.ada/rename_subscript_param.exp
|
||||||
|
- [gdb/tdep] Handle mxcsr kernel bug on Intel Skylake CPUs
|
||||||
|
- [gdb/testsuite] Add KFAIL for missing support of reverse-debugging of vmovd
|
||||||
|
- [gdb/testsuite] Fix incomplete regexps in step-precsave.exp
|
||||||
|
- [gdb/testsuite] Add KFAIL for missing support of reverse-debugging xsave
|
||||||
|
------------------------------------------------------------
|
||||||
|
[gdb/testsuite] Add -early pattern flag for gdb_test_multiple
|
||||||
|
|
||||||
|
[ https://sourceware.org/ml/gdb-patches/2019-09/msg00600.html ]
|
||||||
|
|
||||||
|
Proc gdb_test_multiple builds up and executes a gdb_expect expression with
|
||||||
|
pattern/action clauses. The clauses are either implicit (added by
|
||||||
|
gdb_test_multiple) or explicit (passed via the gdb_test_multiple parameter
|
||||||
|
user_code).
|
||||||
|
|
||||||
|
However, there are a few implicit clauses which are inserted before the
|
||||||
|
explicit ones, making sure those take precedence.
|
||||||
|
|
||||||
|
Add an -early pattern flag for a gdb_test_multiple user_code clause to specify
|
||||||
|
that the clause needs to be inserted before any implicit clause.
|
||||||
|
|
||||||
|
Tested on x86_64-linux.
|
||||||
|
|
||||||
|
gdb/testsuite/ChangeLog:
|
||||||
|
|
||||||
|
2019-09-12 Tom de Vries <tdevries@suse.de>
|
||||||
|
|
||||||
|
* lib/gdb.exp (gdb_test_multiple): Handle -early pattern flag.
|
||||||
|
|
||||||
|
------------------------------------------------------------
|
||||||
|
[gdb/testsuite] Mark watchthreads-reorder.exp FAIL as KFAIL
|
||||||
|
|
||||||
|
[ https://sourceware.org/ml/gdb-patches/2019-09/msg00221.html ]
|
||||||
|
|
||||||
|
When running gdb.threads/watchthreads-reorder.exp in parallel with:
|
||||||
|
...
|
||||||
|
$ n=$(grep -c processor /proc/cpuinfo); n=$((($n + 1) / 2)); stress -c $n
|
||||||
|
...
|
||||||
|
there's a reasonable change to trigger an internal gdb error:
|
||||||
|
...
|
||||||
|
$ for n in $(seq 1 10); do ./test.sh; done 2>&1 \
|
||||||
|
| grep "expected passes" \
|
||||||
|
| sort \
|
||||||
|
| uniq -c
|
||||||
|
1 # of expected passes 14
|
||||||
|
2 # of expected passes 15
|
||||||
|
1 # of expected passes 16
|
||||||
|
6 # of expected passes 17
|
||||||
|
...
|
||||||
|
which look like this in gdb.sum:
|
||||||
|
...
|
||||||
|
FAIL: gdb.threads/watchthreads-reorder.exp: reorder1: continue to breakpoint: \
|
||||||
|
break-at-exit (GDB internal error)
|
||||||
|
...
|
||||||
|
|
||||||
|
This FAIL is filed as PR gdb/24995 and fixed on master by commit c29705b71a
|
||||||
|
"Fix internal error and improve 'set debug infrun 1'/target wait kind trace".
|
||||||
|
|
||||||
|
Mark this as KFAIL for the 8.3 branch.
|
||||||
|
|
||||||
|
It's trivial to do this by adding a setup_kfail:
|
||||||
|
...
|
||||||
|
+ setup_kfail gdb/24995 "*-*-*"
|
||||||
|
gdb_continue_to_breakpoint "break-at-exit" ".*break-at-exit.*"
|
||||||
|
...
|
||||||
|
but we'll get a fair amount of KPASSES:
|
||||||
|
...
|
||||||
|
KPASS: gdb.threads/watchthreads-reorder.exp: reorder0: \
|
||||||
|
continue to breakpoint: break-at-exit (PRMS gdb/24995)
|
||||||
|
KPASS: gdb.threads/watchthreads-reorder.exp: reorder1: \
|
||||||
|
continue to breakpoint: break-at-exit (PRMS gdb/24995)
|
||||||
|
...
|
||||||
|
|
||||||
|
Instead, do this more precise by only KFAILing in case the internal error is
|
||||||
|
detected.
|
||||||
|
|
||||||
|
Tested on x86_64-linux.
|
||||||
|
|
||||||
|
gdb/testsuite/ChangeLog:
|
||||||
|
|
||||||
|
2019-09-12 Tom de Vries <tdevries@suse.de>
|
||||||
|
|
||||||
|
* gdb.threads/watchthreads-reorder.exp: Add PR gdb/24995 KFAIL.
|
||||||
|
|
||||||
|
------------------------------------------------------------
|
||||||
|
[gdb/testsuite] Allow some tests in gdb.base/restore.exp to be unsupported
|
||||||
|
|
||||||
|
[ Backport of master commit 77d036789aa. ]
|
||||||
|
|
||||||
|
We currently run into:
|
||||||
|
...
|
||||||
|
248 n = callee1 (n + l5);
|
||||||
|
(gdb) PASS: gdb.base/restore.exp: caller5 calls callee1; return callee now
|
||||||
|
print l1
|
||||||
|
$51 = <optimized out>
|
||||||
|
(gdb) FAIL: gdb.base/restore.exp: caller5 calls callee1; return restored l1 \
|
||||||
|
to 32492
|
||||||
|
...
|
||||||
|
|
||||||
|
The problem is that we try to access the value of l1 in function caller5, but
|
||||||
|
variable l1 has no DW_AT_location attribute. Since l1 is declared using the
|
||||||
|
register keyword, it's valid for gcc to emit no DW_AT_location at -O0.
|
||||||
|
|
||||||
|
Change the FAIL into an UNSUPPORTED.
|
||||||
|
|
||||||
|
Tested on x86_64-linux.
|
||||||
|
|
||||||
|
gdb/testsuite/ChangeLog:
|
||||||
|
|
||||||
|
2019-09-22 Tom de Vries <tdevries@suse.de>
|
||||||
|
|
||||||
|
* gdb.base/restore.exp: Allow register variables to be optimized out at
|
||||||
|
-O0.
|
||||||
|
|
||||||
|
------------------------------------------------------------
|
||||||
|
[gdb/testsuite] Allow some tests in gdb.base/store.exp to be unsupported
|
||||||
|
|
||||||
|
[ Backport of master commit 25e5c20918a. ]
|
||||||
|
|
||||||
|
The test-case gdb.base/store.exp fails with gcc 7.4.0:
|
||||||
|
...
|
||||||
|
nr of unexpected failures 27
|
||||||
|
...
|
||||||
|
|
||||||
|
The first FAIL:
|
||||||
|
...
|
||||||
|
110 l = add_float (l, r);
|
||||||
|
(gdb) PASS: gdb.base/store.exp: continue to wack_float
|
||||||
|
print l
|
||||||
|
$21 = <optimized out>
|
||||||
|
FAIL: gdb.base/store.exp: var float l; print old l, expecting -1
|
||||||
|
...
|
||||||
|
relates to this bit in the test-case (compiled at -O0):
|
||||||
|
...
|
||||||
|
106 float
|
||||||
|
107 wack_float (register float u, register float v)
|
||||||
|
108 {
|
||||||
|
109 register float l = u, r = v;
|
||||||
|
110 l = add_float (l, r);
|
||||||
|
111 return l + r;
|
||||||
|
112 }
|
||||||
|
...
|
||||||
|
and it expects to be able to read and modify variable l before executing line
|
||||||
|
110, but it already fails to read the value, because l has no DW_AT_location
|
||||||
|
attribute in the debug info.
|
||||||
|
|
||||||
|
Variable l is declared with the register keyword, and GCC implements the
|
||||||
|
register keyword at -O0 like so:
|
||||||
|
...
|
||||||
|
the compiler allocates distinct stack memory for all variables that do not
|
||||||
|
have the register storage-class specifier; if register is specified, the
|
||||||
|
variable may have a shorter lifespan than the code would indicate and may
|
||||||
|
never be placed in memory.
|
||||||
|
...
|
||||||
|
|
||||||
|
The fact that l has no DW_AT_location attribute, matches with the documented
|
||||||
|
"variable may have a shorter lifespan that code would indicate", (though it
|
||||||
|
is the most extreme case of it) so the gcc behaviour is valid. We can of
|
||||||
|
course improve gcc to generate better debuginfo (filed gcc PR91611), but
|
||||||
|
this not a wrong-debug problem.
|
||||||
|
|
||||||
|
[ The test-case passes with gcc 4.2.1, but for the failing test discussed
|
||||||
|
above, it passes simply because it doesn't store l in a register. ]
|
||||||
|
|
||||||
|
With the debug info missing for l, reading and setting l is unsupported, so
|
||||||
|
fix the FAIL by marking the test UNSUPPORTED instead.
|
||||||
|
|
||||||
|
Tested on x86_64-linux.
|
||||||
|
|
||||||
|
gdb/testsuite/ChangeLog:
|
||||||
|
|
||||||
|
2019-09-12 Tom de Vries <tdevries@suse.de>
|
||||||
|
|
||||||
|
* gdb.base/store.exp: Allow register variables to be optimized out at
|
||||||
|
-O0.
|
||||||
|
|
||||||
|
------------------------------------------------------------
|
||||||
|
[gdb/testsuite] Require gnatmake 8 for gdb.ada/rename_subscript_param.exp
|
||||||
|
|
||||||
|
[ Backport of master commit d1b70248bde. ]
|
||||||
|
|
||||||
|
When running gdb.ada/rename_subscript_param.exp with gnatmake 7.4.1, we get:
|
||||||
|
...
|
||||||
|
FAIL: gdb.ada/rename_subscript_param.exp: print rename_subscript_param_b \
|
||||||
|
before changing its value
|
||||||
|
FAIL: gdb.ada/rename_subscript_param.exp: print rename_subscript_param_b \
|
||||||
|
after changing its value
|
||||||
|
...
|
||||||
|
|
||||||
|
The commit last touching the test-case (afcfda091e) states:
|
||||||
|
...
|
||||||
|
The test still fails with old compilers that do not properly
|
||||||
|
generate debug info for this renaming:
|
||||||
|
...
|
||||||
|
|
||||||
|
Fix this by requiring at least gnatmake 8 for the test-case.
|
||||||
|
|
||||||
|
Tested on x86_64-linux.
|
||||||
|
|
||||||
|
gdb/testsuite/ChangeLog:
|
||||||
|
|
||||||
|
2019-09-14 Tom de Vries <tdevries@suse.de>
|
||||||
|
|
||||||
|
PR teststuite/24599
|
||||||
|
* gdb.ada/rename_subscript_param.exp: Require gnatmake 8.
|
||||||
|
* lib/ada.exp (gnatmake_version_at_least): New proc.
|
||||||
|
|
||||||
|
------------------------------------------------------------
|
||||||
|
[gdb/tdep] Handle mxcsr kernel bug on Intel Skylake CPUs
|
||||||
|
|
||||||
|
[ Backport of master commit 3d4352200e3. ]
|
||||||
|
|
||||||
|
On my openSUSE Leap 15.1 x86_64 Skylake system with the default (4.12) kernel,
|
||||||
|
I run into:
|
||||||
|
...
|
||||||
|
FAIL: gdb.base/gcore.exp: corefile restored all registers
|
||||||
|
...
|
||||||
|
|
||||||
|
The problem is that there's a difference in the mxcsr register value before
|
||||||
|
and after the gcore command:
|
||||||
|
...
|
||||||
|
- mxcsr 0x0 [ ]
|
||||||
|
+ mxcsr 0x400440 [ DAZ OM ]
|
||||||
|
...
|
||||||
|
|
||||||
|
This can be traced back to amd64_linux_nat_target::fetch_registers, where
|
||||||
|
xstateregs is partially initialized by the ptrace call:
|
||||||
|
...
|
||||||
|
char xstateregs[X86_XSTATE_MAX_SIZE];
|
||||||
|
struct iovec iov;
|
||||||
|
|
||||||
|
amd64_collect_xsave (regcache, -1, xstateregs, 0);
|
||||||
|
iov.iov_base = xstateregs;
|
||||||
|
iov.iov_len = sizeof (xstateregs);
|
||||||
|
if (ptrace (PTRACE_GETREGSET, tid,
|
||||||
|
(unsigned int) NT_X86_XSTATE, (long) &iov) < 0)
|
||||||
|
perror_with_name (_("Couldn't get extended state status"));
|
||||||
|
|
||||||
|
amd64_supply_xsave (regcache, -1, xstateregs);
|
||||||
|
...
|
||||||
|
after which amd64_supply_xsave is called.
|
||||||
|
|
||||||
|
The amd64_supply_xsave call is supposed to only use initialized parts of
|
||||||
|
xstateregs, but due to a kernel bug on intel skylake (fixed from 4.14 onwards
|
||||||
|
by commit 0852b374173b "x86/fpu: Add FPU state copying quirk to handle XRSTOR
|
||||||
|
failure on Intel Skylake CPUs") it can happen that the mxcsr part of
|
||||||
|
xstateregs is not initialized, while amd64_supply_xsave expects it to be
|
||||||
|
initialized, which explains the FAIL mentioned above.
|
||||||
|
|
||||||
|
Fix the undetermined behaviour by initializing xstateregs before calling
|
||||||
|
ptrace, which makes sure we get a 0x0 for mxcsr when this kernel bug occurs,
|
||||||
|
and which also happens to fix the FAIL.
|
||||||
|
|
||||||
|
Furthermore, add an xfail for this FAIL which triggers the same kernel bug:
|
||||||
|
...
|
||||||
|
FAIL: gdb.arch/amd64-init-x87-values.exp: check_setting_mxcsr_before_enable: \
|
||||||
|
check new value of MXCSR is still in place
|
||||||
|
...
|
||||||
|
|
||||||
|
Both FAILs pass when using a 5.3 kernel instead on the system mentioned above.
|
||||||
|
|
||||||
|
Tested on x86_64-linux.
|
||||||
|
|
||||||
|
gdb/ChangeLog:
|
||||||
|
|
||||||
|
2019-09-24 Tom de Vries <tdevries@suse.de>
|
||||||
|
|
||||||
|
PR gdb/23815
|
||||||
|
* amd64-linux-nat.c (amd64_linux_nat_target::fetch_registers):
|
||||||
|
Initialize xstateregs before ptrace PTRACE_GETREGSET call.
|
||||||
|
|
||||||
|
gdb/testsuite/ChangeLog:
|
||||||
|
|
||||||
|
2019-09-24 Tom de Vries <tdevries@suse.de>
|
||||||
|
|
||||||
|
PR gdb/24598
|
||||||
|
* gdb.arch/amd64-init-x87-values.exp: Add xfail.
|
||||||
|
|
||||||
|
------------------------------------------------------------
|
||||||
|
[gdb/testsuite] Add KFAIL for missing support of reverse-debugging of vmovd
|
||||||
|
|
||||||
|
[ Backport of master commit 68f7d34dd50. ]
|
||||||
|
|
||||||
|
On my openSUSE Leap 15.1 system I run into:
|
||||||
|
...
|
||||||
|
(gdb) PASS: gdb.reverse/step-precsave.exp: turn on process record
|
||||||
|
break 76^M
|
||||||
|
Breakpoint 2 at 0x400654: file step-reverse.c, line 76.^M
|
||||||
|
(gdb) PASS: gdb.reverse/step-precsave.exp: breakpoint at end of main
|
||||||
|
continue^M
|
||||||
|
Continuing.^M
|
||||||
|
Process record does not support instruction 0xc5 at address 0x7ffff783fc70.^M
|
||||||
|
Process record: failed to record execution log.^M
|
||||||
|
^M
|
||||||
|
Program stopped.^M
|
||||||
|
0x00007ffff783fc70 in __memset_avx2_unaligned_erms () from /lib64/libc.so.6^M
|
||||||
|
(gdb) FAIL: gdb.reverse/step-precsave.exp: run to end of main
|
||||||
|
...
|
||||||
|
|
||||||
|
The problem is that the vmovd instruction is not supported in
|
||||||
|
reverse-debugging (PR record/23188).
|
||||||
|
|
||||||
|
Add a KFAIL for this PR.
|
||||||
|
|
||||||
|
Tested on x86_64-linux.
|
||||||
|
|
||||||
|
gdb/testsuite/ChangeLog:
|
||||||
|
|
||||||
|
2019-09-27 Tom de Vries <tdevries@suse.de>
|
||||||
|
|
||||||
|
PR record/23188
|
||||||
|
* gdb.reverse/step-precsave.exp: Add kfail for PR record/23188.
|
||||||
|
|
||||||
|
------------------------------------------------------------
|
||||||
|
[gdb/testsuite] Fix incomplete regexps in step-precsave.exp
|
||||||
|
|
||||||
|
[ Backport of master commit 060b3ab4eda. ]
|
||||||
|
|
||||||
|
The commit 68f7d34dd50 "[gdb/testsuite] Add KFAIL for missing support of
|
||||||
|
reverse-debugging of vmovd" rewrites a gdb_test into a gdb_test_multiple but
|
||||||
|
forgets to add the $gdb_prompt part in the regexp.
|
||||||
|
|
||||||
|
Add the missing parts of the regexps.
|
||||||
|
|
||||||
|
Tested on x86_64-linux.
|
||||||
|
|
||||||
|
gdb/testsuite/ChangeLog:
|
||||||
|
|
||||||
|
2019-09-27 Tom de Vries <tdevries@suse.de>
|
||||||
|
|
||||||
|
* gdb.reverse/step-precsave.exp: Add missing $gdb_prompt in regexps.
|
||||||
|
|
||||||
|
------------------------------------------------------------
|
||||||
|
[gdb/testsuite] Add KFAIL for missing support of reverse-debugging xsave
|
||||||
|
|
||||||
|
[ https://sourceware.org/ml/gdb-patches/2019-09/msg00557.html ]
|
||||||
|
|
||||||
|
Normally the gdb.reverse/*.exp test-cases pass on my system (apart from the
|
||||||
|
record/23188 KFAIL for gdb.reverse/step-precsave.exp). But when specifying
|
||||||
|
GLIBC_TUNABLES=glibc.tune.hwcaps=-XSAVEC_Usable to force glibc to use
|
||||||
|
_dl_runtime_resolve_xsave instead of _dl_runtime_resolve_xsavec, we run into
|
||||||
|
1054 FAILs like this:
|
||||||
|
...
|
||||||
|
(gdb) PASS: gdb.reverse/sigall-reverse.exp: b gen_HUP
|
||||||
|
continue^M
|
||||||
|
Continuing.^M
|
||||||
|
Process record does not support instruction 0xfae64 at address \
|
||||||
|
0x7ffff7ded958.^M
|
||||||
|
Process record: failed to record execution log.^M
|
||||||
|
^M
|
||||||
|
Program stopped.^M
|
||||||
|
0x00007ffff7ded958 in _dl_runtime_resolve_xsave () from \
|
||||||
|
/lib64/ld-linux-x86-64.so.2^M
|
||||||
|
(gdb) FAIL: gdb.reverse/sigall-reverse.exp: get signal ABRT
|
||||||
|
...
|
||||||
|
|
||||||
|
The problem is that the xsave instruction is not supported in
|
||||||
|
reverse-debugging (PR record/25038).
|
||||||
|
|
||||||
|
Add KFAILs for this PR.
|
||||||
|
|
||||||
|
Tested on x86_64-linux.
|
||||||
|
|
||||||
|
gdb/testsuite/ChangeLog:
|
||||||
|
|
||||||
|
2019-09-27 Tom de Vries <tdevries@suse.de>
|
||||||
|
|
||||||
|
PR record/25038
|
||||||
|
* gdb.reverse/sigall-precsave.exp: Add PR record/25038 KFAIL.
|
||||||
|
* gdb.reverse/sigall-reverse.exp: Same.
|
||||||
|
* gdb.reverse/solib-precsave.exp: Same.
|
||||||
|
* gdb.reverse/solib-reverse.exp: Same.
|
||||||
|
* gdb.reverse/step-precsave.exp: Same.
|
||||||
|
* gdb.reverse/until-precsave.exp: Same.
|
||||||
|
* gdb.reverse/until-reverse.exp: Same.
|
||||||
|
* lib/gdb.exp (gdb_continue_to_breakpoint): Same.
|
||||||
|
|
||||||
|
------------------------------------------------------------
|
||||||
|
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
|
||||||
|
index 3d5f8726f7f..5f1bc4d84b7 100644
|
||||||
|
--- a/gdb/testsuite/lib/gdb.exp
|
||||||
|
+++ b/gdb/testsuite/lib/gdb.exp
|
||||||
|
@@ -798,37 +798,44 @@ proc gdb_test_multiple { command message user_code } {
|
||||||
|
set subst_code [uplevel list $subst_code]
|
||||||
|
|
||||||
|
set processed_code ""
|
||||||
|
+ set early_processed_code ""
|
||||||
|
+ set current_list processed_code
|
||||||
|
set patterns ""
|
||||||
|
set expecting_action 0
|
||||||
|
set expecting_arg 0
|
||||||
|
foreach item $user_code subst_item $subst_code {
|
||||||
|
if { $item == "-n" || $item == "-notransfer" || $item == "-nocase" } {
|
||||||
|
- lappend processed_code $item
|
||||||
|
+ lappend $current_list $item
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if { $item == "-indices" || $item == "-re" || $item == "-ex" } {
|
||||||
|
- lappend processed_code $item
|
||||||
|
+ lappend $current_list $item
|
||||||
|
+ continue
|
||||||
|
+ }
|
||||||
|
+ if { $item == "-early" } {
|
||||||
|
+ set current_list early_processed_code
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if { $item == "-timeout" || $item == "-i" } {
|
||||||
|
set expecting_arg 1
|
||||||
|
- lappend processed_code $item
|
||||||
|
+ lappend $current_list $item
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if { $expecting_arg } {
|
||||||
|
set expecting_arg 0
|
||||||
|
- lappend processed_code $subst_item
|
||||||
|
+ lappend $current_list $subst_item
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if { $expecting_action } {
|
||||||
|
- lappend processed_code "uplevel [list $item]"
|
||||||
|
+ lappend $current_list "uplevel [list $item]"
|
||||||
|
set expecting_action 0
|
||||||
|
# Cosmetic, no effect on the list.
|
||||||
|
- append processed_code "\n"
|
||||||
|
+ append $current_list "\n"
|
||||||
|
+ set current_list processed_code
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
set expecting_action 1
|
||||||
|
- lappend processed_code $subst_item
|
||||||
|
+ lappend $current_list $subst_item
|
||||||
|
if {$patterns != ""} {
|
||||||
|
append patterns "; "
|
||||||
|
}
|
||||||
|
@@ -891,7 +898,8 @@ proc gdb_test_multiple { command message user_code } {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- set code {
|
||||||
|
+ set code $early_processed_code
|
||||||
|
+ append code {
|
||||||
|
-re ".*A problem internal to GDB has been detected" {
|
||||||
|
fail "$message (GDB internal error)"
|
||||||
|
gdb_internal_error_resync
|
||||||
|
diff --git a/gdb/testsuite/gdb.threads/watchthreads-reorder.exp b/gdb/testsuite/gdb.threads/watchthreads-reorder.exp
|
||||||
|
index 9bbbb6f2b8b..2e90870087d 100644
|
||||||
|
--- a/gdb/testsuite/gdb.threads/watchthreads-reorder.exp
|
||||||
|
+++ b/gdb/testsuite/gdb.threads/watchthreads-reorder.exp
|
||||||
|
@@ -90,5 +90,19 @@ foreach reorder {0 1} { with_test_prefix "reorder$reorder" {
|
||||||
|
# found in the DEBUG_INFRUN code path.
|
||||||
|
gdb_test "set debug infrun 1"
|
||||||
|
|
||||||
|
- gdb_continue_to_breakpoint "break-at-exit" ".*break-at-exit.*"
|
||||||
|
+ # Do:
|
||||||
|
+ # gdb_continue_to_breakpoint "break-at-exit" ".*break-at-exit.*"
|
||||||
|
+ # with setup_kfail.
|
||||||
|
+ set msg "continue to breakpoint: break-at-exit"
|
||||||
|
+ set pass_pattern "(?:Breakpoint|Temporary breakpoint) .* (at|in) .*break-at-exit.*"
|
||||||
|
+ set kfail_pattern "internal-error: inferior\\* find_inferior_pid\\(int\\): Assertion .pid != 0. failed\\."
|
||||||
|
+ gdb_test_multiple "continue" $msg {
|
||||||
|
+ -early -re "$kfail_pattern" {
|
||||||
|
+ setup_kfail gdb/24995 "*-*-*"
|
||||||
|
+ exp_continue
|
||||||
|
+ }
|
||||||
|
+ -re "\[\r\n\]*(?:$pass_pattern)\[\r\n\]+$gdb_prompt $" {
|
||||||
|
+ pass $msg
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
}}
|
||||||
|
diff --git a/gdb/testsuite/gdb.base/restore.exp b/gdb/testsuite/gdb.base/restore.exp
|
||||||
|
index 947fe58be47..56c2f5e3dce 100644
|
||||||
|
--- a/gdb/testsuite/gdb.base/restore.exp
|
||||||
|
+++ b/gdb/testsuite/gdb.base/restore.exp
|
||||||
|
@@ -73,8 +73,17 @@ proc restore_tests { } {
|
||||||
|
# they should be.
|
||||||
|
for {set var 1} {$var <= $c} {incr var} {
|
||||||
|
set expected [expr 0x7eeb + $var]
|
||||||
|
- gdb_test "print l$var" " = $expected" \
|
||||||
|
- "caller$c calls callee$e; return restored l$var to $expected"
|
||||||
|
+ set test "caller$c calls callee$e; return restored l$var to $expected"
|
||||||
|
+ set pass_pattern " = $expected"
|
||||||
|
+ set unsupported_pattern " = <optimized out>"
|
||||||
|
+ gdb_test_multiple "print l$var" $test {
|
||||||
|
+ -re "\[\r\n\]*(?:$pass_pattern)\[\r\n\]+$gdb_prompt $" {
|
||||||
|
+ pass $test
|
||||||
|
+ }
|
||||||
|
+ -re "\[\r\n\]*(?:$unsupported_pattern)\[\r\n\]+$gdb_prompt $" {
|
||||||
|
+ unsupported $test
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
diff --git a/gdb/testsuite/gdb.base/store.exp b/gdb/testsuite/gdb.base/store.exp
|
||||||
|
index c5a7584101a..9c19ce15a7b 100644
|
||||||
|
--- a/gdb/testsuite/gdb.base/store.exp
|
||||||
|
+++ b/gdb/testsuite/gdb.base/store.exp
|
||||||
|
@@ -55,18 +55,29 @@ proc check_set { t l r new add } {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- gdb_test "print l" " = ${l}" \
|
||||||
|
- "${prefix}; print old l, expecting ${l}"
|
||||||
|
- gdb_test "print r" " = ${r}" \
|
||||||
|
- "${prefix}; print old r, expecting ${r}"
|
||||||
|
- gdb_test_no_output "set variable l = 4" \
|
||||||
|
- "${prefix}; setting l to 4"
|
||||||
|
- gdb_test "print l" " = ${new}" \
|
||||||
|
- "${prefix}; print new l, expecting ${new}"
|
||||||
|
- gdb_test "next" "return l \\+ r;" \
|
||||||
|
- "${prefix}; next over add call"
|
||||||
|
- gdb_test "print l" " = ${add}" \
|
||||||
|
- "${prefix}; print incremented l, expecting ${add}"
|
||||||
|
+ set supported 1
|
||||||
|
+ set test "${prefix}; print old l, expecting ${l}"
|
||||||
|
+ gdb_test_multiple "print l" "$test" {
|
||||||
|
+ -re " = <optimized out>\r\n$gdb_prompt $" {
|
||||||
|
+ unsupported $test
|
||||||
|
+ set supported 0
|
||||||
|
+ }
|
||||||
|
+ -re " = ${l}\r\n$gdb_prompt $" {
|
||||||
|
+ pass $test
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ if { $supported } {
|
||||||
|
+ gdb_test "print r" " = ${r}" \
|
||||||
|
+ "${prefix}; print old r, expecting ${r}"
|
||||||
|
+ gdb_test_no_output "set variable l = 4" \
|
||||||
|
+ "${prefix}; setting l to 4"
|
||||||
|
+ gdb_test "print l" " = ${new}" \
|
||||||
|
+ "${prefix}; print new l, expecting ${new}"
|
||||||
|
+ gdb_test "next" "return l \\+ r;" \
|
||||||
|
+ "${prefix}; next over add call"
|
||||||
|
+ gdb_test "print l" " = ${add}" \
|
||||||
|
+ "${prefix}; print incremented l, expecting ${add}"
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
check_set "charest" "-1 .*" "-2 .*" "4 ..004." "2 ..002."
|
||||||
|
@@ -81,20 +92,34 @@ check_set "doublest" "-1" "-2" "4" "2"
|
||||||
|
#
|
||||||
|
|
||||||
|
proc up_set { t l r new } {
|
||||||
|
+ global gdb_prompt
|
||||||
|
+
|
||||||
|
set prefix "upvar ${t} l"
|
||||||
|
gdb_test "tbreak add_${t}"
|
||||||
|
gdb_test "continue" "return u . v;" \
|
||||||
|
"continue to add_${t}"
|
||||||
|
gdb_test "up" "l = add_${t} .l, r.;" \
|
||||||
|
"${prefix}; up"
|
||||||
|
- gdb_test "print l" " = ${l}" \
|
||||||
|
- "${prefix}; print old l, expecting ${l}"
|
||||||
|
- gdb_test "print r" " = ${r}" \
|
||||||
|
- "${prefix}; print old r, expecting ${r}"
|
||||||
|
- gdb_test_no_output "set variable l = 4" \
|
||||||
|
- "${prefix}; set l to 4"
|
||||||
|
- gdb_test "print l" " = ${new}" \
|
||||||
|
- "${prefix}; print new l, expecting ${new}"
|
||||||
|
+
|
||||||
|
+ set supported 1
|
||||||
|
+ set test "${prefix}; print old l, expecting ${l}"
|
||||||
|
+ gdb_test_multiple "print l" "$test" {
|
||||||
|
+ -re " = <optimized out>\r\n$gdb_prompt $" {
|
||||||
|
+ unsupported $test
|
||||||
|
+ set supported 0
|
||||||
|
+ }
|
||||||
|
+ -re " = ${l}\r\n$gdb_prompt $" {
|
||||||
|
+ pass $test
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ if { $supported } {
|
||||||
|
+ gdb_test "print r" " = ${r}" \
|
||||||
|
+ "${prefix}; print old r, expecting ${r}"
|
||||||
|
+ gdb_test_no_output "set variable l = 4" \
|
||||||
|
+ "${prefix}; set l to 4"
|
||||||
|
+ gdb_test "print l" " = ${new}" \
|
||||||
|
+ "${prefix}; print new l, expecting ${new}"
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
up_set "charest" "-1 .*" "-2 .*" "4 ..004."
|
||||||
|
diff --git a/gdb/testsuite/gdb.ada/rename_subscript_param.exp b/gdb/testsuite/gdb.ada/rename_subscript_param.exp
|
||||||
|
index ffcfa50df33..fd8208825a0 100644
|
||||||
|
--- a/gdb/testsuite/gdb.ada/rename_subscript_param.exp
|
||||||
|
+++ b/gdb/testsuite/gdb.ada/rename_subscript_param.exp
|
||||||
|
@@ -15,6 +15,10 @@
|
||||||
|
|
||||||
|
load_lib "ada.exp"
|
||||||
|
|
||||||
|
+if { ![gnatmake_version_at_least 8] } {
|
||||||
|
+ return -1
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
standard_ada_testfile pb30_012
|
||||||
|
|
||||||
|
if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug]] != "" } {
|
||||||
|
diff --git a/gdb/testsuite/lib/ada.exp b/gdb/testsuite/lib/ada.exp
|
||||||
|
index ee9ade16ae5..b10558811fb 100644
|
||||||
|
--- a/gdb/testsuite/lib/ada.exp
|
||||||
|
+++ b/gdb/testsuite/lib/ada.exp
|
||||||
|
@@ -78,3 +78,23 @@ proc standard_ada_testfile {base_file {dir ""}} {
|
||||||
|
set srcfile $srcdir/$subdir/$testdir/$testfile.adb
|
||||||
|
set binfile [standard_output_file $testfile]
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+# Return 1 if gnatmake is at least version $MAJOR.x.x
|
||||||
|
+
|
||||||
|
+proc gnatmake_version_at_least { major } {
|
||||||
|
+ set gnatmake [gdb_find_gnatmake]
|
||||||
|
+ set gnatmake [lindex [split $gnatmake] 0]
|
||||||
|
+ set output [exec $gnatmake --version]
|
||||||
|
+ if { [regexp {GNATMAKE ([^ .]+).([^ .]+).([^ .]+)} $output \
|
||||||
|
+ match gnatmake_major gnatmake_minor gnatmake_micro] } {
|
||||||
|
+ if { $gnatmake_major >= $major } {
|
||||||
|
+ return 1
|
||||||
|
+ } else {
|
||||||
|
+ return 0
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ # Unknown, return 1
|
||||||
|
+ return 1
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
diff --git a/gdb/amd64-linux-nat.c b/gdb/amd64-linux-nat.c
|
||||||
|
index 8d0e8eb35cd..b56917c2bc6 100644
|
||||||
|
--- a/gdb/amd64-linux-nat.c
|
||||||
|
+++ b/gdb/amd64-linux-nat.c
|
||||||
|
@@ -238,6 +238,12 @@ amd64_linux_nat_target::fetch_registers (struct regcache *regcache, int regnum)
|
||||||
|
char xstateregs[X86_XSTATE_MAX_SIZE];
|
||||||
|
struct iovec iov;
|
||||||
|
|
||||||
|
+ /* Pre-4.14 kernels have a bug (fixed by commit 0852b374173b
|
||||||
|
+ "x86/fpu: Add FPU state copying quirk to handle XRSTOR failure on
|
||||||
|
+ Intel Skylake CPUs") that sometimes causes the mxcsr location in
|
||||||
|
+ xstateregs not to be copied by PTRACE_GETREGSET. Make sure that
|
||||||
|
+ the location is at least initialized with a defined value. */
|
||||||
|
+ memset (xstateregs, 0, sizeof (xstateregs));
|
||||||
|
iov.iov_base = xstateregs;
|
||||||
|
iov.iov_len = sizeof (xstateregs);
|
||||||
|
if (ptrace (PTRACE_GETREGSET, tid,
|
||||||
|
diff --git a/gdb/testsuite/gdb.arch/amd64-init-x87-values.exp b/gdb/testsuite/gdb.arch/amd64-init-x87-values.exp
|
||||||
|
index cdf92dcd377..5fd18dbb794 100644
|
||||||
|
--- a/gdb/testsuite/gdb.arch/amd64-init-x87-values.exp
|
||||||
|
+++ b/gdb/testsuite/gdb.arch/amd64-init-x87-values.exp
|
||||||
|
@@ -116,7 +116,7 @@ proc_with_prefix check_x87_regs_around_init {} {
|
||||||
|
# nop that does not enable any FP features). Finally check that the
|
||||||
|
# mxcsr register still has the value we set.
|
||||||
|
proc_with_prefix check_setting_mxcsr_before_enable {} {
|
||||||
|
- global binfile
|
||||||
|
+ global binfile gdb_prompt
|
||||||
|
|
||||||
|
clean_restart ${binfile}
|
||||||
|
|
||||||
|
@@ -127,7 +127,22 @@ proc_with_prefix check_setting_mxcsr_before_enable {} {
|
||||||
|
|
||||||
|
gdb_test_no_output "set \$mxcsr=0x9f80" "set a new value for MXCSR"
|
||||||
|
gdb_test "stepi" "fwait" "step forward one instruction for mxcsr test"
|
||||||
|
- gdb_test "p/x \$mxcsr" " = 0x9f80" "check new value of MXCSR is still in place"
|
||||||
|
+
|
||||||
|
+ set test "check new value of MXCSR is still in place"
|
||||||
|
+ set pass_pattern " = 0x9f80"
|
||||||
|
+ # Pre-4.14 kernels have a bug (fixed by commit 0852b374173b "x86/fpu:
|
||||||
|
+ # Add FPU state copying quirk to handle XRSTOR failure on Intel Skylake
|
||||||
|
+ # CPUs") that causes mxcsr not to be copied, in which case we get 0 instead of
|
||||||
|
+ # the just saved value.
|
||||||
|
+ set xfail_pattern " = 0x0"
|
||||||
|
+ gdb_test_multiple "p/x \$mxcsr" $test {
|
||||||
|
+ -re "\[\r\n\]*(?:$pass_pattern)\[\r\n\]+$gdb_prompt $" {
|
||||||
|
+ pass $test
|
||||||
|
+ }
|
||||||
|
+ -re "\[\r\n\]*(?:$xfail_pattern)\[\r\n\]+$gdb_prompt $" {
|
||||||
|
+ xfail $test
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
# Start the test file, all FP features will be disabled. Set new
|
||||||
|
diff --git a/gdb/testsuite/gdb.reverse/step-precsave.exp b/gdb/testsuite/gdb.reverse/step-precsave.exp
|
||||||
|
index 7443995c007..f5e15510e1f 100644
|
||||||
|
--- a/gdb/testsuite/gdb.reverse/step-precsave.exp
|
||||||
|
+++ b/gdb/testsuite/gdb.reverse/step-precsave.exp
|
||||||
|
@@ -46,7 +46,15 @@ gdb_test "break $end_of_main" \
|
||||||
|
|
||||||
|
# This can take awhile.
|
||||||
|
with_timeout_factor 20 {
|
||||||
|
- gdb_test "continue" "Breakpoint .* end of main .*" "run to end of main"
|
||||||
|
+ set test "run to end of main"
|
||||||
|
+ gdb_test_multiple "continue" $test {
|
||||||
|
+ -re "Breakpoint .* end of main .*" {
|
||||||
|
+ pass $test
|
||||||
|
+ }
|
||||||
|
+ -re "Process record does not support instruction 0xc5 at.*$gdb_prompt $" {
|
||||||
|
+ kfail "record/23188" $test
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
# So can this, against gdbserver, for example.
|
||||||
|
diff --git a/gdb/testsuite/gdb.reverse/step-precsave.exp b/gdb/testsuite/gdb.reverse/step-precsave.exp
|
||||||
|
index f5e15510e1f..2073b8a1542 100644
|
||||||
|
--- a/gdb/testsuite/gdb.reverse/step-precsave.exp
|
||||||
|
+++ b/gdb/testsuite/gdb.reverse/step-precsave.exp
|
||||||
|
@@ -47,11 +47,13 @@ gdb_test "break $end_of_main" \
|
||||||
|
# This can take awhile.
|
||||||
|
with_timeout_factor 20 {
|
||||||
|
set test "run to end of main"
|
||||||
|
+ set pass_pattern "Breakpoint .* end of main .*"
|
||||||
|
+ set kfail_pattern "Process record does not support instruction 0xc5 at.*"
|
||||||
|
gdb_test_multiple "continue" $test {
|
||||||
|
- -re "Breakpoint .* end of main .*" {
|
||||||
|
+ -re "\[\r\n\]*(?:$pass_pattern)\[\r\n\]+$gdb_prompt $" {
|
||||||
|
pass $test
|
||||||
|
}
|
||||||
|
- -re "Process record does not support instruction 0xc5 at.*$gdb_prompt $" {
|
||||||
|
+ -re "\[\r\n\]*(?:$kfail_pattern)\[\r\n\]+$gdb_prompt $" {
|
||||||
|
kfail "record/23188" $test
|
||||||
|
}
|
||||||
|
}
|
||||||
|
diff --git a/gdb/testsuite/gdb.reverse/sigall-precsave.exp b/gdb/testsuite/gdb.reverse/sigall-precsave.exp
|
||||||
|
index 79a1e7282b6..ccdfde407fc 100644
|
||||||
|
--- a/gdb/testsuite/gdb.reverse/sigall-precsave.exp
|
||||||
|
+++ b/gdb/testsuite/gdb.reverse/sigall-precsave.exp
|
||||||
|
@@ -258,14 +258,20 @@ foreach sig $signals {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-gdb_test_multiple "continue" "continue" {
|
||||||
|
+set kfail_pattern "Process record does not support instruction 0xfae64 at.*"
|
||||||
|
+set test "run to end of main"
|
||||||
|
+gdb_test_multiple "continue" $test {
|
||||||
|
-re "Breakpoint .* end of main .*$gdb_prompt $" {
|
||||||
|
- pass "run to end of main"
|
||||||
|
+ pass $test
|
||||||
|
}
|
||||||
|
-re "Breakpoint .* handle_.*$gdb_prompt $" {
|
||||||
|
send_gdb "continue\n"
|
||||||
|
exp_continue
|
||||||
|
}
|
||||||
|
+ -re "\[\r\n\]*(?:$kfail_pattern)\[\r\n\]+$gdb_prompt $" {
|
||||||
|
+ kfail "gdb/25038" $test
|
||||||
|
+ return -1
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
delete_breakpoints
|
||||||
|
@@ -289,8 +295,12 @@ set sig_supported 1
|
||||||
|
set thissig "ABRT"
|
||||||
|
|
||||||
|
# test signal handling
|
||||||
|
+set record_instruction_kfail 0
|
||||||
|
foreach sig [lrange $signals 1 end] {
|
||||||
|
test_one_sig $sig
|
||||||
|
+ if { $record_instruction_kfail } {
|
||||||
|
+ return -1
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
# The last signal (SIGTERM) gets handled slightly differently because
|
||||||
|
diff --git a/gdb/testsuite/gdb.reverse/sigall-reverse.exp b/gdb/testsuite/gdb.reverse/sigall-reverse.exp
|
||||||
|
index c734fe8e17a..884a00c5dcf 100644
|
||||||
|
--- a/gdb/testsuite/gdb.reverse/sigall-reverse.exp
|
||||||
|
+++ b/gdb/testsuite/gdb.reverse/sigall-reverse.exp
|
||||||
|
@@ -37,6 +37,7 @@ proc test_one_sig {nextsig} {
|
||||||
|
global sig_supported
|
||||||
|
global gdb_prompt
|
||||||
|
global thissig
|
||||||
|
+ global record_instruction_kfail
|
||||||
|
|
||||||
|
set this_sig_supported $sig_supported
|
||||||
|
gdb_test "handle SIG$thissig stop print" \
|
||||||
|
@@ -51,6 +52,7 @@ proc test_one_sig {nextsig} {
|
||||||
|
setup_xfail "i*86-pc-linuxoldld-gnu" "i*86-pc-linuxaout-gnu"
|
||||||
|
}
|
||||||
|
set testmsg "get signal $thissig"
|
||||||
|
+ set kfail_pattern "Process record does not support instruction 0xfae64 at.*"
|
||||||
|
gdb_test_multiple "continue" $testmsg {
|
||||||
|
-re "Program received signal SIG$thissig.*handle_$thissig.*$gdb_prompt $" {
|
||||||
|
fail "$testmsg (wrong location)"
|
||||||
|
@@ -62,6 +64,11 @@ proc test_one_sig {nextsig} {
|
||||||
|
xfail $testmsg
|
||||||
|
set need_another_continue 0
|
||||||
|
}
|
||||||
|
+ -re "\[\r\n\]*(?:$kfail_pattern)\[\r\n\]+$gdb_prompt $" {
|
||||||
|
+ kfail "gdb/25038" "$testmsg"
|
||||||
|
+ set record_instruction_kfail 1
|
||||||
|
+ return
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -237,8 +244,12 @@ set sig_supported 1
|
||||||
|
set thissig "ABRT"
|
||||||
|
|
||||||
|
# test signal handling
|
||||||
|
+set record_instruction_kfail 0
|
||||||
|
foreach sig [lrange $signals 1 end] {
|
||||||
|
test_one_sig $sig
|
||||||
|
+ if { $record_instruction_kfail } {
|
||||||
|
+ return -1
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
# The last signal (SIGTERM) gets handled slightly differently because
|
||||||
|
diff --git a/gdb/testsuite/gdb.reverse/solib-precsave.exp b/gdb/testsuite/gdb.reverse/solib-precsave.exp
|
||||||
|
index 574d79816db..a3f874c09b7 100644
|
||||||
|
--- a/gdb/testsuite/gdb.reverse/solib-precsave.exp
|
||||||
|
+++ b/gdb/testsuite/gdb.reverse/solib-precsave.exp
|
||||||
|
@@ -91,7 +91,18 @@ gdb_test "break $end_of_main" \
|
||||||
|
"Breakpoint $decimal at .*$srcfile, line $end_of_main\." \
|
||||||
|
"breakpoint at end of main"
|
||||||
|
|
||||||
|
-gdb_test "continue" "Breakpoint .* end of main .*" "run to end of main"
|
||||||
|
+set test "run to end of main"
|
||||||
|
+set pass_pattern "Breakpoint .* end of main .*"
|
||||||
|
+set kfail_pattern "Process record does not support instruction 0xfae64 at.*"
|
||||||
|
+gdb_test_multiple "continue" $test {
|
||||||
|
+ -re "\[\r\n\]*(?:$pass_pattern)\[\r\n\]+$gdb_prompt $" {
|
||||||
|
+ pass $test
|
||||||
|
+ }
|
||||||
|
+ -re "\[\r\n\]*(?:$kfail_pattern)\[\r\n\]+$gdb_prompt $" {
|
||||||
|
+ kfail "gdb/25038" $test
|
||||||
|
+ return -1
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
|
||||||
|
gdb_test "record save $precsave" \
|
||||||
|
"Saved core file $precsave with execution log\." \
|
||||||
|
diff --git a/gdb/testsuite/gdb.reverse/solib-reverse.exp b/gdb/testsuite/gdb.reverse/solib-reverse.exp
|
||||||
|
index 77c321388b4..53b35239f81 100644
|
||||||
|
--- a/gdb/testsuite/gdb.reverse/solib-reverse.exp
|
||||||
|
+++ b/gdb/testsuite/gdb.reverse/solib-reverse.exp
|
||||||
|
@@ -86,7 +86,18 @@ if [supports_process_record] {
|
||||||
|
|
||||||
|
set end_part_one [gdb_get_line_number " end part one" "$srcfile"]
|
||||||
|
set end_part_two [gdb_get_line_number " end part two" "$srcfile"]
|
||||||
|
-gdb_test "until $end_part_one" " end part one.*" "run until end part one"
|
||||||
|
+set test "run until end part one"
|
||||||
|
+set pass_pattern " end part one.*"
|
||||||
|
+set kfail_pattern "Process record does not support instruction 0xfae64 at.*"
|
||||||
|
+gdb_test_multiple "until $end_part_one" $test {
|
||||||
|
+ -re "\[\r\n\]*(?:$pass_pattern)\[\r\n\]+$gdb_prompt $" {
|
||||||
|
+ pass $test
|
||||||
|
+ }
|
||||||
|
+ -re "\[\r\n\]*(?:$kfail_pattern)\[\r\n\]+$gdb_prompt $" {
|
||||||
|
+ kfail "gdb/25038" $test
|
||||||
|
+ return -1
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
|
||||||
|
gdb_test "reverse-step" " shr1 three .*" "reverse-step third shr1"
|
||||||
|
gdb_test "reverse-step" " shr1 two .*" "reverse-step second shr1"
|
||||||
|
diff --git a/gdb/testsuite/gdb.reverse/step-precsave.exp b/gdb/testsuite/gdb.reverse/step-precsave.exp
|
||||||
|
index 2073b8a1542..72ee279f806 100644
|
||||||
|
--- a/gdb/testsuite/gdb.reverse/step-precsave.exp
|
||||||
|
+++ b/gdb/testsuite/gdb.reverse/step-precsave.exp
|
||||||
|
@@ -49,6 +49,7 @@ with_timeout_factor 20 {
|
||||||
|
set test "run to end of main"
|
||||||
|
set pass_pattern "Breakpoint .* end of main .*"
|
||||||
|
set kfail_pattern "Process record does not support instruction 0xc5 at.*"
|
||||||
|
+ set kfail2_pattern "Process record does not support instruction 0xfae64 at.*"
|
||||||
|
gdb_test_multiple "continue" $test {
|
||||||
|
-re "\[\r\n\]*(?:$pass_pattern)\[\r\n\]+$gdb_prompt $" {
|
||||||
|
pass $test
|
||||||
|
@@ -56,6 +57,9 @@ with_timeout_factor 20 {
|
||||||
|
-re "\[\r\n\]*(?:$kfail_pattern)\[\r\n\]+$gdb_prompt $" {
|
||||||
|
kfail "record/23188" $test
|
||||||
|
}
|
||||||
|
+ -re "\[\r\n\]*(?:$kfail2_pattern)\[\r\n\]+$gdb_prompt $" {
|
||||||
|
+ kfail "record/25038" $test
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/gdb/testsuite/gdb.reverse/until-precsave.exp b/gdb/testsuite/gdb.reverse/until-precsave.exp
|
||||||
|
index baf21ab7ad2..1f09df193fd 100644
|
||||||
|
--- a/gdb/testsuite/gdb.reverse/until-precsave.exp
|
||||||
|
+++ b/gdb/testsuite/gdb.reverse/until-precsave.exp
|
||||||
|
@@ -50,7 +50,18 @@ gdb_test "break $end_of_main" \
|
||||||
|
|
||||||
|
# This can take awhile.
|
||||||
|
with_timeout_factor 20 {
|
||||||
|
- gdb_test "continue" "Breakpoint .* set breakpoint 10a here .*" "run to end of main"
|
||||||
|
+ set test "run to end of main"
|
||||||
|
+ set pass_pattern "Breakpoint .* set breakpoint 10a here .*"
|
||||||
|
+ set kfail_pattern "Process record does not support instruction 0xfae64 at.*"
|
||||||
|
+ gdb_test_multiple "continue" $test {
|
||||||
|
+ -re "\[\r\n\]*(?:$pass_pattern)\[\r\n\]+$gdb_prompt $" {
|
||||||
|
+ pass $test
|
||||||
|
+ }
|
||||||
|
+ -re "\[\r\n\]*(?:$kfail_pattern)\[\r\n\]+$gdb_prompt $" {
|
||||||
|
+ kfail "gdb/25038" $test
|
||||||
|
+ return -1
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
# So can this, against gdbserver, for example.
|
||||||
|
diff --git a/gdb/testsuite/gdb.reverse/until-reverse.exp b/gdb/testsuite/gdb.reverse/until-reverse.exp
|
||||||
|
index 2e26de3ce7b..804e07f46ca 100644
|
||||||
|
--- a/gdb/testsuite/gdb.reverse/until-reverse.exp
|
||||||
|
+++ b/gdb/testsuite/gdb.reverse/until-reverse.exp
|
||||||
|
@@ -49,9 +49,18 @@ gdb_test "until $bp_location1" \
|
||||||
|
|
||||||
|
# Advance up to factorial, outer invocation
|
||||||
|
#
|
||||||
|
-gdb_test "advance factorial" \
|
||||||
|
- "factorial .value=6..*$srcfile:$bp_location7.*" \
|
||||||
|
- "advance to factorial"
|
||||||
|
+set test "advance to factorial"
|
||||||
|
+set pass_pattern "factorial .value=6..*$srcfile:$bp_location7.*"
|
||||||
|
+set kfail_pattern "Process record does not support instruction 0xfae64 at.*"
|
||||||
|
+gdb_test_multiple "advance factorial" $test {
|
||||||
|
+ -re "\[\r\n\]*(?:$pass_pattern)\[\r\n\]+$gdb_prompt $" {
|
||||||
|
+ pass "$test"
|
||||||
|
+ }
|
||||||
|
+ -re "\[\r\n\]*(?:$kfail_pattern)\[\r\n\]+$gdb_prompt $" {
|
||||||
|
+ kfail "gdb/25038" $test
|
||||||
|
+ return -1
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
|
||||||
|
# At this point, 'until' should continue the inferior up to when all the
|
||||||
|
# inner invocations of factorial() are completed and we are back at this
|
||||||
|
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
|
||||||
|
index 5f1bc4d84b7..0d5447dd10c 100644
|
||||||
|
--- a/gdb/testsuite/lib/gdb.exp
|
||||||
|
+++ b/gdb/testsuite/lib/gdb.exp
|
||||||
|
@@ -633,10 +633,14 @@ proc gdb_continue_to_breakpoint {name {location_pattern .*}} {
|
||||||
|
global gdb_prompt
|
||||||
|
set full_name "continue to breakpoint: $name"
|
||||||
|
|
||||||
|
+ set kfail_pattern "Process record does not support instruction 0xfae64 at.*"
|
||||||
|
gdb_test_multiple "continue" $full_name {
|
||||||
|
-re "(?:Breakpoint|Temporary breakpoint) .* (at|in) $location_pattern\r\n$gdb_prompt $" {
|
||||||
|
pass $full_name
|
||||||
|
}
|
||||||
|
+ -re "\[\r\n\]*(?:$kfail_pattern)\[\r\n\]+$gdb_prompt $" {
|
||||||
|
+ kfail "gdb/25038" $full_name
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,3 @@
|
|||||||
- Testsuite: Ensure pie is disabled on some tests
|
|
||||||
- Testsuite: Remove pie from trace tests
|
- Testsuite: Remove pie from trace tests
|
||||||
- [gdb/testsuite] Fail in gdb_compile if nopie results in PIE executable
|
- [gdb/testsuite] Fail in gdb_compile if nopie results in PIE executable
|
||||||
- [gdb/testsuite] Fail in gdb_compile if pie results in non-PIE executable
|
- [gdb/testsuite] Fail in gdb_compile if pie results in non-PIE executable
|
||||||
@ -107,130 +106,6 @@ gdb/testsuite/ChangeLog:
|
|||||||
|
|
||||||
---------------------------------------------------------
|
---------------------------------------------------------
|
||||||
|
|
||||||
Testsuite: Ensure pie is disabled on some tests
|
|
||||||
|
|
||||||
Recent versions of Ubuntu and Debian default GCC to enable pie.
|
|
||||||
|
|
||||||
In dump.exp, pie will causes addresses to be out of range for IHEX.
|
|
||||||
|
|
||||||
In break-interp.exp, pie is explicitly set for some tests and assumed
|
|
||||||
to be disabled for the remainder.
|
|
||||||
|
|
||||||
Ensure pie is disabled for these tests when required.
|
|
||||||
|
|
||||||
In addition, add a pie option to gdb_compile to match the nopie option
|
|
||||||
and simplify use.
|
|
||||||
|
|
||||||
gdb/testsuite/ChangeLog:
|
|
||||||
|
|
||||||
* README: Add pie options.
|
|
||||||
* gdb.base/break-interp.exp: Ensure pie is disabled.
|
|
||||||
* gdb.base/dump.exp: Likewise.
|
|
||||||
* lib/gdb.exp (gdb_compile): Add pie option.
|
|
||||||
|
|
||||||
---------------------------------------------------------
|
|
||||||
|
|
||||||
diff --git a/gdb/testsuite/README b/gdb/testsuite/README
|
|
||||||
index b5e75b9a79..db90ea4698 100644
|
|
||||||
--- a/gdb/testsuite/README
|
|
||||||
+++ b/gdb/testsuite/README
|
|
||||||
@@ -482,6 +482,16 @@ gdb,no_thread_names
|
|
||||||
|
|
||||||
The target doesn't support thread names.
|
|
||||||
|
|
||||||
+gdb,pie_flag
|
|
||||||
+
|
|
||||||
+ The flag required to force the compiler to produce position-independent
|
|
||||||
+ executables.
|
|
||||||
+
|
|
||||||
+gdb,pie_ldflag
|
|
||||||
+
|
|
||||||
+ The flag required to force the linker to produce position-independent
|
|
||||||
+ executables.
|
|
||||||
+
|
|
||||||
gdb,nopie_flag
|
|
||||||
|
|
||||||
The flag required to force the compiler to produce non-position-independent
|
|
||||||
diff --git a/gdb/testsuite/gdb.base/break-interp.exp b/gdb/testsuite/gdb.base/break-interp.exp
|
|
||||||
index f85e8a650a..51e31f6503 100644
|
|
||||||
--- a/gdb/testsuite/gdb.base/break-interp.exp
|
|
||||||
+++ b/gdb/testsuite/gdb.base/break-interp.exp
|
|
||||||
@@ -625,8 +625,10 @@ foreach ldprelink {NO YES} {
|
|
||||||
lappend opts {debug}
|
|
||||||
}
|
|
||||||
if {$binpie != "NO"} {
|
|
||||||
- lappend opts {additional_flags=-fPIE}
|
|
||||||
- lappend opts {ldflags=-pie}
|
|
||||||
+ lappend opts {pie}
|
|
||||||
+ } else {
|
|
||||||
+ # Debian9/Ubuntu16.10 onwards default to PIE enabled. Ensure it is disabled.
|
|
||||||
+ lappend opts {nopie}
|
|
||||||
}
|
|
||||||
|
|
||||||
set dir ${exec}.d
|
|
||||||
diff --git a/gdb/testsuite/gdb.base/dump.exp b/gdb/testsuite/gdb.base/dump.exp
|
|
||||||
index 44b0988b80..52ba5f8ebe 100644
|
|
||||||
--- a/gdb/testsuite/gdb.base/dump.exp
|
|
||||||
+++ b/gdb/testsuite/gdb.base/dump.exp
|
|
||||||
@@ -36,6 +36,10 @@ if {[istarget "spu*-*-*"]} then {
|
|
||||||
set is64bitonly "yes"
|
|
||||||
}
|
|
||||||
|
|
||||||
+# Debian9/Ubuntu16.10 onwards default to PIE enabled. Ensure it is disabled as
|
|
||||||
+# this causes addresses to be out of range for IHEX.
|
|
||||||
+lappend options {nopie}
|
|
||||||
+
|
|
||||||
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable ${options}] != "" } {
|
|
||||||
untested "failed to compile"
|
|
||||||
return -1
|
|
||||||
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
|
|
||||||
index 36f167336c..3d5f8726f7 100644
|
|
||||||
--- a/gdb/testsuite/lib/gdb.exp
|
|
||||||
+++ b/gdb/testsuite/lib/gdb.exp
|
|
||||||
@@ -3492,6 +3492,7 @@ set gdb_saved_set_unbuffered_mode_obj ""
|
|
||||||
# dynamically load libraries at runtime. For example, on Linux, this adds
|
|
||||||
# -ldl so that the test can use dlopen.
|
|
||||||
# - nowarnings: Inhibit all compiler warnings.
|
|
||||||
+# - pie: Force creation of PIE executables.
|
|
||||||
# - nopie: Prevent creation of PIE executables.
|
|
||||||
#
|
|
||||||
# And here are some of the not too obscure options understood by DejaGnu that
|
|
||||||
@@ -3630,8 +3631,33 @@ proc gdb_compile {source dest type options} {
|
|
||||||
set options [lreplace $options $nowarnings $nowarnings $flag]
|
|
||||||
}
|
|
||||||
|
|
||||||
- # Replace the "nopie" option with the appropriate additional_flags
|
|
||||||
- # to disable PIE executables.
|
|
||||||
+ # Replace the "pie" option with the appropriate compiler and linker flags
|
|
||||||
+ # to enable PIE executables.
|
|
||||||
+ set pie [lsearch -exact $options pie]
|
|
||||||
+ if {$pie != -1} {
|
|
||||||
+ if [target_info exists gdb,pie_flag] {
|
|
||||||
+ set flag "additional_flags=[target_info gdb,pie_flag]"
|
|
||||||
+ } else {
|
|
||||||
+ # For safety, use fPIE rather than fpie. On AArch64, m68k, PowerPC
|
|
||||||
+ # and SPARC, fpie can cause compile errors due to the GOT exceeding
|
|
||||||
+ # a maximum size. On other architectures the two flags are
|
|
||||||
+ # identical (see the GCC manual). Note Debian9 and Ubuntu16.10
|
|
||||||
+ # onwards default GCC to using fPIE. If you do require fpie, then
|
|
||||||
+ # it can be set using the pie_flag.
|
|
||||||
+ set flag "additional_flags=-fPIE"
|
|
||||||
+ }
|
|
||||||
+ set options [lreplace $options $pie $pie $flag]
|
|
||||||
+
|
|
||||||
+ if [target_info exists gdb,pie_ldflag] {
|
|
||||||
+ set flag "ldflags=[target_info gdb,pie_ldflag]"
|
|
||||||
+ } else {
|
|
||||||
+ set flag "ldflags=-pie"
|
|
||||||
+ }
|
|
||||||
+ lappend options "$flag"
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ # Replace the "nopie" option with the appropriate linker flag to disable
|
|
||||||
+ # PIE executables. There are no compiler flags for this option.
|
|
||||||
set nopie [lsearch -exact $options nopie]
|
|
||||||
if {$nopie != -1} {
|
|
||||||
if [target_info exists gdb,nopie_flag] {
|
|
||||||
diff --git a/gdb/testsuite/gdb.trace/backtrace.exp b/gdb/testsuite/gdb.trace/backtrace.exp
|
diff --git a/gdb/testsuite/gdb.trace/backtrace.exp b/gdb/testsuite/gdb.trace/backtrace.exp
|
||||||
index 0f60153cb5..24e097135f 100644
|
index 0f60153cb5..24e097135f 100644
|
||||||
--- a/gdb/testsuite/gdb.trace/backtrace.exp
|
--- a/gdb/testsuite/gdb.trace/backtrace.exp
|
||||||
|
@ -1,212 +0,0 @@
|
|||||||
commit 3f52fdbcb599f76b4838020721ca6c9f1cc28f84
|
|
||||||
Author: Kevin Buettner <kevinb@redhat.com>
|
|
||||||
Date: Sat Mar 16 12:40:01 2019 -0700
|
|
||||||
|
|
||||||
Fix amd64->i386 linux syscall restart problem
|
|
||||||
|
|
||||||
This commit fixes some failures in gdb.base/interrupt.exp
|
|
||||||
when debugging a 32-bit i386 linux inferior from an amd64 host.
|
|
||||||
|
|
||||||
When running the following test...
|
|
||||||
|
|
||||||
make check RUNTESTFLAGS="--target_board unix/-m32 interrupt.exp"
|
|
||||||
|
|
||||||
... without this commit, I see the following output:
|
|
||||||
|
|
||||||
FAIL: gdb.base/interrupt.exp: continue (the program exited)
|
|
||||||
FAIL: gdb.base/interrupt.exp: echo data
|
|
||||||
FAIL: gdb.base/interrupt.exp: Send Control-C, second time
|
|
||||||
FAIL: gdb.base/interrupt.exp: signal SIGINT (the program is no longer running)
|
|
||||||
ERROR: Undefined command "".
|
|
||||||
ERROR: GDB process no longer exists
|
|
||||||
|
|
||||||
=== gdb Summary ===
|
|
||||||
|
|
||||||
When the test is run with this commit in place, we see 12 passes
|
|
||||||
instead. This is the desired behavior.
|
|
||||||
|
|
||||||
Analysis:
|
|
||||||
|
|
||||||
On Linux, when a syscall is interrupted by a signal, the syscall
|
|
||||||
may return -ERESTARTSYS when a signal occurs. Doing so indicates that
|
|
||||||
the syscall is restartable. Then, depending on settings associated
|
|
||||||
with the signal handler, and after the signal handler is called, the
|
|
||||||
kernel can then either return -EINTR or can cause the syscall to be
|
|
||||||
restarted. In this discussion, we are concerned with the latter
|
|
||||||
case.
|
|
||||||
|
|
||||||
On i386, the kernel returns this status via the EAX register.
|
|
||||||
|
|
||||||
When debugging a 32-bit (i386) process from a 64-bit (amd64)
|
|
||||||
GDB, the debugger fetches 64-bit registers even though the
|
|
||||||
process being debugged is 32-bit. Since we're debugging a 32-bit
|
|
||||||
target, only 32 bits are being saved in the register cache.
|
|
||||||
Now, ideally, GDB would save all 64-bits in the regcache and
|
|
||||||
then would be able to restore those same values when it comes
|
|
||||||
time to continue the target. I've looked into doing this, but
|
|
||||||
it's not easy and I don't see many benefits to doing so. One
|
|
||||||
benefit, however, would be that EAX would appear as a negative
|
|
||||||
value for doing syscall restarts.
|
|
||||||
|
|
||||||
At the moment, GDB is setting the high 32 bits of RAX (and other
|
|
||||||
registers too) to 0. So, when GDB restores EAX just prior to
|
|
||||||
a syscall restart, the high 32 bits of RAX are zeroed, thus making
|
|
||||||
it look like a positive value. For this particular purpose, we
|
|
||||||
need to sign extend EAX so that RAX will appear as a negative
|
|
||||||
value when EAX is set to -ERESTARTSYS. This in turn will cause
|
|
||||||
the signal handling code in the kernel to recognize -ERESTARTSYS
|
|
||||||
which will in turn cause the syscall to be restarted.
|
|
||||||
|
|
||||||
This commit is based on work by Jan Kratochvil from 2009:
|
|
||||||
|
|
||||||
https://sourceware.org/ml/gdb-patches/2009-11/msg00592.html
|
|
||||||
|
|
||||||
Jan's patch had the sign extension code in amd64-nat.c. Several
|
|
||||||
other native targets make use of this code, so it seemed better
|
|
||||||
to move the sign extension code to a linux specific file. I
|
|
||||||
also added similar code to gdbserver.
|
|
||||||
|
|
||||||
Another approach is to fix the problem in the kernel. Hui Zhu
|
|
||||||
tried to get a fix into the kernel back in 2014, but it was not
|
|
||||||
accepted. Discussion regarding this approach may be found here:
|
|
||||||
|
|
||||||
https://lore.kernel.org/patchwork/patch/457841/
|
|
||||||
|
|
||||||
Even if a fix were to be put into the kernel, we'd still need
|
|
||||||
some kind of fix in GDB in order to support older kernels.
|
|
||||||
|
|
||||||
Finally, I'll note that Fedora has been carrying a similar patch for
|
|
||||||
at least nine years. Other distributions, including RHEL and CentOS
|
|
||||||
have picked up this change and have been using it too.
|
|
||||||
|
|
||||||
gdb/ChangeLog:
|
|
||||||
|
|
||||||
* amd64-linux-nat.c (amd64_linux_collect_native_gregset): New
|
|
||||||
function.
|
|
||||||
(fill_gregset): Call amd64_linux_collect_native_gregset instead
|
|
||||||
of amd64_collect_native_gregset.
|
|
||||||
(amd64_linux_nat_target::store_registers): Likewise.
|
|
||||||
|
|
||||||
gdb/gdbserver/ChangeLog:
|
|
||||||
|
|
||||||
* linux-x86-low.c (x86_fill_gregset): Sign extend EAX value
|
|
||||||
when using a 64-bit gdbserver.
|
|
||||||
|
|
||||||
diff --git a/gdb/amd64-linux-nat.c b/gdb/amd64-linux-nat.c
|
|
||||||
index a0bb105f5a..8d0e8eb35c 100644
|
|
||||||
--- a/gdb/amd64-linux-nat.c
|
|
||||||
+++ b/gdb/amd64-linux-nat.c
|
|
||||||
@@ -92,6 +92,71 @@ static int amd64_linux_gregset32_reg_offset[] =
|
|
||||||
/* Transfering the general-purpose registers between GDB, inferiors
|
|
||||||
and core files. */
|
|
||||||
|
|
||||||
+/* See amd64_collect_native_gregset. This linux specific version handles
|
|
||||||
+ issues with negative EAX values not being restored correctly upon syscall
|
|
||||||
+ return when debugging 32-bit targets. It has no effect on 64-bit
|
|
||||||
+ targets. */
|
|
||||||
+
|
|
||||||
+static void
|
|
||||||
+amd64_linux_collect_native_gregset (const struct regcache *regcache,
|
|
||||||
+ void *gregs, int regnum)
|
|
||||||
+{
|
|
||||||
+ amd64_collect_native_gregset (regcache, gregs, regnum);
|
|
||||||
+
|
|
||||||
+ struct gdbarch *gdbarch = regcache->arch ();
|
|
||||||
+ if (gdbarch_bfd_arch_info (gdbarch)->bits_per_word == 32)
|
|
||||||
+ {
|
|
||||||
+ /* Sign extend EAX value to avoid potential syscall restart
|
|
||||||
+ problems.
|
|
||||||
+
|
|
||||||
+ On Linux, when a syscall is interrupted by a signal, the
|
|
||||||
+ (kernel function implementing the) syscall may return
|
|
||||||
+ -ERESTARTSYS when a signal occurs. Doing so indicates that
|
|
||||||
+ the syscall is restartable. Then, depending on settings
|
|
||||||
+ associated with the signal handler, and after the signal
|
|
||||||
+ handler is called, the kernel can then either return -EINTR
|
|
||||||
+ or it can cause the syscall to be restarted. We are
|
|
||||||
+ concerned with the latter case here.
|
|
||||||
+
|
|
||||||
+ On (32-bit) i386, the status (-ERESTARTSYS) is placed in the
|
|
||||||
+ EAX register. When debugging a 32-bit process from a 64-bit
|
|
||||||
+ (amd64) GDB, the debugger fetches 64-bit registers even
|
|
||||||
+ though the process being debugged is only 32-bit. The
|
|
||||||
+ register cache is only 32 bits wide though; GDB discards the
|
|
||||||
+ high 32 bits when placing 64-bit values in the 32-bit
|
|
||||||
+ regcache. Normally, this is not a problem since the 32-bit
|
|
||||||
+ process should only care about the lower 32-bit portions of
|
|
||||||
+ these registers. That said, it can happen that the 64-bit
|
|
||||||
+ value being restored will be different from the 64-bit value
|
|
||||||
+ that was originally retrieved from the kernel. The one place
|
|
||||||
+ (that we know of) where it does matter is in the kernel's
|
|
||||||
+ syscall restart code. The kernel's code for restarting a
|
|
||||||
+ syscall after a signal expects to see a negative value
|
|
||||||
+ (specifically -ERESTARTSYS) in the 64-bit RAX register in
|
|
||||||
+ order to correctly cause a syscall to be restarted.
|
|
||||||
+
|
|
||||||
+ The call to amd64_collect_native_gregset, above, is setting
|
|
||||||
+ the high 32 bits of RAX (and other registers too) to 0. For
|
|
||||||
+ syscall restart, we need to sign extend EAX so that RAX will
|
|
||||||
+ appear as a negative value when EAX is set to -ERESTARTSYS.
|
|
||||||
+ This in turn will cause the signal handling code in the
|
|
||||||
+ kernel to recognize -ERESTARTSYS which will in turn cause the
|
|
||||||
+ syscall to be restarted.
|
|
||||||
+
|
|
||||||
+ The test case gdb.base/interrupt.exp tests for this problem.
|
|
||||||
+ Without this sign extension code in place, it'll show
|
|
||||||
+ a number of failures when testing against unix/-m32. */
|
|
||||||
+
|
|
||||||
+ if (regnum == -1 || regnum == I386_EAX_REGNUM)
|
|
||||||
+ {
|
|
||||||
+ void *ptr = ((gdb_byte *) gregs
|
|
||||||
+ + amd64_linux_gregset32_reg_offset[I386_EAX_REGNUM]);
|
|
||||||
+
|
|
||||||
+ *(int64_t *) ptr = *(int32_t *) ptr;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/* Fill GDB's register cache with the general-purpose register values
|
|
||||||
in *GREGSETP. */
|
|
||||||
|
|
||||||
@@ -109,7 +174,7 @@ void
|
|
||||||
fill_gregset (const struct regcache *regcache,
|
|
||||||
elf_gregset_t *gregsetp, int regnum)
|
|
||||||
{
|
|
||||||
- amd64_collect_native_gregset (regcache, gregsetp, regnum);
|
|
||||||
+ amd64_linux_collect_native_gregset (regcache, gregsetp, regnum);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Transfering floating-point registers between GDB, inferiors and cores. */
|
|
||||||
@@ -237,7 +302,7 @@ amd64_linux_nat_target::store_registers (struct regcache *regcache, int regnum)
|
|
||||||
if (ptrace (PTRACE_GETREGS, tid, 0, (long) ®s) < 0)
|
|
||||||
perror_with_name (_("Couldn't get registers"));
|
|
||||||
|
|
||||||
- amd64_collect_native_gregset (regcache, ®s, regnum);
|
|
||||||
+ amd64_linux_collect_native_gregset (regcache, ®s, regnum);
|
|
||||||
|
|
||||||
if (ptrace (PTRACE_SETREGS, tid, 0, (long) ®s) < 0)
|
|
||||||
perror_with_name (_("Couldn't write registers"));
|
|
||||||
diff --git a/gdb/gdbserver/linux-x86-low.c b/gdb/gdbserver/linux-x86-low.c
|
|
||||||
index 029796e361..dd7673126e 100644
|
|
||||||
--- a/gdb/gdbserver/linux-x86-low.c
|
|
||||||
+++ b/gdb/gdbserver/linux-x86-low.c
|
|
||||||
@@ -338,6 +338,19 @@ x86_fill_gregset (struct regcache *regcache, void *buf)
|
|
||||||
|
|
||||||
collect_register_by_name (regcache, "orig_eax",
|
|
||||||
((char *) buf) + ORIG_EAX * REGSIZE);
|
|
||||||
+
|
|
||||||
+ /* Sign extend EAX value to avoid potential syscall restart
|
|
||||||
+ problems.
|
|
||||||
+
|
|
||||||
+ See amd64_linux_collect_native_gregset() in gdb/amd64-linux-nat.c
|
|
||||||
+ for a detailed explanation. */
|
|
||||||
+ if (register_size (regcache->tdesc, 0) == 4)
|
|
||||||
+ {
|
|
||||||
+ void *ptr = ((gdb_byte *) buf
|
|
||||||
+ + i386_regmap[find_regno (regcache->tdesc, "eax")]);
|
|
||||||
+
|
|
||||||
+ *(int64_t *) ptr = *(int32_t *) ptr;
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
27
gdb.changes
27
gdb.changes
@ -1,3 +1,30 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Sep 30 10:34:54 UTC 2019 - Tom de Vries <tdevries@suse.com>
|
||||||
|
|
||||||
|
- Add gdb-testsuite-8.3-kfail-xfail-unsupported.patch
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Thu Sep 26 16:51:17 UTC 2019 - Tom de Vries <tdevries@suse.com>
|
||||||
|
|
||||||
|
- Drop ChangeLog part of patch:
|
||||||
|
* gdb-rhbz1708192-parse_macro_definition-crash.patch
|
||||||
|
* gdb-rhbz1704406-disable-style-log-output-1of3.patch
|
||||||
|
* gdb-rhbz1704406-disable-style-log-output-2of3.patch
|
||||||
|
* gdb-rhbz1704406-disable-style-log-output-3of3.patch
|
||||||
|
* gdb-rhbz1723564-gdb-crash-PYTHONMALLOC-debug.patch
|
||||||
|
* gdb-rhbz1553086-binutils-warning-loadable-section-outside-elf.patch
|
||||||
|
- Update to gdb-8.3.1.
|
||||||
|
* Drop "Testsuite: Ensure pie is disabled on some tests" part of
|
||||||
|
gdb-testsuite-pie-no-pie.patch
|
||||||
|
* Drop:
|
||||||
|
- gdb-7.10-swo18929.patch
|
||||||
|
- gdb-handle-vfork-in-thread-with-follow-fork-mode-child.patch
|
||||||
|
- gdb-x86_64-i386-syscall-restart-master.patch
|
||||||
|
- gdb-suppress-sigttou-when-handling-errors.patch
|
||||||
|
- gdb-fix-breakpoints-on-file-reloads-for-pie-binaries.patch
|
||||||
|
- gdb-symtab-fix-symbol-loading-performance-regression.patch
|
||||||
|
- Fix macro in comment warning
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Wed Sep 25 14:41:32 UTC 2019 - Tom de Vries <tdevries@suse.com>
|
Wed Sep 25 14:41:32 UTC 2019 - Tom de Vries <tdevries@suse.com>
|
||||||
|
|
||||||
|
27
gdb.spec
27
gdb.spec
@ -28,7 +28,7 @@ License: GPL-3.0-or-later AND GPL-3.0-with-GCC-exception AND LGPL-2.1-or-
|
|||||||
Group: Development/Tools/Debuggers
|
Group: Development/Tools/Debuggers
|
||||||
Name: gdb
|
Name: gdb
|
||||||
|
|
||||||
Version: 8.3
|
Version: 8.3.1
|
||||||
Release: 0
|
Release: 0
|
||||||
|
|
||||||
# The release always contains a leading reserved number, start it at 1.
|
# The release always contains a leading reserved number, start it at 1.
|
||||||
@ -232,30 +232,21 @@ Patch1003: gdb-testsuite-ada-pie.patch
|
|||||||
|
|
||||||
# Patches to upstream
|
# Patches to upstream
|
||||||
|
|
||||||
# Fixed upstream Wed, 29 May 2019, 4330d61dfb "Fix crash in
|
|
||||||
# cp_print_value_fields". We should be able to drop this in 8.4.
|
|
||||||
Patch1005: gdb-7.10-swo18929.patch
|
|
||||||
|
|
||||||
# Fixed upstream Sat, Jun 22 2019, 47e3f47487 "[gdb] Fix s390x -m31 build".
|
# Fixed upstream Sat, Jun 22 2019, 47e3f47487 "[gdb] Fix s390x -m31 build".
|
||||||
# We should be able to drop this in 8.4.
|
# We should be able to drop this in 8.4.
|
||||||
Patch1007: gdb-fix-s390-build.diff
|
Patch1007: gdb-fix-s390-build.diff
|
||||||
|
|
||||||
# Backports from master
|
# Backports from master
|
||||||
|
|
||||||
Patch2000: gdb-handle-vfork-in-thread-with-follow-fork-mode-child.patch
|
|
||||||
Patch2001: gdb-fix-riscv-tdep.patch
|
Patch2001: gdb-fix-riscv-tdep.patch
|
||||||
Patch2002: gdb-x86_64-i386-syscall-restart-master.patch
|
|
||||||
Patch2003: gdb-suppress-sigttou-when-handling-errors.patch
|
|
||||||
Patch2004: gdb-testsuite-add-missing-initial-prompt-read-in-multidictionary.exp.patch
|
Patch2004: gdb-testsuite-add-missing-initial-prompt-read-in-multidictionary.exp.patch
|
||||||
Patch2005: gdb-testsuite-pie-no-pie.patch
|
Patch2005: gdb-testsuite-pie-no-pie.patch
|
||||||
Patch2006: gdb-fix-breakpoints-on-file-reloads-for-pie-binaries.patch
|
|
||||||
Patch2007: gdb-testsuite-read1-fixes.patch
|
Patch2007: gdb-testsuite-read1-fixes.patch
|
||||||
Patch2008: gdb-testsuite-i386-pkru-exp.patch
|
Patch2008: gdb-testsuite-i386-pkru-exp.patch
|
||||||
|
|
||||||
# Submitted for master
|
|
||||||
|
|
||||||
Patch2500: gdb-fix-heap-use-after-free-in-typename-concat.patch
|
Patch2500: gdb-fix-heap-use-after-free-in-typename-concat.patch
|
||||||
Patch2501: gdb-symtab-fix-symbol-loading-performance-regression.patch
|
|
||||||
|
# Testsuite patches
|
||||||
|
Patch2600: gdb-testsuite-8.3-kfail-xfail-unsupported.patch
|
||||||
|
|
||||||
# libipt support
|
# libipt support
|
||||||
Patch3000: v1.5-libipt-static.patch
|
Patch3000: v1.5-libipt-static.patch
|
||||||
@ -587,21 +578,17 @@ find -name "*.info*"|xargs rm -f
|
|||||||
%patch1002 -p1
|
%patch1002 -p1
|
||||||
%patch1003 -p1
|
%patch1003 -p1
|
||||||
|
|
||||||
%patch1005 -p1
|
|
||||||
%patch1007 -p1
|
%patch1007 -p1
|
||||||
|
|
||||||
%patch2000 -p1
|
|
||||||
%patch2001 -p1
|
%patch2001 -p1
|
||||||
%patch2002 -p1
|
|
||||||
%patch2003 -p1
|
|
||||||
%patch2004 -p1
|
%patch2004 -p1
|
||||||
%patch2005 -p1
|
%patch2005 -p1
|
||||||
%patch2006 -p1
|
|
||||||
%patch2007 -p1
|
%patch2007 -p1
|
||||||
%patch2008 -p1
|
%patch2008 -p1
|
||||||
|
|
||||||
%patch2500 -p1
|
%patch2500 -p1
|
||||||
%patch2501 -p1
|
|
||||||
|
%patch2600 -p1
|
||||||
|
|
||||||
#unpack libipt
|
#unpack libipt
|
||||||
%if 0%{have_libipt}
|
%if 0%{have_libipt}
|
||||||
@ -832,7 +819,7 @@ then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# This is a build-time test, but still a test. So, skip if we don't do tests.
|
# This is a build-time test, but still a test. So, skip if we don't do tests.
|
||||||
# This is relevant for %qemu_user_space_build == 1 builds, which atm is
|
# This is relevant for %%qemu_user_space_build == 1 builds, which atm is
|
||||||
# the case for riscv64.
|
# the case for riscv64.
|
||||||
%if %{with testsuite}
|
%if %{with testsuite}
|
||||||
if [ "$LIBRPM" != "no" ]; then
|
if [ "$LIBRPM" != "no" ]; then
|
||||||
|
Loading…
x
Reference in New Issue
Block a user