Compare commits
6 Commits
| Author | SHA256 | Date | |
|---|---|---|---|
|
|
23d498ecd7 | ||
|
|
fcf6764793 | ||
|
|
c924a88582 | ||
|
|
6b0b077a98 | ||
|
|
f2af35aae0 | ||
|
|
c74d579308 |
172
avoid-crash-with-length.patch
Normal file
172
avoid-crash-with-length.patch
Normal file
@@ -0,0 +1,172 @@
|
||||
From 357a5282a9a6fba1eccb5fb1111f5ae9dbe35b1f Mon Sep 17 00:00:00 2001
|
||||
From: Tom Tromey <tromey@adacore.com>
|
||||
Date: Tue, 21 Jan 2025 10:49:07 -0700
|
||||
Subject: [PATCH 01/25] Avoid crash with 'length
|
||||
|
||||
While testing gnat-llvm, I found a gdb crash when applying 'length to
|
||||
a non-array type. This patch fixes the crash.
|
||||
---
|
||||
gdb/ada-lang.c | 5 ++--
|
||||
gdb/testsuite/gdb.ada/p-bounds.exp | 36 +++++++++++++++++++++++++
|
||||
gdb/testsuite/gdb.ada/p-bounds/main.adb | 22 +++++++++++++++
|
||||
gdb/testsuite/gdb.ada/p-bounds/pck.adb | 21 +++++++++++++++
|
||||
gdb/testsuite/gdb.ada/p-bounds/pck.ads | 24 +++++++++++++++++
|
||||
5 files changed, 106 insertions(+), 2 deletions(-)
|
||||
create mode 100644 gdb/testsuite/gdb.ada/p-bounds.exp
|
||||
create mode 100644 gdb/testsuite/gdb.ada/p-bounds/main.adb
|
||||
create mode 100644 gdb/testsuite/gdb.ada/p-bounds/pck.adb
|
||||
create mode 100644 gdb/testsuite/gdb.ada/p-bounds/pck.ads
|
||||
|
||||
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
|
||||
index e9311c179b9..1689989d0f8 100644
|
||||
--- a/gdb/ada-lang.c
|
||||
+++ b/gdb/ada-lang.c
|
||||
@@ -1819,7 +1819,8 @@ desc_bounds_type (struct type *type)
|
||||
}
|
||||
|
||||
/* If ARR is an array descriptor (fat or thin pointer), or pointer to
|
||||
- one, a pointer to its bounds data. Otherwise NULL. */
|
||||
+ one, a pointer to its bounds data. Otherwise, throw an
|
||||
+ exception. */
|
||||
|
||||
static struct value *
|
||||
desc_bounds (struct value *arr)
|
||||
@@ -1870,7 +1871,7 @@ desc_bounds (struct value *arr)
|
||||
return p_bounds;
|
||||
}
|
||||
else
|
||||
- return NULL;
|
||||
+ error (_("Not an array"));
|
||||
}
|
||||
|
||||
/* If TYPE is the type of an array-descriptor (fat pointer), the bit
|
||||
diff --git a/gdb/testsuite/gdb.ada/p-bounds.exp b/gdb/testsuite/gdb.ada/p-bounds.exp
|
||||
new file mode 100644
|
||||
index 00000000000..d075491152a
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.ada/p-bounds.exp
|
||||
@@ -0,0 +1,36 @@
|
||||
+# Copyright 2025 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/>.
|
||||
+
|
||||
+# Check for a crash with a type that looks vaguely like an array
|
||||
+# descriptor.
|
||||
+
|
||||
+load_lib "ada.exp"
|
||||
+
|
||||
+require allow_ada_tests
|
||||
+
|
||||
+standard_ada_testfile main
|
||||
+
|
||||
+if {[gdb_compile_ada "${srcfile}" "${binfile}" executable debug] != ""} {
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+clean_restart ${testfile}
|
||||
+
|
||||
+set bp_location [gdb_get_line_number "STOP" ${testdir}/main.adb]
|
||||
+if {![runto "main.adb:$bp_location"]} {
|
||||
+ return
|
||||
+}
|
||||
+
|
||||
+gdb_test "print not_an_array'length" "Not an array"
|
||||
diff --git a/gdb/testsuite/gdb.ada/p-bounds/main.adb b/gdb/testsuite/gdb.ada/p-bounds/main.adb
|
||||
new file mode 100644
|
||||
index 00000000000..d6654aee240
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.ada/p-bounds/main.adb
|
||||
@@ -0,0 +1,22 @@
|
||||
+-- Copyright 2025 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/>.
|
||||
+
|
||||
+with Pck; use Pck;
|
||||
+
|
||||
+procedure Main is
|
||||
+ Not_An_Array : Counfounding := (p_array => 23, p_bounds => 27);
|
||||
+begin
|
||||
+ Do_Nothing (Not_An_Array'Address); -- STOP
|
||||
+end Main;
|
||||
diff --git a/gdb/testsuite/gdb.ada/p-bounds/pck.adb b/gdb/testsuite/gdb.ada/p-bounds/pck.adb
|
||||
new file mode 100644
|
||||
index 00000000000..a175b7bdc5a
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.ada/p-bounds/pck.adb
|
||||
@@ -0,0 +1,21 @@
|
||||
+-- Copyright 2014-2024 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/>.
|
||||
+
|
||||
+package body Pck is
|
||||
+ procedure Do_Nothing (A : System.Address) is
|
||||
+ begin
|
||||
+ null;
|
||||
+ end Do_Nothing;
|
||||
+end Pck;
|
||||
diff --git a/gdb/testsuite/gdb.ada/p-bounds/pck.ads b/gdb/testsuite/gdb.ada/p-bounds/pck.ads
|
||||
new file mode 100644
|
||||
index 00000000000..56685773bb9
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.ada/p-bounds/pck.ads
|
||||
@@ -0,0 +1,24 @@
|
||||
+-- Copyright 2014-2024 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/>.
|
||||
+
|
||||
+with System;
|
||||
+package Pck is
|
||||
+ type Counfounding is record
|
||||
+ p_array: integer;
|
||||
+ p_bounds: integer;
|
||||
+ end record;
|
||||
+
|
||||
+ procedure Do_Nothing (A : System.Address);
|
||||
+end Pck;
|
||||
--
|
||||
2.51.0
|
||||
|
||||
80
bfd-elf-handle-prstatus-of-156-bytes-in-elf32_arm_na.patch
Normal file
80
bfd-elf-handle-prstatus-of-156-bytes-in-elf32_arm_na.patch
Normal file
@@ -0,0 +1,80 @@
|
||||
From 7f89abca702d04b67e5018ba89b74867a80ab675 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Sat, 22 Nov 2025 16:19:14 +0100
|
||||
Subject: [PATCH 16/25] bfd/ELF: Handle prstatus of 156 bytes in
|
||||
elf32_arm_nabi_grok_prstatus
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
For a corefile generated on openSUSE Leap 15.2 armv7l with linux version
|
||||
5.3.18, we get:
|
||||
...
|
||||
$ gdb -q --core core
|
||||
...
|
||||
Core was generated by `/usr/bin/rs_scope -d'.
|
||||
|
||||
⚠️ warning: Couldn't find general-purpose registers in core file.
|
||||
(gdb)
|
||||
...
|
||||
|
||||
The warning is emitted because the pseudo-section .reg is missing, because
|
||||
elf32_arm_nabi_grok_prstatus expects the PRSTATUS note to have size 148, but
|
||||
instead we have:
|
||||
...
|
||||
$ eu-readelf -n core | grep -i prstatus
|
||||
CORE 156 PRSTATUS
|
||||
CORE 156 PRSTATUS
|
||||
CORE 156 PRSTATUS
|
||||
CORE 156 PRSTATUS
|
||||
...
|
||||
|
||||
This is a bug for CONFIG_BINFMT_ELF_FDPIC=y configurations, fixed
|
||||
by v5.9 linux kernel commit 16aead81018c ("take fdpic-related parts of
|
||||
elf_prstatus out").
|
||||
|
||||
The bug causes the FDPIC-specific unsigned long fields pr_exec_fdpic_loadmap
|
||||
and pr_interp_fdpic_loadmap to be added to struct elf_prstatus in case the
|
||||
FDPIC ABI is not used.
|
||||
|
||||
Work around this bug in elf32_arm_nabi_grok_prstatus, by ignoring the extra
|
||||
fields, which gets us instead:
|
||||
...
|
||||
Core was generated by `/usr/bin/rs_scope -d'.
|
||||
Program terminated with signal SIGSEGV, Segmentation fault.
|
||||
[Current thread is 1 (LWP 30047)]
|
||||
(gdb)
|
||||
...
|
||||
|
||||
Tested gdb, gas, binutils and ld on x86_64-linux and arm-linux with
|
||||
--enable-targets=all.
|
||||
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33560
|
||||
---
|
||||
bfd/elf32-arm.c | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
|
||||
index 77510687150..838ad43abda 100644
|
||||
--- a/bfd/elf32-arm.c
|
||||
+++ b/bfd/elf32-arm.c
|
||||
@@ -2151,6 +2151,16 @@ elf32_arm_nabi_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
|
||||
default:
|
||||
return false;
|
||||
|
||||
+ case 156: /* Linux/ARM 32-bit, some pre-v5.9 linux kernels. */
|
||||
+ /* There's a linux kernel bug for CONFIG_BINFMT_ELF_FDPIC=y
|
||||
+ configurations, fixed by v5.9 linux kernel commit 16aead81018c
|
||||
+ ("take fdpic-related parts of elf_prstatus out").
|
||||
+ The bug causes the FDPIC-specific unsigned long fields
|
||||
+ pr_exec_fdpic_loadmap and pr_interp_fdpic_loadmap to be added to
|
||||
+ struct elf_prstatus in case the FDPIC ABI is not used.
|
||||
+ The two fields are added after pr_reg, so just ignore them. */
|
||||
+
|
||||
+ /* Fall through. */
|
||||
case 148: /* Linux/ARM 32-bit. */
|
||||
/* pr_cursig */
|
||||
elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
|
||||
--
|
||||
2.51.0
|
||||
|
||||
135
change-return-value-of-_bfd_mmap_temporary.patch
Normal file
135
change-return-value-of-_bfd_mmap_temporary.patch
Normal file
@@ -0,0 +1,135 @@
|
||||
From a8b8576e54323add0cd7d239ea3e7f5cbb4f4bdc Mon Sep 17 00:00:00 2001
|
||||
From: Tom Tromey <tom@tromey.com>
|
||||
Date: Thu, 4 Sep 2025 14:12:52 -0600
|
||||
Subject: [PATCH 08/25] Change return value of _bfd_mmap_temporary
|
||||
|
||||
_bfd_mmap_temporary will return MAP_FAILED in some cases, but only one
|
||||
caller was prepared for this. This caused a couple of issues in gdb.
|
||||
|
||||
This patch chnages _bfd_mmap_temporary to always return NULL on
|
||||
failure. It also changes the logic to fall back to bfd_malloc if mmap
|
||||
fails.
|
||||
|
||||
I took the opportunity to change some "(void *) -1" to MAP_FAILED
|
||||
where appropriate.
|
||||
|
||||
Tested by "make check" in binutils, and also by applying a hack from
|
||||
bug 33354 to gdb and testing something approximating the original
|
||||
report.
|
||||
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32542
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33354
|
||||
|
||||
(cherry picked from commit 8b50cc76f19d129b3887dbcb58f8286a7b36099f)
|
||||
---
|
||||
bfd/bfdio.c | 5 +++--
|
||||
bfd/libbfd.c | 33 +++++++++++++++------------------
|
||||
bfd/libbfd.h | 2 +-
|
||||
3 files changed, 19 insertions(+), 21 deletions(-)
|
||||
|
||||
diff --git a/bfd/bfdio.c b/bfd/bfdio.c
|
||||
index 2a7f77fa8d4..1602743c7e2 100644
|
||||
--- a/bfd/bfdio.c
|
||||
+++ b/bfd/bfdio.c
|
||||
@@ -293,7 +293,7 @@ DESCRIPTION
|
||||
. int (*bstat) (struct bfd *abfd, struct stat *sb);
|
||||
. {* Mmap a part of the files. ADDR, LEN, PROT, FLAGS and OFFSET are the usual
|
||||
. mmap parameter, except that LEN and OFFSET do not need to be page
|
||||
-. aligned. Returns (void *)-1 on failure, mmapped address on success.
|
||||
+. aligned. Returns MAP_FAILED on failure, mmapped address on success.
|
||||
. Also write in MAP_ADDR the address of the page aligned buffer and in
|
||||
. MAP_LEN the size mapped (a page multiple). Use unmap with MAP_ADDR and
|
||||
. MAP_LEN to unmap. *}
|
||||
@@ -725,6 +725,7 @@ DESCRIPTION
|
||||
Return mmap()ed region of the file, if possible and implemented.
|
||||
LEN and OFFSET do not need to be page aligned. The page aligned
|
||||
address and length are written to MAP_ADDR and MAP_LEN.
|
||||
+ Returns MAP_FAILED on failure.
|
||||
|
||||
*/
|
||||
|
||||
@@ -898,7 +899,7 @@ memory_bmmap (bfd *abfd ATTRIBUTE_UNUSED, void *addr ATTRIBUTE_UNUSED,
|
||||
void **map_addr ATTRIBUTE_UNUSED,
|
||||
size_t *map_len ATTRIBUTE_UNUSED)
|
||||
{
|
||||
- return (void *)-1;
|
||||
+ return MAP_FAILED;
|
||||
}
|
||||
|
||||
const struct bfd_iovec _bfd_memory_iovec =
|
||||
diff --git a/bfd/libbfd.c b/bfd/libbfd.c
|
||||
index 4ab5bf498fd..3488bd09abe 100644
|
||||
--- a/bfd/libbfd.c
|
||||
+++ b/bfd/libbfd.c
|
||||
@@ -1098,24 +1098,26 @@ bfd_mmap_local (bfd *abfd, size_t rsize, void **map_addr, size_t *map_size)
|
||||
|
||||
/* Mmap a memory region of RSIZE bytes at the current offset.
|
||||
Return mmap address and size in MAP_ADDR and MAP_SIZE. Return NULL
|
||||
- on invalid input and MAP_FAILED for mmap failure. */
|
||||
+ on invalid input. */
|
||||
|
||||
void *
|
||||
_bfd_mmap_temporary (bfd *abfd, size_t rsize, void **map_addr,
|
||||
size_t *map_size)
|
||||
{
|
||||
/* Use mmap only if section size >= the minimum mmap section size. */
|
||||
- if (rsize < _bfd_minimum_mmap_size)
|
||||
+ if (rsize >= _bfd_minimum_mmap_size)
|
||||
{
|
||||
- void *mem = _bfd_malloc_and_read (abfd, rsize, rsize);
|
||||
- /* NB: Set *MAP_ADDR to MEM and *MAP_SIZE to 0 to indicate that
|
||||
- _bfd_malloc_and_read is called. */
|
||||
- *map_addr = mem;
|
||||
- *map_size = 0;
|
||||
- return mem;
|
||||
+ void *result = bfd_mmap_local (abfd, rsize, map_addr, map_size);
|
||||
+ if (result != MAP_FAILED)
|
||||
+ return result;
|
||||
}
|
||||
|
||||
- return bfd_mmap_local (abfd, rsize, map_addr, map_size);
|
||||
+ void *mem = _bfd_malloc_and_read (abfd, rsize, rsize);
|
||||
+ /* NB: Set *MAP_ADDR to MEM and *MAP_SIZE to 0 to indicate that
|
||||
+ _bfd_malloc_and_read is called. */
|
||||
+ *map_addr = mem;
|
||||
+ *map_size = 0;
|
||||
+ return mem;
|
||||
}
|
||||
|
||||
/* Munmap RSIZE bytes at PTR. */
|
||||
@@ -1213,15 +1215,10 @@ _bfd_mmap_read_temporary (void **data_p, size_t *size_p,
|
||||
if (use_mmmap)
|
||||
{
|
||||
void *mmaped = _bfd_mmap_temporary (abfd, size, mmap_base, size_p);
|
||||
- /* MAP_FAILED is returned when called from GDB on an object with
|
||||
- opncls_iovec. Use bfd_read in this case. */
|
||||
- if (mmaped != MAP_FAILED)
|
||||
- {
|
||||
- if (mmaped == NULL)
|
||||
- abort ();
|
||||
- *data_p = mmaped;
|
||||
- return true;
|
||||
- }
|
||||
+ if (mmaped == NULL)
|
||||
+ return false;
|
||||
+ *data_p = mmaped;
|
||||
+ return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
diff --git a/bfd/libbfd.h b/bfd/libbfd.h
|
||||
index d4be334bf87..fa09e3c656e 100644
|
||||
--- a/bfd/libbfd.h
|
||||
+++ b/bfd/libbfd.h
|
||||
@@ -1022,7 +1022,7 @@ struct bfd_iovec
|
||||
int (*bstat) (struct bfd *abfd, struct stat *sb);
|
||||
/* Mmap a part of the files. ADDR, LEN, PROT, FLAGS and OFFSET are the usual
|
||||
mmap parameter, except that LEN and OFFSET do not need to be page
|
||||
- aligned. Returns (void *)-1 on failure, mmapped address on success.
|
||||
+ aligned. Returns MAP_FAILED on failure, mmapped address on success.
|
||||
Also write in MAP_ADDR the address of the page aligned buffer and in
|
||||
MAP_LEN the size mapped (a page multiple). Use unmap with MAP_ADDR and
|
||||
MAP_LEN to unmap. */
|
||||
--
|
||||
2.51.0
|
||||
|
||||
44
check-gnatmake-version-in-gnat_version_compare.patch
Normal file
44
check-gnatmake-version-in-gnat_version_compare.patch
Normal file
@@ -0,0 +1,44 @@
|
||||
From f0aa64a18995ba181aa975804934e9b4b02bf076 Mon Sep 17 00:00:00 2001
|
||||
From: Tom Tromey <tromey@adacore.com>
|
||||
Date: Mon, 31 Mar 2025 11:53:53 -0600
|
||||
Subject: [PATCH 14/25] Check gnatmake version in gnat_version_compare
|
||||
|
||||
Tom de Vries pointed out that my earlier change to
|
||||
gnat_version_compare made it actually test gcc's version -- not
|
||||
gnat's.
|
||||
|
||||
This patch changes gnat_version_compare to examine gnatmake's version,
|
||||
while preserving the nicer API.
|
||||
|
||||
Approved-By: Tom de Vries <tdevries@suse.de>
|
||||
---
|
||||
gdb/testsuite/lib/ada.exp | 10 +++++++---
|
||||
1 file changed, 7 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/gdb/testsuite/lib/ada.exp b/gdb/testsuite/lib/ada.exp
|
||||
index 4d04d597474..3d18e6ad82c 100644
|
||||
--- a/gdb/testsuite/lib/ada.exp
|
||||
+++ b/gdb/testsuite/lib/ada.exp
|
||||
@@ -223,12 +223,16 @@ proc gnatmake_version_at_least { major } {
|
||||
# compiler does not appear to be GCC, this will always return false.
|
||||
|
||||
proc gnat_version_compare {op l2} {
|
||||
- set gccvers [gcc_major_version]
|
||||
- if {$gccvers == -1} {
|
||||
+ set gnatmake [find_gnatmake]
|
||||
+ set gnatmake [lindex [split $gnatmake] 0]
|
||||
+ if {[catch {exec $gnatmake --version} output]} {
|
||||
+ return 0
|
||||
+ }
|
||||
+ if {![regexp {GNATMAKE ([0-9]+(\.[0-9]+)*)} $output match version]} {
|
||||
return 0
|
||||
}
|
||||
|
||||
- return [version_compare [split $gccvers .] $op $l2]
|
||||
+ return [version_compare [split $version .] $op $l2]
|
||||
}
|
||||
|
||||
# Return 1 if the GNAT runtime appears to have debug info.
|
||||
--
|
||||
2.51.0
|
||||
|
||||
181
correct-bounds-check-when-working-around-gas-dwarf-5.patch
Normal file
181
correct-bounds-check-when-working-around-gas-dwarf-5.patch
Normal file
@@ -0,0 +1,181 @@
|
||||
From c91de4aa70627bd3c33788d90597c1b787c8d905 Mon Sep 17 00:00:00 2001
|
||||
From: Keith Seitz <keiths@redhat.com>
|
||||
Date: Fri, 19 Sep 2025 09:50:46 -0700
|
||||
Subject: [PATCH 02/25] Correct bounds check when working around GAS DWARF 5
|
||||
directory table bug
|
||||
|
||||
Recent Go toolchains are causing GDB to crash on a relatively recent
|
||||
workaround for a GAS bug:
|
||||
|
||||
commit a833790a626d9620319d0ca6aee23daa584d445c
|
||||
Date: Wed Nov 1 00:33:12 2023 +0100
|
||||
|
||||
[gdb/symtab] Work around gas PR28629
|
||||
|
||||
In the original GAS bug, the first directory table entry did not contain
|
||||
the current directory of the compilation. So the above commit added a
|
||||
workaround fix to prepend the second directory table entry.
|
||||
|
||||
However recent Go toolchain compilations (specifically on aarch64)
|
||||
only output a single directory table entry. Looking at the workaround:
|
||||
|
||||
if (lh->version == 5 && lh->is_valid_file_index (1))
|
||||
{
|
||||
std::string dir = lh->include_dir_at (1);
|
||||
fnd.set_comp_dir (std::move (dir));
|
||||
}
|
||||
|
||||
`lh->is_valid_file_index (1)' is true, but since the directory table only
|
||||
has one entry, `include_dir_at (1)' returns nullptr. Consequently the
|
||||
std::string ctor will segfault. Since there are no guarantees that the file
|
||||
and directory tables are the same size, a better bounds check is to simply
|
||||
rely on `include_dir_at' to ensure a valid directory table entry.
|
||||
|
||||
I have updated the workaround commit's test, gdb.dwarf2/dw2-gas-workaround.exp
|
||||
and tested on x86_64 and aarch64 RHEL 9 and Fedora 41.
|
||||
|
||||
Approved-By: Andrew Burgess <aburgess@redhat.com>
|
||||
---
|
||||
gdb/dwarf2/read.c | 2 +-
|
||||
.../gdb.dwarf2/dw2-gas-workaround.exp | 92 ++++++++++++-------
|
||||
2 files changed, 58 insertions(+), 36 deletions(-)
|
||||
|
||||
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
|
||||
index 5fe92c24559..19a46425f84 100644
|
||||
--- a/gdb/dwarf2/read.c
|
||||
+++ b/gdb/dwarf2/read.c
|
||||
@@ -7520,7 +7520,7 @@ read_file_scope (struct die_info *die, struct dwarf2_cu *cu)
|
||||
sect_offset line_offset = (sect_offset) attr->as_unsigned ();
|
||||
line_header_up lh = dwarf_decode_line_header (line_offset, cu,
|
||||
fnd.get_comp_dir ());
|
||||
- if (lh->version == 5 && lh->is_valid_file_index (1))
|
||||
+ if (lh->version == 5 && lh->include_dir_at (1) != nullptr)
|
||||
{
|
||||
std::string dir = lh->include_dir_at (1);
|
||||
fnd.set_comp_dir (std::move (dir));
|
||||
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-gas-workaround.exp b/gdb/testsuite/gdb.dwarf2/dw2-gas-workaround.exp
|
||||
index 5d6e13a9ae0..4155358f50e 100644
|
||||
--- a/gdb/testsuite/gdb.dwarf2/dw2-gas-workaround.exp
|
||||
+++ b/gdb/testsuite/gdb.dwarf2/dw2-gas-workaround.exp
|
||||
@@ -20,7 +20,7 @@ load_lib dwarf.exp
|
||||
# This test can only be run on targets which support DWARF-2 and use gas.
|
||||
require dwarf2_support
|
||||
|
||||
-standard_testfile dw2-lines.c -dw2.S
|
||||
+standard_testfile dw2-lines.c -dw2.S -dw2-one-diridx.S
|
||||
|
||||
with_shared_gdb {
|
||||
set func_info_vars [get_func_info bar]
|
||||
@@ -33,49 +33,61 @@ proc line_for { l } {
|
||||
return [expr $line + 1]
|
||||
}
|
||||
|
||||
-set asm_file [standard_output_file $srcfile2]
|
||||
-Dwarf::assemble $asm_file {
|
||||
- declare_labels Llines
|
||||
- global srcdir subdir srcfile objdir
|
||||
- global func_info_vars
|
||||
- foreach var $func_info_vars {
|
||||
- global $var
|
||||
- }
|
||||
+# A helper proc to create the DWARF assembly for the test.
|
||||
+# If ONE_DIRIDX is true, then the directory table will be limited
|
||||
+# to one entry.
|
||||
+proc create_dwarf_assembly {source_file one_diridx} {
|
||||
+ set asm_file [standard_output_file $source_file]
|
||||
+ Dwarf::assemble $asm_file {
|
||||
+ declare_labels Llines
|
||||
+ global srcdir subdir srcfile objdir
|
||||
+ global func_info_vars
|
||||
+ upvar one_diridx one_diridx
|
||||
+ foreach var $func_info_vars {
|
||||
+ global $var
|
||||
+ }
|
||||
|
||||
- cu { version 5 } {
|
||||
- compile_unit {
|
||||
- {language @DW_LANG_Mips_Assembler}
|
||||
- {name $srcfile}
|
||||
- {comp_dir $objdir}
|
||||
- {stmt_list $Llines DW_FORM_sec_offset}
|
||||
- {producer "GNU AS 2.35.2"}
|
||||
- } {
|
||||
- subprogram {
|
||||
- {external 1 flag}
|
||||
- {name bar}
|
||||
- {low_pc $bar_start addr}
|
||||
- {high_pc "$bar_start + $bar_len" addr}
|
||||
+ cu { version 5 } {
|
||||
+ compile_unit {
|
||||
+ {DW_AT_language @DW_LANG_Mips_Assembler}
|
||||
+ {DW_AT_name $srcfile}
|
||||
+ {DW_AT_comp_dir $objdir}
|
||||
+ {DW_AT_stmt_list $Llines DW_FORM_sec_offset}
|
||||
+ {DW_AT_producer "GNU AS 2.35.2"}
|
||||
+ } {
|
||||
+ subprogram {
|
||||
+ {DW_AT_external 1 flag}
|
||||
+ {DW_AT_name bar}
|
||||
+ {DW_AT_low_pc $bar_start addr}
|
||||
+ {DW_AT_high_pc "$bar_start + $bar_len" addr}
|
||||
+ }
|
||||
}
|
||||
}
|
||||
- }
|
||||
|
||||
- lines [list version 5] Llines {
|
||||
- set diridx1 [include_dir "${srcdir}/${subdir}"]
|
||||
- set diridx2 [include_dir "${srcdir}/${subdir}"]
|
||||
- file_name "$srcfile" $diridx1
|
||||
- file_name "$srcfile" $diridx2
|
||||
-
|
||||
- program {
|
||||
- DW_LNE_set_address bar_label
|
||||
- line [line_for bar_label]
|
||||
- DW_LNS_copy
|
||||
+ lines [list version 5] Llines {
|
||||
+ set diridx1 [include_dir "${srcdir}/${subdir}"]
|
||||
+ file_name "$srcfile" $diridx1
|
||||
+ if {!$one_diridx} {
|
||||
+ set diridx2 [include_dir "${srcdir}/${subdir}"]
|
||||
+ file_name "$srcfile" $diridx2
|
||||
+ } else {
|
||||
+ file_name "$srcfile" $diridx1
|
||||
+ }
|
||||
+ program {
|
||||
+ DW_LNE_set_address bar_label
|
||||
+ line [line_for bar_label]
|
||||
+ DW_LNS_copy
|
||||
|
||||
- DW_LNE_set_address $bar_end
|
||||
- DW_LNE_end_sequence
|
||||
+ DW_LNE_set_address $bar_end
|
||||
+ DW_LNE_end_sequence
|
||||
+ }
|
||||
}
|
||||
}
|
||||
+
|
||||
+ return $asm_file
|
||||
}
|
||||
|
||||
+set asm_file [create_dwarf_assembly $srcfile2 false]
|
||||
if { [prepare_for_testing "failed to prepare" ${testfile} \
|
||||
[list $srcfile $asm_file] {nodebug}] } {
|
||||
return -1
|
||||
@@ -90,3 +102,13 @@ gdb_test_multiple "ptype bar" "" {
|
||||
pass $gdb_test_name
|
||||
}
|
||||
}
|
||||
+
|
||||
+# Test whether gdb crashes in the case where the number of
|
||||
+# directory indexes is only one.
|
||||
+set asm_file [create_dwarf_assembly $srcfile3 true]
|
||||
+if {[prepare_for_testing "failed to prepare" ${testfile}-one-diridx \
|
||||
+ [list $srcfile $asm_file] {nodebug}] } {
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+gdb_test "ptype bar" ".*" "do not crash with only one directory table entry"
|
||||
--
|
||||
2.51.0
|
||||
|
||||
56
fix-crash-in-f-typeprint.c.patch
Normal file
56
fix-crash-in-f-typeprint.c.patch
Normal file
@@ -0,0 +1,56 @@
|
||||
From a69161a5cbdd93ccd27ea6e07139611039ff3b56 Mon Sep 17 00:00:00 2001
|
||||
From: Tom Tromey <tom@tromey.com>
|
||||
Date: Sat, 13 Sep 2025 13:44:10 -0600
|
||||
Subject: [PATCH 09/25] Fix crash in f-typeprint.c
|
||||
|
||||
I noticed a crash in f-typeprint.c that was hidden by an xfail:
|
||||
|
||||
XFAIL: gdb.fortran/vla-array.exp: print variable length string array type (GDB internal error) (PRMS gcc/101826)
|
||||
|
||||
I think this was introduced by commit 6594ca4a ("do not handle a NULL
|
||||
linebuffer in pager_file::puts") but not detected due to the xfail.
|
||||
|
||||
It seems bad for an xfail to cover up a crash but I haven't
|
||||
investigated that.
|
||||
|
||||
Meanwhile, this patch fixes the crash by checking for a NULL pointer
|
||||
when calling gdb_puts.
|
||||
|
||||
Approved-by: Kevin Buettner <kevinb@redhat.com>
|
||||
(cherry picked from commit 18400a9cdf6b3d84996a99697a97774f268576c2)
|
||||
---
|
||||
gdb/f-typeprint.c | 11 +++++++----
|
||||
1 file changed, 7 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/gdb/f-typeprint.c b/gdb/f-typeprint.c
|
||||
index 36e434ae5c2..cba7099c0db 100644
|
||||
--- a/gdb/f-typeprint.c
|
||||
+++ b/gdb/f-typeprint.c
|
||||
@@ -414,9 +414,11 @@ f_language::f_type_print_base (struct type *type, struct ui_file *stream,
|
||||
if (show > 0)
|
||||
f_type_print_derivation_info (type, stream);
|
||||
|
||||
- gdb_puts (" ", stream);
|
||||
-
|
||||
- gdb_puts (type->name (), stream);
|
||||
+ if (type->name () != nullptr)
|
||||
+ {
|
||||
+ gdb_puts (" ", stream);
|
||||
+ gdb_puts (type->name (), stream);
|
||||
+ }
|
||||
|
||||
/* According to the definition,
|
||||
we only print structure elements in case show > 0. */
|
||||
@@ -435,7 +437,8 @@ f_language::f_type_print_base (struct type *type, struct ui_file *stream,
|
||||
gdb_puts ("\n", stream);
|
||||
}
|
||||
gdb_printf (stream, "%*sEnd Type ", level, "");
|
||||
- gdb_puts (type->name (), stream);
|
||||
+ if (type->name () != nullptr)
|
||||
+ gdb_puts (type->name (), stream);
|
||||
}
|
||||
break;
|
||||
|
||||
--
|
||||
2.51.0
|
||||
|
||||
53
fix-gdb.server-server-kill.exp.patch
Normal file
53
fix-gdb.server-server-kill.exp.patch
Normal file
@@ -0,0 +1,53 @@
|
||||
From 77f7bf5700b2b9be1172c7b5d05d03ee025c5d2c Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?S=C3=A9bastien=20Darche?= <sdarche@efficios.com>
|
||||
Date: Tue, 30 Sep 2025 15:07:41 -0400
|
||||
Subject: [PATCH] fix gdb.server/server-kill.exp
|
||||
|
||||
A test case in gdb.server/server-kill.exp attempts to query the server
|
||||
status after the server it is connected to has been killed. The
|
||||
connection is reset as expected, but the regex on the error message
|
||||
seems to be out-of-date. The test expects:
|
||||
|
||||
Remote communication error. Target disconnected: Connection reset by peer.
|
||||
|
||||
But a modern build of gdb yields :
|
||||
|
||||
Remote communication error. Target disconnected: error while reading: Connection reset by peer.
|
||||
|
||||
I presume this is due to change 0da23004a064 ("Change serial_readchar to
|
||||
throw") which added exceptions to the control flow handling instead of
|
||||
relying on perror(). The exception error string inserts "error while
|
||||
reading" to the perror message.
|
||||
|
||||
The test appeared to fail intermittently, sometimes matching the first
|
||||
part of the regex ("Remote connection closed"). It now passes
|
||||
consistently.
|
||||
|
||||
Change-Id: I3bf364b5d4b56de67f9ca30e9d636d3bb1be4119
|
||||
---
|
||||
gdb/testsuite/gdb.server/server-kill.exp | 3 +--
|
||||
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||
|
||||
diff --git a/gdb/testsuite/gdb.server/server-kill.exp b/gdb/testsuite/gdb.server/server-kill.exp
|
||||
index 4fc25097145..aba9a3cba2c 100644
|
||||
--- a/gdb/testsuite/gdb.server/server-kill.exp
|
||||
+++ b/gdb/testsuite/gdb.server/server-kill.exp
|
||||
@@ -97,7 +97,7 @@ proc_with_prefix test_tstatus {} {
|
||||
|
||||
# Force GDB to talk with GDBserver, so that we can get the
|
||||
# "connection closed" error.
|
||||
- gdb_test "tstatus" {Remote connection closed|Remote communication error\. Target disconnected: Connection reset by peer\.}
|
||||
+ gdb_test "tstatus" {Remote connection closed|Remote communication error\. Target disconnected: error while reading: Connection reset by peer\.}
|
||||
}
|
||||
|
||||
# Test unwinding with no debug/unwind info, right after the connection
|
||||
@@ -152,4 +152,3 @@ test_tstatus
|
||||
test_unwind_nosyms
|
||||
test_unwind_syms
|
||||
test_stepi
|
||||
-
|
||||
|
||||
base-commit: 76cd53ac04d28670ee1fd970d3e37d7006192a9c
|
||||
--
|
||||
2.51.0
|
||||
|
||||
3399
gdb-c-fix-hang-on-whatis-std-string-npos.patch
Normal file
3399
gdb-c-fix-hang-on-whatis-std-string-npos.patch
Normal file
File diff suppressed because it is too large
Load Diff
175
gdb-corefiles-fix-segfault-in-add_thread_silent.patch
Normal file
175
gdb-corefiles-fix-segfault-in-add_thread_silent.patch
Normal file
@@ -0,0 +1,175 @@
|
||||
From 01a9516fcbec4ac8d4cafab711d22d4396094694 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Fri, 21 Nov 2025 14:38:01 +0100
|
||||
Subject: [PATCH 15/25] [gdb/corefiles] Fix segfault in add_thread_silent
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
A user reported a segfault when loading a core file [1].
|
||||
|
||||
The core file is from arm-linux, but I reproduced the segfault on
|
||||
x86_64-linux:
|
||||
...
|
||||
$ gdb -q --core core
|
||||
|
||||
warning: Can't open file /usr/bin/rs_scope during file-backed mapping note processing
|
||||
|
||||
warning: Can't open file /lib/libc-2.26.so during file-backed mapping note processing
|
||||
|
||||
warning: File /lib/libgcc_s.so.1 doesn't match build-id from core-file during file-backed mapping processing
|
||||
|
||||
warning: Can't open file /lib/libm-2.26.so during file-backed mapping note processing
|
||||
|
||||
warning: Can't open file /usr/lib/libstdc++.so.6.0.28 during file-backed mapping note processing
|
||||
|
||||
warning: Can't open file /lib/libpthread-2.26.so during file-backed mapping note processing
|
||||
|
||||
warning: Can't open file /lib/ld-2.26.so during file-backed mapping note processing
|
||||
|
||||
Fatal signal: Segmentation fault
|
||||
----- Backtrace -----
|
||||
0x64a4ff gdb_internal_backtrace_1
|
||||
gdb/bt-utils.c:122
|
||||
0x64a59d _Z22gdb_internal_backtracev
|
||||
gdb/bt-utils.c:175
|
||||
0x9429e7 handle_fatal_signal
|
||||
gdb/event-top.c:1013
|
||||
0x942b96 handle_sigsegv
|
||||
gdb/event-top.c:1090
|
||||
0x7fbf6a64708f ???
|
||||
/usr/src/debug/glibc-2.40/signal/../sysdeps/unix/sysv/linux/x86_64/libc_sigaction.c:0
|
||||
0x5eb453 _ZN9__gnu_cxx17__normal_iteratorIPKSt4pairI6ptid_tP11thread_infoESt6vectorIS5_SaIS5_EEEC4ERKS7_
|
||||
/usr/include/c++/15/bits/stl_iterator.h:1059
|
||||
0x5eb453 _ZNKSt6vectorISt4pairI6ptid_tP11thread_infoESaIS4_EE3endEv
|
||||
/usr/include/c++/15/bits/stl_vector.h:1029
|
||||
0x5eae9e _ZNKSt6vectorISt4pairI6ptid_tP11thread_infoESaIS4_EE5emptyEv
|
||||
/usr/include/c++/15/bits/stl_vector.h:1224
|
||||
0xa77588 _ZNK6ankerl15unordered_dense6v4_4_06detail5tableI6ptid_tP11thread_infoNS1_4hashIS4_vEESt8equal_toIS4_ESaISt4pairIS4_S6_EENS1_11bucket_type8standardELb0EE5emptyEv
|
||||
gdb/../gdbsupport/unordered_dense.h:1351
|
||||
0xa76533 _ZN6ankerl15unordered_dense6v4_4_06detail5tableI6ptid_tP11thread_infoNS1_4hashIS4_vEESt8equal_toIS4_ESaISt4pairIS4_S6_EENS1_11bucket_type8standardELb0EE7do_findIS4_EEN9__gnu_cxx17__normal_iteratorIPSC_St6vectorISC_SD_EEERKT_
|
||||
gdb/../gdbsupport/unordered_dense.h:1119
|
||||
0xa74fef _ZN6ankerl15unordered_dense6v4_4_06detail5tableI6ptid_tP11thread_infoNS1_4hashIS4_vEESt8equal_toIS4_ESaISt4pairIS4_S6_EENS1_11bucket_type8standardELb0EE4findERKS4_
|
||||
gdb/../gdbsupport/unordered_dense.h:1773
|
||||
0xa6f787 _ZN8inferior11find_threadE6ptid_t
|
||||
gdb/inferior.c:253
|
||||
0xfc852a _Z17add_thread_silentP22process_stratum_target6ptid_t
|
||||
gdb/thread.c:310
|
||||
0x73b995 core_target_open
|
||||
gdb/corelow.c:1111
|
||||
0x73a095 _Z17core_file_commandPKci
|
||||
gdb/corelow.c:708
|
||||
0xb6cb38 catch_command_errors
|
||||
gdb/main.c:510
|
||||
0xb6e354 captured_main_1
|
||||
gdb/main.c:1279
|
||||
0xb6e9a2 captured_main
|
||||
gdb/main.c:1372
|
||||
0xb6eaa3 _Z8gdb_mainP18captured_main_args
|
||||
gdb/main.c:1401
|
||||
0x419704 main
|
||||
gdb/gdb.c:38
|
||||
...
|
||||
|
||||
The problem happens as follows. In core_target_open, we do:
|
||||
...
|
||||
if (thread == NULL)
|
||||
thread = add_thread_silent (target, ptid_t (CORELOW_PID));
|
||||
...
|
||||
and then in add_thread_silent:
|
||||
...
|
||||
struct thread_info *
|
||||
add_thread_silent (process_stratum_target *targ, ptid_t ptid)
|
||||
{
|
||||
gdb_assert (targ != nullptr);
|
||||
|
||||
inferior *inf = find_inferior_ptid (targ, ptid);
|
||||
...
|
||||
find_inferior_ptid returns nullptr, which eventually causes the segfault.
|
||||
|
||||
So, why can't we find an inferior with CORELOW_PID?
|
||||
|
||||
A bit earlier in core_target_open, we do:
|
||||
...
|
||||
/* Find (or fake) the pid for the process in this core file, and
|
||||
initialise the current inferior with that pid. */
|
||||
bool fake_pid_p = false;
|
||||
int pid = bfd_core_file_pid (target->core_bfd ());
|
||||
if (pid == 0)
|
||||
{
|
||||
fake_pid_p = true;
|
||||
pid = CORELOW_PID;
|
||||
}
|
||||
|
||||
inferior *inf = current_inferior ();
|
||||
gdb_assert (inf->pid == 0);
|
||||
inferior_appeared (inf, pid);
|
||||
inf->fake_pid_p = fake_pid_p;
|
||||
...
|
||||
|
||||
The problem is that looking for an inferior using CORELOW_PID is correct in
|
||||
case fake_pid_p == true, but otherwise not.
|
||||
|
||||
Fix this by using inf->pid instead:
|
||||
...
|
||||
- thread = add_thread_silent (target, ptid_t (CORELOW_PID));
|
||||
+ thread = add_thread_silent (target, ptid_t (inf->pid));
|
||||
...
|
||||
|
||||
Doing so enables us to continue to a gdb prompt:
|
||||
...
|
||||
Core was generated by `/usr/bin/rs_scope -d'.
|
||||
|
||||
⚠️ warning: Couldn't find general-purpose registers in core file.
|
||||
(gdb)
|
||||
...
|
||||
|
||||
The warning is emitted because the pseudo-section .reg is missing, because
|
||||
elf32_arm_nabi_grok_prstatus expects the PRSTATUS note to have size 148, but
|
||||
instead we have:
|
||||
...
|
||||
$ eu-readelf -n core | grep -i prstatus
|
||||
CORE 156 PRSTATUS
|
||||
CORE 156 PRSTATUS
|
||||
CORE 156 PRSTATUS
|
||||
CORE 156 PRSTATUS
|
||||
...
|
||||
|
||||
I'm assuming this is a bug for CONFIG_BINFMT_ELF_FDPIC=y configurations, fixed
|
||||
by v5.9 linux kernel commit 16aead81018c ("take fdpic-related parts of
|
||||
elf_prstatus out").
|
||||
|
||||
The core was generated using a kernel with CONFIG_BINFMT_ELF_FDPIC=y and
|
||||
v5.3.18.
|
||||
|
||||
We can try to work around this bug in elf32_arm_nabi_grok_prstatus, but
|
||||
that's out of scope for this commit, which focuses on fixing the segfault.
|
||||
|
||||
Tested on x86_64-linux.
|
||||
|
||||
Approved-By: Andrew Burgess <aburgess@redhat.com>
|
||||
|
||||
PR corefiles/33560
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33560
|
||||
|
||||
[1] https://bugzilla.suse.com/show_bug.cgi?id=1251213
|
||||
---
|
||||
gdb/corelow.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/gdb/corelow.c b/gdb/corelow.c
|
||||
index 59c16677109..69bb7e4f163 100644
|
||||
--- a/gdb/corelow.c
|
||||
+++ b/gdb/corelow.c
|
||||
@@ -1120,7 +1120,7 @@ core_target_open (const char *arg, int from_tty)
|
||||
thread_info *thread = first_thread_of_inferior (inf);
|
||||
|
||||
if (thread == NULL)
|
||||
- thread = add_thread_silent (target, ptid_t (CORELOW_PID));
|
||||
+ thread = add_thread_silent (target, ptid_t (inf->pid));
|
||||
|
||||
switch_to_thread (thread);
|
||||
}
|
||||
--
|
||||
2.51.0
|
||||
|
||||
234
gdb-fix-assertion-failure-due-to-null-frame.patch
Normal file
234
gdb-fix-assertion-failure-due-to-null-frame.patch
Normal file
@@ -0,0 +1,234 @@
|
||||
From 76cd53ac04d28670ee1fd970d3e37d7006192a9c Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Sat, 4 Oct 2025 02:07:16 +0200
|
||||
Subject: [PATCH] [gdb] Fix assertion failure due to null frame
|
||||
|
||||
PR gdb/33512 reports an assertion failure in test-case
|
||||
gdb.ada/access_to_packed_array.exp on i386-linux:
|
||||
...
|
||||
(gdb) maint print symbols
|
||||
gdb/frame.c:3400: internal-error: reinflate: \
|
||||
Assertion `m_cached_level >= -1' failed.
|
||||
A problem internal to GDB has been detected,
|
||||
further debugging may prove unreliable.
|
||||
Quit this debugging session? (y or n) FAIL: $exp: \
|
||||
maint print symbols (GDB internal error)
|
||||
...
|
||||
|
||||
I haven't been able to reproduce the failure by running the test-case on
|
||||
x86_64-linux with target board unix/-m32, but I'm able to reproduce on
|
||||
x86_64-linux by using the exec attached to the PR:
|
||||
...
|
||||
$ cat gdb.in
|
||||
file foo
|
||||
maint expand-symtabs
|
||||
maint print symbols
|
||||
$ gdb -q -batch -ex "set trace-commands on" -x gdb.in
|
||||
...
|
||||
c_to: array (gdb/frame.c:3395: internal-error: reinflate: \
|
||||
Assertion `m_cached_level >= -1' failed.
|
||||
...
|
||||
|
||||
The problem happens when trying to print variable c_to:
|
||||
...
|
||||
<4><f227>: Abbrev Number: 3 (DW_TAG_variable)
|
||||
<f228> DW_AT_name : c_to
|
||||
<f230> DW_AT_type : <0xf214>
|
||||
...
|
||||
with type:
|
||||
...
|
||||
<4><f214>: Abbrev Number: 7 (DW_TAG_array_type)
|
||||
<f215> DW_AT_type : <0x9f39>
|
||||
<5><f21d>: Abbrev Number: 12 (DW_TAG_subrange_type)
|
||||
<f21e> DW_AT_type : <0x9d6c>
|
||||
<f222> DW_AT_upper_bound : <0xf209>
|
||||
...
|
||||
with upper bound:
|
||||
...
|
||||
<4><f209>: Abbrev Number: 89 (DW_TAG_variable)
|
||||
<f20a> DW_AT_name : system__os_lib__copy_file__copy_to__TTc_toSP1___U
|
||||
<f20e> DW_AT_type : <0x9d6c>
|
||||
<f212> DW_AT_artificial : 1
|
||||
<f212> DW_AT_location : 1 byte block: 57 (DW_OP_reg7 (edi))
|
||||
...
|
||||
|
||||
The backtrace at the point of the assertion failure is:
|
||||
...
|
||||
(gdb) bt
|
||||
#0 __pthread_kill_implementation (threadid=<optimized out>,
|
||||
signo=signo@entry=6, no_tid=no_tid@entry=0) at pthread_kill.c:44
|
||||
#1 0x00007ffff62a8e7f in __pthread_kill_internal (signo=6,
|
||||
threadid=<optimized out>) at pthread_kill.c:78
|
||||
#2 0x00007ffff6257842 in __GI_raise (sig=sig@entry=6)
|
||||
at ../sysdeps/posix/raise.c:26
|
||||
#3 0x00007ffff623f5cf in __GI_abort () at abort.c:79
|
||||
#4 0x00000000010e7ac6 in dump_core () at gdb/utils.c:223
|
||||
#5 0x00000000010e81b8 in internal_vproblem(internal_problem *, const char *, int, const char *, typedef __va_list_tag __va_list_tag *) (
|
||||
problem=0x2ceb0c0 <internal_error_problem>,
|
||||
file=0x1ad5a90 "gdb/frame.c", line=3395,
|
||||
fmt=0x1ad5a08 "%s: Assertion `%s' failed.", ap=0x7fffffffc3c0)
|
||||
at gdb/utils.c:475
|
||||
#6 0x00000000010e82ac in internal_verror (
|
||||
file=0x1ad5a90 "gdb/frame.c", line=3395,
|
||||
fmt=0x1ad5a08 "%s: Assertion `%s' failed.", ap=0x7fffffffc3c0)
|
||||
at gdb/utils.c:501
|
||||
#7 0x00000000019be79f in internal_error_loc (
|
||||
file=0x1ad5a90 "gdb/frame.c", line=3395,
|
||||
fmt=0x1ad5a08 "%s: Assertion `%s' failed.")
|
||||
at gdbsupport/errors.cc:57
|
||||
#8 0x00000000009b5c16 in frame_info_ptr::reinflate (this=0x7fffffffc878)
|
||||
at gdb/frame.c:3395
|
||||
#9 0x00000000009b66f9 in frame_info_ptr::operator-> (this=0x7fffffffc878)
|
||||
at gdb/frame.h:290
|
||||
#10 0x00000000009b4bd5 in get_frame_arch (this_frame=...)
|
||||
at gdb/frame.c:3075
|
||||
#11 0x000000000081dd89 in dwarf_expr_context::fetch_result (
|
||||
this=0x7fffffffc810, type=0x410d600, subobj_type=0x410d600,
|
||||
subobj_offset=0, as_lval=true)
|
||||
at gdb/dwarf2/expr.c:1006
|
||||
#12 0x000000000081e2ef in dwarf_expr_context::evaluate (this=0x7fffffffc810,
|
||||
addr=0x7ffff459ce6b "W\aF\003", len=1, as_lval=true,
|
||||
per_cu=0x7fffd00053f0, frame=..., addr_info=0x7fffffffcc30, type=0x0,
|
||||
subobj_type=0x0, subobj_offset=0)
|
||||
at gdb/dwarf2/expr.c:1136
|
||||
#13 0x0000000000877c14 in dwarf2_locexpr_baton_eval (dlbaton=0x3e99c18,
|
||||
frame=..., addr_stack=0x7fffffffcc30, valp=0x7fffffffcab0,
|
||||
push_values=..., is_reference=0x7fffffffc9b0)
|
||||
at gdb/dwarf2/loc.c:1604
|
||||
#14 0x0000000000877f71 in dwarf2_evaluate_property (prop=0x3e99ce0,
|
||||
initial_frame=..., addr_stack=0x7fffffffcc30, value=0x7fffffffcab0,
|
||||
push_values=...) at gdb/dwarf2/loc.c:1668
|
||||
#15 0x00000000009def76 in resolve_dynamic_range (dyn_range_type=0x3e99c50,
|
||||
addr_stack=0x7fffffffcc30, frame=..., rank=0, resolve_p=true)
|
||||
at gdb/gdbtypes.c:2198
|
||||
#16 0x00000000009e0ded in resolve_dynamic_type_internal (type=0x3e99c50,
|
||||
addr_stack=0x7fffffffcc30, frame=..., top_level=true)
|
||||
at gdb/gdbtypes.c:2934
|
||||
#17 0x00000000009e1079 in resolve_dynamic_type (type=0x3e99c50, valaddr=...,
|
||||
addr=0, in_frame=0x0) at gdb/gdbtypes.c:2989
|
||||
#18 0x0000000000488ebc in ada_discrete_type_low_bound (type=0x3e99c50)
|
||||
at gdb/ada-lang.c:710
|
||||
#19 0x00000000004eb734 in print_range (type=0x3e99c50, stream=0x30157b0,
|
||||
bounds_preferred_p=0) at gdb/ada-typeprint.c:156
|
||||
#20 0x00000000004ebffe in print_array_type (type=0x3e99d10, stream=0x30157b0,
|
||||
show=1, level=9, flags=0x1bdcf20 <type_print_raw_options>)
|
||||
at gdb/ada-typeprint.c:381
|
||||
#21 0x00000000004eda3c in ada_print_type (type0=0x3e99d10,
|
||||
varstring=0x401f710 "c_to", stream=0x30157b0, show=1, level=9,
|
||||
flags=0x1bdcf20 <type_print_raw_options>)
|
||||
at gdb/ada-typeprint.c:1015
|
||||
#22 0x00000000004b4627 in ada_language::print_type (
|
||||
this=0x2f949b0 <ada_language_defn>, type=0x3e99d10,
|
||||
varstring=0x401f710 "c_to", stream=0x30157b0, show=1, level=9,
|
||||
flags=0x1bdcf20 <type_print_raw_options>)
|
||||
at gdb/ada-lang.c:13681
|
||||
#23 0x0000000000f74646 in print_symbol (gdbarch=0x3256270, symbol=0x3e99db0,
|
||||
depth=9, outfile=0x30157b0) at gdb/symmisc.c:545
|
||||
#24 0x0000000000f737e6 in dump_symtab_1 (symtab=0x3ddd7e0, outfile=0x30157b0)
|
||||
at gdb/symmisc.c:313
|
||||
#25 0x0000000000f73a69 in dump_symtab (symtab=0x3ddd7e0, outfile=0x30157b0)
|
||||
at gdb/symmisc.c:370
|
||||
#26 0x0000000000f7420f in maintenance_print_symbols (args=0x0, from_tty=0)
|
||||
at gdb/symmisc.c:481
|
||||
#27 0x00000000006c7fde in do_simple_func (args=0x0, from_tty=0, c=0x321e270)
|
||||
at gdb/cli/cli-decode.c:94
|
||||
#28 0x00000000006ce65a in cmd_func (cmd=0x321e270, args=0x0, from_tty=0)
|
||||
at gdb/cli/cli-decode.c:2826
|
||||
#29 0x0000000001005b78 in execute_command (p=0x3f48fe3 "", from_tty=0)
|
||||
at gdb/top.c:564
|
||||
#30 0x0000000000966095 in command_handler (
|
||||
command=0x3f48fd0 "maint print symbols")
|
||||
at gdb/event-top.c:613
|
||||
#31 0x0000000001005141 in read_command_file (stream=0x3011a40)
|
||||
at gdb/top.c:333
|
||||
#32 0x00000000006e2a64 in script_from_file (stream=0x3011a40,
|
||||
file=0x7fffffffe21f "gdb.in")
|
||||
at gdb/cli/cli-script.c:1705
|
||||
#33 0x00000000006bb88c in source_script_from_stream (stream=0x3011a40,
|
||||
file=0x7fffffffe21f "gdb.in", file_to_open=0x7fffffffd760 "gdb.in")
|
||||
at gdb/cli/cli-cmds.c:706
|
||||
#34 0x00000000006bba12 in source_script_with_search (
|
||||
file=0x7fffffffe21f "gdb.in", from_tty=0, search_path=0)
|
||||
at gdb/cli/cli-cmds.c:751
|
||||
#35 0x00000000006bbab2 in source_script (file=0x7fffffffe21f "gdb.in",
|
||||
from_tty=0) at gdb/cli/cli-cmds.c:760
|
||||
#36 0x0000000000b835cb in catch_command_errors (
|
||||
command=0x6bba7e <source_script(char const*, int)>,
|
||||
arg=0x7fffffffe21f "gdb.in", from_tty=0, do_bp_actions=false)
|
||||
at gdb/main.c:510
|
||||
#37 0x0000000000b83803 in execute_cmdargs (cmdarg_vec=0x7fffffffd980,
|
||||
file_type=CMDARG_FILE, cmd_type=CMDARG_COMMAND, ret=0x7fffffffd8c8)
|
||||
at gdb/main.c:606
|
||||
#38 0x0000000000b84d79 in captured_main_1 (context=0x7fffffffdb90)
|
||||
at gdb/main.c:1349
|
||||
#39 0x0000000000b84fe4 in captured_main (context=0x7fffffffdb90)
|
||||
at gdb/main.c:1372
|
||||
#40 0x0000000000b85092 in gdb_main (args=0x7fffffffdb90)
|
||||
at gdb/main.c:1401
|
||||
#41 0x000000000041a382 in main (argc=9, argv=0x7fffffffdcc8)
|
||||
at gdb/gdb.c:38
|
||||
(gdb)
|
||||
...
|
||||
|
||||
The immediate problem is in dwarf_expr_context::fetch_result where we're
|
||||
calling get_frame_arch:
|
||||
...
|
||||
switch (this->m_location)
|
||||
{
|
||||
case DWARF_VALUE_REGISTER:
|
||||
{
|
||||
gdbarch *f_arch = get_frame_arch (this->m_frame);
|
||||
...
|
||||
with a null frame:
|
||||
...
|
||||
(gdb) p this->m_frame.is_null ()
|
||||
$1 = true
|
||||
(gdb)
|
||||
...
|
||||
|
||||
Fix this using ensure_have_frame in dwarf_expr_context::execute_stack_op for
|
||||
DW_OP_reg<n> and DW_OP_regx, getting us instead:
|
||||
...
|
||||
c_to: array (<>) of character; computed at runtime
|
||||
...
|
||||
|
||||
Tested on x86_64-linux.
|
||||
|
||||
Approved-By: Tom Tromey <tom@tromey.com>
|
||||
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33512
|
||||
---
|
||||
gdb/dwarf2/expr.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/gdb/dwarf2/expr.c b/gdb/dwarf2/expr.c
|
||||
index ee1522b7437..c532ca90d12 100644
|
||||
--- a/gdb/dwarf2/expr.c
|
||||
+++ b/gdb/dwarf2/expr.c
|
||||
@@ -1710,6 +1710,10 @@ dwarf_expr_context::execute_stack_op (const gdb_byte *op_ptr,
|
||||
case DW_OP_reg29:
|
||||
case DW_OP_reg30:
|
||||
case DW_OP_reg31:
|
||||
+ /* The value of a register is relative to a frame, so we require a
|
||||
+ valid frame. */
|
||||
+ ensure_have_frame (this->m_frame, "DW_OP_reg<n>");
|
||||
+
|
||||
dwarf_expr_require_composition (op_ptr, op_end, "DW_OP_reg");
|
||||
|
||||
result = op - DW_OP_reg0;
|
||||
@@ -1718,6 +1722,10 @@ dwarf_expr_context::execute_stack_op (const gdb_byte *op_ptr,
|
||||
break;
|
||||
|
||||
case DW_OP_regx:
|
||||
+ /* The value of a register is relative to a frame, so we require a
|
||||
+ valid frame. */
|
||||
+ ensure_have_frame (this->m_frame, "DW_OP_regx");
|
||||
+
|
||||
op_ptr = safe_read_uleb128 (op_ptr, op_end, ®);
|
||||
dwarf_expr_require_composition (op_ptr, op_end, "DW_OP_regx");
|
||||
|
||||
|
||||
base-commit: 0234020f718829f13f2645d5057b51ebcbbff151
|
||||
--
|
||||
2.51.0
|
||||
|
||||
152
gdb-fix-handling-of-aborted-inferior-call.patch
Normal file
152
gdb-fix-handling-of-aborted-inferior-call.patch
Normal file
@@ -0,0 +1,152 @@
|
||||
From a8669ab2846396a2eb310e969250b39bd8116920 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Mon, 1 Sep 2025 09:07:11 +0200
|
||||
Subject: [PATCH 21/25] [gdb] Fix handling of aborted inferior call
|
||||
|
||||
PR gdb/33069 reports the following behavior:
|
||||
...
|
||||
$ gdb -q ls -ex starti -ex "b *1"
|
||||
Reading symbols from ls...
|
||||
(No debugging symbols found in ls)
|
||||
Starting program: /usr/bin/ls
|
||||
|
||||
Program stopped.
|
||||
0x00007ffff7fe4f00 in _start () from /lib64/ld-linux-x86-64.so.2
|
||||
Breakpoint 1 at 0x1
|
||||
(gdb) p (int)strlen("abc")
|
||||
Warning:
|
||||
Cannot insert breakpoint 1.
|
||||
Cannot access memory at address 0x1
|
||||
|
||||
Command aborted.
|
||||
An error occurred while in a function called from GDB.
|
||||
Evaluation of the expression containing the function
|
||||
(malloc@plt) will be abandoned.
|
||||
When the function is done executing, GDB will silently stop.
|
||||
|
||||
[1]+ Stopped gdb -q ls -ex starti -ex "b *1"
|
||||
$ fg
|
||||
gdb -q ls -ex starti -ex "b *1"
|
||||
(gdb)
|
||||
...
|
||||
with gdb being unresponsive to further input.
|
||||
|
||||
PR gdb/33068 reports a similar problem, but using gdbserver, and in that case
|
||||
gdb doesn't go into the background, but is likewise unresponsive.
|
||||
|
||||
This is a regression since commit b1c0ab20809 ("gdb: avoid double stop after
|
||||
failed breakpoint condition check"), and consequently since release gdb 14.1.
|
||||
|
||||
The commit changed this in run_inferior_call:
|
||||
...
|
||||
if (current_ui->prompt_state == PROMPT_BLOCKED)
|
||||
- current_ui->unregister_file_handler ();
|
||||
- else
|
||||
- current_ui->register_file_handler ();
|
||||
+ {
|
||||
+ if (call_thread->thread_fsm ()->finished_p ())
|
||||
+ async_disable_stdin ();
|
||||
+ else
|
||||
+ async_enable_stdin ();
|
||||
+ }
|
||||
...
|
||||
which means current_ui->register_file_handler is no longer called in the
|
||||
current_ui->prompt_state == PROMPT_NEEDED case.
|
||||
|
||||
Fix this by:
|
||||
- restoring this behavior, fixing the unresponsiveness, and
|
||||
- adding target_terminal::ours alongside it, fixing the problem that gdb goes
|
||||
into the background.
|
||||
|
||||
Add a new test-case gdb.base/infcall-failure-2.exp, a regression test for the
|
||||
unresponsiveness issue. The problem of gdb going into the background did not
|
||||
reproduce in the test-case.
|
||||
|
||||
Tested on x86_64-linux.
|
||||
|
||||
Reviewed-By: Keith Seitz <keiths@redhat.com>
|
||||
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33068
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33069
|
||||
---
|
||||
gdb/infcall.c | 12 +++++--
|
||||
gdb/testsuite/gdb.base/infcall-failure-2.exp | 37 ++++++++++++++++++++
|
||||
2 files changed, 46 insertions(+), 3 deletions(-)
|
||||
create mode 100644 gdb/testsuite/gdb.base/infcall-failure-2.exp
|
||||
|
||||
diff --git a/gdb/infcall.c b/gdb/infcall.c
|
||||
index 6399278c6ae..d0c6517e84a 100644
|
||||
--- a/gdb/infcall.c
|
||||
+++ b/gdb/infcall.c
|
||||
@@ -887,9 +887,9 @@ run_inferior_call (std::unique_ptr<call_thread_fsm> sm,
|
||||
call async_enable_stdin. This changes the prompt state to
|
||||
PROMPT_NEEDED.
|
||||
|
||||
- If the previous prompt state was PROMPT_NEEDED, then as
|
||||
- async_enable_stdin has already been called, nothing additional
|
||||
- needs to be done here. */
|
||||
+ If the previous prompt state was PROMPT_NEEDED, then async_enable_stdin
|
||||
+ may or may not have been called, so do the same changes as in
|
||||
+ async_enable_stdin. */
|
||||
if (current_ui->prompt_state == PROMPT_BLOCKED)
|
||||
{
|
||||
if (call_thread->thread_fsm ()->finished_p ())
|
||||
@@ -897,6 +897,12 @@ run_inferior_call (std::unique_ptr<call_thread_fsm> sm,
|
||||
else
|
||||
async_enable_stdin ();
|
||||
}
|
||||
+ else if (current_ui->prompt_state == PROMPT_NEEDED)
|
||||
+ {
|
||||
+ /* Copied from async_enable_stdin. */
|
||||
+ target_terminal::ours ();
|
||||
+ current_ui->register_file_handler ();
|
||||
+ }
|
||||
|
||||
/* If the infcall does NOT succeed, normal_stop will have already
|
||||
finished the thread states. However, on success, normal_stop
|
||||
diff --git a/gdb/testsuite/gdb.base/infcall-failure-2.exp b/gdb/testsuite/gdb.base/infcall-failure-2.exp
|
||||
new file mode 100644
|
||||
index 00000000000..2a7d7844acf
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.base/infcall-failure-2.exp
|
||||
@@ -0,0 +1,37 @@
|
||||
+# Copyright 2025 Free Software Foundation, Inc.
|
||||
+
|
||||
+# This program is free software; you can redistribute it and/or modify
|
||||
+# it under the terms of the GNU General Public License as published by
|
||||
+# the Free Software Foundation; either version 3 of the License, or
|
||||
+# (at your option) any later version.
|
||||
+#
|
||||
+# This program is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+# GNU General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU General Public License
|
||||
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
+
|
||||
+standard_testfile infcall-failure.c
|
||||
+
|
||||
+if { [prepare_for_testing "failed to prepare" $testfile $srcfile] == -1 } {
|
||||
+ return
|
||||
+}
|
||||
+
|
||||
+if { ![runto_main] } {
|
||||
+ return
|
||||
+}
|
||||
+
|
||||
+if { ![gdb_breakpoint "*0x1" message] } {
|
||||
+ return
|
||||
+}
|
||||
+
|
||||
+gdb_test "p foo ()" \
|
||||
+ [multi_line \
|
||||
+ [string_to_regexp "Command aborted."] \
|
||||
+ ".*" ]
|
||||
+
|
||||
+# Check that gdb is still responsive. Regression test for PR gdb/33068.
|
||||
+gdb_test "p 1 + 1" \
|
||||
+ " = 2"
|
||||
--
|
||||
2.51.0
|
||||
|
||||
131
gdb-rust-fix-handling-of-unsigned-discriminant.patch
Normal file
131
gdb-rust-fix-handling-of-unsigned-discriminant.patch
Normal file
@@ -0,0 +1,131 @@
|
||||
From aba0fa2aacf1f2a82e4d7e3482a48f8d7216d7d8 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Tue, 11 Nov 2025 22:34:24 +0100
|
||||
Subject: [PATCH 17/25] [gdb/rust] Fix handling of unsigned discriminant
|
||||
|
||||
On i686-linux, with test-case gdb.rust/simple.exp, we get:
|
||||
...
|
||||
(gdb) print str_none^M
|
||||
$71 = core::option::Option<alloc::string::String>::Some(alloc::string::String {vec: alloc::vec::Vec<u8, alloc::alloc::Global> {buf: alloc::raw_vec::RawVec<u8, alloc::alloc::Global> {inner: alloc::raw_vec::RawVecInner<alloc::alloc::Global> {ptr: core::ptr::unique::Unique<u8> {pointer: core::ptr::non_null::NonNull<u8> {pointer: 0xbfffe6e8}, _marker: core::marker::PhantomData<u8>}, cap: core::num::niche_types::UsizeNoHighBit (2147483648), alloc: alloc::alloc::Global}, _marker: core::marker::PhantomData<u8>}, len: 4321411}})^M
|
||||
(gdb) FAIL: $exp: print str_none
|
||||
...
|
||||
while this is expected:
|
||||
...
|
||||
(gdb) print str_none^M
|
||||
$71 = core::option::Option<alloc::string::String>::None^M
|
||||
(gdb) PASS: $exp: print str_none
|
||||
...
|
||||
|
||||
Printing the variable in C mode:
|
||||
...
|
||||
$ gdb -q -batch outputs/gdb.rust/simple/simple \
|
||||
-ex "b 161" \
|
||||
-ex run \
|
||||
-ex "set language c" \
|
||||
-ex "p /x str_none"
|
||||
...
|
||||
$1 = {0x80000000, Some = {__0 = {vec = {buf = {inner = {ptr = {pointer = {pointer = 0xbfffedd8}, _marker = {<No data fields>}}, cap = {__0 = 0x80000000}, alloc = {<No data fields>}}, _marker = {<No data fields>}}, len = 0x41f083}}}}
|
||||
...
|
||||
shows us that the discriminant value is 0x80000000, which matches the "None"
|
||||
variant:
|
||||
...
|
||||
<3><1427>: Abbrev Number: 16 (DW_TAG_structure_type)
|
||||
<1428> DW_AT_name : Option<alloc::string::String>
|
||||
<142c> DW_AT_byte_size : 12
|
||||
<142d> DW_AT_accessibility: 1 (public)
|
||||
<142e> DW_AT_alignment : 4
|
||||
<4><142f>: Abbrev Number: 47 (DW_TAG_variant_part)
|
||||
<1430> DW_AT_discr : <0x1434>
|
||||
<5><1434>: Abbrev Number: 48 (DW_TAG_member)
|
||||
<1435> DW_AT_type : <0x2cba>
|
||||
<1439> DW_AT_alignment : 4
|
||||
<143a> DW_AT_data_member_location: 0
|
||||
<143b> DW_AT_artificial : 1
|
||||
<5><143b>: Abbrev Number: 52 (DW_TAG_variant)
|
||||
<143c> DW_AT_discr_value : 0x80000000
|
||||
<6><1440>: Abbrev Number: 4 (DW_TAG_member)
|
||||
<1441> DW_AT_name : None
|
||||
<1445> DW_AT_type : <0x145a>
|
||||
<1449> DW_AT_alignment : 4
|
||||
<144a> DW_AT_data_member_location: 0
|
||||
<6><144b>: Abbrev Number: 0
|
||||
<5><144c>: Abbrev Number: 51 (DW_TAG_variant)
|
||||
<6><144d>: Abbrev Number: 4 (DW_TAG_member)
|
||||
<144e> DW_AT_name : Some
|
||||
<1452> DW_AT_type : <0x146c>
|
||||
<1456> DW_AT_alignment : 4
|
||||
<1457> DW_AT_data_member_location: 0
|
||||
<6><1458>: Abbrev Number: 0
|
||||
<5><1459>: Abbrev Number: 0
|
||||
...
|
||||
but the dynamic type resolves to the "Some" variant instead.
|
||||
|
||||
This is caused by signedness confusion.
|
||||
|
||||
The DW_AT_discr_value 0x80000000 is encoded as an LEB128 number, and the
|
||||
signedness is determined by the "tag type for the variant part", which in this
|
||||
case is unsigned:
|
||||
...
|
||||
<1><2cba>: Abbrev Number: 6 (DW_TAG_base_type)
|
||||
<2cbb> DW_AT_name : u32
|
||||
<2cbf> DW_AT_encoding : 7 (unsigned)
|
||||
<2cc0> DW_AT_byte_size : 4
|
||||
...
|
||||
|
||||
However, the value gets interpreted as signed instead (value printed in
|
||||
resolve_dynamic_struct):
|
||||
...
|
||||
(gdb) p /x variant_prop.m_data.variant_parts.m_array.variants.m_array[0].discriminants.m_array[0]
|
||||
$3 = {low = 0xffffffff80000000, high = 0xffffffff80000000}
|
||||
...
|
||||
and then compared against an unsigned 0x80000000 in variant::matches().
|
||||
|
||||
Fix this in create_one_variant_part, by passing the required signedness as a
|
||||
parameter to create_one_variant.
|
||||
|
||||
Tested on i686-linux and x86_64-linux.
|
||||
|
||||
Approved-By: Tom Tromey <tom@tromey.com>
|
||||
|
||||
PR rust/33620
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33620
|
||||
---
|
||||
gdb/dwarf2/read.c | 10 ++++++----
|
||||
1 file changed, 6 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
|
||||
index 19a46425f84..f8f411c195a 100644
|
||||
--- a/gdb/dwarf2/read.c
|
||||
+++ b/gdb/dwarf2/read.c
|
||||
@@ -12126,14 +12126,16 @@ static const gdb::array_view<variant_part> create_variant_parts
|
||||
the variant to fill in. OBSTACK is where any needed allocations
|
||||
will be done. OFFSET_MAP holds the mapping from section offsets to
|
||||
fields for the type. FI describes the fields of the type we're
|
||||
- processing. FIELD is the variant field we're converting. */
|
||||
+ processing. FIELD is the variant field we're converting. IS_UNSIGNED
|
||||
+ contains the signedness of the discriminant. */
|
||||
|
||||
static void
|
||||
create_one_variant (variant &result, struct obstack *obstack,
|
||||
const offset_map_type &offset_map,
|
||||
- struct field_info *fi, const variant_field &field)
|
||||
+ struct field_info *fi, const variant_field &field,
|
||||
+ bool is_unsigned)
|
||||
{
|
||||
- result.discriminants = convert_variant_range (obstack, field, false);
|
||||
+ result.discriminants = convert_variant_range (obstack, field, is_unsigned);
|
||||
result.first_field = field.first_field + fi->baseclasses.size ();
|
||||
result.last_field = field.last_field + fi->baseclasses.size ();
|
||||
result.parts = create_variant_parts (obstack, offset_map, fi,
|
||||
@@ -12172,7 +12174,7 @@ create_one_variant_part (variant_part &result,
|
||||
variant *output = new (obstack) variant[n];
|
||||
for (size_t i = 0; i < n; ++i)
|
||||
create_one_variant (output[i], obstack, offset_map, fi,
|
||||
- builder.variants[i]);
|
||||
+ builder.variants[i], result.is_unsigned);
|
||||
|
||||
result.variants = gdb::array_view<variant> (output, n);
|
||||
}
|
||||
--
|
||||
2.51.0
|
||||
|
||||
72
gdb-testsuite-fix-build-id-check-in-gdb.python-py-mi.patch
Normal file
72
gdb-testsuite-fix-build-id-check-in-gdb.python-py-mi.patch
Normal file
@@ -0,0 +1,72 @@
|
||||
From b29fe2547e14caabc04ff35f0dc3b2ed9043bbd0 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Thu, 20 Nov 2025 21:54:47 +0100
|
||||
Subject: [PATCH 07/25] [gdb/testsuite] Fix build-id check in
|
||||
gdb.python/py-missing-objfile.exp
|
||||
|
||||
I recently added two requires in test-case gdb.python/py-missing-objfile.exp:
|
||||
...
|
||||
require {expect_build_id_in_core_file $binfile}
|
||||
require {expect_build_id_in_core_file $libfile}
|
||||
...
|
||||
|
||||
However, at the point where the check is done, the files are no longer
|
||||
available at that location, which makes the require fail.
|
||||
|
||||
First, make the problem visible, by making proc expect_build_id_in_core_file
|
||||
throw an error if the filename argument specifies a non-existing file.
|
||||
|
||||
Then, fix test-case gdb.python/py-missing-objfile.exp by moving the calls to
|
||||
expect_build_id_in_core_file to a point where the files exist.
|
||||
|
||||
Tested on x86_64-linux.
|
||||
---
|
||||
gdb/testsuite/gdb.python/py-missing-objfile.exp | 9 +++++++--
|
||||
gdb/testsuite/lib/gdb.exp | 4 ++++
|
||||
2 files changed, 11 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/gdb/testsuite/gdb.python/py-missing-objfile.exp b/gdb/testsuite/gdb.python/py-missing-objfile.exp
|
||||
index 2786bdfb2ed..9ecf53a7024 100644
|
||||
--- a/gdb/testsuite/gdb.python/py-missing-objfile.exp
|
||||
+++ b/gdb/testsuite/gdb.python/py-missing-objfile.exp
|
||||
@@ -34,6 +34,11 @@ if { [build_executable "build exec" $binfile $srcfile $opts] == -1} {
|
||||
return
|
||||
}
|
||||
|
||||
+set expect_build_id_in_core_file_binfile \
|
||||
+ [expect_build_id_in_core_file $binfile]
|
||||
+set expect_build_id_in_core_file_libfile \
|
||||
+ [expect_build_id_in_core_file $libfile]
|
||||
+
|
||||
# The cc-with-gnu-debuglink board will split the debug out into the
|
||||
# .debug directory. This test script relies on having GDB lookup the
|
||||
# objfile and debug via the build-id, which this test sets up. Trying
|
||||
@@ -185,8 +190,8 @@ with_test_prefix "no objfiles available" {
|
||||
|
||||
# The following tests assume that the build-ids of binfile and libfile can be
|
||||
# found in the core file.
|
||||
-require {expect_build_id_in_core_file $binfile}
|
||||
-require {expect_build_id_in_core_file $libfile}
|
||||
+require {expr $expect_build_id_in_core_file_binfile}
|
||||
+require {expr $expect_build_id_in_core_file_libfile}
|
||||
|
||||
with_test_prefix "all objfiles available" {
|
||||
# Another sanity check that GDB can find the files via the
|
||||
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
|
||||
index 47cff389a41..ac1de76a696 100644
|
||||
--- a/gdb/testsuite/lib/gdb.exp
|
||||
+++ b/gdb/testsuite/lib/gdb.exp
|
||||
@@ -11057,6 +11057,10 @@ gdb_caching_proc root_user {} {
|
||||
# Otherwise, return false.
|
||||
|
||||
proc expect_build_id_in_core_file { filename } {
|
||||
+ if {![file exists $filename]} {
|
||||
+ error "File not found: $filename"
|
||||
+ }
|
||||
+
|
||||
# I'm not sure if other kernels take care to add the first page of
|
||||
# each ELF into the core file. If they do then this test can be
|
||||
# relaxed.
|
||||
--
|
||||
2.51.0
|
||||
|
||||
58
gdb-testsuite-fix-gdb.mi-mi-sym-info.exp.patch
Normal file
58
gdb-testsuite-fix-gdb.mi-mi-sym-info.exp.patch
Normal file
@@ -0,0 +1,58 @@
|
||||
From 58257123680969c03a46d7e877e6a7143bd134c5 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Tue, 25 Nov 2025 09:27:01 +0100
|
||||
Subject: [PATCH 25/25] [gdb/testsuite] Fix gdb.mi/mi-sym-info.exp
|
||||
|
||||
This is the testsuite part of commit 13ab441fb40 ("gdb/dwarf: create multiple
|
||||
cooked index shards when reading .debug_names"). This fixes FAILs on
|
||||
i686-linux.
|
||||
---
|
||||
gdb/testsuite/gdb.mi/mi-sym-info.exp | 20 ++++++++++++++++----
|
||||
1 file changed, 16 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/gdb/testsuite/gdb.mi/mi-sym-info.exp b/gdb/testsuite/gdb.mi/mi-sym-info.exp
|
||||
index b8db2af0d0b..47ca515956a 100644
|
||||
--- a/gdb/testsuite/gdb.mi/mi-sym-info.exp
|
||||
+++ b/gdb/testsuite/gdb.mi/mi-sym-info.exp
|
||||
@@ -245,22 +245,34 @@ mi_gdb_test "120-symbol-info-types --name _int_" \
|
||||
"120\\^done,symbols=\{debug=\\\[\{filename=\"\[^\"\]*$srcfile\",fullname=\"\[^\"\]+$srcfile\",symbols=\\\[$my_int_re\\\]\},\{filename=\"\[^\"\]*$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[$another_int_re\\\]\}\\\]\}" \
|
||||
"List all types matching _int_"
|
||||
|
||||
+# Return the number of matched symbols in the last match.
|
||||
+
|
||||
+proc count_symbol_matches { } {
|
||||
+ # `0,string`, `1,string` and `2,string` respectively contain the
|
||||
+ # command + result, command and result. The symbols match is at
|
||||
+ # `3,string`.
|
||||
+ return [regexp -all $::fun_re $::expect_out(3,string)]
|
||||
+}
|
||||
+
|
||||
# Test the --max-results parameter.
|
||||
mi_gdb_test "121-symbol-info-functions --max-results 0" \
|
||||
"121\\^done,symbols=\{\}" \
|
||||
"-symbol-info-functions --max-results 0"
|
||||
|
||||
mi_gdb_test "122-symbol-info-functions --max-results 1 --name ^\[^_\]" \
|
||||
- "122\\^done,symbols=\{debug=\\\[\{filename=\"\[^\"\]*$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[(?:$f2_re|$f3_re)\\\]\}\\\]\}" \
|
||||
+ "122\\^done,($debug_only_syms)" \
|
||||
"-symbol-info-functions --max-results 1"
|
||||
+gdb_assert {[count_symbol_matches] == 1} "-symbol-info-functions --max-results 1, result count"
|
||||
|
||||
mi_gdb_test "123-symbol-info-functions --max-results 2 --name ^\[^_\]" \
|
||||
- "123\\^done,symbols=\{debug=\\\[\{filename=\"\[^\"\]*$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[$f2_re,$f3_re\\\]\}\\\]\}" \
|
||||
+ "123\\^done,($debug_only_syms)" \
|
||||
"-symbol-info-functions --max-results 2"
|
||||
+gdb_assert {[count_symbol_matches] == 2} "-symbol-info-functions --max-results 2, result count"
|
||||
|
||||
mi_gdb_test "124-symbol-info-variables --max-results 3 --name ^\[^_\]" \
|
||||
- "124\\^done,symbols=\{debug=\\\[\{filename=\"\[^\"\]*$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[$global_f2_re,$global_i2_re,(?:$global_i1_re|$global_f1_s2_re)\\\]\}\\\]\}" \
|
||||
- "-symbol-info-types --max-results 3"
|
||||
+ "124\\^done,($debug_only_syms)" \
|
||||
+ "-symbol-info-variables --max-results 3"
|
||||
+gdb_assert {[count_symbol_matches] == 3} "-symbol-info-variables --max-results 3, result count"
|
||||
|
||||
mi_gdb_test "125-symbol-info-types --max-results 4 --name another_" \
|
||||
"125\\^done,symbols=\{debug=\\\[\{filename=\"\[^\"\]*$srcfile2\",fullname=\"\[^\"\]+$srcfile2\",symbols=\\\[$another_char_re,$another_float_re,$another_int_re,$another_short_re\\\]\}\\\]\}" \
|
||||
--
|
||||
2.51.0
|
||||
|
||||
120
gdb-testsuite-fix-gdb.rust-methods.exp-on-i686-linux.patch
Normal file
120
gdb-testsuite-fix-gdb.rust-methods.exp-on-i686-linux.patch
Normal file
@@ -0,0 +1,120 @@
|
||||
From 48a16bfbf7967663621f7e9ae3f05841ae64eb37 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <vries@device-184.home>
|
||||
Date: Fri, 14 Nov 2025 11:43:44 +0100
|
||||
Subject: [PATCH 11/25] [gdb/testsuite] Fix gdb.rust/methods.exp on i686-linux
|
||||
|
||||
On i686-linux, with test-case gdb.rust/methods.exp I get:
|
||||
...
|
||||
(gdb) print x.take()
|
||||
$5 = methods::HasMethods {value: 4}
|
||||
(gdb) FAIL: $exp: print x.take()
|
||||
...
|
||||
|
||||
The instructions for the function methods::HasMethods::take look like this:
|
||||
...
|
||||
00007b90 <_ZN7methods10HasMethods4take17hf373500ea3bd6e27E>:
|
||||
7b90: 8b 44 24 04 mov 0x4(%esp),%eax
|
||||
7b94: c3 ret
|
||||
...
|
||||
which is equivalent to what you get for:
|
||||
...
|
||||
$ cat test.c
|
||||
int foo (int val) { return val; }
|
||||
$ gcc test.c -O2 -S -o-
|
||||
...
|
||||
movl 4(%esp), %eax
|
||||
ret
|
||||
...
|
||||
$
|
||||
...
|
||||
|
||||
The inferior call mechanism however decides that this is a return_method_struct
|
||||
function, and adds an implicit first parameter pointing to the return value
|
||||
location. Then two things go wrong:
|
||||
- the argument is written to a place where the code doesn't read from, and
|
||||
- the return value is read from a place where the code doesn't write to.
|
||||
|
||||
AFAIU, both gdb and rustc are behaving correctly:
|
||||
- there's no stable ABI and consequently rustc is at liberty to optimize this
|
||||
function how it wants, and
|
||||
- gdb cannot be expected to target an unstable ABI.
|
||||
|
||||
The solution is to mark the function for interoperability using 'extern "C"'.
|
||||
|
||||
Doing so causes a compilation warning:
|
||||
...
|
||||
warning: `extern` fn uses type `HasMethods`, which is not FFI-safe
|
||||
--> gdb.rust/methods.rs:50:28
|
||||
|
|
||||
50 | pub extern "C" fn take(self) -> HasMethods {
|
||||
| ^^^^ not FFI-safe
|
||||
|
|
||||
= help: consider adding a `#[repr(C)]` or `#[repr(transparent)]` attribute
|
||||
to this struct
|
||||
= note: this struct has unspecified layout
|
||||
...
|
||||
which we fix by using '#[repr(C)]'.
|
||||
|
||||
Likewise in gdb.rust/generics.exp.
|
||||
|
||||
Tested on i686-linux and x86_64-linux.
|
||||
|
||||
Approved-By: Tom Tromey <tom@tromey.com>
|
||||
---
|
||||
gdb/testsuite/gdb.rust/generics.rs | 5 ++++-
|
||||
gdb/testsuite/gdb.rust/methods.rs | 12 +++++++++++-
|
||||
2 files changed, 15 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/gdb/testsuite/gdb.rust/generics.rs b/gdb/testsuite/gdb.rust/generics.rs
|
||||
index da269991781..ad6a10944dd 100644
|
||||
--- a/gdb/testsuite/gdb.rust/generics.rs
|
||||
+++ b/gdb/testsuite/gdb.rust/generics.rs
|
||||
@@ -17,11 +17,14 @@
|
||||
#![allow(unused_variables)]
|
||||
#![allow(unused_assignments)]
|
||||
|
||||
+// Use repr(C) and extern "C" to force the compiler to present a
|
||||
+// C-like interface, facilitating inferior calls.
|
||||
|
||||
+#[repr(C)]
|
||||
#[derive(Clone, Copy)]
|
||||
struct Hold<T>(T);
|
||||
|
||||
-pub fn identity<T>(x: T) -> T { x }
|
||||
+pub extern "C" fn identity<T>(x: T) -> T { x }
|
||||
|
||||
fn dowhatever() { () }
|
||||
|
||||
diff --git a/gdb/testsuite/gdb.rust/methods.rs b/gdb/testsuite/gdb.rust/methods.rs
|
||||
index eaeb5ef41e8..bb77d9873dc 100644
|
||||
--- a/gdb/testsuite/gdb.rust/methods.rs
|
||||
+++ b/gdb/testsuite/gdb.rust/methods.rs
|
||||
@@ -33,6 +33,16 @@ impl Whatever for i32 {
|
||||
}
|
||||
}
|
||||
|
||||
+// On i686-linux, for hasMethods::take the rust compiler generates code
|
||||
+// similar to what a c compiler generates for:
|
||||
+// int foo (int val) { return val; }
|
||||
+// but gdb calls it as if it were:
|
||||
+// void foo (int *res, int *val) { *res = *val; }
|
||||
+// By default, the rust compiler is free to optimize functions and data
|
||||
+// layout, so use repr(C) and extern "C" to force the compiler to present a
|
||||
+// C-like interface.
|
||||
+
|
||||
+#[repr(C)]
|
||||
pub struct HasMethods {
|
||||
value: i32
|
||||
}
|
||||
@@ -47,7 +57,7 @@ impl HasMethods {
|
||||
self
|
||||
}
|
||||
|
||||
- pub fn take(self) -> HasMethods {
|
||||
+ pub extern "C" fn take(self) -> HasMethods {
|
||||
self
|
||||
}
|
||||
}
|
||||
--
|
||||
2.51.0
|
||||
|
||||
43
gdb-testsuite-fix-main-in-gdb.trace-mi-trace-frame-c.patch
Normal file
43
gdb-testsuite-fix-main-in-gdb.trace-mi-trace-frame-c.patch
Normal file
@@ -0,0 +1,43 @@
|
||||
From 016b0fdd8f4bd7bebb08bb034b0461722c2229ad Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Sun, 9 Nov 2025 09:18:43 +0100
|
||||
Subject: [PATCH 19/25] [gdb/testsuite] Fix main in
|
||||
gdb.trace/mi-trace-frame-collected.exp
|
||||
|
||||
With test-case gdb.trace/mi-trace-frame-collected.exp I run into:
|
||||
...
|
||||
gdb compile failed, gdb.trace/actions.c: In function 'main':
|
||||
gdb.trace/actions.c:139:1: warning: old-style function definition \
|
||||
[-Wold-style-definition]
|
||||
139 | main (argc, argv, envp)
|
||||
| ^~~~
|
||||
...
|
||||
|
||||
Fix this by rewriting main into a prototyped function.
|
||||
|
||||
Tested on x86_64-linux.
|
||||
|
||||
PR testsuite/32756
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32756
|
||||
---
|
||||
gdb/testsuite/gdb.trace/actions.c | 4 +---
|
||||
1 file changed, 1 insertion(+), 3 deletions(-)
|
||||
|
||||
diff --git a/gdb/testsuite/gdb.trace/actions.c b/gdb/testsuite/gdb.trace/actions.c
|
||||
index 56906b680fc..bd0b546bb00 100644
|
||||
--- a/gdb/testsuite/gdb.trace/actions.c
|
||||
+++ b/gdb/testsuite/gdb.trace/actions.c
|
||||
@@ -136,9 +136,7 @@ static void end () /* called after everything else */
|
||||
}
|
||||
|
||||
int
|
||||
-main (argc, argv, envp)
|
||||
- int argc;
|
||||
- char *argv[], **envp;
|
||||
+main (int argc, char *argv[], char **envp)
|
||||
{
|
||||
int i;
|
||||
unsigned long myparms[10];
|
||||
--
|
||||
2.51.0
|
||||
|
||||
44
gdb-testsuite-fix-possible-tcl-errors-in-gdb.threads.patch
Normal file
44
gdb-testsuite-fix-possible-tcl-errors-in-gdb.threads.patch
Normal file
@@ -0,0 +1,44 @@
|
||||
From 4596ae47782b249e4989e136632037b1cef0fcb5 Mon Sep 17 00:00:00 2001
|
||||
From: Guinevere Larsen <guinevere@redhat.com>
|
||||
Date: Mon, 1 Sep 2025 11:48:30 -0300
|
||||
Subject: [PATCH 22/25] gdb/testsuite: fix possible TCL errors in
|
||||
gdb.threads/threadcrash.exp
|
||||
|
||||
The test gdb.threads/threadcrash.exp, among other things, creates a list
|
||||
of the threads seen in the order that the "thread apply all backtrace"
|
||||
would generate them, tests that this list is the same size as GDB's
|
||||
count of threads, and then loops over the list to check that each
|
||||
thread has the expected backtrace.
|
||||
|
||||
A problem occurs because the loop iterates on GDB's internal count of
|
||||
threads, rather than the size of the list, but then attempts to acces
|
||||
the n-th element of the list. If the list size is smaller than GDB's
|
||||
internal thread count, it'll access past the end of the list and
|
||||
generate TCL errors.
|
||||
|
||||
This commit fixes this by using the list's length instead.
|
||||
|
||||
Approved-By: Tom Tromey <tom@tromey.com>
|
||||
---
|
||||
gdb/testsuite/gdb.threads/threadcrash.exp | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/gdb/testsuite/gdb.threads/threadcrash.exp b/gdb/testsuite/gdb.threads/threadcrash.exp
|
||||
index 6da70736983..9da3bda2a3c 100644
|
||||
--- a/gdb/testsuite/gdb.threads/threadcrash.exp
|
||||
+++ b/gdb/testsuite/gdb.threads/threadcrash.exp
|
||||
@@ -132,8 +132,9 @@ proc do_full_test {} {
|
||||
set pthread_kill ".*"
|
||||
}
|
||||
|
||||
- for {set i 0} {$i < $thread_count } {incr i} {
|
||||
- set thread_num [expr [llength $test_list] - $i]
|
||||
+ set loop_iterations [llength $test_list]
|
||||
+ for {set i 0} {$i < $loop_iterations } {incr i} {
|
||||
+ set thread_num [expr $loop_iterations - $i]
|
||||
|
||||
set type [lindex $test_list $i]
|
||||
if { $type == 1 } {
|
||||
--
|
||||
2.51.0
|
||||
|
||||
69
gdb-testsuite-fix-sizeof-test-in-gdb.rust-simple.exp.patch
Normal file
69
gdb-testsuite-fix-sizeof-test-in-gdb.rust-simple.exp.patch
Normal file
@@ -0,0 +1,69 @@
|
||||
From 71e7e116b5a76314a4db6d272de3169e1d77696e Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Tue, 11 Nov 2025 20:47:33 +0100
|
||||
Subject: [PATCH 12/25] [gdb/testsuite] Fix sizeof test in gdb.rust/simple.exp
|
||||
|
||||
On x86_64-linux, with test-case gdb.rust/simple.exp I get:
|
||||
...
|
||||
(gdb) print sizeof(e)^M
|
||||
$52 = 24^M
|
||||
(gdb) PASS: $exp: print sizeof(e)
|
||||
...
|
||||
but on i686-linux I get instead:
|
||||
...
|
||||
(gdb) print sizeof(e)^M
|
||||
$52 = 20^M
|
||||
(gdb) FAIL: $exp: print sizeof(e)
|
||||
...
|
||||
|
||||
The variable e for which we print the size:
|
||||
...
|
||||
let e = MoreComplicated::Two(73);
|
||||
...
|
||||
has type MoreComplicated which is defined like this:
|
||||
...
|
||||
pub struct HiBob {
|
||||
pub field1: i32,
|
||||
field2: u64,
|
||||
}
|
||||
...
|
||||
enum MoreComplicated {
|
||||
One,
|
||||
Two(i32),
|
||||
Three(HiBob),
|
||||
Four{this: bool, is: u8, a: char, struct_: u64, variant: u32},
|
||||
}
|
||||
...
|
||||
|
||||
The answer to the question what the size of the enum should be seems to be
|
||||
non-trivial [1][2], but AFAICT it doesn't seem to be illegal that the size can
|
||||
differ between different platforms.
|
||||
|
||||
Fix this by accepting both 20 and 24 as valid size.
|
||||
|
||||
Tested on x86_64-linux and i686-linux.
|
||||
|
||||
Approved-By: Tom Tromey <tom@tromey.com>
|
||||
|
||||
[1] https://doc.rust-lang.org/reference/types/enum.html
|
||||
[2] https://doc.rust-lang.org/reference/type-layout.html#the-rust-representation
|
||||
---
|
||||
gdb/testsuite/gdb.rust/simple.exp | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/gdb/testsuite/gdb.rust/simple.exp b/gdb/testsuite/gdb.rust/simple.exp
|
||||
index 37a2e079b6c..dc057bfd7c5 100644
|
||||
--- a/gdb/testsuite/gdb.rust/simple.exp
|
||||
+++ b/gdb/testsuite/gdb.rust/simple.exp
|
||||
@@ -188,7 +188,7 @@ gdb_test "print simple::HiBob{field1: 99, .. y}" \
|
||||
gdb_test "print e" " = simple::MoreComplicated::Two\\(73\\)"
|
||||
gdb_test "print e2" \
|
||||
" = simple::MoreComplicated::Four\\{this: true, is: 8, a: 109 'm', struct_: 100, variant: 10\\}"
|
||||
-gdb_test "print sizeof(e)" " = 24"
|
||||
+gdb_test "print sizeof(e)" " = (20|24)"
|
||||
gdb_test_sequence "ptype e" "" {
|
||||
" = enum simple::MoreComplicated \\{"
|
||||
" One,"
|
||||
--
|
||||
2.51.0
|
||||
|
||||
54
gdb-testsuite-fix-xfail-in-gdb.ada-array_of_variant..patch
Normal file
54
gdb-testsuite-fix-xfail-in-gdb.ada-array_of_variant..patch
Normal file
@@ -0,0 +1,54 @@
|
||||
From 00d4ad62ee46f0f217bd8347b05588a108fbc54b Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Thu, 3 Apr 2025 17:13:12 +0200
|
||||
Subject: [PATCH 24/25] [gdb/testsuite] Fix xfail in
|
||||
gdb.ada/array_of_variant.exp
|
||||
|
||||
In commit af2b87e649b ("[gdb/testsuite] Add xfail for PR gcc/101633"), I added
|
||||
an xfail that was controlled by variable old_gcc, triggering the xfail for
|
||||
gcc 7 and before, but not for gcc 8 onwards:
|
||||
...
|
||||
set old_gcc [expr [test_compiler_info {gcc-[0-7]-*}]]
|
||||
...
|
||||
|
||||
In commit 1411185a57e ("Introduce and use gnat_version_compare"), this changed
|
||||
to:
|
||||
...
|
||||
set old_gcc [gnat_version_compare <= 7]
|
||||
...
|
||||
which still triggered the xfail for gcc 7, because of a bug in
|
||||
gnat_version_compare.
|
||||
|
||||
After that bug got fixed, the xfail was no longer triggered because the gnatmake
|
||||
version is 7.5.0, and [version_compare {7 5 0} <= {7}] == 0.
|
||||
|
||||
We could have the semantics for version_compare where we clip the input
|
||||
arguments to the length of the shortest, and so we'd have
|
||||
[version_compare {7 5 0} <= {7}] == [version_compare {7} <= {7}] == 1.
|
||||
|
||||
But let's stick with the current version-sort semantics, and fix this by
|
||||
using [gnat_version_compare < 8] instead.
|
||||
|
||||
Tested on x86_64-linux.
|
||||
|
||||
Approved-By: Tom Tromey <tom@tromey.com>
|
||||
---
|
||||
gdb/testsuite/gdb.ada/array_of_variant.exp | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/gdb/testsuite/gdb.ada/array_of_variant.exp b/gdb/testsuite/gdb.ada/array_of_variant.exp
|
||||
index 8b83f4ed22a..83b626cb6d1 100644
|
||||
--- a/gdb/testsuite/gdb.ada/array_of_variant.exp
|
||||
+++ b/gdb/testsuite/gdb.ada/array_of_variant.exp
|
||||
@@ -20,7 +20,7 @@ require allow_ada_tests
|
||||
|
||||
standard_ada_testfile p
|
||||
|
||||
-set old_gcc [gnat_version_compare <= 7]
|
||||
+set old_gcc [gnat_version_compare < 8]
|
||||
|
||||
proc gdb_test_with_xfail { cmd re re_xfail msg } {
|
||||
global scenario old_gcc
|
||||
--
|
||||
2.51.0
|
||||
|
||||
53
gdb-testsuite-fix-xfail-in-gdb.ada-variant_record_fi.patch
Normal file
53
gdb-testsuite-fix-xfail-in-gdb.ada-variant_record_fi.patch
Normal file
@@ -0,0 +1,53 @@
|
||||
From edaf039af83893fc6c32b812560d4170f94de430 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Tue, 14 Oct 2025 18:00:48 +0200
|
||||
Subject: [PATCH 13/25] [gdb/testsuite] Fix xfail in
|
||||
gdb.ada/variant_record_field.exp
|
||||
|
||||
On ppc64-linux (debian 14) I run into:
|
||||
...
|
||||
(gdb) print p_record^M
|
||||
$1 = (kind => five, i => <error reading variable: \
|
||||
access outside bounds of object>^M
|
||||
(gdb) gdb_do_cache: get_compiler_info_1 ( c )
|
||||
get_compiler_info: gcc-15-2-0
|
||||
gdb_do_cache: get_compiler_info_1 ( c )
|
||||
FAIL: gdb.ada/variant_record_field.exp: print p_record
|
||||
...
|
||||
|
||||
The test-case contains an xfail for "[gcc_major_version] <= 14", which doesn't
|
||||
trigger because gcc has version 15.2.0, while gnatmake does have version
|
||||
14.3.0:
|
||||
...
|
||||
$ gcc --version
|
||||
gcc (Debian 15.2.0-4) 15.2.0
|
||||
...
|
||||
$ gnatmake --version
|
||||
GNATMAKE 14.3.0
|
||||
...
|
||||
|
||||
Fix this by using "[gnat_version_compare < 15]" instead.
|
||||
|
||||
Tested on ppc64-linux and x86_64-linux.
|
||||
|
||||
Approved-By: Tom Tromey <tom@tromey.com>
|
||||
---
|
||||
gdb/testsuite/gdb.ada/variant_record_field.exp | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/gdb/testsuite/gdb.ada/variant_record_field.exp b/gdb/testsuite/gdb.ada/variant_record_field.exp
|
||||
index f3baa25f020..101f91f416f 100644
|
||||
--- a/gdb/testsuite/gdb.ada/variant_record_field.exp
|
||||
+++ b/gdb/testsuite/gdb.ada/variant_record_field.exp
|
||||
@@ -42,7 +42,7 @@ gdb_test_multiple "$test" "$test" {
|
||||
pass $test
|
||||
}
|
||||
-re "\\(kind => five, i => <error reading variable: access outside bounds of object>" {
|
||||
- if { [gcc_major_version] <= 14 } {
|
||||
+ if { [gnat_version_compare < 15] } {
|
||||
setup_xfail *-*-*
|
||||
}
|
||||
fail $test
|
||||
--
|
||||
2.51.0
|
||||
|
||||
44
gdb-testsuite-force-dwarf-in-gdb.pascal.patch
Normal file
44
gdb-testsuite-force-dwarf-in-gdb.pascal.patch
Normal file
@@ -0,0 +1,44 @@
|
||||
From 4361e02cc1aaf367e09f66a03ab9f5621a59486b Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Mon, 10 Nov 2025 19:36:46 +0100
|
||||
Subject: [PATCH 18/25] [gdb/testsuite] Force DWARF in gdb.pascal
|
||||
|
||||
On i686-linux (and likewise arm-linux), I run into:
|
||||
...
|
||||
(gdb) file str-chars^M
|
||||
Reading symbols from str-chars...^M
|
||||
warning: stabs debug information is not supported.^M
|
||||
(No debugging symbols found in str-chars)^M
|
||||
(gdb) delete breakpoints^M
|
||||
...
|
||||
|
||||
Fix this by using fpc option -gw2.
|
||||
|
||||
Tested on i686-linux.
|
||||
|
||||
Approved-By: Simon Marchi <simon.marchi@efficios.com>
|
||||
|
||||
PR testsuite/33564
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33564
|
||||
---
|
||||
gdb/testsuite/lib/pascal.exp | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/gdb/testsuite/lib/pascal.exp b/gdb/testsuite/lib/pascal.exp
|
||||
index 236eca17dcb..31a8ae64d73 100644
|
||||
--- a/gdb/testsuite/lib/pascal.exp
|
||||
+++ b/gdb/testsuite/lib/pascal.exp
|
||||
@@ -128,7 +128,9 @@ proc fpc_compile {source destfile type options} {
|
||||
if [board_info $dest exists debug_flags] {
|
||||
append add_flags " [board_info $dest debug_flags]"
|
||||
} else {
|
||||
- append add_flags " -g"
|
||||
+ # GDB no longer supports STABS, so force DWARF debug info.
|
||||
+ # Use v2 assuming support is more mature than later versions.
|
||||
+ append add_flags " -g -gw2"
|
||||
}
|
||||
}
|
||||
if { $i == "class" } {
|
||||
--
|
||||
2.51.0
|
||||
|
||||
59
gdb-testsuite-rust-fix-for-empty-array.patch
Normal file
59
gdb-testsuite-rust-fix-for-empty-array.patch
Normal file
@@ -0,0 +1,59 @@
|
||||
From 772b7c2a75f392589518a0ee17a48914f1395c67 Mon Sep 17 00:00:00 2001
|
||||
From: "Rudnicki, Piotr" <piotr.rudnicki@intel.com>
|
||||
Date: Wed, 12 Feb 2025 10:50:37 +0100
|
||||
Subject: [PATCH 03/25] gdb, testsuite, rust: fix for empty array
|
||||
|
||||
For the Rust language, to avoid segmentation fault in case of an empty
|
||||
array, do not try to copy any elements, but allocate and return
|
||||
the empty array immediately.
|
||||
|
||||
With the command before the change, gdb crashes with message:
|
||||
|
||||
(gdb) set lang rust
|
||||
(gdb) p [1;0]
|
||||
Fatal signal: Segmentation fault
|
||||
|
||||
After the fix in this commit, gdb shows following message:
|
||||
(gdb) set lang rust
|
||||
(gdb) p [1;0]
|
||||
$1 = []
|
||||
|
||||
Update the existing test case gdb.rust/expr.exp to verify the change.
|
||||
|
||||
Approved-By: Tom Tromey <tom@tromey.com>
|
||||
---
|
||||
gdb/rust-lang.c | 2 +-
|
||||
gdb/testsuite/gdb.rust/expr.exp | 4 ++++
|
||||
2 files changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c
|
||||
index d4cd8802fa5..8bec934983e 100644
|
||||
--- a/gdb/rust-lang.c
|
||||
+++ b/gdb/rust-lang.c
|
||||
@@ -1455,7 +1455,7 @@ eval_op_rust_array (struct type *expect_type, struct expression *exp,
|
||||
if (copies < 0)
|
||||
error (_("Array with negative number of elements"));
|
||||
|
||||
- if (noside == EVAL_NORMAL)
|
||||
+ if (noside == EVAL_NORMAL && copies > 0)
|
||||
return value_array (0, std::vector<value *> (copies, elt));
|
||||
else
|
||||
{
|
||||
diff --git a/gdb/testsuite/gdb.rust/expr.exp b/gdb/testsuite/gdb.rust/expr.exp
|
||||
index 97db748abf6..ca01c5feb36 100644
|
||||
--- a/gdb/testsuite/gdb.rust/expr.exp
|
||||
+++ b/gdb/testsuite/gdb.rust/expr.exp
|
||||
@@ -115,6 +115,10 @@ gdb_test "print \[1,2 3" "',' or ']' expected"
|
||||
gdb_test "print \[1 2" "',', ';', or ']' expected"
|
||||
gdb_test "print \[23\]" " = \\\[23\\\]"
|
||||
|
||||
+gdb_test "print \[0;0\]" " = \\\[\\\]"
|
||||
+gdb_test "print \[1;0\]" " = \\\[\\\]"
|
||||
+gdb_test "print \[0;1\]" " = \\\[0\\\]"
|
||||
+
|
||||
gdb_test "print b\"hi rust\"" " = b\"hi rust\""
|
||||
# This isn't rusty syntax yet, but that's another bug -- this is just
|
||||
# testing that byte escapes work properly.
|
||||
--
|
||||
2.51.0
|
||||
|
||||
146
gdb-testsuite-use-expect_build_id_in_core_file-a-bit.patch
Normal file
146
gdb-testsuite-use-expect_build_id_in_core_file-a-bit.patch
Normal file
@@ -0,0 +1,146 @@
|
||||
From 26fdff8f7404ee0f9ae957fd5640d43eb6d86820 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Mon, 13 Oct 2025 20:54:43 +0200
|
||||
Subject: [PATCH 04/25] [gdb/testsuite] Use expect_build_id_in_core_file a bit
|
||||
more
|
||||
|
||||
Recent commit c1950dcc04c ("gdb/testsuite: fix failure from
|
||||
gdb.python/py-corefile.exp") introduced proc expect_build_id_in_core_file,
|
||||
which detects the problem that:
|
||||
...
|
||||
... some versions of the linker didn't place the build-id within the first
|
||||
page of an ELF. As a result, the Linux kernel would not include the
|
||||
build-id in the generated core file, ...
|
||||
...
|
||||
|
||||
Use this proc in a few more test-cases, to deal with the same problem.
|
||||
|
||||
Tested on x86_64-linux, openSUSE Tumbleweed with ld 2.43.1.
|
||||
|
||||
Approved-By: Andrew Burgess <aburgess@redhat.com>
|
||||
|
||||
PR testsuite/33528
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33528
|
||||
---
|
||||
.../gdb.debuginfod/corefile-mapped-file.exp | 3 +
|
||||
.../gdb.debuginfod/solib-with-soname.exp | 4 ++
|
||||
.../gdb.python/py-missing-objfile.exp | 5 ++
|
||||
gdb/testsuite/lib/gdb.exp | 58 +++++++++++++++++++
|
||||
4 files changed, 70 insertions(+)
|
||||
|
||||
diff --git a/gdb/testsuite/gdb.debuginfod/corefile-mapped-file.exp b/gdb/testsuite/gdb.debuginfod/corefile-mapped-file.exp
|
||||
index f02876e1453..af143b7d506 100644
|
||||
--- a/gdb/testsuite/gdb.debuginfod/corefile-mapped-file.exp
|
||||
+++ b/gdb/testsuite/gdb.debuginfod/corefile-mapped-file.exp
|
||||
@@ -81,6 +81,9 @@ if {[prepare_for_testing_full "build exec which loads the shared library" \
|
||||
return
|
||||
}
|
||||
|
||||
+require {expect_build_id_in_core_file $binfile2}
|
||||
+require {expect_build_id_in_core_file $library_filename}
|
||||
+
|
||||
if {![runto_main]} {
|
||||
return
|
||||
}
|
||||
diff --git a/gdb/testsuite/gdb.debuginfod/solib-with-soname.exp b/gdb/testsuite/gdb.debuginfod/solib-with-soname.exp
|
||||
index 98c4535fca7..07f0a0f170b 100644
|
||||
--- a/gdb/testsuite/gdb.debuginfod/solib-with-soname.exp
|
||||
+++ b/gdb/testsuite/gdb.debuginfod/solib-with-soname.exp
|
||||
@@ -96,6 +96,10 @@ if { [build_executable "build executable" ${binfile} ${srcfile2} \
|
||||
return
|
||||
}
|
||||
|
||||
+require {expect_build_id_in_core_file $library_1_filename}
|
||||
+require {expect_build_id_in_core_file $library_2_filename}
|
||||
+require {expect_build_id_in_core_file $binfile}
|
||||
+
|
||||
# If the board file is automatically splitting the debug information
|
||||
# into a separate file (e.g. the cc-with-gnu-debuglink.exp board) then
|
||||
# this test isn't going to work.
|
||||
diff --git a/gdb/testsuite/gdb.python/py-missing-objfile.exp b/gdb/testsuite/gdb.python/py-missing-objfile.exp
|
||||
index 8488047d105..2786bdfb2ed 100644
|
||||
--- a/gdb/testsuite/gdb.python/py-missing-objfile.exp
|
||||
+++ b/gdb/testsuite/gdb.python/py-missing-objfile.exp
|
||||
@@ -183,6 +183,11 @@ with_test_prefix "no objfiles available" {
|
||||
check_loaded_debug false false
|
||||
}
|
||||
|
||||
+# The following tests assume that the build-ids of binfile and libfile can be
|
||||
+# found in the core file.
|
||||
+require {expect_build_id_in_core_file $binfile}
|
||||
+require {expect_build_id_in_core_file $libfile}
|
||||
+
|
||||
with_test_prefix "all objfiles available" {
|
||||
# Another sanity check that GDB can find the files via the
|
||||
# debug-file-directory.
|
||||
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
|
||||
index b103c117258..47cff389a41 100644
|
||||
--- a/gdb/testsuite/lib/gdb.exp
|
||||
+++ b/gdb/testsuite/lib/gdb.exp
|
||||
@@ -11044,5 +11044,63 @@ gdb_caching_proc root_user {} {
|
||||
return [expr $uid == 0]
|
||||
}
|
||||
|
||||
+# Return true if we expect the build-id from FILENAME to be included
|
||||
+# in a core file.
|
||||
+#
|
||||
+# On GNU/Linux, when creating a core file, the kernel places the first
|
||||
+# page of an ELF into the core file. If the build-id is within that
|
||||
+# page then GDB can find the build-id from the core file.
|
||||
+#
|
||||
+# This proc checks that the target is GNU/Linux, and then uses readelf
|
||||
+# to find the offset of the build-id within the ELF. If there is a
|
||||
+# build-id, and it is within the first page, then return true.
|
||||
+# Otherwise, return false.
|
||||
+
|
||||
+proc expect_build_id_in_core_file { filename } {
|
||||
+ # I'm not sure if other kernels take care to add the first page of
|
||||
+ # each ELF into the core file. If they do then this test can be
|
||||
+ # relaxed.
|
||||
+ if {![istarget *-*-linux*]} {
|
||||
+ return false
|
||||
+ }
|
||||
+
|
||||
+ # Use readelf to find the build-id note in FILENAME.
|
||||
+ set readelf_program [gdb_find_readelf]
|
||||
+ set cmd [list $readelf_program -WS $filename | grep ".note.gnu.build-id"]
|
||||
+ set res [catch {exec {*}$cmd} output]
|
||||
+ verbose -log "running: $cmd"
|
||||
+ verbose -log "result: $res"
|
||||
+ verbose -log "output: $output"
|
||||
+ if { $res != 0 } {
|
||||
+ return false
|
||||
+ }
|
||||
+
|
||||
+ # Extract the OFFSET from the readelf output.
|
||||
+ set res [regexp {NOTE[ \t]+([0-9a-f]+)[ \t]+([0-9a-f]+)} \
|
||||
+ $output dummy addr offset]
|
||||
+ if { $res != 1 } {
|
||||
+ return false
|
||||
+ }
|
||||
+
|
||||
+ # Convert OFFSET to decimal.
|
||||
+ set offset [expr {[subst 0x$offset]}]
|
||||
+
|
||||
+ # Now figure out the page size. This should be fine for Linux
|
||||
+ # hosts, see the istarget check above.
|
||||
+ if {[catch {exec getconf PAGESIZE} page_size]} {
|
||||
+ # Failed to fetch page size.
|
||||
+ return false
|
||||
+ }
|
||||
+
|
||||
+ # If the build-id is within the first page, then we expect the
|
||||
+ # kernel to include it in the core file. There is actually a
|
||||
+ # kernel setting (see coredump_filter) that could prevent this,
|
||||
+ # but the default behaviour is to include the first page of the
|
||||
+ # ELF, so for now, we just assume this is on.
|
||||
+ verbose -log "Page size is $page_size, Offset is $offset"
|
||||
+ return [expr {$offset < $page_size}]
|
||||
+}
|
||||
+
|
||||
+
|
||||
# Always load compatibility stuff.
|
||||
load_lib future.exp
|
||||
--
|
||||
2.51.0
|
||||
|
||||
56
gdb-testsuite-use-std-c99-in-gdb.base-callfuncs.exp.patch
Normal file
56
gdb-testsuite-use-std-c99-in-gdb.base-callfuncs.exp.patch
Normal file
@@ -0,0 +1,56 @@
|
||||
From 24f5907ddb7fd5157ce3cc938bb5b5bcdeb54460 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Sun, 9 Nov 2025 08:07:57 +0100
|
||||
Subject: [PATCH 05/25] [gdb/testsuite] Use -std=c99 in gdb.base/callfuncs.exp
|
||||
|
||||
In test-case gdb.base/callfuncs.exp I run into:
|
||||
...
|
||||
gdb compile failed, gdb.base/callfuncs.c: In function 't_func_values':
|
||||
gdb.base/callfuncs.c:611:12: error: too many arguments to function \
|
||||
'func_arg1'; expected 0, have 2
|
||||
611 | return ((*func_arg1) (5,5) == (*func_val1) (5,5)
|
||||
| ~^~~~~~~~~~~ ~
|
||||
...
|
||||
|
||||
Fix this by using -std=c99.
|
||||
|
||||
Tested on x86_64-linux.
|
||||
|
||||
Approved-By: Tom Tromey <tom@tromey.com>
|
||||
|
||||
PR testsuite/32756
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32756
|
||||
---
|
||||
gdb/testsuite/gdb.base/callfuncs.exp | 14 ++++++++++++--
|
||||
1 file changed, 12 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/gdb/testsuite/gdb.base/callfuncs.exp b/gdb/testsuite/gdb.base/callfuncs.exp
|
||||
index 494b6dfa96f..ed979603a26 100644
|
||||
--- a/gdb/testsuite/gdb.base/callfuncs.exp
|
||||
+++ b/gdb/testsuite/gdb.base/callfuncs.exp
|
||||
@@ -18,10 +18,20 @@
|
||||
|
||||
standard_testfile
|
||||
|
||||
+set compile_flags {}
|
||||
+lappend compile_flags debug
|
||||
+
|
||||
# We still want to test non-prototype functions for now, which is why
|
||||
# we disable compilers warning about them.
|
||||
-set compile_flags {debug additional_flags=-Wno-deprecated-non-prototype}
|
||||
-if [support_complex_tests] {
|
||||
+lappend compile_flags additional_flags=-Wno-deprecated-non-prototype
|
||||
+
|
||||
+if {[have_compile_flag -std=c99]} {
|
||||
+ # Gcc 15 defaults to c23, which no longer supports unprototyped functions.
|
||||
+ # Use a c dialect that does support this.
|
||||
+ lappend compile_flags additional_flags=-std=c99
|
||||
+}
|
||||
+
|
||||
+if {[support_complex_tests]} {
|
||||
lappend compile_flags "additional_flags=-DTEST_COMPLEX"
|
||||
}
|
||||
|
||||
--
|
||||
2.51.0
|
||||
|
||||
54
gdb-testsuite-use-std-c99-in-gdb.base-nodebug.exp.patch
Normal file
54
gdb-testsuite-use-std-c99-in-gdb.base-nodebug.exp.patch
Normal file
@@ -0,0 +1,54 @@
|
||||
From 7ff7fb4184861f31c624aafab433462ecafb4321 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Wed, 12 Nov 2025 11:08:31 +0100
|
||||
Subject: [PATCH 06/25] [gdb/testsuite] Use -std=c99 in gdb.base/nodebug.exp
|
||||
|
||||
With test-case gdb.base/nodebug.exp I run into:
|
||||
...
|
||||
gdb compile failed, gdb.base/nodebug.c: In function 'multf_noproto':
|
||||
gdb.base/nodebug.c:63:1: warning: old-style function definition \
|
||||
[-Wold-style-definition]
|
||||
63 | multf_noproto (v1, v2)
|
||||
| ^~~~~~~~~~~~~
|
||||
...
|
||||
|
||||
Fix this using -std=c99.
|
||||
|
||||
Tested on x86_64-linux.
|
||||
|
||||
PR testsuite/32756
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32756
|
||||
---
|
||||
gdb/testsuite/gdb.base/nodebug.exp | 15 ++++++++++-----
|
||||
1 file changed, 10 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/gdb/testsuite/gdb.base/nodebug.exp b/gdb/testsuite/gdb.base/nodebug.exp
|
||||
index 4c07d2ea9db..999c4217aa8 100644
|
||||
--- a/gdb/testsuite/gdb.base/nodebug.exp
|
||||
+++ b/gdb/testsuite/gdb.base/nodebug.exp
|
||||
@@ -18,12 +18,17 @@
|
||||
|
||||
standard_testfile .c
|
||||
|
||||
-if [test_compiler_info "xlc-*"] {
|
||||
+set exec_opts {}
|
||||
+if {[have_compile_flag -std=c99]} {
|
||||
+ # Gcc 15 defaults to c23, which no longer supports unprototyped functions.
|
||||
+ # Use a c dialect that does support this.
|
||||
+ lappend exec_opts additional_flags=-std=c99
|
||||
+}
|
||||
+
|
||||
+if {[test_compiler_info "xlc-*"]} {
|
||||
# By default, IBM'x xlc compiler doesn't add static variables into the symtab.
|
||||
- # Use "-qstatsym" to do so.
|
||||
- set exec_opts additional_flags=-qstatsym
|
||||
-} else {
|
||||
- set exec_opts ""
|
||||
+ # Use "-qstatsym" to do so.
|
||||
+ lappend exec_opts additional_flags=-qstatsym
|
||||
}
|
||||
|
||||
if { [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $exec_opts] != "" } {
|
||||
--
|
||||
2.51.0
|
||||
|
||||
86
gdb-testsuite-yet-another-attempt-to-fix-gdb.threads.patch
Normal file
86
gdb-testsuite-yet-another-attempt-to-fix-gdb.threads.patch
Normal file
@@ -0,0 +1,86 @@
|
||||
From 6256bcf098ccf5737dbb8e379d2c0251647aec43 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Wed, 22 Oct 2025 08:46:06 +0200
|
||||
Subject: [PATCH] [gdb/testsuite] Yet another attempt to fix
|
||||
gdb.threads/thread-specific-bp.exp
|
||||
|
||||
When running test-case gdb.threads/thread-specific-bp.exp using taskset to
|
||||
select an Efficient-core in a loop, it fails 19 out of 100 runs.
|
||||
|
||||
For example, like this:
|
||||
...
|
||||
(gdb) continue -a^M
|
||||
Continuing.^M
|
||||
^M
|
||||
Thread 1 "thread-specific" hit Breakpoint 4, end () at thread-specific-bp.c:29^M
|
||||
29 }^M
|
||||
(gdb) FAIL: $exp: non_stop=on: continue to end
|
||||
[Thread 0x7ffff7cbe6c0 (LWP 2348848) exited]^M
|
||||
Thread-specific breakpoint 3 deleted - thread 2 no longer in the thread list.^M
|
||||
...
|
||||
|
||||
The way we're trying to match this gdb output is:
|
||||
...
|
||||
gdb_test_multiple "$cmd" "continue to end" {
|
||||
-re "$\r\n${gdb_prompt} .*${msg_re}\r\n" {
|
||||
pass $gdb_test_name
|
||||
}
|
||||
-re "\r\n${msg_re}\r\n.*$gdb_prompt " {
|
||||
pass $gdb_test_name
|
||||
}
|
||||
}
|
||||
...
|
||||
|
||||
The problem is that the two -re clauses above do not match the output ending
|
||||
in a prompt, so the default fail in gdb_test_multiple triggers.
|
||||
|
||||
Fix this by splitting this up in two gdb_test_multiple calls:
|
||||
- the first matches a prompt (with or without preceding $msg_re), making sure
|
||||
that the default fail doesn't trigger, and
|
||||
- the second matches $msg_re, if that was not already matched by the first call.
|
||||
|
||||
Using this approach, the test-case passes 100 out of 100 runs.
|
||||
|
||||
Tested on x86_64-linux, also with make-check-all.sh.
|
||||
|
||||
PR testsuite/32688
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32688
|
||||
---
|
||||
.../gdb.threads/thread-specific-bp.exp | 17 +++++++++++++----
|
||||
1 file changed, 13 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/gdb/testsuite/gdb.threads/thread-specific-bp.exp b/gdb/testsuite/gdb.threads/thread-specific-bp.exp
|
||||
index e7641d2c9b4..dc7a8fbfa76 100644
|
||||
--- a/gdb/testsuite/gdb.threads/thread-specific-bp.exp
|
||||
+++ b/gdb/testsuite/gdb.threads/thread-specific-bp.exp
|
||||
@@ -95,12 +95,21 @@ proc check_thread_specific_breakpoint {non_stop} {
|
||||
"-" \
|
||||
"thread 2 no longer in the thread list\\."]]
|
||||
|
||||
- gdb_test_multiple "$cmd" "continue to end" {
|
||||
- -re "$\r\n${gdb_prompt} .*${msg_re}\r\n" {
|
||||
+ set test "continue to end"
|
||||
+ set try_again 0
|
||||
+ gdb_test_multiple $cmd $test -no-prompt-anchor {
|
||||
+ -re -wrap "\r\n${msg_re}(?=\r\n).*" {
|
||||
pass $gdb_test_name
|
||||
}
|
||||
- -re "\r\n${msg_re}\r\n.*$gdb_prompt " {
|
||||
- pass $gdb_test_name
|
||||
+ -re -wrap "" {
|
||||
+ set try_again 1
|
||||
+ }
|
||||
+ }
|
||||
+ if { $try_again } {
|
||||
+ gdb_test_multiple "" $test {
|
||||
+ -re "\r\n${msg_re}(?=\r\n)" {
|
||||
+ pass $gdb_test_name
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
base-commit: 77f7bf5700b2b9be1172c7b5d05d03ee025c5d2c
|
||||
--
|
||||
2.51.0
|
||||
|
||||
77
gdb.changes
77
gdb.changes
@@ -1,3 +1,80 @@
|
||||
-------------------------------------------------------------------
|
||||
Wed Nov 26 13:48:35 UTC 2025 - Tom de Vries <tdevries@suse.com>
|
||||
|
||||
- Maintenance script qa.sh:
|
||||
* Fix grep: warning: stray \ before -.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Nov 25 09:49:13 UTC 2025 - Tom de Vries <tdevries@suse.com>
|
||||
|
||||
- Patches added:
|
||||
* avoid-crash-with-length.patch
|
||||
* correct-bounds-check-when-working-around-gas-dwarf-5.patch
|
||||
* fix-crash-in-f-typeprint.c.patch
|
||||
- Patches added (swo#33560, bsc#1251213):
|
||||
* bfd-elf-handle-prstatus-of-156-bytes-in-elf32_arm_na.patch
|
||||
* gdb-corefiles-fix-segfault-in-add_thread_silent.patch
|
||||
- Patches added (swo#32542, swo#33354):
|
||||
* change-return-value-of-_bfd_mmap_temporary.patch
|
||||
- Patches added (swo#33068, swo#33069):
|
||||
* gdb-fix-handling-of-aborted-inferior-call.patch
|
||||
- Patches added (swo#33620):
|
||||
* gdb-rust-fix-handling-of-unsigned-discriminant.patch
|
||||
- Patches added (swo#33444):
|
||||
* have-gdb.threadexitedevent-inherit-from-gdb.threadev.patch
|
||||
- Patches added (swo#33617):
|
||||
* mark-pascal-as-case-insensitive.patch
|
||||
- Patches added (testsuite):
|
||||
* check-gnatmake-version-in-gnat_version_compare.patch
|
||||
* gdb-testsuite-fix-build-id-check-in-gdb.python-py-mi.patch
|
||||
* gdb-testsuite-fix-gdb.mi-mi-sym-info.exp.patch
|
||||
* gdb-testsuite-fix-gdb.rust-methods.exp-on-i686-linux.patch
|
||||
* gdb-testsuite-fix-main-in-gdb.trace-mi-trace-frame-c.patch
|
||||
* gdb-testsuite-fix-possible-tcl-errors-in-gdb.threads.patch
|
||||
* gdb-testsuite-fix-sizeof-test-in-gdb.rust-simple.exp.patch
|
||||
* gdb-testsuite-fix-xfail-in-gdb.ada-array_of_variant..patch
|
||||
* gdb-testsuite-fix-xfail-in-gdb.ada-variant_record_fi.patch
|
||||
* gdb-testsuite-force-dwarf-in-gdb.pascal.patch
|
||||
* gdb-testsuite-rust-fix-for-empty-array.patch
|
||||
* gdb-testsuite-use-expect_build_id_in_core_file-a-bit.patch
|
||||
* gdb-testsuite-use-std-c99-in-gdb.base-callfuncs.exp.patch
|
||||
* gdb-testsuite-use-std-c99-in-gdb.base-nodebug.exp.patch
|
||||
* powerpc-mark-rtti-typeid-tests-as-expected-fail-befo.patch
|
||||
- Maintenance script import-patches.sh:
|
||||
* Use git instead of osc.
|
||||
- Maintenance script qa.sh:
|
||||
* Add PR32893 kfail.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Oct 22 07:55:19 UTC 2025 - Tom de Vries <tdevries@suse.com>
|
||||
|
||||
- Patch added (swo#32688):
|
||||
* gdb-testsuite-yet-another-attempt-to-fix-gdb.threads.patch
|
||||
- Maintenance script qa.sh:
|
||||
* Remove PR32688 kfail.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Oct 21 14:07:07 UTC 2025 - Tom de Vries <tdevries@suse.com>
|
||||
|
||||
- Work around recursively defined sle_version on openSUSE Leap 16.0
|
||||
(bsc#1238724).
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Mon Oct 6 18:44:56 UTC 2025 - Tom de Vries <tdevries@suse.com>
|
||||
|
||||
- Patch added:
|
||||
* fix-gdb.server-server-kill.exp.patch
|
||||
- Maintenance script qa.sh:
|
||||
* Add PR33054 kfail.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Oct 1 14:29:57 UTC 2025 - Tom de Vries <tdevries@suse.com>
|
||||
|
||||
- Patch added (bsc#1250033, swo#33480):
|
||||
* gdb-c-fix-hang-on-whatis-std-string-npos.patch
|
||||
- Patch added (swo#33512):
|
||||
* gdb-fix-assertion-failure-due-to-null-frame.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Fri Jun 6 08:16:36 UTC 2025 - Tom de Vries <tdevries@suse.com>
|
||||
|
||||
|
||||
73
gdb.spec
73
gdb.spec
@@ -16,6 +16,11 @@
|
||||
# Please submit bugfixes or comments via https://bugs.opensuse.org/
|
||||
#
|
||||
|
||||
%if 0%{?suse_version} >= 1600
|
||||
# Workaround recursively defined sle_version, see this PR (
|
||||
# https://bugzilla.suse.com/show_bug.cgi?id=1238724 ).
|
||||
%undefine sle_version
|
||||
%endif
|
||||
|
||||
%define flavor @BUILD_FLAVOR@%{nil}
|
||||
|
||||
@@ -255,6 +260,33 @@ Patch2144: gdb-testsuite-fix-gdb.ada-scalar_storage.exp-on-s390.patch
|
||||
Patch2145: gdb-testsuite-fix-gdb.base-bp-permanent.exp-with-gcc.patch
|
||||
Patch2146: gdb-testsuite-don-t-run-to-main-in-gdb.cp-cplusfuncs.patch
|
||||
Patch2147: gdb-testsuite-fix-timeout-in-gdb.multi-attach-while-.patch
|
||||
Patch2148: gdb-fix-assertion-failure-due-to-null-frame.patch
|
||||
Patch2149: check-gnatmake-version-in-gnat_version_compare.patch
|
||||
Patch2150: gdb-fix-handling-of-aborted-inferior-call.patch
|
||||
Patch2151: gdb-testsuite-fix-possible-tcl-errors-in-gdb.threads.patch
|
||||
Patch2152: gdb-testsuite-fix-xfail-in-gdb.ada-array_of_variant..patch
|
||||
Patch2153: gdb-testsuite-fix-gdb.mi-mi-sym-info.exp.patch
|
||||
|
||||
# Backports from master, available in GDB 18.
|
||||
|
||||
Patch2500: fix-gdb.server-server-kill.exp.patch
|
||||
Patch2501: avoid-crash-with-length.patch
|
||||
Patch2502: correct-bounds-check-when-working-around-gas-dwarf-5.patch
|
||||
Patch2503: gdb-testsuite-rust-fix-for-empty-array.patch
|
||||
Patch2504: gdb-testsuite-use-expect_build_id_in_core_file-a-bit.patch
|
||||
Patch2505: gdb-testsuite-use-std-c99-in-gdb.base-callfuncs.exp.patch
|
||||
Patch2506: gdb-testsuite-use-std-c99-in-gdb.base-nodebug.exp.patch
|
||||
Patch2507: change-return-value-of-_bfd_mmap_temporary.patch
|
||||
Patch2508: fix-crash-in-f-typeprint.c.patch
|
||||
Patch2509: have-gdb.threadexitedevent-inherit-from-gdb.threadev.patch
|
||||
Patch2510: gdb-testsuite-fix-gdb.rust-methods.exp-on-i686-linux.patch
|
||||
Patch2511: gdb-testsuite-fix-sizeof-test-in-gdb.rust-simple.exp.patch
|
||||
Patch2512: gdb-testsuite-fix-xfail-in-gdb.ada-variant_record_fi.patch
|
||||
Patch2513: gdb-corefiles-fix-segfault-in-add_thread_silent.patch
|
||||
Patch2514: gdb-rust-fix-handling-of-unsigned-discriminant.patch
|
||||
Patch2515: gdb-testsuite-force-dwarf-in-gdb.pascal.patch
|
||||
Patch2516: gdb-testsuite-fix-main-in-gdb.trace-mi-trace-frame-c.patch
|
||||
Patch2517: mark-pascal-as-case-insensitive.patch
|
||||
|
||||
# Backport from gdb-patches
|
||||
|
||||
@@ -280,6 +312,17 @@ Patch3013: gdb-testsuite-fix-regexp-in-gdb.multi-pending-bp-del.patch
|
||||
Patch3014: gdb-testsuite-fix-timeout-in-gdb.threads-main-thread.patch
|
||||
# https://sourceware.org/pipermail/gdb-patches/2025-June/218637.html
|
||||
Patch3015: gdb-python-reimplement-gdb.interrupt-race-fix.patch
|
||||
# https://sourceware.org/pipermail/gdb-patches/2025-September/221285.html
|
||||
Patch3016: gdb-c-fix-hang-on-whatis-std-string-npos.patch
|
||||
# https://sourceware.org/pipermail/gdb-patches/2025-October/221953.html
|
||||
Patch3017: gdb-testsuite-yet-another-attempt-to-fix-gdb.threads.patch
|
||||
# https://sourceware.org/pipermail/gdb-patches/2025-November/222840.html
|
||||
Patch3018: gdb-testsuite-fix-build-id-check-in-gdb.python-py-mi.patch
|
||||
# https://sourceware.org/pipermail/gdb-patches/2025-November/222874.html
|
||||
Patch3019: bfd-elf-handle-prstatus-of-156-bytes-in-elf32_arm_na.patch
|
||||
# https://sourceware.org/pipermail/gdb-patches/2025-November/222919.html
|
||||
# Todo: submit arm part.
|
||||
Patch3020: powerpc-mark-rtti-typeid-tests-as-expected-fail-befo.patch
|
||||
|
||||
# Debug patches.
|
||||
|
||||
@@ -666,6 +709,31 @@ find -name "*.info*"|xargs rm -f
|
||||
%patch -P 2145 -p1
|
||||
%patch -P 2146 -p1
|
||||
%patch -P 2147 -p1
|
||||
%patch -P 2148 -p1
|
||||
%patch -P 2149 -p1
|
||||
%patch -P 2150 -p1
|
||||
%patch -P 2151 -p1
|
||||
%patch -P 2152 -p1
|
||||
%patch -P 2153 -p1
|
||||
|
||||
%patch -P 2500 -p1
|
||||
%patch -P 2501 -p1
|
||||
%patch -P 2502 -p1
|
||||
%patch -P 2503 -p1
|
||||
%patch -P 2504 -p1
|
||||
%patch -P 2505 -p1
|
||||
%patch -P 2506 -p1
|
||||
%patch -P 2507 -p1
|
||||
%patch -P 2508 -p1
|
||||
%patch -P 2509 -p1
|
||||
%patch -P 2510 -p1
|
||||
%patch -P 2511 -p1
|
||||
%patch -P 2512 -p1
|
||||
%patch -P 2513 -p1
|
||||
%patch -P 2514 -p1
|
||||
%patch -P 2515 -p1
|
||||
%patch -P 2516 -p1
|
||||
%patch -P 2517 -p1
|
||||
|
||||
%patch -P 3000 -p1
|
||||
%patch -P 3001 -p1
|
||||
@@ -676,6 +744,11 @@ find -name "*.info*"|xargs rm -f
|
||||
%patch -P 3013 -p1
|
||||
%patch -P 3014 -p1
|
||||
%patch -P 3015 -p1
|
||||
%patch -P 3016 -p1
|
||||
%patch -P 3017 -p1
|
||||
%patch -P 3018 -p1
|
||||
%patch -P 3019 -p1
|
||||
%patch -P 3020 -p1
|
||||
|
||||
#unpack libipt
|
||||
%if 0%{have_libipt}
|
||||
|
||||
49
have-gdb.threadexitedevent-inherit-from-gdb.threadev.patch
Normal file
49
have-gdb.threadexitedevent-inherit-from-gdb.threadev.patch
Normal file
@@ -0,0 +1,49 @@
|
||||
From 5e756961d8907915bd46e3a97078851169a9fdc7 Mon Sep 17 00:00:00 2001
|
||||
From: Tom Tromey <tromey@adacore.com>
|
||||
Date: Wed, 17 Sep 2025 08:49:27 -0600
|
||||
Subject: [PATCH 10/25] Have gdb.ThreadExitedEvent inherit from gdb.ThreadEvent
|
||||
|
||||
The documentation says that ThreadExitedEvent is derived from
|
||||
ThreadEvent, but the code does not actually implement this.
|
||||
|
||||
This patch fixes the problem. I propose applying this to gdb 17 as
|
||||
well.
|
||||
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33444
|
||||
Approved-By: Simon Marchi <simon.marchi@efficios.com>
|
||||
|
||||
(cherry picked from commit 3a9f5df6ea8adcae7769f271cccbc2da8553c08d)
|
||||
---
|
||||
gdb/python/py-event-types.def | 2 +-
|
||||
gdb/testsuite/gdb.python/py-thread-exited.py | 2 ++
|
||||
2 files changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/gdb/python/py-event-types.def b/gdb/python/py-event-types.def
|
||||
index e22f042bd6b..bef5fe2eb00 100644
|
||||
--- a/gdb/python/py-event-types.def
|
||||
+++ b/gdb/python/py-event-types.def
|
||||
@@ -54,7 +54,7 @@ GDB_PY_DEFINE_EVENT_TYPE (new_thread,
|
||||
GDB_PY_DEFINE_EVENT_TYPE (thread_exited,
|
||||
"ThreadExitedEvent",
|
||||
"GDB thread exited event object",
|
||||
- event_object_type);
|
||||
+ thread_event_object_type);
|
||||
|
||||
GDB_PY_DEFINE_EVENT_TYPE (new_inferior,
|
||||
"NewInferiorEvent",
|
||||
diff --git a/gdb/testsuite/gdb.python/py-thread-exited.py b/gdb/testsuite/gdb.python/py-thread-exited.py
|
||||
index f813271bc3c..953e7cb8c70 100644
|
||||
--- a/gdb/testsuite/gdb.python/py-thread-exited.py
|
||||
+++ b/gdb/testsuite/gdb.python/py-thread-exited.py
|
||||
@@ -26,6 +26,8 @@ def thread_exited_handler(event):
|
||||
global threadOneExit, threadTwoExit, mainThreadExit
|
||||
print("{}".format(event))
|
||||
assert isinstance(event, gdb.ThreadExitedEvent)
|
||||
+ # Also check the inheritance.
|
||||
+ assert isinstance(event, gdb.ThreadEvent)
|
||||
if threadOneExit == "":
|
||||
threadOneExit = "event type: thread-exited. global num: {}".format(
|
||||
event.inferior_thread.global_num
|
||||
--
|
||||
2.51.0
|
||||
|
||||
@@ -99,7 +99,7 @@ fi
|
||||
|
||||
for f in $files; do
|
||||
mv tmp.patches/"$f" .
|
||||
osc add "$f"
|
||||
git add "$f"
|
||||
done
|
||||
|
||||
rmdir tmp.patches
|
||||
|
||||
34
mark-pascal-as-case-insensitive.patch
Normal file
34
mark-pascal-as-case-insensitive.patch
Normal file
@@ -0,0 +1,34 @@
|
||||
From f580f6862fb9c408f73c815b1d431911deb81cf3 Mon Sep 17 00:00:00 2001
|
||||
From: Tom Tromey <tromey@adacore.com>
|
||||
Date: Thu, 13 Nov 2025 09:26:58 -0700
|
||||
Subject: [PATCH 20/25] Mark Pascal as case-insensitive
|
||||
|
||||
The Pascal language is not case-sensitive, so implement the
|
||||
appropriate language method. This fixes gdb.pascal failures with
|
||||
-gw3.
|
||||
|
||||
I wasn't sure if -gw3 should be the default so I've left it as-is.
|
||||
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=33617
|
||||
Approved-By: Tom de Vries <tdevries@suse.de>
|
||||
---
|
||||
gdb/p-lang.h | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/gdb/p-lang.h b/gdb/p-lang.h
|
||||
index abb981aeaed..bcac81d8cac 100644
|
||||
--- a/gdb/p-lang.h
|
||||
+++ b/gdb/p-lang.h
|
||||
@@ -154,6 +154,9 @@ class pascal_language : public language_defn
|
||||
bool range_checking_on_by_default () const override
|
||||
{ return true; }
|
||||
|
||||
+ enum case_sensitivity case_sensitivity () const override
|
||||
+ { return case_sensitive_off; }
|
||||
+
|
||||
private:
|
||||
|
||||
/* Print the character C on STREAM as part of the contents of a literal
|
||||
--
|
||||
2.51.0
|
||||
|
||||
57
powerpc-mark-rtti-typeid-tests-as-expected-fail-befo.patch
Normal file
57
powerpc-mark-rtti-typeid-tests-as-expected-fail-befo.patch
Normal file
@@ -0,0 +1,57 @@
|
||||
From 9504544659b7215bce811876c1a4e4491b3d70df Mon Sep 17 00:00:00 2001
|
||||
From: Abhay Kandpal <abhay@linux.ibm.com>
|
||||
Date: Mon, 24 Nov 2025 04:49:44 -0600
|
||||
Subject: [PATCH 23/25] PowerPC: Mark RTTI typeid tests as expected fail before
|
||||
inferior start
|
||||
|
||||
On PowerPC targets, the RTTI typeinfo objects for base types may not
|
||||
be emitted until the inferior has been started. As a result,
|
||||
the `gdb.cp/typeid.exp` test fails when checking typeid results
|
||||
before program execution begins.
|
||||
|
||||
This patch marks these specific cases as expected failures on PowerPC
|
||||
when the inferior has not yet started, aligning the behavior with other
|
||||
targets (such as Clang) where RTTI emission is deferred until runtime.
|
||||
|
||||
gdb/testsuite/
|
||||
* gdb.cp/typeid.exp (do_typeid_tests): Mark PowerPC pre-start
|
||||
RTTI typeinfo checks as expected failures for `i`, `cp`, and `ccp`.
|
||||
---
|
||||
gdb/testsuite/gdb.cp/typeid.exp | 21 ++++++++++++++++-----
|
||||
1 file changed, 16 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/gdb/testsuite/gdb.cp/typeid.exp b/gdb/testsuite/gdb.cp/typeid.exp
|
||||
index 3ba82f6f001..4dbd9729b54 100644
|
||||
--- a/gdb/testsuite/gdb.cp/typeid.exp
|
||||
+++ b/gdb/testsuite/gdb.cp/typeid.exp
|
||||
@@ -28,11 +28,22 @@ proc do_typeid_tests {started} {
|
||||
set type_re "(std::type_info|gdb_gnu_v3_type_info)"
|
||||
|
||||
set var {ca b}
|
||||
- if {$started || ![test_compiler_info clang-*-* c++]} {
|
||||
- # Clang doesn't place type information for the base types in
|
||||
- # the executable, and relies on this being linked in from the
|
||||
- # standard library. As a result, type information for these
|
||||
- # variables is only available once the inferior is started.
|
||||
+
|
||||
+ set have_base_types 1
|
||||
+ if {!$started} {
|
||||
+ if {[test_compiler_info clang-*-* c++]} {
|
||||
+ # Clang doesn't place type information for the base types in
|
||||
+ # the executable, and relies on this being linked in from the
|
||||
+ # standard library. As a result, type information for these
|
||||
+ # variables is only available once the inferior is started.
|
||||
+ set have_base_types 0
|
||||
+ } elseif {[istarget "powerpc*-*-*"] || [is_aarch32_target]} {
|
||||
+ # On PowerPC, RTTI typeinfo for base types (i, cp, ccp) may not be
|
||||
+ # emitted until the inferior is started.
|
||||
+ set have_base_types 0
|
||||
+ }
|
||||
+ }
|
||||
+ if { $have_base_types } {
|
||||
lappend var i cp ccp
|
||||
}
|
||||
|
||||
--
|
||||
2.51.0
|
||||
|
||||
25
qa.sh
25
qa.sh
@@ -332,10 +332,6 @@ kfail=(
|
||||
"FAIL: gdb.debuginfod/fetch_src_and_symbols.exp: local_url: file corefile"
|
||||
"FAIL: gdb.debuginfod/crc_mismatch.exp: local_debuginfod: debuginfod running, info downloaded, no CRC mismatch"
|
||||
|
||||
# Fixed by commit 17f6581c36a ("gdb/testsuite: another attempt to fix
|
||||
# gdb.threads/thread-specific-bp.exp").
|
||||
"FAIL: gdb.threads/thread-specific-bp.exp: non_stop=on: continue to end \(timeout\)"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=31811
|
||||
"FAIL: gdb.threads/threads-after-exec.exp:"
|
||||
|
||||
@@ -361,12 +357,12 @@ kfail=(
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=32619
|
||||
"FAIL: gdb.dap/eof.exp: exceptions in log file"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=32688
|
||||
"FAIL: gdb.threads/thread-specific-bp.exp: non_stop=on: continue to end"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=31308
|
||||
"FAIL: gdb.arch/amd64-init-x87-values.exp: check_setting_mxcsr_before_enable: check new value of MXCSR is still in place"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=32893
|
||||
"FAIL: gdb.multi/attach-no-multi-process.exp: target_non_stop=off: info threads \(timeout\)"
|
||||
|
||||
) # kfail
|
||||
|
||||
kfail_sle12=(
|
||||
@@ -544,6 +540,19 @@ kfail_factory=(
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=32678
|
||||
"FAIL: gdb.reverse/time-reverse.exp: mode=c:"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=33054
|
||||
"FAIL: gdb.ada/task_switch_in_core.exp: info tasks after switching to task 1"
|
||||
"FAIL: gdb.ada/task_switch_in_core.exp: info tasks after switching to task 2"
|
||||
"FAIL: gdb.ada/task_switch_in_core.exp: task 1"
|
||||
"FAIL: gdb.ada/task_switch_in_core.exp: task 2"
|
||||
"FAIL: gdb.server/server-kill.exp: test_tstatus: tstatus"
|
||||
"FAIL: gdb.threads/threadcrash.exp: test_gcore: \\\$thread_count == \[llength \\\$test_list\]"
|
||||
"FAIL: gdb.threads/threadcrash.exp: test_gcore: thread apply 2 backtrace"
|
||||
"FAIL: gdb.threads/threadcrash.exp: test_gcore: thread apply 3 backtrace"
|
||||
"FAIL: gdb.threads/threadcrash.exp: test_gcore: thread apply 4 backtrace"
|
||||
"FAIL: gdb.threads/threadcrash.exp: test_gcore: thread apply 5 backtrace"
|
||||
"FAIL: gdb.threads/tls-core.exp: gcore: print thread-local storage variable"
|
||||
|
||||
) # kfail_factory
|
||||
|
||||
kfail_aarch64=(
|
||||
@@ -823,7 +832,7 @@ case $n in
|
||||
|
||||
kfail_re=$(join "|" "${kfail[@]}")
|
||||
grep -A1 "ERROR:.*no longer" binaries-testsuite*/gdb-testresults/*.sum \
|
||||
| grep -E -v "ERROR|\--" | grep -E -v "$kfail_re"
|
||||
| grep -E -v "ERROR|--" | grep -E -v "$kfail_re"
|
||||
;;
|
||||
|
||||
3)
|
||||
|
||||
Reference in New Issue
Block a user