Accepting request 1126771 from devel:gcc
- Maintenance script qa.sh: * Update PR31004 kfail. - Patches added (backport from gdb-patches): * gdb-fix-segfault-in-for_each_block-part-1.patch - Maintenance script qa.sh: * Update PR28561 kfail. * Remove PR31015 kfail. * Remove PR30547 kfail. - Patches added (backport from master): * gdb-symtab-add-producer_is_gas.patch * gdb-symtab-work-around-gas-pr28629.patch * gdb-tdep-fix-nr-array-elements-in-ppc64_aggregate_ca.patch * gdb-testsuite-fix-gdb.python-py-breakpoint.exp-with-.patch * gdb-tui-fix-segfault-in-tui_find_disassembly_address.patch * gdb-tui-fix-wmaybe-uninitialized-in-tui_find_disasse.patch * gdb-testsuite-add-wait_for_msg-arg-to-term-resize-fi.patch - Patches added (backport from gdb-patches): * gdb-fix-segfault-in-for_each_block-part-2.patch * gdb-tui-allow-command-window-of-1-or-2-lines.patch * gdb-tui-fix-resizing-of-terminal-to-1-or-2-lines.patch - Maintenance script qa.sh: * Remove PR28467, PR29418, PR29420, PR29814 and PR29408 kfail. * Remove gdb.tui/tui-layout-asm-short-prog.exp kfail. * Remove commit f68eca29d3b, 29004660c94, 301fe55e9c4, 4d88ae0c7b5, e7d69e72bfd, 8b272d7671f, 85819864f7c, 167f3beb655 and a0eda3df5b7 kfails. * Add PR31015 kfail. * Remove PR29793 kfail. * Remove gdb.arch/powerpc-bcl-prologue.exp kfail. * Remove PR29813 and PR29816 kfail. - Maintenance script qa.sh: * Update PR28561 kfail. * Update PR29781 kfail. - Maintenance script qa-local.sh: * Add "Verify quilt setup" step. - Patches added (backport from master): * gdb-symtab-handle-self-reference-die.patch * gdb-symtab-handle-self-reference-in-inherit_abstract.patch * gdb-symtab-add-optimized-out-static-var-to-cooked-in.patch - Maintenance script qa.sh: * Add comment to kfail for PR30528. * Add UNRESOLVED kfail for gdb.base/gcore-excessive-memory.exp. * Add UNRESOLVED kfail for PR31001. * Remove PR27238 kfail. * Add powerpc64le hw watchpoint kfails. * Add PR31004 kfail. * Add PR30531 kfail. - Patches added (backport from master): * xcoffread.c-fix-werror-dangling-pointer-issue-with-m.patch * avoid-manual-memory-management-in-go-lang.c.patch * gdb-go-handle-v3-go_0-mangled-prefix.patch - Patches added (backport from master): * gdb-symtab-don-t-deduplicate-variables-in-gdb-index.patch - Patches dropped (requires unsupported command): * gdb-testsuite-add-wait-for-index-cache-in-gdb.dwarf2.patch - Maintenance script qa.sh: * Added PR30528 kfail. - Patches added (manual import from fedora rawhide @ 52a4dab): * gdb-rhbz1773651-gdb-index-internal-error.patch - Patches added (backport from master): * gdb-support-rseq-auxvs.patch * gdb-symtab-fix-line-number-of-static-const-class-mem.patch * gdb-symtab-fix-too-many-symbols-in-gdbpy_lookup_stat.patch * gdb-symtab-handle-pu-in-iterate_over_some_symtabs.patch * gdb-symtab-work-around-pr-gas-29517.patch * gdb-testsuite-add-kfail-for-pr-ada-30908.patch * gdb-testsuite-add-xfail-for-gdb-29965-in-gdb.threads.patch * gdb-testsuite-fix-gdb.ada-mi_task_arg.exp-with-newer.patch * gdb-testsuite-fix-gdb.arch-i386-signal.exp-on-x86_64.patch * gdb-testsuite-fix-gdb.cp-m-static.exp-regression-on-.patch * gdb-testsuite-fix-gdb.dwarf2-nullptr_t.exp-with-cc-w.patch * gdb-testsuite-fix-regexps-in-gdb.base-step-over-sysc.patch * gdb-symtab-find-main-language-without-symtab-expansi.patch * gdb-testsuite-add-wait-for-index-cache-in-gdb.dwarf2.patch - Patches moved (from "Backport from gdb-patches" to "Backports from master, available in next release"): * gdb-cli-handle-pending-c-after-rl_callback_read_char.patch * gdb-testsuite-add-have_host_locale.patch - Maintenance script qa.sh: * Remove PR28463, PR28108, PR29247 and PR29160 kfails. * Remove PR30540, PR30908, PR29965 kfails. * Remove gdb.ada/mi_task_arg.exp kfail. - Limit "Suggests: %{python}-Pygments" to SLE-15 and later. - Mention import-fedora.sh to fix warning. - Maintenance script qa.sh: * Update kfail for PR28561. - Maintenance script import-fedora.sh: * New script. Move skipped patches list from gdb.spec to script. - Update to fedora 38 @ 82cc8e0. - Patch renamed: * pass-const-frame_info_ptr-reference-for-skip_-langua.patch -> gdb-rhbz2192105-ftbs-dangling-pointer - Patches added: * gdb-bz2237392-dwarf-obstack-allocation.patch * gdb-bz2237515-debuginfod-double-free.patch * gdb-rhbz2160211-excessive-core-file-warnings.patch * gdb-rhbz2196395-debuginfod-legacy-openssl-crash.patch * gdb-rhbz2233961-CVE-2022-4806.patch * gdb-rhbz2233965-memory-leak.patch - Maintenance script qa-local.sh: * Add openSUSE_Leap_15.5 and openSUSE_Factory_LegacyX86. * Add "List configs" item. * Skip i586 for SLE-11. - Maintenance script qa.sh: * Make sure exit status is 0 - Add "Suggests: %{python}-Pygments". - Maintenance script qa.sh: * Note investigation of some ada test-cases. * Update PR30547 kfail. * Add PR28561 kfail. * Update PKRU-related kfail. * Use openSUSE_Factory_LegacyX86.i586 instead of openSUSE_Factory.i586. * Remove PR27813 kfail and corresponding todo. OBS-URL: https://build.opensuse.org/request/show/1126771 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/gdb?expand=0&rev=173
This commit is contained in:
commit
f2388a0709
202
avoid-manual-memory-management-in-go-lang.c.patch
Normal file
202
avoid-manual-memory-management-in-go-lang.c.patch
Normal file
@ -0,0 +1,202 @@
|
||||
From 4e0e7ff14ba271576232160bf337639662a2ea23 Mon Sep 17 00:00:00 2001
|
||||
From: Tom Tromey <tom@tromey.com>
|
||||
Date: Thu, 16 Feb 2023 17:36:29 -0700
|
||||
Subject: [PATCH 2/3] Avoid manual memory management in go-lang.c
|
||||
|
||||
I noticed a couple of spots in go-lang.c that could be improved by
|
||||
using unique_ptr.
|
||||
|
||||
Reviewed-By: Andrew Burgess <aburgess@redhat.com>
|
||||
---
|
||||
gdb/dwarf2/read.c | 2 +-
|
||||
gdb/go-exp.c | 287 +++++++++++++++++++++++-----------------------
|
||||
gdb/go-exp.y | 8 +-
|
||||
gdb/go-lang.c | 40 +++----
|
||||
gdb/go-lang.h | 11 +-
|
||||
5 files changed, 173 insertions(+), 175 deletions(-)
|
||||
|
||||
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
|
||||
index 8aa7f8c31e5..61f4bd75013 100644
|
||||
--- a/gdb/dwarf2/read.c
|
||||
+++ b/gdb/dwarf2/read.c
|
||||
@@ -7890,7 +7890,7 @@ fixup_go_packaging (struct dwarf2_cu *cu)
|
||||
&& sym->aclass () == LOC_BLOCK)
|
||||
{
|
||||
gdb::unique_xmalloc_ptr<char> this_package_name
|
||||
- (go_symbol_package_name (sym));
|
||||
+ = go_symbol_package_name (sym);
|
||||
|
||||
if (this_package_name == NULL)
|
||||
continue;
|
||||
diff --git a/gdb/go-exp.y b/gdb/go-exp.y
|
||||
index cbaa79ee18c..542a06d06d6 100644
|
||||
--- a/gdb/go-exp.y
|
||||
+++ b/gdb/go-exp.y
|
||||
@@ -1393,16 +1393,16 @@ classify_name (struct parser_state *par_state, const struct block *block)
|
||||
current package. */
|
||||
|
||||
{
|
||||
- char *current_package_name = go_block_package_name (block);
|
||||
+ gdb::unique_xmalloc_ptr<char> current_package_name
|
||||
+ = go_block_package_name (block);
|
||||
|
||||
if (current_package_name != NULL)
|
||||
{
|
||||
struct stoken sval =
|
||||
- build_packaged_name (current_package_name,
|
||||
- strlen (current_package_name),
|
||||
+ build_packaged_name (current_package_name.get (),
|
||||
+ strlen (current_package_name.get ()),
|
||||
copy.c_str (), copy.size ());
|
||||
|
||||
- xfree (current_package_name);
|
||||
sym = lookup_symbol (sval.ptr, block, VAR_DOMAIN,
|
||||
&is_a_field_of_this);
|
||||
if (sym.symbol)
|
||||
diff --git a/gdb/go-lang.c b/gdb/go-lang.c
|
||||
index 7549f14dc63..f9176ace71d 100644
|
||||
--- a/gdb/go-lang.c
|
||||
+++ b/gdb/go-lang.c
|
||||
@@ -163,11 +163,8 @@ unpack_package_and_object (char *buf,
|
||||
|
||||
Space for the resulting strings is malloc'd in one buffer.
|
||||
PACKAGEP,OBJECTP,METHOD_TYPE* will (typically) point into this buffer.
|
||||
- [There are a few exceptions, but the caller is still responsible for
|
||||
- freeing the resulting pointer.]
|
||||
A pointer to this buffer is returned, or NULL if symbol isn't a
|
||||
mangled Go symbol.
|
||||
- The caller is responsible for freeing the result.
|
||||
|
||||
*METHOD_TYPE_IS_POINTERP is set to a boolean indicating if
|
||||
the method type is a pointer.
|
||||
@@ -180,7 +177,7 @@ unpack_package_and_object (char *buf,
|
||||
If we ever need to unpack the method type, this routine should work
|
||||
for that too. */
|
||||
|
||||
-static char *
|
||||
+static gdb::unique_xmalloc_ptr<char>
|
||||
unpack_mangled_go_symbol (const char *mangled_name,
|
||||
const char **packagep,
|
||||
const char **objectp,
|
||||
@@ -209,9 +206,10 @@ unpack_mangled_go_symbol (const char *mangled_name,
|
||||
/* main.init is mangled specially. */
|
||||
if (strcmp (mangled_name, "__go_init_main") == 0)
|
||||
{
|
||||
- char *package = xstrdup ("main");
|
||||
+ gdb::unique_xmalloc_ptr<char> package
|
||||
+ = make_unique_xstrdup ("main");
|
||||
|
||||
- *packagep = package;
|
||||
+ *packagep = package.get ();
|
||||
*objectp = "init";
|
||||
return package;
|
||||
}
|
||||
@@ -219,9 +217,10 @@ unpack_mangled_go_symbol (const char *mangled_name,
|
||||
/* main.main is mangled specially (missing prefix). */
|
||||
if (strcmp (mangled_name, "main.main") == 0)
|
||||
{
|
||||
- char *package = xstrdup ("main");
|
||||
+ gdb::unique_xmalloc_ptr<char> package
|
||||
+ = make_unique_xstrdup ("main");
|
||||
|
||||
- *packagep = package;
|
||||
+ *packagep = package.get ();
|
||||
*objectp = "main";
|
||||
return package;
|
||||
}
|
||||
@@ -261,7 +260,8 @@ unpack_mangled_go_symbol (const char *mangled_name,
|
||||
|
||||
/* At this point we've decided we have a mangled Go symbol. */
|
||||
|
||||
- buf = xstrdup (mangled_name);
|
||||
+ gdb::unique_xmalloc_ptr<char> result = make_unique_xstrdup (mangled_name);
|
||||
+ buf = result.get ();
|
||||
|
||||
/* Search backwards looking for "N<digit(s)>". */
|
||||
p = buf + len;
|
||||
@@ -317,7 +317,7 @@ unpack_mangled_go_symbol (const char *mangled_name,
|
||||
}
|
||||
|
||||
unpack_package_and_object (buf, packagep, objectp);
|
||||
- return buf;
|
||||
+ return result;
|
||||
}
|
||||
|
||||
/* Implements the la_demangle language_defn routine for language Go.
|
||||
@@ -381,10 +381,9 @@ go_language::demangle_symbol (const char *mangled_name, int options) const
|
||||
return make_unique_xstrdup ((const char *) obstack_finish (&tempbuf));
|
||||
}
|
||||
|
||||
-/* Given a Go symbol, return its package or NULL if unknown.
|
||||
- Space for the result is malloc'd, caller must free. */
|
||||
+/* See go-lang.h. */
|
||||
|
||||
-char *
|
||||
+gdb::unique_xmalloc_ptr<char>
|
||||
go_symbol_package_name (const struct symbol *sym)
|
||||
{
|
||||
const char *mangled_name = sym->linkage_name ();
|
||||
@@ -393,8 +392,7 @@ go_symbol_package_name (const struct symbol *sym)
|
||||
const char *method_type_package_name;
|
||||
const char *method_type_object_name;
|
||||
int method_type_is_pointer;
|
||||
- char *name_buf;
|
||||
- char *result;
|
||||
+ gdb::unique_xmalloc_ptr<char> name_buf;
|
||||
|
||||
gdb_assert (sym->language () == language_go);
|
||||
name_buf = unpack_mangled_go_symbol (mangled_name,
|
||||
@@ -405,15 +403,12 @@ go_symbol_package_name (const struct symbol *sym)
|
||||
/* Some Go symbols don't have mangled form we interpret (yet). */
|
||||
if (name_buf == NULL)
|
||||
return NULL;
|
||||
- result = xstrdup (package_name);
|
||||
- xfree (name_buf);
|
||||
- return result;
|
||||
+ return make_unique_xstrdup (package_name);
|
||||
}
|
||||
|
||||
-/* Return the package that BLOCK is in, or NULL if there isn't one.
|
||||
- Space for the result is malloc'd, caller must free. */
|
||||
+/* See go-lang.h. */
|
||||
|
||||
-char *
|
||||
+gdb::unique_xmalloc_ptr<char>
|
||||
go_block_package_name (const struct block *block)
|
||||
{
|
||||
while (block != NULL)
|
||||
@@ -422,7 +417,8 @@ go_block_package_name (const struct block *block)
|
||||
|
||||
if (function != NULL)
|
||||
{
|
||||
- char *package_name = go_symbol_package_name (function);
|
||||
+ gdb::unique_xmalloc_ptr<char> package_name
|
||||
+ = go_symbol_package_name (function);
|
||||
|
||||
if (package_name != NULL)
|
||||
return package_name;
|
||||
diff --git a/gdb/go-lang.h b/gdb/go-lang.h
|
||||
index f0929cc3ac5..8edfe6ed53a 100644
|
||||
--- a/gdb/go-lang.h
|
||||
+++ b/gdb/go-lang.h
|
||||
@@ -62,9 +62,14 @@ extern const char *go_main_name (void);
|
||||
|
||||
extern enum go_type go_classify_struct_type (struct type *type);
|
||||
|
||||
-extern char *go_symbol_package_name (const struct symbol *sym);
|
||||
-
|
||||
-extern char *go_block_package_name (const struct block *block);
|
||||
+/* Given a Go symbol, return its package or nullptr if unknown. */
|
||||
+extern gdb::unique_xmalloc_ptr<char> go_symbol_package_name
|
||||
+ (const struct symbol *sym);
|
||||
+
|
||||
+/* Return the package that BLOCK is in, or nullptr if there isn't
|
||||
+ one. */
|
||||
+extern gdb::unique_xmalloc_ptr<char> go_block_package_name
|
||||
+ (const struct block *block);
|
||||
|
||||
extern const struct builtin_go_type *builtin_go_type (struct gdbarch *);
|
||||
|
||||
--
|
||||
2.35.3
|
||||
|
68
gdb-bz2237392-dwarf-obstack-allocation.patch
Normal file
68
gdb-bz2237392-dwarf-obstack-allocation.patch
Normal file
@ -0,0 +1,68 @@
|
||||
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
|
||||
From: Andrew Burgess <aburgess@redhat.com>
|
||||
Date: Thu, 14 Sep 2023 13:06:26 +0100
|
||||
Subject: gdb-bz2237392-dwarf-obstack-allocation.patch
|
||||
|
||||
;; Backport upstream commit 54392c4df604f20 to fix an incorrect
|
||||
;; obstack allocation that wold lead to memory corruption.
|
||||
|
||||
gdb: fix buffer overflow in DWARF reader
|
||||
|
||||
In this commit:
|
||||
|
||||
commit 48ac197b0c209ccf1f2de9704eb6cdf7c5c73a8e
|
||||
Date: Fri Nov 19 10:12:44 2021 -0700
|
||||
|
||||
Handle multiple addresses in call_site_target
|
||||
|
||||
a buffer overflow bug was introduced when the following code was
|
||||
added:
|
||||
|
||||
CORE_ADDR *saved = XOBNEWVAR (&objfile->objfile_obstack, CORE_ADDR,
|
||||
addresses.size ());
|
||||
std::copy (addresses.begin (), addresses.end (), saved);
|
||||
|
||||
The definition of XOBNEWVAR is (from libiberty.h):
|
||||
|
||||
#define XOBNEWVAR(O, T, S) ((T *) obstack_alloc ((O), (S)))
|
||||
|
||||
So 'saved' is going to point to addresses.size () bytes of memory,
|
||||
however, the std::copy will write addresses.size () number of
|
||||
CORE_ADDR sized entries to the address pointed to by 'saved', this is
|
||||
going to result in memory corruption.
|
||||
|
||||
The mistake is that we should have used XOBNEWVEC, which allocates a
|
||||
vector of entries, the definition of XOBNEWVEC is:
|
||||
|
||||
#define XOBNEWVEC(O, T, N) \
|
||||
((T *) obstack_alloc ((O), sizeof (T) * (N)))
|
||||
|
||||
Which means we will have set aside enough space to create a copy of
|
||||
the contents of the addresses vector.
|
||||
|
||||
I'm not sure how to create a test for this problem, this issue cropped
|
||||
up when debugging a particular i686 built binary, which just happened
|
||||
to trigger a glibc assertion (likely due to random memory corruption),
|
||||
debugging the same binary built for x86-64 appeared to work just fine.
|
||||
|
||||
Using valgrind on the failing GDB binary pointed straight to the cause
|
||||
of the problem, and with this patch in place there are no longer
|
||||
valgrind errors in this area.
|
||||
|
||||
If anyone has ideas for a test I'm happy to work on something.
|
||||
|
||||
Co-Authored-By: Keith Seitz <keiths@redhat.com>
|
||||
Approved-By: Tom Tromey <tom@tromey.com>
|
||||
|
||||
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
|
||||
--- a/gdb/dwarf2/read.c
|
||||
+++ b/gdb/dwarf2/read.c
|
||||
@@ -12506,7 +12506,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu)
|
||||
std::vector<CORE_ADDR> addresses;
|
||||
dwarf2_ranges_read_low_addrs (ranges_offset, target_cu,
|
||||
target_die->tag, addresses);
|
||||
- CORE_ADDR *saved = XOBNEWVAR (&objfile->objfile_obstack, CORE_ADDR,
|
||||
+ CORE_ADDR *saved = XOBNEWVEC (&objfile->objfile_obstack, CORE_ADDR,
|
||||
addresses.size ());
|
||||
std::copy (addresses.begin (), addresses.end (), saved);
|
||||
call_site->target.set_loc_array (addresses.size (), saved);
|
102
gdb-bz2237515-debuginfod-double-free.patch
Normal file
102
gdb-bz2237515-debuginfod-double-free.patch
Normal file
@ -0,0 +1,102 @@
|
||||
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
|
||||
From: Tom Tromey <tromey@adacore.com>
|
||||
Date: Tue, 6 Dec 2022 12:07:12 -0700
|
||||
Subject: gdb-bz2237515-debuginfod-double-free.patch
|
||||
|
||||
;; Backport upstream commit f96328accde1e63 to fix a potential double
|
||||
;; free issue in the debuginfod code.
|
||||
|
||||
Avoid double-free with debuginfod
|
||||
|
||||
PR gdb/29257 points out a possible double free when debuginfod is in
|
||||
use. Aside from some ugly warts in the symbol code (an ongoing
|
||||
issue), the underlying issue in this particular case is that elfread.c
|
||||
seems to assume that symfile_bfd_open will return NULL on error,
|
||||
whereas in reality it throws an exception. As this code isn't
|
||||
prepared for an exception, bad things result.
|
||||
|
||||
This patch fixes the problem by introducing a non-throwing variant of
|
||||
symfile_bfd_open and using it in the affected places.
|
||||
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29257
|
||||
|
||||
diff --git a/gdb/elfread.c b/gdb/elfread.c
|
||||
--- a/gdb/elfread.c
|
||||
+++ b/gdb/elfread.c
|
||||
@@ -1222,10 +1222,12 @@ elf_symfile_read_dwarf2 (struct objfile *objfile,
|
||||
|
||||
if (!debugfile.empty ())
|
||||
{
|
||||
- gdb_bfd_ref_ptr debug_bfd (symfile_bfd_open (debugfile.c_str ()));
|
||||
+ gdb_bfd_ref_ptr debug_bfd
|
||||
+ (symfile_bfd_open_no_error (debugfile.c_str ()));
|
||||
|
||||
- symbol_file_add_separate (debug_bfd, debugfile.c_str (),
|
||||
- symfile_flags, objfile);
|
||||
+ if (debug_bfd != nullptr)
|
||||
+ symbol_file_add_separate (debug_bfd, debugfile.c_str (),
|
||||
+ symfile_flags, objfile);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1245,13 +1247,12 @@ elf_symfile_read_dwarf2 (struct objfile *objfile,
|
||||
if (fd.get () >= 0)
|
||||
{
|
||||
/* File successfully retrieved from server. */
|
||||
- gdb_bfd_ref_ptr debug_bfd (symfile_bfd_open (symfile_path.get ()));
|
||||
+ gdb_bfd_ref_ptr debug_bfd
|
||||
+ (symfile_bfd_open_no_error (symfile_path.get ()));
|
||||
|
||||
- if (debug_bfd == nullptr)
|
||||
- warning (_("File \"%s\" from debuginfod cannot be opened as bfd"),
|
||||
- filename);
|
||||
- else if (build_id_verify (debug_bfd.get (), build_id->size,
|
||||
- build_id->data))
|
||||
+ if (debug_bfd != nullptr
|
||||
+ && build_id_verify (debug_bfd.get (), build_id->size,
|
||||
+ build_id->data))
|
||||
{
|
||||
symbol_file_add_separate (debug_bfd, symfile_path.get (),
|
||||
symfile_flags, objfile);
|
||||
diff --git a/gdb/symfile.c b/gdb/symfile.c
|
||||
--- a/gdb/symfile.c
|
||||
+++ b/gdb/symfile.c
|
||||
@@ -1744,6 +1744,23 @@ symfile_bfd_open (const char *name)
|
||||
return sym_bfd;
|
||||
}
|
||||
|
||||
+/* See symfile.h. */
|
||||
+
|
||||
+gdb_bfd_ref_ptr
|
||||
+symfile_bfd_open_no_error (const char *name) noexcept
|
||||
+{
|
||||
+ try
|
||||
+ {
|
||||
+ return symfile_bfd_open (name);
|
||||
+ }
|
||||
+ catch (const gdb_exception_error &err)
|
||||
+ {
|
||||
+ warning ("%s", err.what ());
|
||||
+ }
|
||||
+
|
||||
+ return nullptr;
|
||||
+}
|
||||
+
|
||||
/* Return the section index for SECTION_NAME on OBJFILE. Return -1 if
|
||||
the section was not found. */
|
||||
|
||||
diff --git a/gdb/symfile.h b/gdb/symfile.h
|
||||
--- a/gdb/symfile.h
|
||||
+++ b/gdb/symfile.h
|
||||
@@ -269,6 +269,11 @@ extern void set_initial_language (void);
|
||||
|
||||
extern gdb_bfd_ref_ptr symfile_bfd_open (const char *);
|
||||
|
||||
+/* Like symfile_bfd_open, but will not throw an exception on error.
|
||||
+ Instead, it issues a warning and returns nullptr. */
|
||||
+
|
||||
+extern gdb_bfd_ref_ptr symfile_bfd_open_no_error (const char *) noexcept;
|
||||
+
|
||||
extern int get_section_index (struct objfile *, const char *);
|
||||
|
||||
extern int print_symbol_loading_p (int from_tty, int mainline, int full);
|
645
gdb-fix-segfault-in-for_each_block-part-1.patch
Normal file
645
gdb-fix-segfault-in-for_each_block-part-1.patch
Normal file
@ -0,0 +1,645 @@
|
||||
From 75617e6d28b93814ac46ad85ad4fc2b133f61114 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Fri, 3 Nov 2023 16:25:33 +0100
|
||||
Subject: [PATCH] [gdb] Fix segfault in for_each_block, part 1
|
||||
|
||||
When running test-case gdb.base/vfork-follow-parent.exp on powerpc64 (likewise
|
||||
on s390x), I run into:
|
||||
...
|
||||
(gdb) PASS: gdb.base/vfork-follow-parent.exp: \
|
||||
exec_file=vfork-follow-parent-exit: target-non-stop=on: non-stop=off: \
|
||||
resolution_method=schedule-multiple: print unblock_parent = 1
|
||||
continue^M
|
||||
Continuing.^M
|
||||
Reading symbols from vfork-follow-parent-exit...^M
|
||||
^M
|
||||
^M
|
||||
Fatal signal: Segmentation fault^M
|
||||
----- Backtrace -----^M
|
||||
0x1027d3e7 gdb_internal_backtrace_1^M
|
||||
src/gdb/bt-utils.c:122^M
|
||||
0x1027d54f _Z22gdb_internal_backtracev^M
|
||||
src/gdb/bt-utils.c:168^M
|
||||
0x1057643f handle_fatal_signal^M
|
||||
src/gdb/event-top.c:889^M
|
||||
0x10576677 handle_sigsegv^M
|
||||
src/gdb/event-top.c:962^M
|
||||
0x3fffa7610477 ???^M
|
||||
0x103f2144 for_each_block^M
|
||||
src/gdb/dcache.c:199^M
|
||||
0x103f235b _Z17dcache_invalidateP13dcache_struct^M
|
||||
src/gdb/dcache.c:251^M
|
||||
0x10bde8c7 _Z24target_dcache_invalidatev^M
|
||||
src/gdb/target-dcache.c:50^M
|
||||
...
|
||||
or similar.
|
||||
|
||||
The root cause for the segmentation fault is that linux_is_uclinux gives an
|
||||
incorrect result: it should always return false, given that we're running on a
|
||||
regular linux system, but instead it returns first true, then false.
|
||||
|
||||
In more detail, the segmentation fault happens as follows:
|
||||
- a program space with an address space is created
|
||||
- a second program space is about to be created. maybe_new_address_space
|
||||
is called, and because linux_is_uclinux returns true, maybe_new_address_space
|
||||
returns false, and no new address space is created
|
||||
- a second program space with the same address space is created
|
||||
- a program space is deleted. Because linux_is_uclinux now returns false,
|
||||
gdbarch_has_shared_address_space (current_inferior ()->arch ()) returns
|
||||
false, and the address space is deleted
|
||||
- when gdb uses the address space of the remaining program space, we run into
|
||||
the segfault, because the address space is deleted.
|
||||
|
||||
Hardcoding linux_is_uclinux to false makes the test-case pass.
|
||||
|
||||
We leave addressing the root cause for the following commit in this series.
|
||||
|
||||
For now, prevent the segmentation fault by making the address space a refcounted
|
||||
object.
|
||||
|
||||
This was already suggested here [1]:
|
||||
...
|
||||
A better solution might be to have the address spaces be reference counted
|
||||
...
|
||||
|
||||
Tested on top of trunk on x86_64-linux and ppc64le-linux.
|
||||
Tested on top of gdb-14-branch on ppc64-linux.
|
||||
|
||||
Co-Authored-By: Simon Marchi <simon.marchi@polymtl.ca>
|
||||
|
||||
PR gdb/30547
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30547
|
||||
|
||||
[1] https://sourceware.org/pipermail/gdb-patches/2023-October/202928.html
|
||||
---
|
||||
gdb/breakpoint.c | 29 ++++++++-------
|
||||
gdb/inferior.c | 8 ++---
|
||||
gdb/inferior.h | 2 +-
|
||||
gdb/infrun.c | 20 +++++------
|
||||
gdb/linux-nat.c | 2 +-
|
||||
gdb/process-stratum-target.c | 2 +-
|
||||
gdb/progspace.c | 22 +++++-------
|
||||
gdb/progspace.h | 64 +++++++++++++++++++++-------------
|
||||
gdb/record-btrace.c | 2 +-
|
||||
gdb/regcache.c | 2 +-
|
||||
gdb/scoped-mock-context.h | 2 +-
|
||||
gdb/target-dcache.c | 11 +++---
|
||||
gdbsupport/refcounted-object.h | 17 +++++++++
|
||||
13 files changed, 103 insertions(+), 80 deletions(-)
|
||||
|
||||
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
|
||||
index f8d19356828..f4acb4ea8c4 100644
|
||||
--- a/gdb/breakpoint.c
|
||||
+++ b/gdb/breakpoint.c
|
||||
@@ -1605,7 +1605,7 @@ one_breakpoint_xfer_memory (gdb_byte *readbuf, gdb_byte *writebuf,
|
||||
int bptoffset = 0;
|
||||
|
||||
if (!breakpoint_address_match (target_info->placed_address_space, 0,
|
||||
- current_program_space->aspace, 0))
|
||||
+ current_program_space->aspace.get (), 0))
|
||||
{
|
||||
/* The breakpoint is inserted in a different address space. */
|
||||
return;
|
||||
@@ -2278,7 +2278,7 @@ should_be_inserted (struct bp_location *bl)
|
||||
a breakpoint. */
|
||||
if ((bl->loc_type == bp_loc_software_breakpoint
|
||||
|| bl->loc_type == bp_loc_hardware_breakpoint)
|
||||
- && stepping_past_instruction_at (bl->pspace->aspace,
|
||||
+ && stepping_past_instruction_at (bl->pspace->aspace.get (),
|
||||
bl->address)
|
||||
/* The single-step breakpoint may be inserted at the location
|
||||
we're trying to step if the instruction branches to itself.
|
||||
@@ -2713,7 +2713,7 @@ insert_bp_location (struct bp_location *bl,
|
||||
read the breakpoint instead of returning the data saved in
|
||||
the breakpoint location's shadow contents. */
|
||||
bl->target_info.reqstd_address = bl->address;
|
||||
- bl->target_info.placed_address_space = bl->pspace->aspace;
|
||||
+ bl->target_info.placed_address_space = bl->pspace->aspace.get ();
|
||||
bl->target_info.length = bl->length;
|
||||
|
||||
/* When working with target-side conditions, we must pass all the conditions
|
||||
@@ -4276,7 +4276,7 @@ bp_location_inserted_here_p (const struct bp_location *bl,
|
||||
const address_space *aspace, CORE_ADDR pc)
|
||||
{
|
||||
if (bl->inserted
|
||||
- && breakpoint_address_match (bl->pspace->aspace, bl->address,
|
||||
+ && breakpoint_address_match (bl->pspace->aspace.get (), bl->address,
|
||||
aspace, pc))
|
||||
{
|
||||
/* An unmapped overlay can't be a match. */
|
||||
@@ -4355,7 +4355,7 @@ hardware_watchpoint_inserted_in_range (const address_space *aspace,
|
||||
continue;
|
||||
|
||||
for (bp_location *loc : bpt->locations ())
|
||||
- if (loc->pspace->aspace == aspace && loc->inserted)
|
||||
+ if (loc->pspace->aspace.get () == aspace && loc->inserted)
|
||||
{
|
||||
CORE_ADDR l, h;
|
||||
|
||||
@@ -7153,10 +7153,10 @@ breakpoint_location_address_match (struct bp_location *bl,
|
||||
const address_space *aspace,
|
||||
CORE_ADDR addr)
|
||||
{
|
||||
- return (breakpoint_address_match (bl->pspace->aspace, bl->address,
|
||||
+ return (breakpoint_address_match (bl->pspace->aspace.get (), bl->address,
|
||||
aspace, addr)
|
||||
|| (bl->length
|
||||
- && breakpoint_address_match_range (bl->pspace->aspace,
|
||||
+ && breakpoint_address_match_range (bl->pspace->aspace.get (),
|
||||
bl->address, bl->length,
|
||||
aspace, addr)));
|
||||
}
|
||||
@@ -7173,7 +7173,7 @@ breakpoint_location_address_range_overlap (struct bp_location *bl,
|
||||
CORE_ADDR addr, int len)
|
||||
{
|
||||
if (gdbarch_has_global_breakpoints (target_gdbarch ())
|
||||
- || bl->pspace->aspace == aspace)
|
||||
+ || bl->pspace->aspace.get () == aspace)
|
||||
{
|
||||
int bl_len = bl->length != 0 ? bl->length : 1;
|
||||
|
||||
@@ -7230,8 +7230,10 @@ breakpoint_locations_match (const struct bp_location *loc1,
|
||||
/* We compare bp_location.length in order to cover ranged
|
||||
breakpoints. Keep this in sync with
|
||||
bp_location_is_less_than. */
|
||||
- return (breakpoint_address_match (loc1->pspace->aspace, loc1->address,
|
||||
- loc2->pspace->aspace, loc2->address)
|
||||
+ return (breakpoint_address_match (loc1->pspace->aspace.get (),
|
||||
+ loc1->address,
|
||||
+ loc2->pspace->aspace.get (),
|
||||
+ loc2->address)
|
||||
&& (loc1->loc_type == loc2->loc_type || sw_hw_bps_match)
|
||||
&& loc1->length == loc2->length);
|
||||
}
|
||||
@@ -9297,8 +9299,9 @@ ranged_breakpoint::breakpoint_hit (const struct bp_location *bl,
|
||||
|| ws.sig () != GDB_SIGNAL_TRAP)
|
||||
return 0;
|
||||
|
||||
- return breakpoint_address_match_range (bl->pspace->aspace, bl->address,
|
||||
- bl->length, aspace, bp_addr);
|
||||
+ return breakpoint_address_match_range (bl->pspace->aspace.get (),
|
||||
+ bl->address, bl->length, aspace,
|
||||
+ bp_addr);
|
||||
}
|
||||
|
||||
/* Implement the "resources_needed" method for ranged breakpoints. */
|
||||
@@ -11696,7 +11699,7 @@ code_breakpoint::breakpoint_hit (const struct bp_location *bl,
|
||||
|| ws.sig () != GDB_SIGNAL_TRAP)
|
||||
return 0;
|
||||
|
||||
- if (!breakpoint_address_match (bl->pspace->aspace, bl->address,
|
||||
+ if (!breakpoint_address_match (bl->pspace->aspace.get (), bl->address,
|
||||
aspace, bp_addr))
|
||||
return 0;
|
||||
|
||||
diff --git a/gdb/inferior.c b/gdb/inferior.c
|
||||
index b0ecca8b63a..87c61eeafd7 100644
|
||||
--- a/gdb/inferior.c
|
||||
+++ b/gdb/inferior.c
|
||||
@@ -775,15 +775,13 @@ remove_inferior_command (const char *args, int from_tty)
|
||||
struct inferior *
|
||||
add_inferior_with_spaces (void)
|
||||
{
|
||||
- struct address_space *aspace;
|
||||
struct program_space *pspace;
|
||||
struct inferior *inf;
|
||||
|
||||
/* If all inferiors share an address space on this system, this
|
||||
doesn't really return a new address space; otherwise, it
|
||||
really does. */
|
||||
- aspace = maybe_new_address_space ();
|
||||
- pspace = new program_space (aspace);
|
||||
+ pspace = new program_space (maybe_new_address_space ());
|
||||
inf = add_inferior (0);
|
||||
inf->pspace = pspace;
|
||||
inf->aspace = pspace->aspace;
|
||||
@@ -946,15 +944,13 @@ clone_inferior_command (const char *args, int from_tty)
|
||||
|
||||
for (i = 0; i < copies; ++i)
|
||||
{
|
||||
- struct address_space *aspace;
|
||||
struct program_space *pspace;
|
||||
struct inferior *inf;
|
||||
|
||||
/* If all inferiors share an address space on this system, this
|
||||
doesn't really return a new address space; otherwise, it
|
||||
really does. */
|
||||
- aspace = maybe_new_address_space ();
|
||||
- pspace = new program_space (aspace);
|
||||
+ pspace = new program_space (maybe_new_address_space ());
|
||||
inf = add_inferior (0);
|
||||
inf->pspace = pspace;
|
||||
inf->aspace = pspace->aspace;
|
||||
diff --git a/gdb/inferior.h b/gdb/inferior.h
|
||||
index 4d001b0ad50..fa5c3c92eeb 100644
|
||||
--- a/gdb/inferior.h
|
||||
+++ b/gdb/inferior.h
|
||||
@@ -541,7 +541,7 @@ class inferior : public refcounted_object,
|
||||
bool removable = false;
|
||||
|
||||
/* The address space bound to this inferior. */
|
||||
- struct address_space *aspace = NULL;
|
||||
+ address_space_ref_ptr aspace;
|
||||
|
||||
/* The program space bound to this inferior. */
|
||||
struct program_space *pspace = NULL;
|
||||
diff --git a/gdb/infrun.c b/gdb/infrun.c
|
||||
index c078098a6f8..4073150d80c 100644
|
||||
--- a/gdb/infrun.c
|
||||
+++ b/gdb/infrun.c
|
||||
@@ -501,8 +501,8 @@ holding the child stopped. Try \"set detach-on-fork\" or \
|
||||
}
|
||||
else
|
||||
{
|
||||
- child_inf->aspace = new address_space ();
|
||||
- child_inf->pspace = new program_space (child_inf->aspace);
|
||||
+ child_inf->pspace = new program_space (new_address_space ());
|
||||
+ child_inf->aspace = child_inf->pspace->aspace;
|
||||
child_inf->removable = true;
|
||||
clone_program_space (child_inf->pspace, parent_inf->pspace);
|
||||
}
|
||||
@@ -573,8 +573,8 @@ holding the child stopped. Try \"set detach-on-fork\" or \
|
||||
|
||||
child_inf->aspace = parent_inf->aspace;
|
||||
child_inf->pspace = parent_inf->pspace;
|
||||
- parent_inf->aspace = new address_space ();
|
||||
- parent_inf->pspace = new program_space (parent_inf->aspace);
|
||||
+ parent_inf->pspace = new program_space (new_address_space ());
|
||||
+ parent_inf->aspace = parent_inf->pspace->aspace;
|
||||
clone_program_space (parent_inf->pspace, child_inf->pspace);
|
||||
|
||||
/* The parent inferior is still the current one, so keep things
|
||||
@@ -583,8 +583,8 @@ holding the child stopped. Try \"set detach-on-fork\" or \
|
||||
}
|
||||
else
|
||||
{
|
||||
- child_inf->aspace = new address_space ();
|
||||
- child_inf->pspace = new program_space (child_inf->aspace);
|
||||
+ child_inf->pspace = new program_space (new_address_space ());
|
||||
+ child_inf->aspace = child_inf->pspace->aspace;
|
||||
child_inf->removable = true;
|
||||
child_inf->symfile_flags = SYMFILE_NO_READ;
|
||||
clone_program_space (child_inf->pspace, parent_inf->pspace);
|
||||
@@ -938,7 +938,6 @@ handle_vfork_child_exec_or_exit (int exec)
|
||||
if (vfork_parent->pending_detach)
|
||||
{
|
||||
struct program_space *pspace;
|
||||
- struct address_space *aspace;
|
||||
|
||||
/* follow-fork child, detach-on-fork on. */
|
||||
|
||||
@@ -963,9 +962,8 @@ handle_vfork_child_exec_or_exit (int exec)
|
||||
of" a hack. */
|
||||
|
||||
pspace = inf->pspace;
|
||||
- aspace = inf->aspace;
|
||||
- inf->aspace = nullptr;
|
||||
inf->pspace = nullptr;
|
||||
+ address_space_ref_ptr aspace = std::move (inf->aspace);
|
||||
|
||||
if (print_inferior_events)
|
||||
{
|
||||
@@ -1019,7 +1017,7 @@ handle_vfork_child_exec_or_exit (int exec)
|
||||
/* Temporarily switch to the vfork parent, to facilitate ptrace
|
||||
calls done during maybe_new_address_space. */
|
||||
switch_to_thread (any_live_thread_of_inferior (vfork_parent));
|
||||
- address_space *aspace = maybe_new_address_space ();
|
||||
+ address_space_ref_ptr aspace = maybe_new_address_space ();
|
||||
|
||||
/* Switch back to the vfork child inferior. Switch to no-thread
|
||||
while running clone_program_space, so that clone_program_space
|
||||
@@ -5639,7 +5637,7 @@ handle_inferior_event (struct execution_control_state *ecs)
|
||||
= get_thread_arch_aspace_regcache (parent_inf->process_target (),
|
||||
ecs->ws.child_ptid (),
|
||||
gdbarch,
|
||||
- parent_inf->aspace);
|
||||
+ parent_inf->aspace.get ());
|
||||
/* Read PC value of parent process. */
|
||||
parent_pc = regcache_read_pc (regcache);
|
||||
|
||||
diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
|
||||
index 2b206a4ec1e..474d3c7f945 100644
|
||||
--- a/gdb/linux-nat.c
|
||||
+++ b/gdb/linux-nat.c
|
||||
@@ -4316,7 +4316,7 @@ linux_nat_target::thread_address_space (ptid_t ptid)
|
||||
|
||||
inf = find_inferior_pid (this, pid);
|
||||
gdb_assert (inf != NULL);
|
||||
- return inf->aspace;
|
||||
+ return inf->aspace.get ();
|
||||
}
|
||||
|
||||
/* Return the cached value of the processor core for thread PTID. */
|
||||
diff --git a/gdb/process-stratum-target.c b/gdb/process-stratum-target.c
|
||||
index 4722c5a0f28..e67012a8591 100644
|
||||
--- a/gdb/process-stratum-target.c
|
||||
+++ b/gdb/process-stratum-target.c
|
||||
@@ -37,7 +37,7 @@ process_stratum_target::thread_address_space (ptid_t ptid)
|
||||
"address space of thread %s\n"),
|
||||
target_pid_to_str (ptid).c_str ());
|
||||
|
||||
- return inf->aspace;
|
||||
+ return inf->aspace.get ();
|
||||
}
|
||||
|
||||
struct gdbarch *
|
||||
diff --git a/gdb/progspace.c b/gdb/progspace.c
|
||||
index 32bdfebcf7c..55df3b65dfe 100644
|
||||
--- a/gdb/progspace.c
|
||||
+++ b/gdb/progspace.c
|
||||
@@ -54,8 +54,8 @@ address_space::address_space ()
|
||||
return a pointer to an existing address space, in case inferiors
|
||||
share an address space on this target system. */
|
||||
|
||||
-struct address_space *
|
||||
-maybe_new_address_space (void)
|
||||
+address_space_ref_ptr
|
||||
+maybe_new_address_space ()
|
||||
{
|
||||
int shared_aspace = gdbarch_has_shared_address_space (target_gdbarch ());
|
||||
|
||||
@@ -65,7 +65,7 @@ maybe_new_address_space (void)
|
||||
return program_spaces[0]->aspace;
|
||||
}
|
||||
|
||||
- return new address_space ();
|
||||
+ return new_address_space ();
|
||||
}
|
||||
|
||||
/* Start counting over from scratch. */
|
||||
@@ -93,9 +93,9 @@ remove_program_space (program_space *pspace)
|
||||
|
||||
/* See progspace.h. */
|
||||
|
||||
-program_space::program_space (address_space *aspace_)
|
||||
+program_space::program_space (address_space_ref_ptr aspace_)
|
||||
: num (++last_program_space_num),
|
||||
- aspace (aspace_)
|
||||
+ aspace (std::move (aspace_))
|
||||
{
|
||||
program_spaces.push_back (this);
|
||||
}
|
||||
@@ -118,8 +118,6 @@ program_space::~program_space ()
|
||||
/* Defer breakpoint re-set because we don't want to create new
|
||||
locations for this pspace which we're tearing down. */
|
||||
clear_symtab_users (SYMFILE_DEFER_BP_RESET);
|
||||
- if (!gdbarch_has_shared_address_space (target_gdbarch ()))
|
||||
- delete this->aspace;
|
||||
}
|
||||
|
||||
/* See progspace.h. */
|
||||
@@ -389,18 +387,14 @@ update_address_spaces (void)
|
||||
|
||||
if (shared_aspace)
|
||||
{
|
||||
- struct address_space *aspace = new address_space ();
|
||||
+ address_space_ref_ptr aspace = new_address_space ();
|
||||
|
||||
- delete current_program_space->aspace;
|
||||
for (struct program_space *pspace : program_spaces)
|
||||
pspace->aspace = aspace;
|
||||
}
|
||||
else
|
||||
for (struct program_space *pspace : program_spaces)
|
||||
- {
|
||||
- delete pspace->aspace;
|
||||
- pspace->aspace = new address_space ();
|
||||
- }
|
||||
+ pspace->aspace = new_address_space ();
|
||||
|
||||
for (inferior *inf : all_inferiors ())
|
||||
if (gdbarch_has_global_solist (target_gdbarch ()))
|
||||
@@ -437,5 +431,5 @@ initialize_progspace (void)
|
||||
modules have done that. Do this before
|
||||
initialize_current_architecture, because that accesses the ebfd
|
||||
of current_program_space. */
|
||||
- current_program_space = new program_space (new address_space ());
|
||||
+ current_program_space = new program_space (new_address_space ());
|
||||
}
|
||||
diff --git a/gdb/progspace.h b/gdb/progspace.h
|
||||
index 85215f0e2f1..07cca8c675c 100644
|
||||
--- a/gdb/progspace.h
|
||||
+++ b/gdb/progspace.h
|
||||
@@ -28,6 +28,8 @@
|
||||
#include "solist.h"
|
||||
#include "gdbsupport/next-iterator.h"
|
||||
#include "gdbsupport/safe-iterator.h"
|
||||
+#include "gdbsupport/refcounted-object.h"
|
||||
+#include "gdbsupport/gdb_ref_ptr.h"
|
||||
#include <list>
|
||||
#include <vector>
|
||||
|
||||
@@ -42,6 +44,40 @@ struct so_list;
|
||||
|
||||
typedef std::list<std::unique_ptr<objfile>> objfile_list;
|
||||
|
||||
+/* An address space. It is used for comparing if
|
||||
+ pspaces/inferior/threads see the same address space and for
|
||||
+ associating caches to each address space. */
|
||||
+struct address_space : public refcounted_object
|
||||
+{
|
||||
+ /* Create a new address space object, and add it to the list. */
|
||||
+ address_space ();
|
||||
+ DISABLE_COPY_AND_ASSIGN (address_space);
|
||||
+
|
||||
+ /* Returns the integer address space id of this address space. */
|
||||
+ int num () const
|
||||
+ {
|
||||
+ return m_num;
|
||||
+ }
|
||||
+
|
||||
+ /* Per aspace data-pointers required by other GDB modules. */
|
||||
+ registry<address_space> registry_fields;
|
||||
+
|
||||
+private:
|
||||
+ int m_num;
|
||||
+};
|
||||
+
|
||||
+using address_space_ref_ptr
|
||||
+ = gdb::ref_ptr<address_space,
|
||||
+ refcounted_object_delete_ref_policy<address_space>>;
|
||||
+
|
||||
+/* Create a new address space. */
|
||||
+
|
||||
+static inline address_space_ref_ptr
|
||||
+new_address_space ()
|
||||
+{
|
||||
+ return address_space_ref_ptr::new_reference (new address_space);
|
||||
+}
|
||||
+
|
||||
/* An iterator that wraps an iterator over std::unique_ptr<objfile>,
|
||||
and dereferences the returned object. This is useful for iterating
|
||||
over a list of shared pointers and returning raw pointers -- which
|
||||
@@ -191,7 +227,7 @@ struct program_space
|
||||
{
|
||||
/* Constructs a new empty program space, binds it to ASPACE, and
|
||||
adds it to the program space list. */
|
||||
- explicit program_space (address_space *aspace);
|
||||
+ explicit program_space (address_space_ref_ptr aspace);
|
||||
|
||||
/* Releases a program space, and all its contents (shared libraries,
|
||||
objfiles, and any other references to the program space in other
|
||||
@@ -332,7 +368,7 @@ struct program_space
|
||||
are global, then this field is ignored (we don't currently
|
||||
support inferiors sharing a program space if the target doesn't
|
||||
make breakpoints global). */
|
||||
- struct address_space *aspace = NULL;
|
||||
+ address_space_ref_ptr aspace;
|
||||
|
||||
/* True if this program space's section offsets don't yet represent
|
||||
the final offsets of the "live" address space (that is, the
|
||||
@@ -379,28 +415,6 @@ struct program_space
|
||||
target_section_table m_target_sections;
|
||||
};
|
||||
|
||||
-/* An address space. It is used for comparing if
|
||||
- pspaces/inferior/threads see the same address space and for
|
||||
- associating caches to each address space. */
|
||||
-struct address_space
|
||||
-{
|
||||
- /* Create a new address space object, and add it to the list. */
|
||||
- address_space ();
|
||||
- DISABLE_COPY_AND_ASSIGN (address_space);
|
||||
-
|
||||
- /* Returns the integer address space id of this address space. */
|
||||
- int num () const
|
||||
- {
|
||||
- return m_num;
|
||||
- }
|
||||
-
|
||||
- /* Per aspace data-pointers required by other GDB modules. */
|
||||
- registry<address_space> registry_fields;
|
||||
-
|
||||
-private:
|
||||
- int m_num;
|
||||
-};
|
||||
-
|
||||
/* The list of all program spaces. There's always at least one. */
|
||||
extern std::vector<struct program_space *>program_spaces;
|
||||
|
||||
@@ -443,7 +457,7 @@ class scoped_restore_current_program_space
|
||||
/* Maybe create a new address space object, and add it to the list, or
|
||||
return a pointer to an existing address space, in case inferiors
|
||||
share an address space. */
|
||||
-extern struct address_space *maybe_new_address_space (void);
|
||||
+extern address_space_ref_ptr maybe_new_address_space ();
|
||||
|
||||
/* Update all program spaces matching to address spaces. The user may
|
||||
have created several program spaces, and loaded executables into
|
||||
diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c
|
||||
index 0daba893813..276cdcc03b8 100644
|
||||
--- a/gdb/record-btrace.c
|
||||
+++ b/gdb/record-btrace.c
|
||||
@@ -2314,7 +2314,7 @@ record_btrace_replay_at_breakpoint (struct thread_info *tp)
|
||||
if (insn == NULL)
|
||||
return 0;
|
||||
|
||||
- return record_check_stopped_by_breakpoint (tp->inf->aspace, insn->pc,
|
||||
+ return record_check_stopped_by_breakpoint (tp->inf->aspace.get (), insn->pc,
|
||||
&btinfo->stop_reason);
|
||||
}
|
||||
|
||||
diff --git a/gdb/regcache.c b/gdb/regcache.c
|
||||
index 56b6d047874..8a0b57e67b8 100644
|
||||
--- a/gdb/regcache.c
|
||||
+++ b/gdb/regcache.c
|
||||
@@ -1617,7 +1617,7 @@ get_thread_arch_aspace_regcache_and_check (process_stratum_target *target,
|
||||
the current inferior's gdbarch. Also use the current inferior's address
|
||||
space. */
|
||||
gdbarch *arch = current_inferior ()->gdbarch;
|
||||
- address_space *aspace = current_inferior ()->aspace;
|
||||
+ address_space *aspace = current_inferior ()->aspace.get ();
|
||||
regcache *regcache
|
||||
= get_thread_arch_aspace_regcache (target, ptid, arch, aspace);
|
||||
|
||||
diff --git a/gdb/scoped-mock-context.h b/gdb/scoped-mock-context.h
|
||||
index 9ad7ebf5f0c..5f25dc7ed6b 100644
|
||||
--- a/gdb/scoped-mock-context.h
|
||||
+++ b/gdb/scoped-mock-context.h
|
||||
@@ -38,7 +38,7 @@ struct scoped_mock_context
|
||||
|
||||
Target mock_target;
|
||||
ptid_t mock_ptid {1, 1};
|
||||
- program_space mock_pspace {new address_space ()};
|
||||
+ program_space mock_pspace {new_address_space ()};
|
||||
inferior mock_inferior {mock_ptid.pid ()};
|
||||
thread_info mock_thread {&mock_inferior, mock_ptid};
|
||||
|
||||
diff --git a/gdb/target-dcache.c b/gdb/target-dcache.c
|
||||
index 13c2888e7ea..b1b772ab76e 100644
|
||||
--- a/gdb/target-dcache.c
|
||||
+++ b/gdb/target-dcache.c
|
||||
@@ -33,7 +33,7 @@ int
|
||||
target_dcache_init_p (void)
|
||||
{
|
||||
DCACHE *dcache
|
||||
- = target_dcache_aspace_key.get (current_program_space->aspace);
|
||||
+ = target_dcache_aspace_key.get (current_program_space->aspace.get ());
|
||||
|
||||
return (dcache != NULL);
|
||||
}
|
||||
@@ -44,7 +44,7 @@ void
|
||||
target_dcache_invalidate (void)
|
||||
{
|
||||
DCACHE *dcache
|
||||
- = target_dcache_aspace_key.get (current_program_space->aspace);
|
||||
+ = target_dcache_aspace_key.get (current_program_space->aspace.get ());
|
||||
|
||||
if (dcache != NULL)
|
||||
dcache_invalidate (dcache);
|
||||
@@ -56,7 +56,7 @@ target_dcache_invalidate (void)
|
||||
DCACHE *
|
||||
target_dcache_get (void)
|
||||
{
|
||||
- return target_dcache_aspace_key.get (current_program_space->aspace);
|
||||
+ return target_dcache_aspace_key.get (current_program_space->aspace.get ());
|
||||
}
|
||||
|
||||
/* Return the target dcache. If it is not initialized yet, initialize
|
||||
@@ -66,12 +66,13 @@ DCACHE *
|
||||
target_dcache_get_or_init (void)
|
||||
{
|
||||
DCACHE *dcache
|
||||
- = target_dcache_aspace_key.get (current_program_space->aspace);
|
||||
+ = target_dcache_aspace_key.get (current_program_space->aspace.get ());
|
||||
|
||||
if (dcache == NULL)
|
||||
{
|
||||
dcache = dcache_init ();
|
||||
- target_dcache_aspace_key.set (current_program_space->aspace, dcache);
|
||||
+ target_dcache_aspace_key.set (current_program_space->aspace.get (),
|
||||
+ dcache);
|
||||
}
|
||||
|
||||
return dcache;
|
||||
diff --git a/gdbsupport/refcounted-object.h b/gdbsupport/refcounted-object.h
|
||||
index d8fdb950043..294fd873df1 100644
|
||||
--- a/gdbsupport/refcounted-object.h
|
||||
+++ b/gdbsupport/refcounted-object.h
|
||||
@@ -67,4 +67,21 @@ struct refcounted_object_ref_policy
|
||||
}
|
||||
};
|
||||
|
||||
+/* A policy class to interface gdb::ref_ptr with a refcounted_object, that
|
||||
+ deletes the object once the refcount reaches 0.. */
|
||||
+
|
||||
+template<typename T>
|
||||
+struct refcounted_object_delete_ref_policy
|
||||
+{
|
||||
+ static void incref (T *obj)
|
||||
+ { obj->incref (); }
|
||||
+
|
||||
+ static void decref (T *obj)
|
||||
+ {
|
||||
+ obj->decref ();
|
||||
+ if (obj->refcount () == 0)
|
||||
+ delete obj;
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
#endif /* COMMON_REFCOUNTED_OBJECT_H */
|
||||
|
||||
base-commit: c55a452eaf9390d5659d3205f762aa2cb84511e1
|
||||
--
|
||||
2.35.3
|
||||
|
168
gdb-fix-segfault-in-for_each_block-part-2.patch
Normal file
168
gdb-fix-segfault-in-for_each_block-part-2.patch
Normal file
@ -0,0 +1,168 @@
|
||||
From 1cd845ab3d405412aabf9b959aa527dd60143826 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Thu, 2 Nov 2023 14:51:02 +0100
|
||||
Subject: [PATCH] [gdb] Fix segfault in for_each_block, part 2
|
||||
|
||||
The previous commit describes PR gdb/30547, a segfault when running test-case
|
||||
gdb.base/vfork-follow-parent.exp on powerpc64 (likewise on s390x).
|
||||
|
||||
The root cause for the segmentation fault is that linux_is_uclinux gives an
|
||||
incorrect result: it returns true instead of false.
|
||||
|
||||
So, why does linux_is_uclinux:
|
||||
...
|
||||
int
|
||||
linux_is_uclinux (void)
|
||||
{
|
||||
CORE_ADDR dummy;
|
||||
|
||||
return (target_auxv_search (AT_NULL, &dummy) > 0
|
||||
&& target_auxv_search (AT_PAGESZ, &dummy) == 0);
|
||||
...
|
||||
return true?
|
||||
|
||||
This is because ppc_linux_target_wordsize returns 4 instead of 8, causing
|
||||
ppc_linux_nat_target::auxv_parse to misinterpret the auxv vector.
|
||||
|
||||
So, why does ppc_linux_target_wordsize:
|
||||
...
|
||||
int
|
||||
ppc_linux_target_wordsize (int tid)
|
||||
{
|
||||
int wordsize = 4;
|
||||
|
||||
/* Check for 64-bit inferior process. This is the case when the host is
|
||||
64-bit, and in addition the top bit of the MSR register is set. */
|
||||
long msr;
|
||||
|
||||
errno = 0;
|
||||
msr = (long) ptrace (PTRACE_PEEKUSER, tid, PT_MSR * 8, 0);
|
||||
if (errno == 0 && ppc64_64bit_inferior_p (msr))
|
||||
wordsize = 8;
|
||||
|
||||
return wordsize;
|
||||
}
|
||||
...
|
||||
return 4?
|
||||
|
||||
Specifically, we get this result because because tid == 0, so we get
|
||||
errno == ESRCH.
|
||||
|
||||
The tid == 0 is caused by the switch_to_no_thread in
|
||||
handle_vfork_child_exec_or_exit:
|
||||
...
|
||||
/* Switch to no-thread while running clone_program_space, so
|
||||
that clone_program_space doesn't want to read the
|
||||
selected frame of a dead process. */
|
||||
scoped_restore_current_thread restore_thread;
|
||||
switch_to_no_thread ();
|
||||
|
||||
inf->pspace = new program_space (maybe_new_address_space ());
|
||||
...
|
||||
but moving the maybe_new_address_space call to before that gives us the
|
||||
same result. The tid is no longer 0, but we still get ESRCH because the
|
||||
thread has exited.
|
||||
|
||||
Fix this in handle_vfork_child_exec_or_exit by doing the
|
||||
maybe_new_address_space call in the context of the vfork parent.
|
||||
|
||||
Tested on top of trunk on x86_64-linux and ppc64le-linux.
|
||||
Tested on top of gdb-14-branch on ppc64-linux.
|
||||
|
||||
Co-Authored-By: Simon Marchi <simon.marchi@polymtl.ca>
|
||||
|
||||
PR gdb/30547
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30547
|
||||
---
|
||||
gdb/infrun.c | 16 +++++++++++-----
|
||||
gdb/nat/ppc-linux.c | 2 ++
|
||||
gdb/ppc-linux-nat.c | 2 ++
|
||||
gdb/s390-linux-nat.c | 5 ++++-
|
||||
4 files changed, 19 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/gdb/infrun.c b/gdb/infrun.c
|
||||
index 9c1b1f04e4d..c078098a6f8 100644
|
||||
--- a/gdb/infrun.c
|
||||
+++ b/gdb/infrun.c
|
||||
@@ -1014,13 +1014,19 @@ handle_vfork_child_exec_or_exit (int exec)
|
||||
go ahead and create a new one for this exiting
|
||||
inferior. */
|
||||
|
||||
- /* Switch to no-thread while running clone_program_space, so
|
||||
- that clone_program_space doesn't want to read the
|
||||
- selected frame of a dead process. */
|
||||
scoped_restore_current_thread restore_thread;
|
||||
- switch_to_no_thread ();
|
||||
|
||||
- inf->pspace = new program_space (maybe_new_address_space ());
|
||||
+ /* Temporarily switch to the vfork parent, to facilitate ptrace
|
||||
+ calls done during maybe_new_address_space. */
|
||||
+ switch_to_thread (any_live_thread_of_inferior (vfork_parent));
|
||||
+ address_space *aspace = maybe_new_address_space ();
|
||||
+
|
||||
+ /* Switch back to the vfork child inferior. Switch to no-thread
|
||||
+ while running clone_program_space, so that clone_program_space
|
||||
+ doesn't want to read the selected frame of a dead process. */
|
||||
+ switch_to_inferior_no_thread (inf);
|
||||
+
|
||||
+ inf->pspace = new program_space (aspace);
|
||||
inf->aspace = inf->pspace->aspace;
|
||||
set_current_program_space (inf->pspace);
|
||||
inf->removable = true;
|
||||
diff --git a/gdb/nat/ppc-linux.c b/gdb/nat/ppc-linux.c
|
||||
index 0957d1b58a7..74549754806 100644
|
||||
--- a/gdb/nat/ppc-linux.c
|
||||
+++ b/gdb/nat/ppc-linux.c
|
||||
@@ -78,6 +78,8 @@ ppc64_64bit_inferior_p (long msr)
|
||||
int
|
||||
ppc_linux_target_wordsize (int tid)
|
||||
{
|
||||
+ gdb_assert (tid != 0);
|
||||
+
|
||||
int wordsize = 4;
|
||||
|
||||
/* Check for 64-bit inferior process. This is the case when the host is
|
||||
diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c
|
||||
index d8a8fbdf706..500fb566bc1 100644
|
||||
--- a/gdb/ppc-linux-nat.c
|
||||
+++ b/gdb/ppc-linux-nat.c
|
||||
@@ -1918,6 +1918,8 @@ ppc_linux_nat_target::auxv_parse (const gdb_byte **readptr,
|
||||
const gdb_byte *endptr, CORE_ADDR *typep,
|
||||
CORE_ADDR *valp)
|
||||
{
|
||||
+ gdb_assert (inferior_ptid != null_ptid);
|
||||
+
|
||||
int tid = inferior_ptid.lwp ();
|
||||
if (tid == 0)
|
||||
tid = inferior_ptid.pid ();
|
||||
diff --git a/gdb/s390-linux-nat.c b/gdb/s390-linux-nat.c
|
||||
index fc3917d30be..403f37d690d 100644
|
||||
--- a/gdb/s390-linux-nat.c
|
||||
+++ b/gdb/s390-linux-nat.c
|
||||
@@ -949,10 +949,12 @@ s390_target_wordsize (void)
|
||||
/* Check for 64-bit inferior process. This is the case when the host is
|
||||
64-bit, and in addition bit 32 of the PSW mask is set. */
|
||||
#ifdef __s390x__
|
||||
+ int tid = s390_inferior_tid ();
|
||||
+ gdb_assert (tid != 0);
|
||||
long pswm;
|
||||
|
||||
errno = 0;
|
||||
- pswm = (long) ptrace (PTRACE_PEEKUSER, s390_inferior_tid (), PT_PSWMASK, 0);
|
||||
+ pswm = (long) ptrace (PTRACE_PEEKUSER, tid, PT_PSWMASK, 0);
|
||||
if (errno == 0 && (pswm & 0x100000000ul) != 0)
|
||||
wordsize = 8;
|
||||
#endif
|
||||
@@ -965,6 +967,7 @@ s390_linux_nat_target::auxv_parse (const gdb_byte **readptr,
|
||||
const gdb_byte *endptr, CORE_ADDR *typep,
|
||||
CORE_ADDR *valp)
|
||||
{
|
||||
+ gdb_assert (inferior_ptid != null_ptid);
|
||||
int sizeof_auxv_field = s390_target_wordsize ();
|
||||
enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
|
||||
const gdb_byte *ptr = *readptr;
|
||||
|
||||
base-commit: 59053f06bd94be51efacfa80f9a1f738e3e1ee9c
|
||||
--
|
||||
2.35.3
|
||||
|
138
gdb-go-handle-v3-go_0-mangled-prefix.patch
Normal file
138
gdb-go-handle-v3-go_0-mangled-prefix.patch
Normal file
@ -0,0 +1,138 @@
|
||||
From 6c9e159dbd1a35aafa134fcd52982174236a8dd9 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Thu, 5 Oct 2023 23:22:11 +0200
|
||||
Subject: [PATCH 3/3] [gdb/go] Handle v3 go_0 mangled prefix
|
||||
|
||||
With gcc-10 we have:
|
||||
...
|
||||
(gdb) break package2.Foo^M
|
||||
Breakpoint 2 at 0x402563: file package2.go, line 5.^M
|
||||
(gdb) PASS: gdb.go/package.exp: setting breakpoint 1
|
||||
...
|
||||
but with gcc-11:
|
||||
...
|
||||
gdb) break package2.Foo^M
|
||||
Function "package2.Foo" not defined.^M
|
||||
Make breakpoint pending on future shared library load? (y or [n]) n^M
|
||||
(gdb) FAIL: gdb.go/package.exp: gdb_breakpoint: set breakpoint at package2.Foo
|
||||
...
|
||||
|
||||
In the gcc-10 case, though the exec contains dwarf, it's not used to set the
|
||||
breakpoint (which is an independent problem, filed as PR go/30941), instead
|
||||
the minimal symbol information is used.
|
||||
|
||||
The minimal symbol information changed between gcc-10 and gcc-11:
|
||||
...
|
||||
$ nm a.out.10 | grep Foo
|
||||
000000000040370d T go.package2.Foo
|
||||
0000000000404e50 R go.package2.Foo..f
|
||||
$ nm a.out.11 | grep Foo
|
||||
0000000000403857 T go_0package2.Foo
|
||||
0000000000405030 R go_0package2.Foo..f
|
||||
...
|
||||
|
||||
A new v3 mangling scheme was used. The mangling schemes define a separator
|
||||
character and mangling character:
|
||||
- for v2, dot is used both as separator character and mangling character, and
|
||||
- for v3, dot is used as separator character and underscore as mangling
|
||||
character.
|
||||
|
||||
For more details, see [1] and [2].
|
||||
|
||||
In v3, "_0" demangles to ".". [ See gcc commit a01dda3c23b ("compiler, libgo:
|
||||
change mangling scheme"), function Special_char_code::Special_char_code. ]
|
||||
|
||||
Handle the new go_0 prefix in unpack_mangled_go_symbol, which fixes the
|
||||
test-case.
|
||||
|
||||
Note that this doesn't fix this regression:
|
||||
...
|
||||
$ gccgo-10 package2.go -c -g0
|
||||
$ gccgo-10 package1.go package2.o -g0
|
||||
$ gdb -q -batch a.out -ex "break go.package2.Foo"
|
||||
Breakpoint 1 at 0x40370d
|
||||
$ gccgo-11 package2.go -c -g0
|
||||
$ gccgo-11 package1.go package2.o -g0
|
||||
$ gdb -q -batch a.out -ex "break go.package2.Foo"
|
||||
Function "go.package2.Foo" not defined.
|
||||
...
|
||||
|
||||
With gcc-10, we set a breakpoint on the mangled minimal symbol. That
|
||||
one has simply changed for gcc-11, so it's equivalent to using:
|
||||
...
|
||||
$ gdb -q -batch a.out -ex "break go_0package2.Foo"
|
||||
Breakpoint 1 at 0x403857
|
||||
...
|
||||
which does work.
|
||||
|
||||
Tested on x86_64-linux:
|
||||
- openSUSE Leap 15.4, using gccgo-7,
|
||||
- openSUSE Tumbleweed, using gccgo-13.
|
||||
|
||||
PR go/27238
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=27238
|
||||
|
||||
[1] https://go-review.googlesource.com/c/gofrontend/+/271726
|
||||
[2] https://github.com/golang/go/issues/41862#issuecomment-707244103
|
||||
---
|
||||
gdb/go-lang.c | 30 +++++++++++++++++++++++++++---
|
||||
1 file changed, 27 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/gdb/go-lang.c b/gdb/go-lang.c
|
||||
index f9176ace71d..8a5568f56e0 100644
|
||||
--- a/gdb/go-lang.c
|
||||
+++ b/gdb/go-lang.c
|
||||
@@ -233,16 +233,28 @@ unpack_mangled_go_symbol (const char *mangled_name,
|
||||
libgo_.*: used by gccgo's runtime
|
||||
|
||||
Thus we don't support -fgo-prefix (except as used by the runtime). */
|
||||
- if (!startswith (mangled_name, "go.")
|
||||
- && !startswith (mangled_name, "libgo_"))
|
||||
+ bool v3;
|
||||
+ if (startswith (mangled_name, "go_0"))
|
||||
+ /* V3 mangling detected, see
|
||||
+ https://go-review.googlesource.com/c/gofrontend/+/271726 . */
|
||||
+ v3 = true;
|
||||
+ else if (startswith (mangled_name, "go.")
|
||||
+ || startswith (mangled_name, "libgo_"))
|
||||
+ v3 = false;
|
||||
+ else
|
||||
return NULL;
|
||||
|
||||
/* Quick check for whether a search may be fruitful. */
|
||||
/* Ignore anything with @plt, etc. in it. */
|
||||
if (strchr (mangled_name, '@') != NULL)
|
||||
return NULL;
|
||||
+
|
||||
/* It must have at least two dots. */
|
||||
- first_dot = strchr (mangled_name, '.');
|
||||
+ if (v3)
|
||||
+ first_dot = strchr (mangled_name, '0');
|
||||
+ else
|
||||
+ first_dot = strchr (mangled_name, '.');
|
||||
+
|
||||
if (first_dot == NULL)
|
||||
return NULL;
|
||||
/* Treat "foo.bar" as unmangled. It can collide with lots of other
|
||||
@@ -263,6 +275,18 @@ unpack_mangled_go_symbol (const char *mangled_name,
|
||||
gdb::unique_xmalloc_ptr<char> result = make_unique_xstrdup (mangled_name);
|
||||
buf = result.get ();
|
||||
|
||||
+ if (v3)
|
||||
+ {
|
||||
+ /* Replace "go_0" with "\0go.". */
|
||||
+ buf[0] = '\0';
|
||||
+ buf[1] = 'g';
|
||||
+ buf[2] = 'o';
|
||||
+ buf[3] = '.';
|
||||
+
|
||||
+ /* Skip the '\0'. */
|
||||
+ buf++;
|
||||
+ }
|
||||
+
|
||||
/* Search backwards looking for "N<digit(s)>". */
|
||||
p = buf + len;
|
||||
saw_digit = method_type = NULL;
|
||||
--
|
||||
2.35.3
|
||||
|
105
gdb-rhbz1773651-gdb-index-internal-error.patch
Normal file
105
gdb-rhbz1773651-gdb-index-internal-error.patch
Normal file
@ -0,0 +1,105 @@
|
||||
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Buettner <kevinb@redhat.com>
|
||||
Date: Mon, 2 Oct 2023 15:05:23 -0700
|
||||
Subject: gdb-rhbz1773651-gdb-index-internal-error.patch
|
||||
|
||||
;; Backport upstream patch which prevents internal error when
|
||||
;; generating a gdb-index file (RH BZ 1773651).
|
||||
|
||||
Throw error when creating an overly large gdb-index file
|
||||
|
||||
The header in a .gdb_index section uses 32-bit unsigned offsets to
|
||||
refer to other areas of the section. Thus, there is a size limit of
|
||||
2^32-1 which is currently unaccounted for by GDB's code for outputting
|
||||
these sections.
|
||||
|
||||
At the moment, when GDB creates an overly large section, it will exit
|
||||
abnormally due to an internal error, which is caused by a failed
|
||||
assert in assert_file_size, which in turn is called from
|
||||
write_gdbindex_1, both of which are in gdb/dwarf2/index-write.c.
|
||||
|
||||
This is what happens when that assert fails:
|
||||
|
||||
$ gdb -q -nx -iex 'set auto-load no' -iex 'set debuginfod enabled off' -ex file ./libgraph_tool_inference.so -ex "save gdb-index `pwd`/"
|
||||
Reading symbols from ./libgraph_tool_inference.so...
|
||||
No executable file now.
|
||||
Discard symbol table from `libgraph_tool_inference.so'? (y or n) n
|
||||
Not confirmed.
|
||||
../../gdb/dwarf2/index-write.c:1069: internal-error: assert_file_size: Assertion `file_size == expected_size' failed.
|
||||
A problem internal to GDB has been detected,
|
||||
further debugging may prove unreliable.
|
||||
----- Backtrace -----
|
||||
0x55fddb4d78b0 gdb_internal_backtrace_1
|
||||
../../gdb/bt-utils.c:122
|
||||
0x55fddb4d78b0 _Z22gdb_internal_backtracev
|
||||
../../gdb/bt-utils.c:168
|
||||
0x55fddb98b5d4 internal_vproblem
|
||||
../../gdb/utils.c:396
|
||||
0x55fddb98b8de _Z15internal_verrorPKciS0_P13__va_list_tag
|
||||
../../gdb/utils.c:476
|
||||
0x55fddbb71654 _Z18internal_error_locPKciS0_z
|
||||
../../gdbsupport/errors.cc:58
|
||||
0x55fddb5a0f23 assert_file_size
|
||||
../../gdb/dwarf2/index-write.c:1069
|
||||
0x55fddb5a1ee0 assert_file_size
|
||||
/usr/include/c++/13/bits/stl_iterator.h:1158
|
||||
0x55fddb5a1ee0 write_gdbindex_1
|
||||
../../gdb/dwarf2/index-write.c:1119
|
||||
0x55fddb5a51be write_gdbindex
|
||||
../../gdb/dwarf2/index-write.c:1273
|
||||
[...]
|
||||
---------------------
|
||||
../../gdb/dwarf2/index-write.c:1069: internal-error: assert_file_size: Assertion `file_size == expected_size' failed.
|
||||
|
||||
This problem was encountered while building the python-graph-tool
|
||||
package on Fedora. The Fedora bugzilla bug can be found here:
|
||||
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=1773651
|
||||
|
||||
This commit prevents the internal error from occurring by calling error()
|
||||
when the file size exceeds 2^32-1.
|
||||
|
||||
Using a gdb built with this commit, I now see this behavior instead:
|
||||
|
||||
$ gdb -q -nx -iex 'set auto-load no' -iex 'set debuginfod enabled off' -ex file ./libgraph_tool_inference.so -ex "save gdb-index `pwd`/"
|
||||
Reading symbols from ./libgraph_tool_inference.so...
|
||||
No executable file now.
|
||||
Discard symbol table from `/mesquite2/fedora-bugs/1773651/libgraph_tool_inference.so'? (y or n) n
|
||||
Not confirmed.
|
||||
Error while writing index for `/mesquite2/fedora-bugs/1773651/libgraph_tool_inference.so': gdb-index maximum file size of 4294967295 exceeded
|
||||
(gdb)
|
||||
|
||||
I wish I could provide a test case, but due to the sizes of both the
|
||||
input and output files, I think that testing resources would be
|
||||
strained or exceeded in many environments.
|
||||
|
||||
My testing on Fedora 38 shows no regressions.
|
||||
|
||||
Approved-by: Tom Tromey <tom@tromey.com>
|
||||
|
||||
diff --git a/gdb/dwarf2/index-write.c b/gdb/dwarf2/index-write.c
|
||||
--- a/gdb/dwarf2/index-write.c
|
||||
+++ b/gdb/dwarf2/index-write.c
|
||||
@@ -1082,7 +1082,7 @@ write_gdbindex_1 (FILE *out_file,
|
||||
{
|
||||
data_buf contents;
|
||||
const offset_type size_of_header = 6 * sizeof (offset_type);
|
||||
- offset_type total_len = size_of_header;
|
||||
+ size_t total_len = size_of_header;
|
||||
|
||||
/* The version number. */
|
||||
contents.append_offset (8);
|
||||
@@ -1109,6 +1109,13 @@ write_gdbindex_1 (FILE *out_file,
|
||||
|
||||
gdb_assert (contents.size () == size_of_header);
|
||||
|
||||
+ /* The maximum size of an index file is limited by the maximum value
|
||||
+ capable of being represented by 'offset_type'. Throw an error if
|
||||
+ that length has been exceeded. */
|
||||
+ size_t max_size = ~(offset_type) 0;
|
||||
+ if (total_len > max_size)
|
||||
+ error (_("gdb-index maximum file size of %zu exceeded"), max_size);
|
||||
+
|
||||
contents.file_write (out_file);
|
||||
cu_list.file_write (out_file);
|
||||
types_cu_list.file_write (out_file);
|
108
gdb-rhbz2160211-excessive-core-file-warnings.patch
Normal file
108
gdb-rhbz2160211-excessive-core-file-warnings.patch
Normal file
@ -0,0 +1,108 @@
|
||||
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Buettner <kevinb@redhat.com>
|
||||
Date: Thu, 29 Jun 2023 18:20:30 -0700
|
||||
Subject: gdb-rhbz2160211-excessive-core-file-warnings.patch
|
||||
|
||||
;; Backport two commits, 0ad504dd464 and ea70f941f9b, from Lancelot SIX
|
||||
;; which prevent repeated warnings from being printed while loading a
|
||||
;; core file. (RH BZ 2160211)
|
||||
|
||||
gdb/corelow.c: avoid repeated warnings in build_file_mappings
|
||||
|
||||
When GDB opens a coredump it tries to locate and then open all files
|
||||
which were mapped in the process.
|
||||
|
||||
If a file is found but cannot be opened with BFD (bfd_open /
|
||||
bfd_check_format fails), then a warning is printed to the user. If the
|
||||
same file was mapped multiple times in the process's address space, the
|
||||
warning is printed once for each time the file was mapped. I find this
|
||||
un-necessarily noisy.
|
||||
|
||||
This patch makes it so the warning message is printed only once per
|
||||
file.
|
||||
|
||||
There was a comment in the code assuming that if the file was found on
|
||||
the system, opening it (bfd_open + bfd_check_format) should always
|
||||
succeed. A recent change in BFD (014a602b86f "Don't optimise bfd_seek
|
||||
to same position") showed that this assumption is not valid. For
|
||||
example, it is possible to have a core dump of a process which had
|
||||
mmaped an IO page from a DRI render node (/dev/dri/runderD$NUM). In
|
||||
such case the core dump does contain the information that portions of
|
||||
this special file were mapped in the host process, but trying to seek to
|
||||
position 0 will fail, making bfd_check_format fail. This patch removes
|
||||
this comment.
|
||||
|
||||
Reviewed-By: John Baldwin <jhb@FreeBSD.org>
|
||||
Approved-By: Andrew Burgess <aburgess@redhat.com>
|
||||
|
||||
gdb/corelow.c: do not try to reopen a file if open failed once
|
||||
|
||||
In the current implementation, core_target::build_file_mappings will try
|
||||
to locate and open files which were mapped in the process for which the
|
||||
core dump was produced. If the file cannot be found or cannot be
|
||||
opened, GDB will re-try to open it once for each time it was mapped in
|
||||
the process's address space.
|
||||
|
||||
This patch makes it so GDB recognizes that it has already failed to open
|
||||
a given file once and does not re-try the process for each mapping.
|
||||
|
||||
Reviewed-By: John Baldwin <jhb@FreeBSD.org>
|
||||
Approved-By: Andrew Burgess <aburgess@redhat.com>
|
||||
|
||||
diff --git a/gdb/corelow.c b/gdb/corelow.c
|
||||
--- a/gdb/corelow.c
|
||||
+++ b/gdb/corelow.c
|
||||
@@ -237,6 +237,16 @@ core_target::build_file_mappings ()
|
||||
weed out non-file-backed mappings. */
|
||||
gdb_assert (filename != nullptr);
|
||||
|
||||
+ if (unavailable_paths.find (filename) != unavailable_paths.end ())
|
||||
+ {
|
||||
+ /* We have already seen some mapping for FILENAME but failed to
|
||||
+ find/open the file. There is no point in trying the same
|
||||
+ thing again so just record that the range [start, end) is
|
||||
+ unavailable. */
|
||||
+ m_core_unavailable_mappings.emplace_back (start, end - start);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
struct bfd *bfd = bfd_map[filename];
|
||||
if (bfd == nullptr)
|
||||
{
|
||||
@@ -254,11 +264,10 @@ core_target::build_file_mappings ()
|
||||
if (expanded_fname == nullptr)
|
||||
{
|
||||
m_core_unavailable_mappings.emplace_back (start, end - start);
|
||||
- /* Print just one warning per path. */
|
||||
- if (unavailable_paths.insert (filename).second)
|
||||
- warning (_("Can't open file %s during file-backed mapping "
|
||||
- "note processing"),
|
||||
- filename);
|
||||
+ unavailable_paths.insert (filename);
|
||||
+ warning (_("Can't open file %s during file-backed mapping "
|
||||
+ "note processing"),
|
||||
+ filename);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -268,18 +277,11 @@ core_target::build_file_mappings ()
|
||||
if (bfd == nullptr || !bfd_check_format (bfd, bfd_object))
|
||||
{
|
||||
m_core_unavailable_mappings.emplace_back (start, end - start);
|
||||
- /* If we get here, there's a good chance that it's due to
|
||||
- an internal error. We issue a warning instead of an
|
||||
- internal error because of the possibility that the
|
||||
- file was removed in between checking for its
|
||||
- existence during the expansion in exec_file_find()
|
||||
- and the calls to bfd_openr() / bfd_check_format().
|
||||
- Output both the path from the core file note along
|
||||
- with its expansion to make debugging this problem
|
||||
- easier. */
|
||||
+ unavailable_paths.insert (filename);
|
||||
warning (_("Can't open file %s which was expanded to %s "
|
||||
"during file-backed mapping note processing"),
|
||||
filename, expanded_fname.get ());
|
||||
+
|
||||
if (bfd != nullptr)
|
||||
bfd_close (bfd);
|
||||
return;
|
@ -1,12 +1,16 @@
|
||||
From 406fd9f71067fce649343dfd609ca8e5e97b2164 Mon Sep 17 00:00:00 2001
|
||||
From: Mark Wielaard <mark@klomp.org>
|
||||
Date: Tue, 2 May 2023 20:23:32 +0200
|
||||
Subject: [PATCH] Pass const frame_info_ptr reference for
|
||||
skip_[language_]trampoline
|
||||
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
|
||||
From: Kevin Buettner <kevinb@redhat.com>
|
||||
Date: Wed, 3 May 2023 11:28:24 -0700
|
||||
Subject: gdb-rhbz2192105-ftbs-dangling-pointer
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
;; Backport upstream patch fixing a "dangling pointer" build problem
|
||||
;; first seen when building with GCC 13.1.1 20230426 (Red Hat ;; 13.1.1-1).
|
||||
|
||||
Pass const frame_info_ptr reference for skip_[language_]trampoline
|
||||
|
||||
g++ 13.1.1 produces a -Werror=dangling-pointer=
|
||||
|
||||
In file included from ../../binutils-gdb/gdb/frame.h:75,
|
||||
@ -43,15 +47,8 @@ Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30413
|
||||
Tested-by: Kevin Buettner <kevinb@redhat.com>
|
||||
Reviewed-by: Kevin Buettner <kevinb@redhat.com>
|
||||
Reviewed-by: Tom Tromey <tom@tromey.com>
|
||||
---
|
||||
gdb/c-lang.c | 2 +-
|
||||
gdb/language.c | 2 +-
|
||||
gdb/language.h | 4 ++--
|
||||
gdb/objc-lang.c | 2 +-
|
||||
4 files changed, 5 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/gdb/c-lang.c b/gdb/c-lang.c
|
||||
index 52010fa8cb1..a46343c837a 100644
|
||||
--- a/gdb/c-lang.c
|
||||
+++ b/gdb/c-lang.c
|
||||
@@ -1003,7 +1003,7 @@ class cplus_language : public language_defn
|
||||
@ -64,7 +61,6 @@ index 52010fa8cb1..a46343c837a 100644
|
||||
{
|
||||
return cplus_skip_trampoline (fi, pc);
|
||||
diff --git a/gdb/language.c b/gdb/language.c
|
||||
index 5037867b256..655d0794394 100644
|
||||
--- a/gdb/language.c
|
||||
+++ b/gdb/language.c
|
||||
@@ -528,7 +528,7 @@ add_set_language_command ()
|
||||
@ -77,7 +73,6 @@ index 5037867b256..655d0794394 100644
|
||||
for (const auto &lang : language_defn::languages)
|
||||
{
|
||||
diff --git a/gdb/language.h b/gdb/language.h
|
||||
index cf94923ecc1..88c3bc90efe 100644
|
||||
--- a/gdb/language.h
|
||||
+++ b/gdb/language.h
|
||||
@@ -471,7 +471,7 @@ struct language_defn
|
||||
@ -99,7 +94,6 @@ index cf94923ecc1..88c3bc90efe 100644
|
||||
/* Return demangled language symbol, or NULL. */
|
||||
extern gdb::unique_xmalloc_ptr<char> language_demangle
|
||||
diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c
|
||||
index e17a4c406c0..5bcf1e4f3f0 100644
|
||||
--- a/gdb/objc-lang.c
|
||||
+++ b/gdb/objc-lang.c
|
||||
@@ -282,7 +282,7 @@ class objc_language : public language_defn
|
||||
@ -111,8 +105,3 @@ index e17a4c406c0..5bcf1e4f3f0 100644
|
||||
CORE_ADDR stop_pc) const override
|
||||
{
|
||||
struct gdbarch *gdbarch = get_frame_arch (frame);
|
||||
|
||||
base-commit: 4b9342bc7f1d79b1453afd6c15e1a5cdefa92d9e
|
||||
--
|
||||
2.35.3
|
||||
|
188
gdb-rhbz2196395-debuginfod-legacy-openssl-crash.patch
Normal file
188
gdb-rhbz2196395-debuginfod-legacy-openssl-crash.patch
Normal file
@ -0,0 +1,188 @@
|
||||
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
|
||||
From: Andrew Burgess <aburgess@redhat.com>
|
||||
Date: Tue, 20 Jun 2023 09:46:35 +0100
|
||||
Subject: gdb-rhbz2196395-debuginfod-legacy-openssl-crash.patch
|
||||
|
||||
;; Backport upstream commit f3eee5861743d635 to fix a crash triggered
|
||||
;; when debuginfod makes use of particular openssl settings.
|
||||
|
||||
gdb/debuginfod: cleanup debuginfod earlier
|
||||
|
||||
A GDB crash was discovered on Fedora GDB that was tracked back to an
|
||||
issue with the way that debuginfod is cleaned up.
|
||||
|
||||
The bug was reported on Fedora 37, 38, and 39. Here are the steps to
|
||||
reproduce:
|
||||
|
||||
1. The file /etc/ssl/openssl.cnf contains the following lines:
|
||||
|
||||
[provider_sect]
|
||||
default = default_sect
|
||||
##legacy = legacy_sect
|
||||
##
|
||||
[default_sect]
|
||||
activate = 1
|
||||
|
||||
##[legacy_sect]
|
||||
##activate = 1
|
||||
|
||||
The bug will occur when the '##' characters are removed so that the
|
||||
lines in question look like this:
|
||||
|
||||
[provider_sect]
|
||||
default = default_sect
|
||||
legacy = legacy_sect
|
||||
|
||||
[default_sect]
|
||||
activate = 1
|
||||
|
||||
[legacy_sect]
|
||||
activate = 1
|
||||
|
||||
2. Clean up any existing debuginfod cache data:
|
||||
|
||||
> rm -rf $HOME/.cache/debuginfod_client
|
||||
|
||||
3. Run GDB:
|
||||
|
||||
> gdb -nx -q -iex 'set trace-commands on' \
|
||||
-iex 'set debuginfod enabled on' \
|
||||
-iex 'set confirm off' \
|
||||
-ex 'start' -ex 'quit' /bin/ls
|
||||
+set debuginfod enabled on
|
||||
+set confirm off
|
||||
Reading symbols from /bin/ls...
|
||||
Downloading separate debug info for /usr/bin/ls
|
||||
... snip ...
|
||||
Temporary breakpoint 1, main (argc=1, argv=0x7fffffffde38) at ../src/ls.c:1646
|
||||
1646 {
|
||||
+quit
|
||||
|
||||
Fatal signal: Segmentation fault
|
||||
----- Backtrace -----
|
||||
... snip ...
|
||||
|
||||
So GDB ends up crashing during exit.
|
||||
|
||||
What's happening is that when debuginfod is initialised
|
||||
debuginfod_begin is called (this is in the debuginfod library), this
|
||||
in turn sets up libcurl, which makes use of openssl. Somewhere during
|
||||
this setup process an at_exit function is registered to cleanup some
|
||||
state.
|
||||
|
||||
Back in GDB the debuginfod_client object is managed using this code:
|
||||
|
||||
/* Deleter for a debuginfod_client. */
|
||||
|
||||
struct debuginfod_client_deleter
|
||||
{
|
||||
void operator() (debuginfod_client *c)
|
||||
{
|
||||
debuginfod_end (c);
|
||||
}
|
||||
};
|
||||
|
||||
using debuginfod_client_up
|
||||
= std::unique_ptr<debuginfod_client, debuginfod_client_deleter>;
|
||||
|
||||
And then a global debuginfod_client_up is created to hold a pointer to
|
||||
the debuginfod_client object. As a global this will be cleaned up
|
||||
using the standard C++ global object destructor mechanism, which is
|
||||
run after the at_exit handlers.
|
||||
|
||||
However, it is expected that when debuginfod_end is called the
|
||||
debuginfod_client object will still be in a usable state, that is, we
|
||||
don't expect the at_exit handlers to have run and started cleaning up
|
||||
the library state.
|
||||
|
||||
To fix this issue we need to ensure that debuginfod_end is called
|
||||
before the at_exit handlers have a chance to run.
|
||||
|
||||
This commit removes the debuginfod_client_up type, and instead has GDB
|
||||
hold a raw pointer to the debuginfod_client object. We then make use
|
||||
of GDB's make_final_cleanup to register a function that will call
|
||||
debuginfod_end.
|
||||
|
||||
As GDB's final cleanups are called before exit is called, this means
|
||||
that debuginfod_end will be called before the at_exit handlers are
|
||||
called, and the crash identified above is resolved.
|
||||
|
||||
It's not obvious how this issue can easily be tested for. The bug does
|
||||
not appear to manifest when using a local debuginfod server, so we'd
|
||||
need to setup something more involved. For now I'm proposing this
|
||||
patch without any associated tests.
|
||||
|
||||
diff --git a/gdb/debuginfod-support.c b/gdb/debuginfod-support.c
|
||||
--- a/gdb/debuginfod-support.c
|
||||
+++ b/gdb/debuginfod-support.c
|
||||
@@ -96,20 +96,6 @@ struct user_data
|
||||
ui_out::progress_update progress;
|
||||
};
|
||||
|
||||
-/* Deleter for a debuginfod_client. */
|
||||
-
|
||||
-struct debuginfod_client_deleter
|
||||
-{
|
||||
- void operator() (debuginfod_client *c)
|
||||
- {
|
||||
- debuginfod_end (c);
|
||||
- }
|
||||
-};
|
||||
-
|
||||
-using debuginfod_client_up
|
||||
- = std::unique_ptr<debuginfod_client, debuginfod_client_deleter>;
|
||||
-
|
||||
-
|
||||
/* Convert SIZE into a unit suitable for use with progress updates.
|
||||
SIZE should in given in bytes and will be converted into KB, MB, GB
|
||||
or remain unchanged. UNIT will be set to "B", "KB", "MB" or "GB"
|
||||
@@ -180,20 +166,45 @@ progressfn (debuginfod_client *c, long cur, long total)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+/* Cleanup ARG, which is a debuginfod_client pointer. */
|
||||
+
|
||||
+static void
|
||||
+cleanup_debuginfod_client (void *arg)
|
||||
+{
|
||||
+ debuginfod_client *client = static_cast<debuginfod_client *> (arg);
|
||||
+ debuginfod_end (client);
|
||||
+}
|
||||
+
|
||||
+/* Return a pointer to the single global debuginfod_client, initialising it
|
||||
+ first if needed. */
|
||||
+
|
||||
static debuginfod_client *
|
||||
get_debuginfod_client ()
|
||||
{
|
||||
- static debuginfod_client_up global_client;
|
||||
+ static debuginfod_client *global_client = nullptr;
|
||||
|
||||
if (global_client == nullptr)
|
||||
{
|
||||
- global_client.reset (debuginfod_begin ());
|
||||
+ global_client = debuginfod_begin ();
|
||||
|
||||
if (global_client != nullptr)
|
||||
- debuginfod_set_progressfn (global_client.get (), progressfn);
|
||||
+ {
|
||||
+ /* It is important that we cleanup the debuginfod_client object
|
||||
+ before calling exit. Some of the libraries used by debuginfod
|
||||
+ make use of at_exit handlers to perform cleanup.
|
||||
+
|
||||
+ If we wrapped the debuginfod_client in a unique_ptr and relied
|
||||
+ on its destructor to cleanup then this would be run as part of
|
||||
+ the global C++ object destructors, which is after the at_exit
|
||||
+ handlers, which is too late.
|
||||
+
|
||||
+ So instead, we make use of GDB's final cleanup mechanism. */
|
||||
+ make_final_cleanup (cleanup_debuginfod_client, global_client);
|
||||
+ debuginfod_set_progressfn (global_client, progressfn);
|
||||
+ }
|
||||
}
|
||||
|
||||
- return global_client.get ();
|
||||
+ return global_client;
|
||||
}
|
||||
|
||||
/* Check if debuginfod is enabled. If configured to do so, ask the user
|
50
gdb-rhbz2233961-CVE-2022-4806.patch
Normal file
50
gdb-rhbz2233961-CVE-2022-4806.patch
Normal file
@ -0,0 +1,50 @@
|
||||
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Alexandra=20H=C3=A1jkov=C3=A1?= <ahajkova@redhat.com>
|
||||
Date: Thu, 21 Sep 2023 18:52:49 +0200
|
||||
Subject: gdb-rhbz2233961-CVE-2022-4806.patch
|
||||
|
||||
;; Backport PR29922, SHT_NOBITS section
|
||||
;; avoids section size sanity check.
|
||||
|
||||
PR29922, SHT_NOBITS section avoids section size sanity check
|
||||
|
||||
PR 29922
|
||||
* dwarf2.c (find_debug_info): Ignore sections without
|
||||
SEC_HAS_CONTENTS.
|
||||
|
||||
diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c
|
||||
--- a/bfd/dwarf2.c
|
||||
+++ b/bfd/dwarf2.c
|
||||
@@ -4831,16 +4831,19 @@ find_debug_info (bfd *abfd, const struct dwarf_debug_section *debug_sections,
|
||||
{
|
||||
look = debug_sections[debug_info].uncompressed_name;
|
||||
msec = bfd_get_section_by_name (abfd, look);
|
||||
- if (msec != NULL)
|
||||
+ /* Testing SEC_HAS_CONTENTS is an anti-fuzzer measure. Of
|
||||
+ course debug sections always have contents. */
|
||||
+ if (msec != NULL && (msec->flags & SEC_HAS_CONTENTS) != 0)
|
||||
return msec;
|
||||
|
||||
look = debug_sections[debug_info].compressed_name;
|
||||
msec = bfd_get_section_by_name (abfd, look);
|
||||
- if (msec != NULL)
|
||||
+ if (msec != NULL && (msec->flags & SEC_HAS_CONTENTS) != 0)
|
||||
return msec;
|
||||
|
||||
for (msec = abfd->sections; msec != NULL; msec = msec->next)
|
||||
- if (startswith (msec->name, GNU_LINKONCE_INFO))
|
||||
+ if ((msec->flags & SEC_HAS_CONTENTS) != 0
|
||||
+ && startswith (msec->name, GNU_LINKONCE_INFO))
|
||||
return msec;
|
||||
|
||||
return NULL;
|
||||
@@ -4848,6 +4851,9 @@ find_debug_info (bfd *abfd, const struct dwarf_debug_section *debug_sections,
|
||||
|
||||
for (msec = after_sec->next; msec != NULL; msec = msec->next)
|
||||
{
|
||||
+ if ((msec->flags & SEC_HAS_CONTENTS) == 0)
|
||||
+ continue;
|
||||
+
|
||||
look = debug_sections[debug_info].uncompressed_name;
|
||||
if (strcmp (msec->name, look) == 0)
|
||||
return msec;
|
115
gdb-rhbz2233965-memory-leak.patch
Normal file
115
gdb-rhbz2233965-memory-leak.patch
Normal file
@ -0,0 +1,115 @@
|
||||
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Alexandra=20H=C3=A1jkov=C3=A1?= <ahajkova@redhat.com>
|
||||
Date: Sat, 14 Oct 2023 12:37:50 +0200
|
||||
Subject: gdb-rhbz2233965-memory-leak.patch
|
||||
|
||||
;; Backport PR29925, Memory leak in find_abstract_instance
|
||||
|
||||
PR29925, Memory leak in find_abstract_instance
|
||||
|
||||
The testcase in the PR had a variable with both DW_AT_decl_file and
|
||||
DW_AT_specification, where the DW_AT_specification also specified
|
||||
DW_AT_decl_file. This leads to a memory leak as the file name is
|
||||
malloced and duplicates are not expected.
|
||||
|
||||
I've also changed find_abstract_instance to not use a temp for "name",
|
||||
because that can result in a change in behaviour from the usual last
|
||||
of duplicate attributes wins.
|
||||
|
||||
PR 29925
|
||||
* dwarf2.c (find_abstract_instance): Delete "name" variable.
|
||||
Free *filename_ptr before assigning new file name.
|
||||
(scan_unit_for_symbols): Similarly free func->file and
|
||||
var->file before assigning.
|
||||
|
||||
diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c
|
||||
--- a/bfd/dwarf2.c
|
||||
+++ b/bfd/dwarf2.c
|
||||
@@ -3441,7 +3441,6 @@ find_abstract_instance (struct comp_unit *unit,
|
||||
struct abbrev_info *abbrev;
|
||||
uint64_t die_ref = attr_ptr->u.val;
|
||||
struct attribute attr;
|
||||
- const char *name = NULL;
|
||||
|
||||
if (recur_count == 100)
|
||||
{
|
||||
@@ -3602,9 +3601,9 @@ find_abstract_instance (struct comp_unit *unit,
|
||||
case DW_AT_name:
|
||||
/* Prefer DW_AT_MIPS_linkage_name or DW_AT_linkage_name
|
||||
over DW_AT_name. */
|
||||
- if (name == NULL && is_str_form (&attr))
|
||||
+ if (*pname == NULL && is_str_form (&attr))
|
||||
{
|
||||
- name = attr.u.str;
|
||||
+ *pname = attr.u.str;
|
||||
if (mangle_style (unit->lang) == 0)
|
||||
*is_linkage = true;
|
||||
}
|
||||
@@ -3612,7 +3611,7 @@ find_abstract_instance (struct comp_unit *unit,
|
||||
case DW_AT_specification:
|
||||
if (is_int_form (&attr)
|
||||
&& !find_abstract_instance (unit, &attr, recur_count + 1,
|
||||
- &name, is_linkage,
|
||||
+ pname, is_linkage,
|
||||
filename_ptr, linenumber_ptr))
|
||||
return false;
|
||||
break;
|
||||
@@ -3622,7 +3621,7 @@ find_abstract_instance (struct comp_unit *unit,
|
||||
non-string forms into these attributes. */
|
||||
if (is_str_form (&attr))
|
||||
{
|
||||
- name = attr.u.str;
|
||||
+ *pname = attr.u.str;
|
||||
*is_linkage = true;
|
||||
}
|
||||
break;
|
||||
@@ -3630,8 +3629,11 @@ find_abstract_instance (struct comp_unit *unit,
|
||||
if (!comp_unit_maybe_decode_line_info (unit))
|
||||
return false;
|
||||
if (is_int_form (&attr))
|
||||
- *filename_ptr = concat_filename (unit->line_table,
|
||||
- attr.u.val);
|
||||
+ {
|
||||
+ free (*filename_ptr);
|
||||
+ *filename_ptr = concat_filename (unit->line_table,
|
||||
+ attr.u.val);
|
||||
+ }
|
||||
break;
|
||||
case DW_AT_decl_line:
|
||||
if (is_int_form (&attr))
|
||||
@@ -3643,7 +3645,6 @@ find_abstract_instance (struct comp_unit *unit,
|
||||
}
|
||||
}
|
||||
}
|
||||
- *pname = name;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -4139,8 +4140,11 @@ scan_unit_for_symbols (struct comp_unit *unit)
|
||||
|
||||
case DW_AT_decl_file:
|
||||
if (is_int_form (&attr))
|
||||
- func->file = concat_filename (unit->line_table,
|
||||
- attr.u.val);
|
||||
+ {
|
||||
+ free (func->file);
|
||||
+ func->file = concat_filename (unit->line_table,
|
||||
+ attr.u.val);
|
||||
+ }
|
||||
break;
|
||||
|
||||
case DW_AT_decl_line:
|
||||
@@ -4182,8 +4186,11 @@ scan_unit_for_symbols (struct comp_unit *unit)
|
||||
|
||||
case DW_AT_decl_file:
|
||||
if (is_int_form (&attr))
|
||||
- var->file = concat_filename (unit->line_table,
|
||||
- attr.u.val);
|
||||
+ {
|
||||
+ free (var->file);
|
||||
+ var->file = concat_filename (unit->line_table,
|
||||
+ attr.u.val);
|
||||
+ }
|
||||
break;
|
||||
|
||||
case DW_AT_decl_line:
|
45
gdb-support-rseq-auxvs.patch
Normal file
45
gdb-support-rseq-auxvs.patch
Normal file
@ -0,0 +1,45 @@
|
||||
From 1bbcd2144710c4b1daa9c404df0ebc80c3461747 Mon Sep 17 00:00:00 2001
|
||||
From: Ilya Leoshkevich <iii@linux.ibm.com>
|
||||
Date: Thu, 22 Jun 2023 01:03:04 +0200
|
||||
Subject: [PATCH 11/12] gdb: support rseq auxvs
|
||||
|
||||
Linux kernel commit commit 317c8194e6ae ("rseq: Introduce feature size
|
||||
and alignment ELF auxiliary vector entries") introduced two new auxvs:
|
||||
AT_RSEQ_FEATURE_SIZE and AT_RSEQ_ALIGN. Support them in GDB. This
|
||||
fixes auxv.exp on kernels >= v6.3.
|
||||
---
|
||||
gdb/auxv.c | 4 ++++
|
||||
include/elf/common.h | 2 ++
|
||||
2 files changed, 6 insertions(+)
|
||||
|
||||
diff --git a/gdb/auxv.c b/gdb/auxv.c
|
||||
index 812b2807554..3ce5ccd3342 100644
|
||||
--- a/gdb/auxv.c
|
||||
+++ b/gdb/auxv.c
|
||||
@@ -493,6 +493,10 @@ default_print_auxv_entry (struct gdbarch *gdbarch, struct ui_file *file,
|
||||
AUXV_FORMAT_STR);
|
||||
TAG (AT_RANDOM, _("Address of 16 random bytes"), AUXV_FORMAT_HEX);
|
||||
TAG (AT_HWCAP2, _("Extension of AT_HWCAP"), AUXV_FORMAT_HEX);
|
||||
+ TAG (AT_RSEQ_FEATURE_SIZE, _("rseq supported feature size"),
|
||||
+ AUXV_FORMAT_HEX);
|
||||
+ TAG (AT_RSEQ_ALIGN, _("rseq allocation alignment"),
|
||||
+ AUXV_FORMAT_HEX);
|
||||
TAG (AT_EXECFN, _("File name of executable"), AUXV_FORMAT_STR);
|
||||
TAG (AT_SECURE, _("Boolean, was exec setuid-like?"), AUXV_FORMAT_DEC);
|
||||
TAG (AT_SYSINFO, _("Special system info/entry points"), AUXV_FORMAT_HEX);
|
||||
diff --git a/include/elf/common.h b/include/elf/common.h
|
||||
index 16587f6fb06..a37b1f9a264 100644
|
||||
--- a/include/elf/common.h
|
||||
+++ b/include/elf/common.h
|
||||
@@ -1353,6 +1353,8 @@
|
||||
may differ from AT_PLATFORM. */
|
||||
#define AT_RANDOM 25 /* Address of 16 random bytes. */
|
||||
#define AT_HWCAP2 26 /* Extension of AT_HWCAP. */
|
||||
+#define AT_RSEQ_FEATURE_SIZE 27 /* rseq supported feature size */
|
||||
+#define AT_RSEQ_ALIGN 28 /* rseq allocation alignment */
|
||||
#define AT_EXECFN 31 /* Filename of executable. */
|
||||
/* Pointer to the global system page used for system calls and other
|
||||
nice things. */
|
||||
--
|
||||
2.35.3
|
||||
|
299
gdb-symtab-add-optimized-out-static-var-to-cooked-in.patch
Normal file
299
gdb-symtab-add-optimized-out-static-var-to-cooked-in.patch
Normal file
@ -0,0 +1,299 @@
|
||||
From 7f4601b0a51f400bd1b1bc0f7895254d467e3bb4 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Fri, 21 Jul 2023 08:25:25 +0200
|
||||
Subject: [PATCH] [gdb/symtab] Add optimized out static var to cooked index
|
||||
|
||||
Consider the test-case:
|
||||
...
|
||||
$ cat main.c
|
||||
int main (void) { return 0; }
|
||||
$ cat static-optimized-out.c
|
||||
static int aaa;
|
||||
...
|
||||
compiled like this:
|
||||
...
|
||||
$ gcc-12 static-optimized-out.c main.c -g -O2 -flto
|
||||
...
|
||||
|
||||
There's a difference in behaviour depending on symtab expansion state:
|
||||
...
|
||||
$ gdb -q -batch a.out -ex "print aaa"
|
||||
No symbol "aaa" in current context.
|
||||
$ gdb -q -batch a.out -ex "maint expand-symtab" -ex "print aaa"
|
||||
$1 = <optimized out>
|
||||
...
|
||||
|
||||
The reason for the difference is that the optimized out variable aaa:
|
||||
...
|
||||
<1><104>: Abbrev Number: 2 (DW_TAG_variable)
|
||||
<105> DW_AT_name : aaa
|
||||
<109> DW_AT_decl_file : 1
|
||||
<10a> DW_AT_decl_line : 18
|
||||
<10b> DW_AT_decl_column : 12
|
||||
<10c> DW_AT_type : <0x110>
|
||||
...
|
||||
is not added to the cooked index because of this clause in abbrev_table::read:
|
||||
...
|
||||
else if (!has_location && !has_specification_or_origin && !has_external
|
||||
&& cur_abbrev->tag == DW_TAG_variable)
|
||||
cur_abbrev->interesting = false;
|
||||
...
|
||||
|
||||
Fix this inconsistency by making sure that the optimized out variable is added
|
||||
to the cooked index.
|
||||
|
||||
Regression tested on x86_64-linux.
|
||||
|
||||
Add two test-cases, a C test-case gdb.opt/static-optimized-out.exp and a dwarf
|
||||
assembly test-case gdb.dwarf2/static-optimized-out.exp.
|
||||
|
||||
Tested gdb.opt/static-optimized-out.exp with gcc-8 to gcc-12, for which we now
|
||||
consistently get:
|
||||
...
|
||||
(gdb) print aaa^M
|
||||
$1 = <optimized out>^M
|
||||
...
|
||||
and with gcc 7.5.0 and clang 13.0.1, for which we still consistently get:
|
||||
...
|
||||
(gdb) print aaa^M
|
||||
No symbol "aaa" in current context.^M
|
||||
...
|
||||
due to missing debug info for the variable.
|
||||
|
||||
PR symtab/30656
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30656
|
||||
|
||||
Approved-By: Tom Tromey <tom@tromey.com>
|
||||
---
|
||||
gdb/dwarf2/abbrev.c | 9 ---
|
||||
.../gdb.dwarf2/static-optimized-out.exp | 69 +++++++++++++++++++
|
||||
gdb/testsuite/gdb.opt/main.c | 22 ++++++
|
||||
gdb/testsuite/gdb.opt/static-optimized-out.c | 18 +++++
|
||||
.../gdb.opt/static-optimized-out.exp | 49 +++++++++++++
|
||||
5 files changed, 158 insertions(+), 9 deletions(-)
|
||||
create mode 100644 gdb/testsuite/gdb.dwarf2/static-optimized-out.exp
|
||||
create mode 100644 gdb/testsuite/gdb.opt/main.c
|
||||
create mode 100644 gdb/testsuite/gdb.opt/static-optimized-out.c
|
||||
create mode 100644 gdb/testsuite/gdb.opt/static-optimized-out.exp
|
||||
|
||||
diff --git a/gdb/dwarf2/abbrev.c b/gdb/dwarf2/abbrev.c
|
||||
index 1ebf8f6eed5..3a429fd41b1 100644
|
||||
--- a/gdb/dwarf2/abbrev.c
|
||||
+++ b/gdb/dwarf2/abbrev.c
|
||||
@@ -162,7 +162,6 @@ abbrev_table::read (struct dwarf2_section_info *section,
|
||||
bool has_specification_or_origin = false;
|
||||
bool has_name = false;
|
||||
bool has_linkage_name = false;
|
||||
- bool has_location = false;
|
||||
bool has_external = false;
|
||||
|
||||
/* Now read in declarations. */
|
||||
@@ -217,11 +216,6 @@ abbrev_table::read (struct dwarf2_section_info *section,
|
||||
has_linkage_name = true;
|
||||
break;
|
||||
|
||||
- case DW_AT_const_value:
|
||||
- case DW_AT_location:
|
||||
- has_location = true;
|
||||
- break;
|
||||
-
|
||||
case DW_AT_sibling:
|
||||
if (is_csize && cur_attr.form == DW_FORM_ref4)
|
||||
sibling_offset = size;
|
||||
@@ -296,9 +290,6 @@ abbrev_table::read (struct dwarf2_section_info *section,
|
||||
cur_abbrev->interesting = false;
|
||||
else if (!tag_interesting_for_index (cur_abbrev->tag))
|
||||
cur_abbrev->interesting = false;
|
||||
- else if (!has_location && !has_specification_or_origin && !has_external
|
||||
- && cur_abbrev->tag == DW_TAG_variable)
|
||||
- cur_abbrev->interesting = false;
|
||||
else
|
||||
cur_abbrev->interesting = true;
|
||||
|
||||
diff --git a/gdb/testsuite/gdb.dwarf2/static-optimized-out.exp b/gdb/testsuite/gdb.dwarf2/static-optimized-out.exp
|
||||
new file mode 100644
|
||||
index 00000000000..1547a8acbc0
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.dwarf2/static-optimized-out.exp
|
||||
@@ -0,0 +1,69 @@
|
||||
+# Copyright 2023 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 that an optimized out static variable is printed the same independent
|
||||
+# of state of symtab expansion. See also gdb.opt/static-optimized-out.exp.
|
||||
+
|
||||
+load_lib dwarf.exp
|
||||
+
|
||||
+# This test can only be run on targets which support DWARF-2 and use gas.
|
||||
+if { ![dwarf2_support] } {
|
||||
+ return 0
|
||||
+}
|
||||
+
|
||||
+standard_testfile main.c -dw.S
|
||||
+
|
||||
+# Make DWARF for the test.
|
||||
+set asm_file [standard_output_file $srcfile2]
|
||||
+Dwarf::assemble $asm_file {
|
||||
+ cu {} {
|
||||
+ compile_unit {
|
||||
+ {
|
||||
+ language @DW_LANG_C
|
||||
+ }
|
||||
+ } {
|
||||
+ declare_labels integer_label
|
||||
+
|
||||
+ integer_label: DW_TAG_base_type {
|
||||
+ {DW_AT_byte_size 4 DW_FORM_sdata}
|
||||
+ {DW_AT_encoding @DW_ATE_signed}
|
||||
+ {DW_AT_name integer}
|
||||
+ }
|
||||
+
|
||||
+ DW_TAG_variable {
|
||||
+ {name var}
|
||||
+ {type :$integer_label}
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+if { [prepare_for_testing "failed to prepare" ${testfile} \
|
||||
+ [list $srcfile $asm_file] {nodebug}] } {
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+gdb_test "print var" " = <optimized out>"
|
||||
+
|
||||
+# Expand all symbol tables.
|
||||
+gdb_test_no_output "maint expand-symtabs"
|
||||
+
|
||||
+# Make sure we do an actual lookup rather than just returning the same as
|
||||
+# before.
|
||||
+gdb_test_no_output "maint flush symbol-cache"
|
||||
+
|
||||
+with_test_prefix "after expand-symtabs" {
|
||||
+ gdb_test "print var" " = <optimized out>"
|
||||
+}
|
||||
diff --git a/gdb/testsuite/gdb.opt/main.c b/gdb/testsuite/gdb.opt/main.c
|
||||
new file mode 100644
|
||||
index 00000000000..c6beff77dbe
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.opt/main.c
|
||||
@@ -0,0 +1,22 @@
|
||||
+/* This testcase is part of GDB, the GNU debugger.
|
||||
+
|
||||
+ Copyright 2023 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/>. */
|
||||
+
|
||||
+int
|
||||
+main (void)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
diff --git a/gdb/testsuite/gdb.opt/static-optimized-out.c b/gdb/testsuite/gdb.opt/static-optimized-out.c
|
||||
new file mode 100644
|
||||
index 00000000000..44287fbd6d2
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.opt/static-optimized-out.c
|
||||
@@ -0,0 +1,18 @@
|
||||
+/* This testcase is part of GDB, the GNU debugger.
|
||||
+
|
||||
+ Copyright 2023 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/>. */
|
||||
+
|
||||
+static int aaa;
|
||||
diff --git a/gdb/testsuite/gdb.opt/static-optimized-out.exp b/gdb/testsuite/gdb.opt/static-optimized-out.exp
|
||||
new file mode 100644
|
||||
index 00000000000..bd673b6503e
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.opt/static-optimized-out.exp
|
||||
@@ -0,0 +1,49 @@
|
||||
+# Copyright 2023 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 that an optimized out static variable is printed the same independent
|
||||
+# of state of symtab expansion. See also gdb.dwarf2/static-optimized-out.exp.
|
||||
+
|
||||
+standard_testfile .c main.c
|
||||
+
|
||||
+set opts {}
|
||||
+lappend opts debug
|
||||
+lappend opts "optimize=-O2 -flto"
|
||||
+
|
||||
+if { [prepare_for_testing "failed to prepare" $testfile \
|
||||
+ [list $srcfile $srcfile2] $opts] } {
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+set val ""
|
||||
+gdb_test_multiple "print aaa" "" {
|
||||
+ -re -wrap "\r\n(?:\\$$decimal = )?(\[^\r\n\]*)" {
|
||||
+ set val $expect_out(1,string)
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+if { $val == "" } {
|
||||
+ return
|
||||
+}
|
||||
+
|
||||
+# Expand all symbol tables.
|
||||
+gdb_test_no_output "maint expand-symtab"
|
||||
+
|
||||
+# Make sure we do an actual lookup rather than just returning the same as
|
||||
+# before.
|
||||
+gdb_test_no_output "maint flush symbol-cache"
|
||||
+
|
||||
+# Now check that we get the same result in both cases.
|
||||
+gdb_test "print aaa" [string_to_regexp $val] "consistency"
|
||||
|
||||
base-commit: 800c393f89a94f49b01dff99f693cb13c5e28116
|
||||
--
|
||||
2.35.3
|
||||
|
125
gdb-symtab-add-producer_is_gas.patch
Normal file
125
gdb-symtab-add-producer_is_gas.patch
Normal file
@ -0,0 +1,125 @@
|
||||
From aa8ba17b9a3fdfeeb65df4c3e0731a0e9e96cbf7 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Wed, 1 Nov 2023 00:33:12 +0100
|
||||
Subject: [PATCH 1/2] [gdb/symtab] Add producer_is_gas
|
||||
|
||||
Add producer_is_gas, a generic way to get the gas version from the
|
||||
producer string.
|
||||
|
||||
Tested on x86_64-linux.
|
||||
---
|
||||
gdb/dwarf2/read.c | 4 ++--
|
||||
gdb/producer.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++
|
||||
gdb/producer.h | 5 +++++
|
||||
3 files changed, 63 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
|
||||
index 970dd54c7a5..472684a5817 100644
|
||||
--- a/gdb/dwarf2/read.c
|
||||
+++ b/gdb/dwarf2/read.c
|
||||
@@ -13376,8 +13376,8 @@ check_producer (struct dwarf2_cu *cu)
|
||||
cu->producer_is_codewarrior = true;
|
||||
else if (producer_is_clang (cu->producer, &major, &minor))
|
||||
cu->producer_is_clang = true;
|
||||
- else if (startswith (cu->producer, "GNU AS 2.39.0"))
|
||||
- cu->producer_is_gas_2_39 = true;
|
||||
+ else if (producer_is_gas (cu->producer, &major, &minor))
|
||||
+ cu->producer_is_gas_2_39 = major == 2 && minor == 39;
|
||||
else
|
||||
{
|
||||
/* For other non-GCC compilers, expect their behavior is DWARF version
|
||||
diff --git a/gdb/producer.c b/gdb/producer.c
|
||||
index 9fcf749e3d4..cd83dfce128 100644
|
||||
--- a/gdb/producer.c
|
||||
+++ b/gdb/producer.c
|
||||
@@ -81,6 +81,45 @@ producer_is_gcc (const char *producer, int *major, int *minor)
|
||||
|
||||
/* See producer.h. */
|
||||
|
||||
+bool
|
||||
+producer_is_gas (const char *producer, int *major, int *minor)
|
||||
+{
|
||||
+ if (producer == nullptr)
|
||||
+ {
|
||||
+ /* No producer, don't know. */
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ /* Detect prefix. */
|
||||
+ const char prefix[] = "GNU AS ";
|
||||
+ if (!startswith (producer, prefix))
|
||||
+ {
|
||||
+ /* Producer is not gas. */
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ /* Skip prefix. */
|
||||
+ const char *cs = &producer[strlen (prefix)];
|
||||
+
|
||||
+ /* Ensure that major/minor are not nullptrs. */
|
||||
+ int maj, min;
|
||||
+ if (major == nullptr)
|
||||
+ major = &maj;
|
||||
+ if (minor == nullptr)
|
||||
+ minor = &min;
|
||||
+
|
||||
+ int scanned = sscanf (cs, "%d.%d", major, minor);
|
||||
+ if (scanned != 2)
|
||||
+ {
|
||||
+ /* Unable to scan major/minor version. */
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
+ /* See producer.h. */
|
||||
+
|
||||
bool
|
||||
producer_is_icc_ge_19 (const char *producer)
|
||||
{
|
||||
@@ -251,6 +290,23 @@ Version 18.0 Beta";
|
||||
SELF_CHECK (!producer_is_gcc (flang_llvm_exp, &major, &minor));
|
||||
SELF_CHECK (producer_is_llvm (flang_llvm_exp));
|
||||
}
|
||||
+
|
||||
+ {
|
||||
+ static const char gas_exp[] = "GNU AS 2.39.0";
|
||||
+ int major = 0, minor = 0;
|
||||
+ SELF_CHECK (!producer_is_gcc (gas_exp, &major, &minor));
|
||||
+ SELF_CHECK (producer_is_gas (gas_exp, &major, &minor));
|
||||
+ SELF_CHECK (major == 2 && minor == 39);
|
||||
+
|
||||
+ static const char gas_incomplete_exp[] = "GNU AS ";
|
||||
+ SELF_CHECK (!producer_is_gas (gas_incomplete_exp, &major, &minor));
|
||||
+ SELF_CHECK (!producer_is_gcc (gas_incomplete_exp, &major, &minor));
|
||||
+
|
||||
+ static const char gas_incomplete_exp_2[] = "GNU AS 2";
|
||||
+ SELF_CHECK (!producer_is_gas (gas_incomplete_exp_2, &major, &minor));
|
||||
+ SELF_CHECK (!producer_is_gcc (gas_incomplete_exp_2, &major, &minor));
|
||||
+ }
|
||||
+
|
||||
}
|
||||
}
|
||||
}
|
||||
diff --git a/gdb/producer.h b/gdb/producer.h
|
||||
index c915979b122..00718511775 100644
|
||||
--- a/gdb/producer.h
|
||||
+++ b/gdb/producer.h
|
||||
@@ -30,6 +30,11 @@ extern int producer_is_gcc_ge_4 (const char *producer);
|
||||
is NULL or it isn't GCC. */
|
||||
extern int producer_is_gcc (const char *producer, int *major, int *minor);
|
||||
|
||||
+/* Returns nonzero if the given PRODUCER string is GAS and sets the MAJOR
|
||||
+ and MINOR versions when not NULL. Returns zero if the given PRODUCER
|
||||
+ is NULL or it isn't GAS. */
|
||||
+bool producer_is_gas (const char *producer, int *major, int *minor);
|
||||
+
|
||||
/* Check for Intel compilers >= 19.0. */
|
||||
extern bool producer_is_icc_ge_19 (const char *producer);
|
||||
|
||||
|
||||
base-commit: 39553c1e285c426946188ec2a890c1c1cb933060
|
||||
--
|
||||
2.35.3
|
||||
|
81
gdb-symtab-don-t-deduplicate-variables-in-gdb-index.patch
Normal file
81
gdb-symtab-don-t-deduplicate-variables-in-gdb-index.patch
Normal file
@ -0,0 +1,81 @@
|
||||
From 04d0d6ebdc6d08f5a7ec0d4c89eb1835deef54dc Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Sun, 13 Aug 2023 14:08:06 +0200
|
||||
Subject: [PATCH] [gdb/symtab] Don't deduplicate variables in gdb-index
|
||||
|
||||
When running test-case gdb.python/py-symbol.exp with target board
|
||||
cc-with-gdb-index, we run into:
|
||||
...
|
||||
(gdb) python print (len (gdb.lookup_static_symbols ('rr')))^M
|
||||
1^M
|
||||
(gdb) FAIL: gdb.python/py-symbol.exp: print (len (gdb.lookup_static_symbols ('rr')))
|
||||
...
|
||||
|
||||
[ Note that the test-case contains rr in both py-symtab.c:
|
||||
...
|
||||
static int __attribute__ ((used)) rr = 42; /* line of rr */
|
||||
...
|
||||
and py-symtab-2.c:
|
||||
...
|
||||
static int __attribute__ ((used)) rr = 99; /* line of other rr */
|
||||
... ]
|
||||
|
||||
This passes with gdb-12-branch, and fails with gdb-13-branch.
|
||||
|
||||
AFAIU the current code in symtab_index_entry::minimize makes the assumption
|
||||
that it's fine to store only one copy of rr in the gdb-index, because
|
||||
"print rr" will only ever print one, and always the same.
|
||||
|
||||
But that fails to recognize that gdb supports gdb.lookup_static_symbols, which
|
||||
returns a list of variables rather than the first one.
|
||||
|
||||
In other words, the current approach breaks feature parity between cooked
|
||||
index and gdb-index.
|
||||
|
||||
Note btw that also debug-names has both instances:
|
||||
...
|
||||
[ 5] #00597969 rr:
|
||||
<4> DW_TAG_variable DW_IDX_compile_unit=3 DW_IDX_GNU_internal=1
|
||||
<4> DW_TAG_variable DW_IDX_compile_unit=4 DW_IDX_GNU_internal=1
|
||||
...
|
||||
|
||||
Fix this in symtab_index_entry::minimize, by not deduplicating variables.
|
||||
|
||||
Tested on x86_64-linux, with target boards unix and cc-with-gdb-index.
|
||||
|
||||
Reviewed-by: Kevin Buettner <kevinb@redhat.com>
|
||||
|
||||
PR symtab/30720
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30720
|
||||
---
|
||||
gdb/dwarf2/index-write.c | 5 ++---
|
||||
1 file changed, 2 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/gdb/dwarf2/index-write.c b/gdb/dwarf2/index-write.c
|
||||
index d10583568c0..ea67f73ac3c 100644
|
||||
--- a/gdb/dwarf2/index-write.c
|
||||
+++ b/gdb/dwarf2/index-write.c
|
||||
@@ -294,7 +294,7 @@ symtab_index_entry::minimize ()
|
||||
auto from = std::unique (cu_indices.begin (), cu_indices.end ());
|
||||
cu_indices.erase (from, cu_indices.end ());
|
||||
|
||||
- /* We don't want to enter a variable or type more than once, so
|
||||
+ /* We don't want to enter a type more than once, so
|
||||
remove any such duplicates from the list as well. When doing
|
||||
this, we want to keep the entry from the first CU -- but this is
|
||||
implicit due to the sort. This choice is done because it's
|
||||
@@ -304,8 +304,7 @@ symtab_index_entry::minimize ()
|
||||
[&] (offset_type val)
|
||||
{
|
||||
gdb_index_symbol_kind kind = GDB_INDEX_SYMBOL_KIND_VALUE (val);
|
||||
- if (kind != GDB_INDEX_SYMBOL_KIND_TYPE
|
||||
- && kind != GDB_INDEX_SYMBOL_KIND_VARIABLE)
|
||||
+ if (kind != GDB_INDEX_SYMBOL_KIND_TYPE)
|
||||
return false;
|
||||
|
||||
val &= ~GDB_INDEX_CU_MASK;
|
||||
|
||||
base-commit: 2521ac7ed0c495b9e804c4356939b9be7166853c
|
||||
--
|
||||
2.35.3
|
||||
|
202
gdb-symtab-find-main-language-without-symtab-expansi.patch
Normal file
202
gdb-symtab-find-main-language-without-symtab-expansi.patch
Normal file
@ -0,0 +1,202 @@
|
||||
From e2f41776aa9ca2f625bbc50e9bb498e2a95dba25 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Sat, 5 Aug 2023 17:57:13 +0200
|
||||
Subject: [PATCH] [gdb/symtab] Find main language without symtab expansion
|
||||
|
||||
When loading an executable using "file a.out", the language is set according
|
||||
to a.out, which can involve looking up the language of symbol "main", which
|
||||
will cause the symtab expansion for the containing CU.
|
||||
|
||||
Expansion of lto debug info can be slow, so in commit d3214198119 ("[gdb] Use
|
||||
partial symbol table to find language for main") a feature was added to avoid
|
||||
the symtab expansion.
|
||||
|
||||
This feature stopped working after commit 7f4307436fd ("Fix "start" for D,
|
||||
Rust, etc").
|
||||
|
||||
[ The commit addresses problems related to command start, which requires finding
|
||||
the main function:
|
||||
- for language D, "main" was found instead of "D main", and
|
||||
- for Rust, the correct function was found, but attributed the wrong name
|
||||
(not fully qualified). ]
|
||||
|
||||
Reimplement the feature by adding
|
||||
cooked_index_functions::lookup_global_symbol_language.
|
||||
|
||||
Tested on x86_64-linux.
|
||||
|
||||
PR symtab/30661
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30661
|
||||
---
|
||||
gdb/dwarf2/read.c | 41 +++++++++++++++++++++++++++++++
|
||||
gdb/testsuite/gdb.base/main-c.exp | 33 +++++++++++++++++++++++++
|
||||
gdb/testsuite/gdb.cp/main-cp.exp | 33 +++++++++++++++++++++++++
|
||||
gdb/testsuite/gdb.cp/main.cc | 22 +++++++++++++++++
|
||||
4 files changed, 129 insertions(+)
|
||||
create mode 100644 gdb/testsuite/gdb.base/main-c.exp
|
||||
create mode 100644 gdb/testsuite/gdb.cp/main-cp.exp
|
||||
create mode 100644 gdb/testsuite/gdb.cp/main.cc
|
||||
|
||||
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
|
||||
index 04bc0e1cbbd..8aa7f8c31e5 100644
|
||||
--- a/gdb/dwarf2/read.c
|
||||
+++ b/gdb/dwarf2/read.c
|
||||
@@ -18621,6 +18621,47 @@ struct cooked_index_functions : public dwarf2_base_index_functions
|
||||
if (dwarf2_has_info (objfile, nullptr))
|
||||
dwarf2_build_psymtabs (objfile);
|
||||
}
|
||||
+
|
||||
+ enum language lookup_global_symbol_language (struct objfile *objfile,
|
||||
+ const char *name,
|
||||
+ domain_enum domain,
|
||||
+ bool *symbol_found_p) override
|
||||
+ {
|
||||
+ *symbol_found_p = false;
|
||||
+
|
||||
+ if (!(domain == VAR_DOMAIN && streq (name, "main")))
|
||||
+ return language_unknown;
|
||||
+
|
||||
+ dwarf2_per_objfile *per_objfile = get_dwarf2_per_objfile (objfile);
|
||||
+ struct dwarf2_per_bfd *per_bfd = per_objfile->per_bfd;
|
||||
+ if (per_bfd->index_table == nullptr)
|
||||
+ return language_unknown;
|
||||
+
|
||||
+ /* Expansion of large CUs can be slow. By returning the language of main
|
||||
+ here for C and C++, we avoid CU expansion during set_initial_language.
|
||||
+ But by doing a symbol lookup in the cooked index, we are forced to wait
|
||||
+ for finalization to complete. See PR symtab/30174 for ideas how to
|
||||
+ bypass that as well. */
|
||||
+ cooked_index_vector *table
|
||||
+ = (gdb::checked_static_cast<cooked_index_vector *>
|
||||
+ (per_objfile->per_bfd->index_table.get ()));
|
||||
+ table->wait ();
|
||||
+
|
||||
+ for (const cooked_index_entry *entry : table->find (name, false))
|
||||
+ {
|
||||
+ if (entry->tag != DW_TAG_subprogram)
|
||||
+ continue;
|
||||
+
|
||||
+ enum language lang = entry->per_cu->lang ();
|
||||
+ if (!(lang == language_c || lang == language_cplus))
|
||||
+ continue;
|
||||
+
|
||||
+ *symbol_found_p = true;
|
||||
+ return lang;
|
||||
+ }
|
||||
+
|
||||
+ return language_unknown;
|
||||
+ }
|
||||
};
|
||||
|
||||
dwarf2_per_cu_data *
|
||||
diff --git a/gdb/testsuite/gdb.base/main-c.exp b/gdb/testsuite/gdb.base/main-c.exp
|
||||
new file mode 100644
|
||||
index 00000000000..bcbd0fca7e4
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.base/main-c.exp
|
||||
@@ -0,0 +1,33 @@
|
||||
+# Copyright 2023 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 that finding main to set the current language doesn't cause any symtab
|
||||
+# to be expanded.
|
||||
+
|
||||
+standard_testfile main.c
|
||||
+
|
||||
+if { [readnow] } {
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+if { [prepare_for_testing "failed to prepare" $testfile $srcfile] } {
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+if { ![string eq [have_index $binfile] ""] } {
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+gdb_test_no_output "maint info symtabs"
|
||||
diff --git a/gdb/testsuite/gdb.cp/main-cp.exp b/gdb/testsuite/gdb.cp/main-cp.exp
|
||||
new file mode 100644
|
||||
index 00000000000..86d626bdbaf
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.cp/main-cp.exp
|
||||
@@ -0,0 +1,33 @@
|
||||
+# Copyright 2023 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 that finding main to set the current language doesn't cause any symtab
|
||||
+# to be expanded.
|
||||
+
|
||||
+standard_testfile main.cc
|
||||
+
|
||||
+if { [readnow] } {
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+if { [prepare_for_testing "failed to prepare" $testfile $srcfile] } {
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+if { ![string eq [have_index $binfile] ""] } {
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+gdb_test_no_output "maint info symtabs"
|
||||
diff --git a/gdb/testsuite/gdb.cp/main.cc b/gdb/testsuite/gdb.cp/main.cc
|
||||
new file mode 100644
|
||||
index 00000000000..c6beff77dbe
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.cp/main.cc
|
||||
@@ -0,0 +1,22 @@
|
||||
+/* This testcase is part of GDB, the GNU debugger.
|
||||
+
|
||||
+ Copyright 2023 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/>. */
|
||||
+
|
||||
+int
|
||||
+main (void)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
|
||||
base-commit: ebceffa1196651683a7a6d31abb4b3b5adc6c168
|
||||
--
|
||||
2.35.3
|
||||
|
84
gdb-symtab-fix-line-number-of-static-const-class-mem.patch
Normal file
84
gdb-symtab-fix-line-number-of-static-const-class-mem.patch
Normal file
@ -0,0 +1,84 @@
|
||||
From e5972def532f3ed248dfbd2f220f28dc367f4ca1 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Fri, 24 Mar 2023 15:45:56 +0100
|
||||
Subject: [PATCH 07/12] [gdb/symtab] Fix line number of static const class
|
||||
member
|
||||
|
||||
Since commit 6d263fe46e0 ("Avoid bad breakpoints with --gc-sections"), there
|
||||
was a silent regression on openSUSE Leap 15.4 for test-case
|
||||
gdb.cp/m-static.exp, from:
|
||||
...
|
||||
(gdb) info variable everywhere^M
|
||||
All variables matching regular expression "everywhere":^M
|
||||
^M
|
||||
File /home/vries/tmp.local-remote-host-native/m-static.h:^M
|
||||
8: const int gnu_obj_4::everywhere;^M
|
||||
(gdb)
|
||||
...
|
||||
to:
|
||||
...
|
||||
(gdb) info variable everywhere^M
|
||||
All variables matching regular expression "everywhere":^M
|
||||
^M
|
||||
File /data/vries/gdb/src/gdb/testsuite/gdb.cp/m-static.h:^M
|
||||
8: const int gnu_obj_4::everywhere;^M
|
||||
^M
|
||||
File /data/vries/gdb/src/gdb/testsuite/gdb.cp/m-static1.cc:^M
|
||||
8: const int gnu_obj_4::everywhere;^M
|
||||
(gdb)
|
||||
...
|
||||
|
||||
Another regression was found due to that commit, and it was fixed in commit
|
||||
99d679e7b30 ("[gdb/symtab] Fix "file index out of range" complaint") by
|
||||
limiting the scope of the fix in the original commit.
|
||||
|
||||
Fix this regression by yet further limiting the scope of that fix, making sure
|
||||
that this bit in dwarf_decode_lines is executed again for m-static1.cc:
|
||||
...
|
||||
/* Make sure a symtab is created for every file, even files
|
||||
which contain only variables (i.e. no code with associated
|
||||
line numbers). */
|
||||
...
|
||||
|
||||
Tested on x86_64-linux.
|
||||
|
||||
PR symtab/30265
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30265
|
||||
---
|
||||
gdb/dwarf2/read.c | 3 +--
|
||||
gdb/testsuite/gdb.cp/m-static.exp | 4 +++-
|
||||
2 files changed, 4 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
|
||||
index f39eba7a008..04bc0e1cbbd 100644
|
||||
--- a/gdb/dwarf2/read.c
|
||||
+++ b/gdb/dwarf2/read.c
|
||||
@@ -9633,8 +9633,7 @@ handle_DW_AT_stmt_list (struct die_info *die, struct dwarf2_cu *cu,
|
||||
then there won't be any interesting code in the CU, but a check later on
|
||||
(in lnp_state_machine::check_line_address) will fail to properly exclude
|
||||
an entry that was removed via --gc-sections. */
|
||||
- if (have_code)
|
||||
- dwarf_decode_lines (cu->line_header, cu, lowpc, decode_mapping);
|
||||
+ dwarf_decode_lines (cu->line_header, cu, lowpc, decode_mapping && have_code);
|
||||
}
|
||||
|
||||
/* Process DW_TAG_compile_unit or DW_TAG_partial_unit. */
|
||||
diff --git a/gdb/testsuite/gdb.cp/m-static.exp b/gdb/testsuite/gdb.cp/m-static.exp
|
||||
index a67b4cd3736..049e88299da 100644
|
||||
--- a/gdb/testsuite/gdb.cp/m-static.exp
|
||||
+++ b/gdb/testsuite/gdb.cp/m-static.exp
|
||||
@@ -183,8 +183,10 @@ gdb_test "print test4.somewhere" "\\$\[0-9\].* = 3.14\[0-9\]*" "static const flo
|
||||
if { $non_dwarf } { setup_xfail *-*-* }
|
||||
gdb_test "info variable everywhere" \
|
||||
[multi_line \
|
||||
+ {All variables matching regular expression "everywhere":} \
|
||||
+ "" \
|
||||
"File (.*/)?m-static\[.\]h:" \
|
||||
- "$decimal:\tconst int gnu_obj_4::everywhere;.*"]
|
||||
+ "$decimal:\tconst int gnu_obj_4::everywhere;"]
|
||||
|
||||
# Perhaps at some point test4 should also include a test for a static
|
||||
# const int that was initialized in the header file. But I'm not sure
|
||||
--
|
||||
2.35.3
|
||||
|
66
gdb-symtab-fix-too-many-symbols-in-gdbpy_lookup_stat.patch
Normal file
66
gdb-symtab-fix-too-many-symbols-in-gdbpy_lookup_stat.patch
Normal file
@ -0,0 +1,66 @@
|
||||
From 1362bc937bd54dbd22dd7b3c7ae9d8ab6ca7bbfc Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Wed, 6 Sep 2023 11:00:01 +0200
|
||||
Subject: [PATCH 10/12] [gdb/symtab] Fix too many symbols in
|
||||
gdbpy_lookup_static_symbols
|
||||
|
||||
When running test-case gdb.python/py-symbol.exp with target board
|
||||
cc-with-dwz-m, we run into:
|
||||
...
|
||||
(gdb) python print (len (gdb.lookup_static_symbols ('rr')))^M
|
||||
4^M
|
||||
(gdb) FAIL: gdb.python/py-symbol.exp: \
|
||||
print (len (gdb.lookup_static_symbols ('rr')))
|
||||
...
|
||||
while with target board unix we have instead:
|
||||
...
|
||||
(gdb) python print (len (gdb.lookup_static_symbols ('rr')))^M
|
||||
2^M
|
||||
(gdb) PASS: gdb.python/py-symbol.exp: \
|
||||
print (len (gdb.lookup_static_symbols ('rr')))
|
||||
...
|
||||
|
||||
The problem is that the loop in gdbpy_lookup_static_symbols loops over compunits
|
||||
representing both CUs and PUs:
|
||||
...
|
||||
for (compunit_symtab *cust : objfile->compunits ())
|
||||
...
|
||||
|
||||
When doing a lookup on a PU, the user link is followed until we end up at a CU,
|
||||
and the lookup is done in that CU.
|
||||
|
||||
In other words, when doing a lookup in the loop for a PU we duplicate the
|
||||
lookup for a CU that is already handled by the loop.
|
||||
|
||||
Fix this by skipping PUs in the loop in gdb.lookup_static_symbols.
|
||||
|
||||
Tested on x86_64-linux.
|
||||
|
||||
PR symtab/25261
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=25261
|
||||
---
|
||||
gdb/python/py-symbol.c | 7 +++++--
|
||||
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/gdb/python/py-symbol.c b/gdb/python/py-symbol.c
|
||||
index b8777966c47..ed4250bc2c7 100644
|
||||
--- a/gdb/python/py-symbol.c
|
||||
+++ b/gdb/python/py-symbol.c
|
||||
@@ -582,9 +582,12 @@ gdbpy_lookup_static_symbols (PyObject *self, PyObject *args, PyObject *kw)
|
||||
{
|
||||
for (compunit_symtab *cust : objfile->compunits ())
|
||||
{
|
||||
- const struct blockvector *bv;
|
||||
+ /* Skip included compunits to prevent including compunits from
|
||||
+ being searched twice. */
|
||||
+ if (cust->user != nullptr)
|
||||
+ continue;
|
||||
|
||||
- bv = cust->blockvector ();
|
||||
+ const struct blockvector *bv = cust->blockvector ();
|
||||
const struct block *block = bv->static_block ();
|
||||
|
||||
if (block != nullptr)
|
||||
--
|
||||
2.35.3
|
||||
|
59
gdb-symtab-handle-pu-in-iterate_over_some_symtabs.patch
Normal file
59
gdb-symtab-handle-pu-in-iterate_over_some_symtabs.patch
Normal file
@ -0,0 +1,59 @@
|
||||
From c67e982325c5b2249b0e29d07a9dc1985614e898 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Wed, 6 Sep 2023 10:14:50 +0200
|
||||
Subject: [PATCH 08/12] [gdb/symtab] Handle PU in iterate_over_some_symtabs
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
When running test-case gdb.base/setshow.exp with target board cc-with-dwz I
|
||||
run into:
|
||||
...
|
||||
(gdb) info line 1^M
|
||||
Line 1 of "setshow.c" is at address 0x400527 <main> but contains no code.^M
|
||||
Line 1 of "setshow.c" is at address 0x400527 <main> but contains no code.^M
|
||||
(gdb) FAIL: gdb.base/setshow.exp: test_setshow_annotate: annotation_level 1
|
||||
...
|
||||
while the expected output is:
|
||||
...
|
||||
Line 1 of "setshow.c" is at address 0x400527 <main> but contains no code.
|
||||
<EFBFBD><EFBFBD>setshow.c:1:0:beg:0x400527
|
||||
...
|
||||
|
||||
The second line of the expected output is missing due to the first line of the
|
||||
expected output being repeated, so the problem is that the "Line 1" line is
|
||||
printed twice.
|
||||
|
||||
This happens because the PU imported by the CU reuses the filetab of the CU,
|
||||
and both the CU and PU are visited by iterate_over_some_symtabs.
|
||||
|
||||
Fix this by skipping PUs in iterate_over_some_symtabs.
|
||||
|
||||
Tested on x86_64-linux, target boards unix, cc-with-dwz and cc-with-dwz-m.
|
||||
|
||||
Approved-By: Tom Tromey <tom@tromey.com>
|
||||
|
||||
PR symtab/30797
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30797
|
||||
---
|
||||
gdb/symtab.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/gdb/symtab.c b/gdb/symtab.c
|
||||
index a662d7d1869..fe7cc679b6b 100644
|
||||
--- a/gdb/symtab.c
|
||||
+++ b/gdb/symtab.c
|
||||
@@ -550,6 +550,10 @@ iterate_over_some_symtabs (const char *name,
|
||||
|
||||
for (cust = first; cust != NULL && cust != after_last; cust = cust->next)
|
||||
{
|
||||
+ /* Skip included compunits. */
|
||||
+ if (cust->user != nullptr)
|
||||
+ continue;
|
||||
+
|
||||
for (symtab *s : cust->filetabs ())
|
||||
{
|
||||
if (compare_filenames_for_search (s->filename, name))
|
||||
--
|
||||
2.35.3
|
||||
|
159
gdb-symtab-handle-self-reference-die.patch
Normal file
159
gdb-symtab-handle-self-reference-die.patch
Normal file
@ -0,0 +1,159 @@
|
||||
From 8f53ac47d3f9c3800c8429d9187961ba81707d8b Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Wed, 16 Aug 2023 23:43:25 +0200
|
||||
Subject: [PATCH 1/2] [gdb/symtab] Handle self-reference DIE
|
||||
|
||||
While working on a dwarf assembly test-case I accidentally created the
|
||||
following pathological dwarf:
|
||||
...
|
||||
<1><be>: Abbrev Number: 3 (DW_TAG_class_type)
|
||||
<bf> DW_AT_name : c1
|
||||
<c2> DW_AT_specification: <0xbe>
|
||||
...
|
||||
and noticed gdb segfaulting during cooked index creating due to running out of
|
||||
stack. This is a regression from gdb-12, where gdb just hung.
|
||||
|
||||
Fix this by inhibiting the scan_attributes self-recursion for self-references.
|
||||
|
||||
The same test-case with -readnow makes gdb hang, so also fix this in
|
||||
dwarf2_attr and follow_die_ref.
|
||||
|
||||
Note that this doesn't fix the same problems for the more complicated case of:
|
||||
...
|
||||
<1><be>: Abbrev Number: 3 (DW_TAG_class_type)
|
||||
<bf> DW_AT_name : c1
|
||||
<c2> DW_AT_specification: <0xc6>
|
||||
<1><c6>: Abbrev Number: 4 (DW_TAG_class_type)
|
||||
<c7> DW_AT_name : c2
|
||||
<ca> DW_AT_specification: <0xbe>
|
||||
...
|
||||
but the approach for deciding whether to fix pathological dwarf cases is as
|
||||
per PR27981 comment 3:
|
||||
...
|
||||
yes if it is cheap/obvious, and no if it is something complicated or expensive.
|
||||
...
|
||||
and at this point I'm not sure whether fixing this will fall in the first
|
||||
category.
|
||||
|
||||
Tested on x86_64-linux.
|
||||
|
||||
Approved-By: Tom Tromey <tom@tromey.com>
|
||||
---
|
||||
gdb/dwarf2/read.c | 22 +++++++++--
|
||||
gdb/testsuite/gdb.dwarf2/self-spec.exp | 54 ++++++++++++++++++++++++++
|
||||
2 files changed, 73 insertions(+), 3 deletions(-)
|
||||
create mode 100644 gdb/testsuite/gdb.dwarf2/self-spec.exp
|
||||
|
||||
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
|
||||
index 61f4bd75013..1be5f381432 100644
|
||||
--- a/gdb/dwarf2/read.c
|
||||
+++ b/gdb/dwarf2/read.c
|
||||
@@ -18289,9 +18289,15 @@ cooked_indexer::scan_attributes (dwarf2_per_cu_data *scanning_per_cu,
|
||||
new_info_ptr,
|
||||
&bytes_read);
|
||||
new_info_ptr += bytes_read;
|
||||
- scan_attributes (scanning_per_cu, new_reader, new_info_ptr, new_info_ptr,
|
||||
- new_abbrev, name, linkage_name, flags, nullptr,
|
||||
- parent_entry, maybe_defer, true);
|
||||
+
|
||||
+ if (new_reader->cu == reader->cu && new_info_ptr == watermark_ptr)
|
||||
+ {
|
||||
+ /* Self-reference, we're done. */
|
||||
+ }
|
||||
+ else
|
||||
+ scan_attributes (scanning_per_cu, new_reader, new_info_ptr,
|
||||
+ new_info_ptr, new_abbrev, name, linkage_name,
|
||||
+ flags, nullptr, parent_entry, maybe_defer, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19783,7 +19789,11 @@ dwarf2_attr (struct die_info *die, unsigned int name, struct dwarf2_cu *cu)
|
||||
if (!spec)
|
||||
break;
|
||||
|
||||
+ struct die_info *prev_die = die;
|
||||
die = follow_die_ref (die, spec, &cu);
|
||||
+ if (die == prev_die)
|
||||
+ /* Self-reference, we're done. */
|
||||
+ break;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
@@ -22521,6 +22531,12 @@ follow_die_ref (struct die_info *src_die, const struct attribute *attr,
|
||||
struct dwarf2_cu *cu = *ref_cu;
|
||||
struct die_info *die;
|
||||
|
||||
+ if (attr->form != DW_FORM_GNU_ref_alt && src_die->sect_off == sect_off)
|
||||
+ {
|
||||
+ /* Self-reference, we're done. */
|
||||
+ return src_die;
|
||||
+ }
|
||||
+
|
||||
die = follow_die_offset (sect_off,
|
||||
(attr->form == DW_FORM_GNU_ref_alt
|
||||
|| cu->per_cu->is_dwz),
|
||||
diff --git a/gdb/testsuite/gdb.dwarf2/self-spec.exp b/gdb/testsuite/gdb.dwarf2/self-spec.exp
|
||||
new file mode 100644
|
||||
index 00000000000..77e92549fd1
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.dwarf2/self-spec.exp
|
||||
@@ -0,0 +1,54 @@
|
||||
+# Copyright 2023 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 that gdb doesn't hang or segfault on reading a DIE with a
|
||||
+# specification reference to itself.
|
||||
+
|
||||
+load_lib dwarf.exp
|
||||
+
|
||||
+if {![dwarf2_support]} {
|
||||
+ return 0
|
||||
+}
|
||||
+
|
||||
+standard_testfile main.c .S
|
||||
+
|
||||
+# Create the DWARF.
|
||||
+set asm_file [standard_output_file $srcfile2]
|
||||
+Dwarf::assemble $asm_file {
|
||||
+ cu {} {
|
||||
+ compile_unit {{language @DW_LANG_C_plus_plus}} {
|
||||
+ declare_labels c1
|
||||
+ c1: class_type {
|
||||
+ {name c1}
|
||||
+ {specification :$c1}
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+if [prepare_for_testing "failed to prepare" $testfile "${asm_file} ${srcfile}" {}] {
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+set index [have_index $binfile]
|
||||
+if { ![string eq $index ""] } {
|
||||
+ return 0
|
||||
+}
|
||||
+
|
||||
+if { [readnow] } {
|
||||
+ return 0
|
||||
+}
|
||||
+
|
||||
+gdb_test "maint expand-symtabs"
|
||||
|
||||
base-commit: 6c9e159dbd1a35aafa134fcd52982174236a8dd9
|
||||
--
|
||||
2.35.3
|
||||
|
92
gdb-symtab-handle-self-reference-in-inherit_abstract.patch
Normal file
92
gdb-symtab-handle-self-reference-in-inherit_abstract.patch
Normal file
@ -0,0 +1,92 @@
|
||||
From 800c393f89a94f49b01dff99f693cb13c5e28116 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Mon, 28 Aug 2023 16:27:58 +0200
|
||||
Subject: [PATCH 2/2] [gdb/symtab] Handle self-reference in
|
||||
inherit_abstract_dies
|
||||
|
||||
Building gdb with gcc 7.5.0 and -flto -O2 -flto-partition=one generates a
|
||||
self-referencing DIE:
|
||||
...
|
||||
<2><91dace>: Abbrev Number: 405 (DW_TAG_label)
|
||||
<91dad0> DW_AT_abstract_origin: <0x91dace>
|
||||
...
|
||||
|
||||
When encountering the self-reference DIE in inherit_abstract_dies we loop
|
||||
following the abstract origin, effectively hanging gdb.
|
||||
|
||||
Fix this by handling self-referencing DIEs in the loop in
|
||||
inherit_abstract_dies.
|
||||
|
||||
Tested on x86_64-linux.
|
||||
|
||||
Approved-By: Tom Tromey <tom@tromey.com>
|
||||
|
||||
PR symtab/30799
|
||||
https://sourceware.org/bugzilla/show_bug.cgi?id=30799
|
||||
---
|
||||
gdb/dwarf2/read.c | 7 +++++++
|
||||
gdb/testsuite/gdb.dwarf2/self-spec.exp | 16 +++++++++++++++-
|
||||
2 files changed, 22 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
|
||||
index 1be5f381432..970dd54c7a5 100644
|
||||
--- a/gdb/dwarf2/read.c
|
||||
+++ b/gdb/dwarf2/read.c
|
||||
@@ -11938,8 +11938,15 @@ inherit_abstract_dies (struct die_info *die, struct dwarf2_cu *cu)
|
||||
if (attr == nullptr)
|
||||
break;
|
||||
|
||||
+ die_info *prev_child_origin_die = child_origin_die;
|
||||
child_origin_die = follow_die_ref (child_origin_die, attr,
|
||||
&child_origin_cu);
|
||||
+
|
||||
+ if (prev_child_origin_die == child_origin_die)
|
||||
+ {
|
||||
+ /* Handle DIE with self-reference. */
|
||||
+ break;
|
||||
+ }
|
||||
}
|
||||
|
||||
/* If missing DW_AT_abstract_origin, try the corresponding child
|
||||
diff --git a/gdb/testsuite/gdb.dwarf2/self-spec.exp b/gdb/testsuite/gdb.dwarf2/self-spec.exp
|
||||
index 77e92549fd1..f04ff6da42e 100644
|
||||
--- a/gdb/testsuite/gdb.dwarf2/self-spec.exp
|
||||
+++ b/gdb/testsuite/gdb.dwarf2/self-spec.exp
|
||||
@@ -14,7 +14,7 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# Check that gdb doesn't hang or segfault on reading a DIE with a
|
||||
-# specification reference to itself.
|
||||
+# specification/abstract_origin reference to itself.
|
||||
|
||||
load_lib dwarf.exp
|
||||
|
||||
@@ -29,11 +29,25 @@ set asm_file [standard_output_file $srcfile2]
|
||||
Dwarf::assemble $asm_file {
|
||||
cu {} {
|
||||
compile_unit {{language @DW_LANG_C_plus_plus}} {
|
||||
+ # Check handling of self-referencing DIE.
|
||||
declare_labels c1
|
||||
c1: class_type {
|
||||
{name c1}
|
||||
{specification :$c1}
|
||||
}
|
||||
+
|
||||
+ # Check handling of self-referencing child DIE. Regression test
|
||||
+ # for PR30799.
|
||||
+ declare_labels f1 abstract_f1 f1_l
|
||||
+ abstract_f1: subprogram {}
|
||||
+ f1: subprogram {
|
||||
+ {MACRO_AT_func {main}}
|
||||
+ {abstract_origin :$abstract_f1}
|
||||
+ } {
|
||||
+ f1_l: label {
|
||||
+ {abstract_origin :$f1_l}
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
}
|
||||
}
|
||||
--
|
||||
2.35.3
|
||||
|
278
gdb-symtab-work-around-gas-pr28629.patch
Normal file
278
gdb-symtab-work-around-gas-pr28629.patch
Normal file
@ -0,0 +1,278 @@
|
||||
From b1136560e772dd4c74f1fbb41f6ba840b92fb9d6 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Wed, 1 Nov 2023 00:33:12 +0100
|
||||
Subject: [PATCH 2/2] [gdb/symtab] Work around gas PR28629
|
||||
|
||||
When running test-case gdb.tui/tui-layout-asm-short-prog.exp on AlmaLinux 9.2
|
||||
ppc64le, I run into:
|
||||
...
|
||||
FAIL: gdb.tui/tui-layout-asm-short-prog.exp: check asm box contents
|
||||
...
|
||||
|
||||
The problem is that we get:
|
||||
...
|
||||
7 [ No Assembly Available ]
|
||||
...
|
||||
because tui_get_begin_asm_address doesn't succeed.
|
||||
|
||||
In more detail, tui_get_begin_asm_address calls:
|
||||
...
|
||||
find_line_pc (sal.symtab, sal.line, &addr);
|
||||
...
|
||||
with:
|
||||
...
|
||||
(gdb) p *sal.symtab
|
||||
$5 = {next = 0x130393c0, m_compunit = 0x130392f0, m_linetable = 0x0,
|
||||
filename = "tui-layout-asm-short-prog.S",
|
||||
filename_for_id = "$gdb/build/gdb/testsuite/tui-layout-asm-short-prog.S",
|
||||
m_language = language_asm, fullname = 0x0}
|
||||
(gdb) p sal.line
|
||||
$6 = 1
|
||||
...
|
||||
|
||||
The problem is the filename_for_id which is the source file prefixed with the
|
||||
compilation dir rather than the source dir.
|
||||
|
||||
This is due to faulty debug info generated by gas, PR28629:
|
||||
...
|
||||
<1a> DW_AT_name : tui-layout-asm-short-prog.S
|
||||
<1e> DW_AT_comp_dir : $gdb/build/gdb/testsuite
|
||||
<22> DW_AT_producer : GNU AS 2.35.2
|
||||
...
|
||||
|
||||
The DW_AT_name is relative, and it's relative to the DW_AT_comp_dir entry,
|
||||
making the effective name $gdb/build/gdb/testsuite/tui-layout-asm-short-prog.S.
|
||||
|
||||
The bug is fixed starting version 2.38, where we get instead:
|
||||
...
|
||||
<1a> DW_AT_name :
|
||||
$gdb/src/gdb/testsuite/gdb.tui/tui-layout-asm-short-prog.S
|
||||
<1e> DW_AT_comp_dir : $gdb/build/gdb/testsuite
|
||||
<22> DW_AT_producer : GNU AS 2.38
|
||||
...
|
||||
|
||||
Work around the faulty debug info by constructing the filename_for_id using
|
||||
the second directory from the directory table in the .debug_line header:
|
||||
...
|
||||
The Directory Table (offset 0x22, lines 2, columns 1):
|
||||
Entry Name
|
||||
0 $gdb/build/gdb/testsuite
|
||||
1 $gdb/src/gdb/testsuite/gdb.tui
|
||||
...
|
||||
|
||||
Note that the used gas contains a backport of commit 3417bfca676 ("GAS:
|
||||
DWARF-5: Ensure that the 0'th entry in the directory table contains the
|
||||
current working directory."), because directory 0 is correct. With the
|
||||
unpatched 2.35.2 release the directory 0 entry is incorrect: it's a copy of
|
||||
entry 1.
|
||||
|
||||
Add a dwarf assembly test-case that reflects the debug info as generated by
|
||||
unpatched gas 2.35.2.
|
||||
|
||||
Tested on x86_64-linux.
|
||||
|
||||
Approved-By: Tom Tromey <tom@tromey.com>
|
||||
---
|
||||
gdb/dwarf2/cu.c | 1 +
|
||||
gdb/dwarf2/cu.h | 1 +
|
||||
gdb/dwarf2/read.c | 37 +++++++-
|
||||
.../gdb.dwarf2/dw2-gas-workaround.exp | 94 +++++++++++++++++++
|
||||
4 files changed, 132 insertions(+), 1 deletion(-)
|
||||
create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-gas-workaround.exp
|
||||
|
||||
diff --git a/gdb/dwarf2/cu.c b/gdb/dwarf2/cu.c
|
||||
index 42fd4f4441b..6b5d956649f 100644
|
||||
--- a/gdb/dwarf2/cu.c
|
||||
+++ b/gdb/dwarf2/cu.c
|
||||
@@ -40,6 +40,7 @@ dwarf2_cu::dwarf2_cu (dwarf2_per_cu_data *per_cu,
|
||||
producer_is_icc_lt_14 (false),
|
||||
producer_is_codewarrior (false),
|
||||
producer_is_clang (false),
|
||||
+ producer_is_gas_lt_2_38 (false),
|
||||
producer_is_gas_2_39 (false),
|
||||
processing_has_namespace_info (false),
|
||||
load_all_dies (false)
|
||||
diff --git a/gdb/dwarf2/cu.h b/gdb/dwarf2/cu.h
|
||||
index 710aeb5b237..9b1e8775ff4 100644
|
||||
--- a/gdb/dwarf2/cu.h
|
||||
+++ b/gdb/dwarf2/cu.h
|
||||
@@ -265,6 +265,7 @@ struct dwarf2_cu
|
||||
bool producer_is_icc_lt_14 : 1;
|
||||
bool producer_is_codewarrior : 1;
|
||||
bool producer_is_clang : 1;
|
||||
+ bool producer_is_gas_lt_2_38 : 1;
|
||||
bool producer_is_gas_2_39 : 1;
|
||||
|
||||
/* When true, the file that we're processing is known to have
|
||||
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
|
||||
index 472684a5817..2339cceb829 100644
|
||||
--- a/gdb/dwarf2/read.c
|
||||
+++ b/gdb/dwarf2/read.c
|
||||
@@ -146,6 +146,8 @@ static int dwarf2_loclist_index;
|
||||
static int dwarf2_locexpr_block_index;
|
||||
static int dwarf2_loclist_block_index;
|
||||
|
||||
+static bool producer_is_gas_lt_2_38 (struct dwarf2_cu *cu);
|
||||
+
|
||||
/* Size of .debug_loclists section header for 32-bit DWARF format. */
|
||||
#define LOCLIST_HEADER_SIZE32 12
|
||||
|
||||
@@ -9663,6 +9665,27 @@ read_file_scope (struct die_info *die, struct dwarf2_cu *cu)
|
||||
|
||||
file_and_directory &fnd = find_file_and_directory (die, cu);
|
||||
|
||||
+ /* GAS supports generating dwarf-5 info starting version 2.35. Versions
|
||||
+ 2.35-2.37 generate an incorrect CU name attribute: it's relative,
|
||||
+ implicitly prefixing it with the compilation dir. Work around this by
|
||||
+ prefixing it with the source dir instead. */
|
||||
+ if (cu->header.version == 5 && !IS_ABSOLUTE_PATH (fnd.get_name ())
|
||||
+ && producer_is_gas_lt_2_38 (cu))
|
||||
+ {
|
||||
+ attr = dwarf2_attr (die, DW_AT_stmt_list, cu);
|
||||
+ if (attr != nullptr && attr->form_is_unsigned ())
|
||||
+ {
|
||||
+ 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))
|
||||
+ {
|
||||
+ std::string dir = lh->include_dir_at (1);
|
||||
+ fnd.set_comp_dir (std::move (dir));
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
cu->start_compunit_symtab (fnd.get_name (), fnd.intern_comp_dir (objfile),
|
||||
lowpc);
|
||||
|
||||
@@ -13377,7 +13400,10 @@ check_producer (struct dwarf2_cu *cu)
|
||||
else if (producer_is_clang (cu->producer, &major, &minor))
|
||||
cu->producer_is_clang = true;
|
||||
else if (producer_is_gas (cu->producer, &major, &minor))
|
||||
- cu->producer_is_gas_2_39 = major == 2 && minor == 39;
|
||||
+ {
|
||||
+ cu->producer_is_gas_lt_2_38 = major < 2 || (major == 2 && minor < 38);
|
||||
+ cu->producer_is_gas_2_39 = major == 2 && minor == 39;
|
||||
+ }
|
||||
else
|
||||
{
|
||||
/* For other non-GCC compilers, expect their behavior is DWARF version
|
||||
@@ -13413,6 +13439,15 @@ producer_is_codewarrior (struct dwarf2_cu *cu)
|
||||
return cu->producer_is_codewarrior;
|
||||
}
|
||||
|
||||
+static bool
|
||||
+producer_is_gas_lt_2_38 (struct dwarf2_cu *cu)
|
||||
+{
|
||||
+ if (!cu->checked_producer)
|
||||
+ check_producer (cu);
|
||||
+
|
||||
+ return cu->producer_is_gas_lt_2_38;
|
||||
+}
|
||||
+
|
||||
static bool
|
||||
producer_is_gas_2_39 (struct dwarf2_cu *cu)
|
||||
{
|
||||
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-gas-workaround.exp b/gdb/testsuite/gdb.dwarf2/dw2-gas-workaround.exp
|
||||
new file mode 100644
|
||||
index 00000000000..416778f51b7
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.dwarf2/dw2-gas-workaround.exp
|
||||
@@ -0,0 +1,94 @@
|
||||
+# Copyright 2023 Free Software Foundation, Inc.
|
||||
+
|
||||
+# This program is free software; you can redistribute it and/or modify
|
||||
+# it under the terms of the GNU General Public License as published by
|
||||
+# the Free Software Foundation; either version 3 of the License, or
|
||||
+# (at your option) any later version.
|
||||
+#
|
||||
+# This program is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+# GNU General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU General Public License
|
||||
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
+
|
||||
+# Test line number information in various configurations.
|
||||
+
|
||||
+load_lib dwarf.exp
|
||||
+
|
||||
+# This test can only be run on targets which support DWARF-2 and use gas.
|
||||
+if { ![dwarf2_support] } {
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+standard_testfile dw2-lines.c -dw2.S
|
||||
+
|
||||
+with_shared_gdb {
|
||||
+ set func_info_vars [get_func_info bar]
|
||||
+}
|
||||
+
|
||||
+# Helper function.
|
||||
+proc line_for { l } {
|
||||
+ global srcfile
|
||||
+ set line [gdb_get_line_number "$l:" $srcfile]
|
||||
+ 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
|
||||
+ }
|
||||
+
|
||||
+ 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}
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ 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
|
||||
+
|
||||
+ DW_LNE_set_address bar_label_2
|
||||
+ DW_LNE_end_sequence
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+if { [prepare_for_testing "failed to prepare" ${testfile} \
|
||||
+ [list $srcfile $asm_file] {nodebug}] } {
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+gdb_test_no_output "set debug symtab-create 1"
|
||||
+gdb_test_multiple "ptype bar" "" {
|
||||
+ -re -wrap "$objdir.*" {
|
||||
+ fail $gdb_test_name
|
||||
+ }
|
||||
+ -re -wrap "" {
|
||||
+ pass $gdb_test_name
|
||||
+ }
|
||||
+}
|
||||
--
|
||||
2.35.3
|
||||
|
255
gdb-symtab-work-around-pr-gas-29517.patch
Normal file
255
gdb-symtab-work-around-pr-gas-29517.patch
Normal file
@ -0,0 +1,255 @@
|
||||
From 92a5f5ae1b71d152d943ee896bf6cd073d50daa7 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Thu, 28 Sep 2023 13:55:07 +0200
|
||||
Subject: [PATCH 02/12] [gdb/symtab] Work around PR gas/29517
|
||||
|
||||
When using glibc debuginfo generated with gas 2.39, we run into PR gas/29517:
|
||||
...
|
||||
$ gdb -q -batch a.out -ex start -ex "p (char *)strstr (\"haha\", \"ah\")"
|
||||
Temporary breakpoint 1 at 0x40051b: file hello.c, line 6.
|
||||
|
||||
Temporary breakpoint 1, main () at hello.c:6
|
||||
6 printf ("hello\n");
|
||||
Invalid cast.
|
||||
...
|
||||
while without glibc debuginfo installed we get the expected result:
|
||||
...
|
||||
$n = 0x7ffff7daa1b1 "aha"
|
||||
...
|
||||
and likewise with glibc debuginfo generated with gas 2.40.
|
||||
|
||||
The strstr ifunc resolves to __strstr_sse2_unaligned. The problem is that gas
|
||||
generates dwarf that states that the return type is void:
|
||||
...
|
||||
<1><3e1e58>: Abbrev Number: 2 (DW_TAG_subprogram)
|
||||
<3e1e59> DW_AT_name : __strstr_sse2_unaligned
|
||||
<3e1e5d> DW_AT_external : 1
|
||||
<3e1e5e> DW_AT_low_pc : 0xbbd2e
|
||||
<3e1e66> DW_AT_high_pc : 0xbc1c3
|
||||
...
|
||||
while the return type should be a DW_TAG_unspecified_type, as is the case
|
||||
with gas 2.40.
|
||||
|
||||
We can still use the workaround of casting to another function type for both
|
||||
__strstr_sse2_unaligned:
|
||||
...
|
||||
(gdb) p ((char * (*) (const char *, const char *))__strstr_sse2_unaligned) \
|
||||
("haha", "ah")
|
||||
$n = 0x7ffff7daa211 "aha"
|
||||
...
|
||||
and strstr (which requires using *strstr to dereference the ifunc before we
|
||||
cast):
|
||||
...
|
||||
gdb) p ((char * (*) (const char *, const char *))*strstr) ("haha", "ah")
|
||||
$n = 0x7ffff7daa251 "aha"
|
||||
...
|
||||
but that's a bit cumbersome to use.
|
||||
|
||||
Work around this in the dwarf reader, such that we have instead:
|
||||
...
|
||||
(gdb) p (char *)strstr ("haha", "ah")
|
||||
$n = 0x7ffff7daa1b1 "aha"
|
||||
...
|
||||
|
||||
This also requires fixing producer_is_gcc to stop returning true for
|
||||
producer "GNU AS 2.39.0".
|
||||
|
||||
Tested on x86_64-linux.
|
||||
|
||||
PR symtab/30911
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30911
|
||||
---
|
||||
gdb/dwarf2/cu.c | 1 +
|
||||
gdb/dwarf2/cu.h | 1 +
|
||||
gdb/dwarf2/read.c | 22 ++++++++++++
|
||||
gdb/producer.c | 8 ++++-
|
||||
.../gdb.dwarf2/dw2-unspecified-type.c | 9 ++++-
|
||||
.../gdb.dwarf2/dw2-unspecified-type.exp | 36 +++++++++++++++----
|
||||
6 files changed, 68 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/gdb/dwarf2/cu.c b/gdb/dwarf2/cu.c
|
||||
index 9c1691c90e9..42fd4f4441b 100644
|
||||
--- a/gdb/dwarf2/cu.c
|
||||
+++ b/gdb/dwarf2/cu.c
|
||||
@@ -40,6 +40,7 @@ dwarf2_cu::dwarf2_cu (dwarf2_per_cu_data *per_cu,
|
||||
producer_is_icc_lt_14 (false),
|
||||
producer_is_codewarrior (false),
|
||||
producer_is_clang (false),
|
||||
+ producer_is_gas_2_39 (false),
|
||||
processing_has_namespace_info (false),
|
||||
load_all_dies (false)
|
||||
{
|
||||
diff --git a/gdb/dwarf2/cu.h b/gdb/dwarf2/cu.h
|
||||
index e8dbde9c019..710aeb5b237 100644
|
||||
--- a/gdb/dwarf2/cu.h
|
||||
+++ b/gdb/dwarf2/cu.h
|
||||
@@ -265,6 +265,7 @@ struct dwarf2_cu
|
||||
bool producer_is_icc_lt_14 : 1;
|
||||
bool producer_is_codewarrior : 1;
|
||||
bool producer_is_clang : 1;
|
||||
+ bool producer_is_gas_2_39 : 1;
|
||||
|
||||
/* When true, the file that we're processing is known to have
|
||||
debugging info for C++ namespaces. GCC 3.3.x did not produce
|
||||
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
|
||||
index b9e7e18f2a6..f39eba7a008 100644
|
||||
--- a/gdb/dwarf2/read.c
|
||||
+++ b/gdb/dwarf2/read.c
|
||||
@@ -13370,6 +13370,8 @@ check_producer (struct dwarf2_cu *cu)
|
||||
cu->producer_is_codewarrior = true;
|
||||
else if (producer_is_clang (cu->producer, &major, &minor))
|
||||
cu->producer_is_clang = true;
|
||||
+ else if (startswith (cu->producer, "GNU AS 2.39.0"))
|
||||
+ cu->producer_is_gas_2_39 = true;
|
||||
else
|
||||
{
|
||||
/* For other non-GCC compilers, expect their behavior is DWARF version
|
||||
@@ -13405,6 +13407,15 @@ producer_is_codewarrior (struct dwarf2_cu *cu)
|
||||
return cu->producer_is_codewarrior;
|
||||
}
|
||||
|
||||
+static bool
|
||||
+producer_is_gas_2_39 (struct dwarf2_cu *cu)
|
||||
+{
|
||||
+ if (!cu->checked_producer)
|
||||
+ check_producer (cu);
|
||||
+
|
||||
+ return cu->producer_is_gas_2_39;
|
||||
+}
|
||||
+
|
||||
/* Return the accessibility of DIE, as given by DW_AT_accessibility.
|
||||
If that attribute is not available, return the appropriate
|
||||
default. */
|
||||
@@ -16581,6 +16592,17 @@ read_subroutine_type (struct die_info *die, struct dwarf2_cu *cu)
|
||||
|
||||
type = die_type (die, cu);
|
||||
|
||||
+ if (type->code () == TYPE_CODE_VOID
|
||||
+ && !type->is_stub ()
|
||||
+ && die->child == nullptr
|
||||
+ && producer_is_gas_2_39 (cu))
|
||||
+ {
|
||||
+ /* Work around PR gas/29517, pretend we have an DW_TAG_unspecified_type
|
||||
+ return type. */
|
||||
+ type = init_type (cu->per_objfile->objfile, TYPE_CODE_VOID, 0, NULL);
|
||||
+ type->set_is_stub (true);
|
||||
+ }
|
||||
+
|
||||
/* The die_type call above may have already set the type for this DIE. */
|
||||
ftype = get_die_type (die, cu);
|
||||
if (ftype)
|
||||
diff --git a/gdb/producer.c b/gdb/producer.c
|
||||
index 655eb971283..9fcf749e3d4 100644
|
||||
--- a/gdb/producer.c
|
||||
+++ b/gdb/producer.c
|
||||
@@ -54,13 +54,19 @@ producer_is_gcc (const char *producer, int *major, int *minor)
|
||||
if (minor == NULL)
|
||||
minor = &min;
|
||||
|
||||
+ /* Skip GNU. */
|
||||
+ cs = &producer[strlen ("GNU ")];
|
||||
+
|
||||
+ /* Bail out for GNU AS. */
|
||||
+ if (startswith (cs, "AS "))
|
||||
+ return 0;
|
||||
+
|
||||
/* Skip any identifier after "GNU " - such as "C11" "C++" or "Java".
|
||||
A full producer string might look like:
|
||||
"GNU C 4.7.2"
|
||||
"GNU Fortran 4.8.2 20140120 (Red Hat 4.8.2-16) -mtune=generic ..."
|
||||
"GNU C++14 5.0.0 20150123 (experimental)"
|
||||
*/
|
||||
- cs = &producer[strlen ("GNU ")];
|
||||
while (*cs && !isspace (*cs))
|
||||
cs++;
|
||||
if (*cs && isspace (*cs))
|
||||
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type.c b/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type.c
|
||||
index 1df09214d4a..e07d9517ff2 100644
|
||||
--- a/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type.c
|
||||
+++ b/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type.c
|
||||
@@ -17,9 +17,16 @@
|
||||
|
||||
extern int foo (void);
|
||||
|
||||
+int
|
||||
+bar (void)
|
||||
+{
|
||||
+ asm ("bar_label: .globl bar_label");
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
- int res = foo ();
|
||||
+ int res = foo () + bar ();
|
||||
return res;
|
||||
}
|
||||
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type.exp b/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type.exp
|
||||
index a353395592e..bd707204fba 100644
|
||||
--- a/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type.exp
|
||||
+++ b/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type.exp
|
||||
@@ -29,10 +29,18 @@ lassign $foo_res \
|
||||
foo_start foo_len
|
||||
set foo_end "$foo_start + $foo_len"
|
||||
|
||||
+set bar_res \
|
||||
+ [function_range bar \
|
||||
+ [list ${srcdir}/${subdir}/$srcfile ${srcdir}/${subdir}/$srcfile2]]
|
||||
+lassign $bar_res \
|
||||
+ bar_start bar_len
|
||||
+set bar_end "$bar_start + $bar_len"
|
||||
+
|
||||
# Create the DWARF.
|
||||
set asm_file [standard_output_file $srcfile3]
|
||||
Dwarf::assemble $asm_file {
|
||||
global foo_start foo_end
|
||||
+ global bar_start bar_end
|
||||
declare_labels unspecified_type_label
|
||||
|
||||
cu {} {
|
||||
@@ -47,7 +55,19 @@ Dwarf::assemble $asm_file {
|
||||
{high_pc $foo_end addr}
|
||||
{type :$unspecified_type_label}
|
||||
}
|
||||
+ }
|
||||
+ }
|
||||
|
||||
+ cu {} {
|
||||
+ compile_unit {
|
||||
+ {language @DW_LANG_Mips_Assembler}
|
||||
+ {producer "GNU AS 2.39.0"}
|
||||
+ } {
|
||||
+ DW_TAG_subprogram {
|
||||
+ {name bar}
|
||||
+ {low_pc $bar_start addr}
|
||||
+ {high_pc $bar_end addr}
|
||||
+ }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -61,12 +81,14 @@ if ![runto_main] {
|
||||
return -1
|
||||
}
|
||||
|
||||
-# Print the function type. Return type should be stub type, which is printed
|
||||
-# as void.
|
||||
-gdb_test "ptype foo" "type = void \\(void\\)"
|
||||
+foreach f {foo bar} {
|
||||
+ # Print the function type. Return type should be stub type, which is printed
|
||||
+ # as void.
|
||||
+ gdb_test "ptype $f" "type = void \\(void\\)"
|
||||
|
||||
-# Call the function, casting the function to the correct function type.
|
||||
-gdb_test "p ((int (*) ()) foo) ()" " = 0"
|
||||
+ # Call the function, casting the function to the correct function type.
|
||||
+ gdb_test "p ((int (*) ()) $f) ()" " = 0"
|
||||
|
||||
-# Call the function, casting the function result to the correct type.
|
||||
-gdb_test "p (int) foo ()" " = 0"
|
||||
+ # Call the function, casting the function result to the correct type.
|
||||
+ gdb_test "p (int) $f ()" " = 0"
|
||||
+}
|
||||
--
|
||||
2.35.3
|
||||
|
86
gdb-tdep-fix-nr-array-elements-in-ppc64_aggregate_ca.patch
Normal file
86
gdb-tdep-fix-nr-array-elements-in-ppc64_aggregate_ca.patch
Normal file
@ -0,0 +1,86 @@
|
||||
From 3f0c512dc37dbede372a018732d315726a56d10e Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Wed, 1 Nov 2023 08:07:15 +0100
|
||||
Subject: [PATCH] [gdb/tdep] Fix nr array elements in ppc64_aggregate_candidate
|
||||
|
||||
On AlmaLinux 9.2 powerpc64le I run into:
|
||||
...
|
||||
(gdb) PASS: gdb.ada/array_return.exp: continuing to Create_Small_Float_Vector
|
||||
finish^M
|
||||
Run till exit from #0 pck.create_small_float_vector () at pck.adb:30^M
|
||||
0x00000000100022d4 in p () at p.adb:25^M
|
||||
25 Vector := Create_Small_Float_Vector;^M
|
||||
Value returned is $3 = (2.80259693e-45, 2.80259693e-45)^M
|
||||
(gdb) FAIL: gdb.ada/array_return.exp: value printed by finish of Create_Small_Float_Vector
|
||||
...
|
||||
while this is expected:
|
||||
...
|
||||
Value returned is $3 = (4.25, 4.25)^M
|
||||
...
|
||||
|
||||
The problem is here in ppc64_aggregate_candidate:
|
||||
...
|
||||
if (!get_array_bounds (type, &low_bound, &high_bound))
|
||||
return -1;
|
||||
count *= high_bound - low_bound
|
||||
...
|
||||
|
||||
The array type (containing 2 elements) is:
|
||||
...
|
||||
type Small_Float_Vector is array (1 .. 2) of Float;
|
||||
...
|
||||
so we have:
|
||||
...
|
||||
(gdb) p low_bound
|
||||
$1 = 1
|
||||
(gdb) p high_bound
|
||||
$2 = 2
|
||||
...
|
||||
but we calculate the number of elements in the array using
|
||||
"high_bound - low_bound", which is 1.
|
||||
|
||||
Consequently, gdb fails to correctly classify the type as a ELFv2 homogeneous
|
||||
aggregate.
|
||||
|
||||
Fix this by calculating the number of elements in the array by using
|
||||
"high_bound - low_bound + 1" instead.
|
||||
|
||||
Furthermore, high_bound can (in general, though perhaps not here) be also be
|
||||
smaller than low_bound, so to be safe take that into account as well:
|
||||
...
|
||||
LONGEST nr_array_elements = (low_bound > high_bound
|
||||
? 0
|
||||
: (high_bound - low_bound + 1));
|
||||
count *= nr_array_elements;
|
||||
...
|
||||
|
||||
Tested on powerpc64le-linux.
|
||||
|
||||
PR tdep/31015
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31015
|
||||
---
|
||||
gdb/ppc-sysv-tdep.c | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/gdb/ppc-sysv-tdep.c b/gdb/ppc-sysv-tdep.c
|
||||
index 9cea63307e6..dc89201eed2 100644
|
||||
--- a/gdb/ppc-sysv-tdep.c
|
||||
+++ b/gdb/ppc-sysv-tdep.c
|
||||
@@ -1126,7 +1126,11 @@ ppc64_aggregate_candidate (struct type *type,
|
||||
|
||||
if (!get_array_bounds (type, &low_bound, &high_bound))
|
||||
return -1;
|
||||
- count *= high_bound - low_bound;
|
||||
+
|
||||
+ LONGEST nr_array_elements = (low_bound > high_bound
|
||||
+ ? 0
|
||||
+ : (high_bound - low_bound + 1));
|
||||
+ count *= nr_array_elements;
|
||||
|
||||
/* There must be no padding. */
|
||||
if (count == 0)
|
||||
|
||||
base-commit: b1136560e772dd4c74f1fbb41f6ba840b92fb9d6
|
||||
--
|
||||
2.35.3
|
||||
|
108
gdb-testsuite-add-kfail-for-pr-ada-30908.patch
Normal file
108
gdb-testsuite-add-kfail-for-pr-ada-30908.patch
Normal file
@ -0,0 +1,108 @@
|
||||
From 0b29bc75761b11387f89912ce827311b8eac18a6 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Sun, 1 Oct 2023 15:10:32 +0200
|
||||
Subject: [PATCH 04/12] [gdb/testsuite] Add KFAIL for PR ada/30908
|
||||
|
||||
With gcc 13.2.1, I run into a cluster of fails:
|
||||
...
|
||||
FAIL: gdb.ada/str_binop_equal.exp: print my_str = "ABCD"
|
||||
FAIL: gdb.ada/widewide.exp: print my_wws = " helo"
|
||||
FAIL: gdb.ada/widewide.exp: print my_ws = "wide"
|
||||
...
|
||||
|
||||
The problem is that the debug info contains information about function
|
||||
ada.strings.maps."=", and gdb uses it to implement the comparison.
|
||||
The function is supposed to compare two char sets, not strings, so gdb
|
||||
shouldn't use it. This is PR ada/30908.
|
||||
|
||||
I don't see the same problem with gcc 7.5.0, because the exec doesn't contain
|
||||
the debug info for the function, because the corresponding object is not
|
||||
linked in. Adter adding "with Ada.Strings.Maps; use Ada.Strings.Maps;" to
|
||||
gdb.ada/widewide/foo.adb I run into the same problem with gcc 7.5.0.
|
||||
|
||||
Add KFAILs for the PR.
|
||||
|
||||
Tested on x86_64-linux:
|
||||
- openSUSE Leap 15.4 (using gcc 7.5.0), and
|
||||
- openSUSE Tumbleweed (using gcc 13.2.1).
|
||||
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30908
|
||||
---
|
||||
gdb/testsuite/gdb.ada/str_binop_equal.exp | 20 ++++++++++++++--
|
||||
gdb/testsuite/gdb.ada/widewide.exp | 28 +++++++++++++++++++++--
|
||||
2 files changed, 44 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/gdb/testsuite/gdb.ada/str_binop_equal.exp b/gdb/testsuite/gdb.ada/str_binop_equal.exp
|
||||
index 5eb531c1453..2c1b8414c5c 100644
|
||||
--- a/gdb/testsuite/gdb.ada/str_binop_equal.exp
|
||||
+++ b/gdb/testsuite/gdb.ada/str_binop_equal.exp
|
||||
@@ -31,8 +31,24 @@ runto "foo_p211_061.adb:$bp_location"
|
||||
gdb_test "print my_str = my_str" \
|
||||
" = true"
|
||||
|
||||
-gdb_test "print my_str = \"ABCD\"" \
|
||||
- " = true"
|
||||
+set kfail_re \
|
||||
+ [multi_line \
|
||||
+ [string_to_regexp {Symbol: ada.strings.maps."="}] \
|
||||
+ ".*" \
|
||||
+ "\\$$decimal = false"]
|
||||
+
|
||||
+gdb_test_no_output "set debug expr 1"
|
||||
+
|
||||
+gdb_test_multiple {print my_str = "ABCD"} "" {
|
||||
+ -re -wrap " = true" {
|
||||
+ pass $gdb_test_name
|
||||
+ }
|
||||
+ -re -wrap $kfail_re {
|
||||
+ kfail ada/30908 $gdb_test_name
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+gdb_test "set debug expr 0"
|
||||
|
||||
gdb_test "print my_str = \"EFGH\"" \
|
||||
" = false"
|
||||
diff --git a/gdb/testsuite/gdb.ada/widewide.exp b/gdb/testsuite/gdb.ada/widewide.exp
|
||||
index 5de5d52b8cb..b91b6bc746b 100644
|
||||
--- a/gdb/testsuite/gdb.ada/widewide.exp
|
||||
+++ b/gdb/testsuite/gdb.ada/widewide.exp
|
||||
@@ -42,9 +42,33 @@ gdb_test "print my_wws(1)" "= 32 ' '"
|
||||
|
||||
gdb_test "print my_wws(2)" "= 104 'h'"
|
||||
|
||||
-gdb_test "print my_wws = \" helo\"" " = true"
|
||||
+set kfail_re \
|
||||
+ [multi_line \
|
||||
+ [string_to_regexp {Symbol: ada.strings.maps."="}] \
|
||||
+ ".*" \
|
||||
+ "\\$$decimal = false"]
|
||||
+
|
||||
+gdb_test_no_output "set debug expr 1"
|
||||
+
|
||||
+gdb_test_multiple {print my_wws = " helo"} "" {
|
||||
+ -re -wrap " = true" {
|
||||
+ pass $gdb_test_name
|
||||
+ }
|
||||
+ -re -wrap $kfail_re {
|
||||
+ kfail ada/30908 $gdb_test_name
|
||||
+ }
|
||||
+}
|
||||
+gdb_test_multiple {print my_ws = "wide"} "" {
|
||||
+ -re -wrap " = true" {
|
||||
+ pass $gdb_test_name
|
||||
+ }
|
||||
+ -re -wrap $kfail_re {
|
||||
+ kfail ada/30908 $gdb_test_name
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+gdb_test "set debug expr 0"
|
||||
|
||||
-gdb_test "print my_ws = \"wide\"" " = true"
|
||||
gdb_test "print my_ws = \"nope\"" " = false"
|
||||
|
||||
gdb_test "print \"x\" & my_ws & \"y\"" " = \"xwidey\""
|
||||
--
|
||||
2.35.3
|
||||
|
49
gdb-testsuite-add-wait_for_msg-arg-to-term-resize-fi.patch
Normal file
49
gdb-testsuite-add-wait_for_msg-arg-to-term-resize-fi.patch
Normal file
@ -0,0 +1,49 @@
|
||||
From 028d19e262b4086bc266b2657edd566bb4757927 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Mon, 13 Nov 2023 11:33:23 +0100
|
||||
Subject: [PATCH 5/6] [gdb/testsuite] Add wait_for_msg arg to Term::resize fix
|
||||
|
||||
From commit deb1ba4e38b ("[gdb/tui] Fix TUI resizing for TERM=ansi").
|
||||
|
||||
Required for "[gdb/tui] Fix resizing of terminal to 1 or 2 lines".
|
||||
---
|
||||
gdb/testsuite/lib/tuiterm.exp | 10 +++++++---
|
||||
1 file changed, 7 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/gdb/testsuite/lib/tuiterm.exp b/gdb/testsuite/lib/tuiterm.exp
|
||||
index 591c4ca9c4c..eaac09581e9 100644
|
||||
--- a/gdb/testsuite/lib/tuiterm.exp
|
||||
+++ b/gdb/testsuite/lib/tuiterm.exp
|
||||
@@ -1066,7 +1066,7 @@ namespace eval Term {
|
||||
}
|
||||
}
|
||||
|
||||
- proc resize {rows cols} {
|
||||
+ proc resize {rows cols {wait_for_msg 1}} {
|
||||
variable _rows
|
||||
variable _cols
|
||||
variable _resize_count
|
||||
@@ -1080,14 +1080,18 @@ namespace eval Term {
|
||||
# Due to the strange column resizing behavior, and because we
|
||||
# don't care about this intermediate resize, we don't check
|
||||
# the size here.
|
||||
- wait_for "@@ resize done $_resize_count"
|
||||
+ if { $wait_for_msg } {
|
||||
+ wait_for "@@ resize done $_resize_count"
|
||||
+ }
|
||||
incr _resize_count
|
||||
# Somehow the number of columns transmitted to gdb is one less
|
||||
# than what we request from expect. We hide this weird
|
||||
# details from the caller.
|
||||
_do_resize $_rows $cols
|
||||
stty columns [expr {$_cols + 1}] < $::gdb_tty_name
|
||||
- wait_for "@@ resize done $_resize_count, size = ${_cols}x${rows}"
|
||||
+ if { $wait_for_msg } {
|
||||
+ wait_for "@@ resize done $_resize_count, size = ${_cols}x${rows}"
|
||||
+ }
|
||||
incr _resize_count
|
||||
}
|
||||
}
|
||||
--
|
||||
2.35.3
|
||||
|
65
gdb-testsuite-add-xfail-for-gdb-29965-in-gdb.threads.patch
Normal file
65
gdb-testsuite-add-xfail-for-gdb-29965-in-gdb.threads.patch
Normal file
@ -0,0 +1,65 @@
|
||||
From ebceffa1196651683a7a6d31abb4b3b5adc6c168 Mon Sep 17 00:00:00 2001
|
||||
From: Simon Marchi <simon.marchi@efficios.com>
|
||||
Date: Thu, 7 Sep 2023 21:53:55 -0400
|
||||
Subject: [PATCH 12/12] gdb/testsuite: add xfail for gdb/29965 in
|
||||
gdb.threads/process-exit-status-is-leader-exit-status.exp
|
||||
|
||||
Bug 29965 shows on a Linux kernel >= 6.1, that test fails consistently
|
||||
with:
|
||||
|
||||
FAIL: gdb.threads/process-exit-status-is-leader-exit-status.exp: iteration=0: continue (the program exited)
|
||||
...
|
||||
FAIL: gdb.threads/process-exit-status-is-leader-exit-status.exp: iteration=9: continue (the program exited)
|
||||
|
||||
This is due to a change in Linux kernel behavior [1] that affects
|
||||
exactly what this test tests. That is, if multiple threads (including
|
||||
the leader) call SYS_exit, the exit status of the process should be the
|
||||
exit status of the leader. After that change in the kernel, it is no
|
||||
longer the case.
|
||||
|
||||
Add an xfail in the test, based on the Linux kernel version. The goal
|
||||
is that if a regression is introduced in GDB regarding this feature, it
|
||||
should be caught if running on an older kernel where the behavior was
|
||||
consistent.
|
||||
|
||||
[1] https://bugzilla.suse.com/show_bug.cgi?id=1206926
|
||||
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29965
|
||||
Change-Id: If6ab7171c92bfc1a3b961c7179e26611773969eb
|
||||
Approved-By: Tom de Vries <tdevries@suse.de>
|
||||
---
|
||||
...cess-exit-status-is-leader-exit-status.exp | 19 ++++++++++++++++++-
|
||||
1 file changed, 18 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/gdb/testsuite/gdb.threads/process-exit-status-is-leader-exit-status.exp b/gdb/testsuite/gdb.threads/process-exit-status-is-leader-exit-status.exp
|
||||
index f64d6a73dea..e470fe29110 100644
|
||||
--- a/gdb/testsuite/gdb.threads/process-exit-status-is-leader-exit-status.exp
|
||||
+++ b/gdb/testsuite/gdb.threads/process-exit-status-is-leader-exit-status.exp
|
||||
@@ -41,6 +41,23 @@ for {set iteration 0} {$iteration < 10} {incr iteration} {
|
||||
return
|
||||
}
|
||||
|
||||
- gdb_test "continue" "\\\[Inferior 1 \\(.*\\) exited with code 01\\\]"
|
||||
+ gdb_test_multiple "continue" "" {
|
||||
+ -re -wrap "\\\[Inferior 1 \\(.*\\) exited with code 01\\\]" {
|
||||
+ pass $gdb_test_name
|
||||
+ }
|
||||
+
|
||||
+ -re -wrap "\\\[Inferior 1 \\(.*\\) exited with code $::decimal\\\]" {
|
||||
+ set lkv [linux_kernel_version]
|
||||
+
|
||||
+ if { [llength $lkv] != 0 } {
|
||||
+ if { [version_compare {6 1 0} <= $lkv] } {
|
||||
+ xfail "$gdb_test_name (PR 29965)"
|
||||
+ return
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ fail $gdb_test_name
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
}
|
||||
--
|
||||
2.35.3
|
||||
|
64
gdb-testsuite-fix-gdb.ada-mi_task_arg.exp-with-newer.patch
Normal file
64
gdb-testsuite-fix-gdb.ada-mi_task_arg.exp-with-newer.patch
Normal file
@ -0,0 +1,64 @@
|
||||
From ad1be044276c4727434f84ac6c554da4f2829aaf Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Tue, 26 Sep 2023 18:57:49 +0200
|
||||
Subject: [PATCH 05/12] [gdb/testsuite] Fix gdb.ada/mi_task_arg.exp with newer
|
||||
gcc
|
||||
|
||||
When running test-case gdb.ada/mi_task_arg.exp on openSUSE Tumbleweed using
|
||||
gcc 13.2.1, I run into (layout adapted for readability):
|
||||
...
|
||||
-stack-list-arguments 1^M
|
||||
^done,stack-args=[
|
||||
frame={level="0",args=[]},
|
||||
frame={level="1",args=[{name="<_task>",value="0x464820"},
|
||||
{name="<_taskL>",value="129"}]},
|
||||
frame={level="2",args=[{name="self_id",value="0x464840"}]},
|
||||
frame={level="3",args=[]},
|
||||
frame={level="4",args=[]}
|
||||
]^M
|
||||
(gdb) ^M
|
||||
FAIL: gdb.ada/mi_task_arg.exp: -stack-list-arguments 1 (unexpected output)
|
||||
...
|
||||
|
||||
On openSUSE Leap 15.4 with gcc 7.5.0 I get instead:
|
||||
...
|
||||
-stack-list-arguments 1^M
|
||||
^done,stack-args=[
|
||||
frame={level="0",args=[]},
|
||||
frame={level="1",args=[{name="<_task>",value="0x444830"}]},
|
||||
frame={level="2",args=[{name="self_id",value="0x444850"}]},
|
||||
frame={level="3",args=[]},
|
||||
frame={level="4",args=[]}]^M
|
||||
(gdb) ^M
|
||||
PASS: gdb.ada/mi_task_arg.exp: -stack-list-arguments 1
|
||||
...
|
||||
|
||||
The difference in gdb output is due to difference in the dwarf generated by
|
||||
the compiler, so I don't see a problem with gdb here.
|
||||
|
||||
Fix this by updating the test-case to accept this output.
|
||||
|
||||
Tested on x86_64-linux.
|
||||
|
||||
Approved-By: Tom Tromey <tom@tromey.com>
|
||||
---
|
||||
gdb/testsuite/gdb.ada/mi_task_arg.exp | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/gdb/testsuite/gdb.ada/mi_task_arg.exp b/gdb/testsuite/gdb.ada/mi_task_arg.exp
|
||||
index ffee40ad044..2820f2d3722 100644
|
||||
--- a/gdb/testsuite/gdb.ada/mi_task_arg.exp
|
||||
+++ b/gdb/testsuite/gdb.ada/mi_task_arg.exp
|
||||
@@ -49,7 +49,8 @@ if {![mi_runto "task_switch.break_me"]} {
|
||||
set frame0 "frame=\{level=\"0\",args=\\\[\\\]\}"
|
||||
# Frame for task_switch.caller
|
||||
set frame1_args "\{name=\"<_task>\",value=\"$hex\"\}"
|
||||
-set frame1 "frame=\{level=\"1\",args=\\\[$frame1_args\\\]\}"
|
||||
+set frame1_opt_args "\{name=\"<_taskL>\",value=\"$decimal\"\}"
|
||||
+set frame1 "frame=\{level=\"1\",args=\\\[${frame1_args}(,$frame1_opt_args)?\\\]\}"
|
||||
# Frame for system.tasking.stages.task_wrapper
|
||||
set frame2_args "(\{name=\"self_id\",value=\"($hex|<optimized out>)\"\})?"
|
||||
set frame2 "frame=\{level=\"2\",args=\\\[$frame2_args\\\]\}"
|
||||
--
|
||||
2.35.3
|
||||
|
91
gdb-testsuite-fix-gdb.arch-i386-signal.exp-on-x86_64.patch
Normal file
91
gdb-testsuite-fix-gdb.arch-i386-signal.exp-on-x86_64.patch
Normal file
@ -0,0 +1,91 @@
|
||||
From ef58dedc82b17919360bf51f7efcbf6d74c11329 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Sun, 1 Oct 2023 13:00:23 +0200
|
||||
Subject: [PATCH 01/12] [gdb/testsuite] Fix gdb.arch/i386-signal.exp on x86_64
|
||||
|
||||
On x86_64-linux, with test-case gdb.arch/i386-signal.exp I run into:
|
||||
...
|
||||
builtin_spawn -ignore SIGHUP gcc -fno-stack-protector i386-signal.c \
|
||||
-fdiagnostics-color=never -fno-pie -g -no-pie -lm -o i386-signal^M
|
||||
/tmp/cc2xydTG.s: Assembler messages:^M
|
||||
/tmp/cc2xydTG.s:50: Error: operand size mismatch for `push'^M
|
||||
compiler exited with status 1
|
||||
output is:
|
||||
/tmp/cc2xydTG.s: Assembler messages:^M
|
||||
/tmp/cc2xydTG.s:50: Error: operand size mismatch for `push'^M
|
||||
|
||||
gdb compile failed, /tmp/cc2xydTG.s: Assembler messages:
|
||||
/tmp/cc2xydTG.s:50: Error: operand size mismatch for `push'
|
||||
UNTESTED: gdb.arch/i386-signal.exp: failed to compile
|
||||
...
|
||||
|
||||
This is with gas 2.41, it compiles without problems with gas 2.40. Some more
|
||||
strict checking was added in commit 5cc007751cd ("x86: further adjust
|
||||
extend-to-32bit-address conditions").
|
||||
|
||||
The offending bit is:
|
||||
...
|
||||
" push $sigframe\n"
|
||||
...
|
||||
which refers to a function:
|
||||
...
|
||||
" .globl sigframe\n"
|
||||
"sigframe:\n"
|
||||
...
|
||||
|
||||
The test-case passes with target board unix/-m32.
|
||||
|
||||
Make the test-case work by using pushq instead of push for the
|
||||
is_amd64_regs_target case.
|
||||
|
||||
Tested on x86_64-linux, with target boards:
|
||||
- unix/-m64 (is_amd64_regs_target == 1), and
|
||||
- unix/-m32 (is_amd64_regs_target == 0),
|
||||
|
||||
PR testsuite/30928
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30928
|
||||
---
|
||||
gdb/testsuite/gdb.arch/i386-signal.c | 4 ++++
|
||||
gdb/testsuite/gdb.arch/i386-signal.exp | 7 ++++++-
|
||||
2 files changed, 10 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/gdb/testsuite/gdb.arch/i386-signal.c b/gdb/testsuite/gdb.arch/i386-signal.c
|
||||
index 19bb1bbaaf8..4bf97e5f159 100644
|
||||
--- a/gdb/testsuite/gdb.arch/i386-signal.c
|
||||
+++ b/gdb/testsuite/gdb.arch/i386-signal.c
|
||||
@@ -45,7 +45,11 @@ asm(".text\n"
|
||||
" .align 8\n"
|
||||
" .globl setup\n"
|
||||
"setup:\n"
|
||||
+#if IS_AMD64_REGS_TARGET
|
||||
+ " pushq $sigframe\n"
|
||||
+#else
|
||||
" push $sigframe\n"
|
||||
+#endif
|
||||
" jmp func\n"
|
||||
"\n"
|
||||
" .cfi_startproc\n"
|
||||
diff --git a/gdb/testsuite/gdb.arch/i386-signal.exp b/gdb/testsuite/gdb.arch/i386-signal.exp
|
||||
index 9806970b245..0a413f73a5b 100644
|
||||
--- a/gdb/testsuite/gdb.arch/i386-signal.exp
|
||||
+++ b/gdb/testsuite/gdb.arch/i386-signal.exp
|
||||
@@ -22,8 +22,13 @@ if {![istarget "i?86-*-*"] && ![istarget "x86_64-*-*"]} {
|
||||
|
||||
standard_testfile
|
||||
|
||||
+set opts {}
|
||||
+lappend opts debug
|
||||
+lappend opts nopie
|
||||
+lappend opts additional_flags=-DIS_AMD64_REGS_TARGET=[is_amd64_regs_target]
|
||||
+
|
||||
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" \
|
||||
- executable { debug nopie }] != "" } {
|
||||
+ executable $opts] != "" } {
|
||||
untested "failed to compile"
|
||||
return -1
|
||||
}
|
||||
|
||||
base-commit: b671ae32ae890a373abcfe4b19a3b662fd5e86f2
|
||||
--
|
||||
2.35.3
|
||||
|
76
gdb-testsuite-fix-gdb.cp-m-static.exp-regression-on-.patch
Normal file
76
gdb-testsuite-fix-gdb.cp-m-static.exp-regression-on-.patch
Normal file
@ -0,0 +1,76 @@
|
||||
From 424c96685651cc949597d700811a5fbb15256d1d Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Fri, 24 Mar 2023 09:18:07 +0100
|
||||
Subject: [PATCH 06/12] [gdb/testsuite] Fix gdb.cp/m-static.exp regression on
|
||||
Ubuntu 20.04
|
||||
|
||||
In commit 722c4596034 ("[gdb/testsuite] Fix gdb.cp/*.exp for remote host"), I
|
||||
needed to change ".*/" into "(.*/)?" in:
|
||||
...
|
||||
gdb_test "info variable everywhere" \
|
||||
"File .*/m-static\[.\]h.*const int gnu_obj_4::everywhere;"
|
||||
...
|
||||
|
||||
However, due to the fact that I got this output:
|
||||
...
|
||||
(gdb) info variable everywhere^M
|
||||
All variables matching regular expression "everywhere":^M
|
||||
^M
|
||||
File /data/vries/gdb/src/gdb/testsuite/gdb.cp/m-static.h:^M
|
||||
8: const int gnu_obj_4::everywhere;^M
|
||||
^M
|
||||
File /data/vries/gdb/src/gdb/testsuite/gdb.cp/m-static1.cc:^M
|
||||
8: const int gnu_obj_4::everywhere;^M
|
||||
...
|
||||
I decided to make the matching somewhat stricter, to make sure that the two
|
||||
matched lines were subsequent.
|
||||
|
||||
The commit turned out to be more strict than intended, and caused a regression
|
||||
on Ubuntu 20.04, where the output was instead:
|
||||
...
|
||||
(gdb) info variable everywhere^M
|
||||
All variables matching regular expression "everywhere":^M
|
||||
^M
|
||||
File /data/vries/gdb/src/gdb/testsuite/gdb.cp/m-static.h:^M
|
||||
8: const int gnu_obj_4::everywhere;^M
|
||||
...
|
||||
|
||||
At that point I realized I'm looking at a bug (filed as PR symtab/30265),
|
||||
which manifests on openSUSE Leap 15.4 for native and readnow, and on Ubuntu
|
||||
20.04 for readnow, but not for native.
|
||||
|
||||
Before my commit, the test-case passed whether the bug manifested or not.
|
||||
|
||||
After my commit, the test-case only passed when the bug manifested.
|
||||
|
||||
Fix the test-case regression by reverting to the situation before the commit:
|
||||
pass whether the bug manifests or not. We could add an xfail for the PR, but
|
||||
I'm expecting a fix soon, so that doesn't look worth the effort.
|
||||
|
||||
Tested on x86_64-linux, both on openSUSE Leap 15.4 and Ubuntu 20.04, both with
|
||||
native and readnow.
|
||||
|
||||
Reported-By: Simon Marchi <simon.marchi@efficios.com>
|
||||
---
|
||||
gdb/testsuite/gdb.cp/m-static.exp | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/gdb/testsuite/gdb.cp/m-static.exp b/gdb/testsuite/gdb.cp/m-static.exp
|
||||
index 97a5645b53a..a67b4cd3736 100644
|
||||
--- a/gdb/testsuite/gdb.cp/m-static.exp
|
||||
+++ b/gdb/testsuite/gdb.cp/m-static.exp
|
||||
@@ -181,7 +181,10 @@ gdb_test "print test4.somewhere" "\\$\[0-9\].* = 3.14\[0-9\]*" "static const flo
|
||||
|
||||
# Also make sure static const members can be found via "info var".
|
||||
if { $non_dwarf } { setup_xfail *-*-* }
|
||||
-gdb_test "info variable everywhere" "File .*/m-static\[.\]h.*const int gnu_obj_4::everywhere;"
|
||||
+gdb_test "info variable everywhere" \
|
||||
+ [multi_line \
|
||||
+ "File (.*/)?m-static\[.\]h:" \
|
||||
+ "$decimal:\tconst int gnu_obj_4::everywhere;.*"]
|
||||
|
||||
# Perhaps at some point test4 should also include a test for a static
|
||||
# const int that was initialized in the header file. But I'm not sure
|
||||
--
|
||||
2.35.3
|
||||
|
38
gdb-testsuite-fix-gdb.dwarf2-nullptr_t.exp-with-cc-w.patch
Normal file
38
gdb-testsuite-fix-gdb.dwarf2-nullptr_t.exp-with-cc-w.patch
Normal file
@ -0,0 +1,38 @@
|
||||
From 335a151d834199610b515e67f1924d6e0a211db2 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Wed, 30 Aug 2023 23:33:31 +0200
|
||||
Subject: [PATCH 09/12] [gdb/testsuite] Fix gdb.dwarf2/nullptr_t.exp with
|
||||
cc-with-dwz-m
|
||||
|
||||
When running test-case gdb.dwarf2/nullptr_t.exp with target board
|
||||
cc-with-dwz-m, I run into:
|
||||
...
|
||||
FAIL: gdb.dwarf2/nullptr_t.exp: decltype(nullptr) symbol
|
||||
...
|
||||
|
||||
The problem is that were looking for "typedef void decltype\\(nullptr\\)"
|
||||
using "maint print symbols -source $srcfile", but dwz has moved the typedef to
|
||||
a PU, so it's shown by "maint print symbols -source <unknown>" instead.
|
||||
|
||||
Fix this by dropping the "-source $srcfile" bit.
|
||||
|
||||
Tested on x86_64-linux, with make-check-all.sh.
|
||||
---
|
||||
gdb/testsuite/gdb.dwarf2/nullptr_t.exp | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/gdb/testsuite/gdb.dwarf2/nullptr_t.exp b/gdb/testsuite/gdb.dwarf2/nullptr_t.exp
|
||||
index a02ebbf109e..e78d90fdb25 100644
|
||||
--- a/gdb/testsuite/gdb.dwarf2/nullptr_t.exp
|
||||
+++ b/gdb/testsuite/gdb.dwarf2/nullptr_t.exp
|
||||
@@ -34,6 +34,6 @@ with_complaints 5 {
|
||||
gdb_test $cmd $re "$cmd without complaints"
|
||||
}
|
||||
|
||||
-gdb_test "maint print symbols -source $srcfile" \
|
||||
+gdb_test "maint print symbols" \
|
||||
"typedef void decltype\\(nullptr\\); \r\n.*" \
|
||||
"decltype(nullptr) symbol"
|
||||
--
|
||||
2.35.3
|
||||
|
65
gdb-testsuite-fix-gdb.python-py-breakpoint.exp-with-.patch
Normal file
65
gdb-testsuite-fix-gdb.python-py-breakpoint.exp-with-.patch
Normal file
@ -0,0 +1,65 @@
|
||||
From 0cb123a4157d215c80f3deb339a3ba10a188ba19 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Mon, 2 Jan 2023 11:59:17 +0100
|
||||
Subject: [PATCH 1/6] [gdb/testsuite] Fix gdb.python/py-breakpoint.exp with
|
||||
libstdc++ debug info
|
||||
|
||||
On x86_64-linux, I run into:
|
||||
...
|
||||
(gdb) python hbp1 = gdb.Breakpoint("add", type=gdb.BP_HARDWARE_BREAKPOINT)^M
|
||||
Hardware assisted breakpoint 2 at 0x40072e: add. (7 locations)^M
|
||||
(gdb) FAIL: gdb.python/py-breakpoint.exp: test_hardware_breakpoints: \
|
||||
Set hardware breakpoint
|
||||
...
|
||||
due to libstdc++ debug info:
|
||||
...
|
||||
$ gdb -q -batch outputs/gdb.python/py-breakpoint/py-breakpoint \
|
||||
-ex start \
|
||||
-ex "b add" \
|
||||
-ex "info break"
|
||||
Temporary breakpoint 1 at 0x40076a: file py-breakpoint.c, line 50.
|
||||
|
||||
Temporary breakpoint 1, main (argc=1, argv=$hex) at py-breakpoint.c:50
|
||||
50 int foo = 5;
|
||||
Breakpoint 2 at 0x40072e: add. (7 locations)
|
||||
Num Type Disp Enb Address What
|
||||
2 breakpoint keep y <MULTIPLE>
|
||||
2.1 y 0x000000000040072e in add(int) at \
|
||||
py-breakpoint.c:39
|
||||
2.2 y 0x00007ffff7b131de in \
|
||||
(anonymous namespace)::fast_float::bigint::add at \
|
||||
../../../../../libstdc++-v3/src/c++17/fast_float/fast_float.h:1815
|
||||
...
|
||||
2.7 y 0x00007ffff7b137e4 in \
|
||||
(anonymous namespace)::fast_float::bigint::add at \
|
||||
../../../../../libstdc++-v3/src/c++17/fast_float/fast_float.h:1815
|
||||
...
|
||||
|
||||
Fix this by using qualified=True.
|
||||
|
||||
Tested on x86_64-linux.
|
||||
PR testsuite/29910
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29910
|
||||
---
|
||||
gdb/testsuite/gdb.python/py-breakpoint.exp | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/gdb/testsuite/gdb.python/py-breakpoint.exp b/gdb/testsuite/gdb.python/py-breakpoint.exp
|
||||
index 9ba6b837a41..23c6637cd3a 100644
|
||||
--- a/gdb/testsuite/gdb.python/py-breakpoint.exp
|
||||
+++ b/gdb/testsuite/gdb.python/py-breakpoint.exp
|
||||
@@ -273,7 +273,8 @@ proc_with_prefix test_hardware_breakpoints { } {
|
||||
|
||||
delete_breakpoints
|
||||
|
||||
- gdb_test "python hbp1 = gdb.Breakpoint(\"add\", type=gdb.BP_HARDWARE_BREAKPOINT)" \
|
||||
+ set bp_args {"add", type=gdb.BP_HARDWARE_BREAKPOINT, qualified=True}
|
||||
+ gdb_test "python hbp1 = gdb.Breakpoint($bp_args)" \
|
||||
".*Hardware assisted breakpoint ($decimal)+ at .*$srcfile, line ($decimal)+\." \
|
||||
"Set hardware breakpoint"
|
||||
gdb_test "python print (gdb.breakpoints()\[0\].type == gdb.BP_HARDWARE_BREAKPOINT)" \
|
||||
|
||||
base-commit: 1cd845ab3d405412aabf9b959aa527dd60143826
|
||||
--
|
||||
2.35.3
|
||||
|
85
gdb-testsuite-fix-regexps-in-gdb.base-step-over-sysc.patch
Normal file
85
gdb-testsuite-fix-regexps-in-gdb.base-step-over-sysc.patch
Normal file
@ -0,0 +1,85 @@
|
||||
From e492116f04d3b4d704c4f6f3259143d7fb16a03e Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Wed, 26 Jul 2023 11:53:31 +0200
|
||||
Subject: [PATCH 03/12] [gdb/testsuite] Fix regexps in
|
||||
gdb.base/step-over-syscall.exp
|
||||
|
||||
When running test-case gdb.base/step-over-syscall.exp without glibc debuginfo
|
||||
installed, I get:
|
||||
...
|
||||
(gdb) continue^M
|
||||
Continuing.^M
|
||||
^M
|
||||
Breakpoint 2, 0x00007ffff7d4405e in vfork () from /lib64/libc.so.6^M
|
||||
(gdb) PASS: gdb.base/step-over-syscall.exp: vfork: displaced=off: \
|
||||
continue to vfork (1st time)
|
||||
...
|
||||
but with glibc debuginfo installed I get instead:
|
||||
...
|
||||
(gdb) continue^M
|
||||
Continuing.^M
|
||||
^M
|
||||
Breakpoint 2, 0x00007ffff7d4405e in __libc_vfork () at \
|
||||
../sysdeps/unix/sysv/linux/x86_64/vfork.S:44^M
|
||||
44 ENTRY (__vfork)^M
|
||||
(gdb) FAIL: gdb.base/step-over-syscall.exp: vfork: displaced=off: \
|
||||
continue to vfork (1st time)
|
||||
...
|
||||
|
||||
The FAIL is due to a mismatch with regexp:
|
||||
...
|
||||
"Breakpoint \[0-9\]+, (.* in |__libc_|)$syscall \\(\\).*"
|
||||
...
|
||||
because it cannot match both ".* in " and the __libc_ prefix.
|
||||
|
||||
Fix this by using instead the regexp:
|
||||
...
|
||||
"Breakpoint \[0-9\]+, (.* in )?(__libc_)?$syscall \\(\\).*"
|
||||
...
|
||||
|
||||
Tested on x86_64-linux.
|
||||
---
|
||||
gdb/testsuite/gdb.base/step-over-syscall.exp | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/gdb/testsuite/gdb.base/step-over-syscall.exp b/gdb/testsuite/gdb.base/step-over-syscall.exp
|
||||
index 424eee142fd..87ff2606d30 100644
|
||||
--- a/gdb/testsuite/gdb.base/step-over-syscall.exp
|
||||
+++ b/gdb/testsuite/gdb.base/step-over-syscall.exp
|
||||
@@ -127,13 +127,13 @@ proc setup { syscall } {
|
||||
|
||||
gdb_test "break \*$syscall" "Breakpoint \[0-9\]* at .*"
|
||||
|
||||
- gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, (.* in |__libc_|)$syscall \\(\\).*" \
|
||||
+ gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, (.* in )?(__libc_)?$syscall \\(\\).*" \
|
||||
"continue to $syscall (1st time)"
|
||||
# Hit the breakpoint on $syscall for the first time. In this time,
|
||||
# we will let PLT resolution done, and the number single steps we will
|
||||
# do later will be reduced.
|
||||
|
||||
- gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, (.* in |__libc_|)$syscall \\(\\).*" \
|
||||
+ gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, (.* in )?(__libc_)?$syscall \\(\\).*" \
|
||||
"continue to $syscall (2nd time)"
|
||||
# Hit the breakpoint on $syscall for the second time. In this time,
|
||||
# the address of syscall insn and next insn of syscall are recorded.
|
||||
@@ -265,7 +265,7 @@ proc step_over_syscall { syscall } {
|
||||
return -1
|
||||
}
|
||||
|
||||
- gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, (.* in |__libc_|)$syscall \\(\\).*" \
|
||||
+ gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, (.* in )?(__libc_)?$syscall \\(\\).*" \
|
||||
"continue to $syscall (3rd time)"
|
||||
|
||||
# Hit the breakpoint on $syscall for the third time. In this time, we'll set
|
||||
@@ -333,7 +333,7 @@ proc break_cond_on_syscall { syscall follow_fork detach_on_fork } {
|
||||
return -1
|
||||
}
|
||||
|
||||
- gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, (.* in |__libc_|)$syscall \\(\\).*" \
|
||||
+ gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, (.* in )?(__libc_)?$syscall \\(\\).*" \
|
||||
"continue to $syscall"
|
||||
# Delete breakpoint syscall insns to avoid interference with other syscalls.
|
||||
delete_breakpoints
|
||||
--
|
||||
2.35.3
|
||||
|
80
gdb-tui-allow-command-window-of-1-or-2-lines.patch
Normal file
80
gdb-tui-allow-command-window-of-1-or-2-lines.patch
Normal file
@ -0,0 +1,80 @@
|
||||
From 02616ce7c5571e5b2680cad52f8c58b27f77b2a5 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Thu, 9 Nov 2023 09:04:39 +0100
|
||||
Subject: [PATCH 4/6] [gdb/tui] Allow command window of 1 or 2 lines
|
||||
|
||||
When starting TUI in a terminal with 2 lines (likewise with 1 line):
|
||||
...
|
||||
$ echo $LINES
|
||||
2
|
||||
$ gdb -q -tui
|
||||
...
|
||||
we run into this assert in tui_apply_current_layout:
|
||||
...
|
||||
/* This should always be made visible by a layout. */
|
||||
gdb_assert (TUI_CMD_WIN != nullptr);
|
||||
...
|
||||
|
||||
The problem is that for the command window:
|
||||
- the minimum height is 3 (the default), but
|
||||
- the maximum height is only 2 because there are only 2 lines.
|
||||
|
||||
This discrepancy eventually leads to a call to newwin in make_window with:
|
||||
...
|
||||
(gdb) p height
|
||||
$1 = 3
|
||||
(gdb) p width
|
||||
$2 = 66
|
||||
(gdb) p y
|
||||
$3 = -1
|
||||
(gdb) p x
|
||||
$4 = 0
|
||||
(gdb)
|
||||
...
|
||||
which results in a nullptr, which eventually triggers the assert.
|
||||
|
||||
The easiest way to fix this is to change the minimum height of the command
|
||||
window to 1. However, that would also change behaviour for the case that the
|
||||
screen size is 3 lines or more. For instance, in gdb.tui/winheight.exp the
|
||||
number of lines in the terminal is 24, and the test-case checks that the user
|
||||
cannot increase the source window height to the point that the command window
|
||||
height would be less than 3.
|
||||
|
||||
Fix this by calculating the minimum height of the command window as follows:
|
||||
- the default (3) if max_height () allows it, and
|
||||
- max_height () otherwise.
|
||||
|
||||
Tested on x86_64-linux.
|
||||
|
||||
PR tui/31044
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31044
|
||||
---
|
||||
gdb/tui/tui-command.h | 12 ++++++++++++
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
diff --git a/gdb/tui/tui-command.h b/gdb/tui/tui-command.h
|
||||
index f6842880bb2..e8c96ecee30 100644
|
||||
--- a/gdb/tui/tui-command.h
|
||||
+++ b/gdb/tui/tui-command.h
|
||||
@@ -57,6 +57,18 @@ struct tui_cmd_window : public tui_win_info
|
||||
/* The command window can't be made invisible. */
|
||||
}
|
||||
|
||||
+ /* Compute the minimum height of this window. */
|
||||
+ virtual int min_height () const override
|
||||
+ {
|
||||
+ int preferred_min = tui_win_info::min_height ();
|
||||
+ int max = max_height ();
|
||||
+ /* If there is enough space to accommodate the preferred minimum height,
|
||||
+ use it. Otherwise, use as much as possible. */
|
||||
+ return (preferred_min <= max
|
||||
+ ? preferred_min
|
||||
+ : max);
|
||||
+ }
|
||||
+
|
||||
int start_line = 0;
|
||||
|
||||
protected:
|
||||
--
|
||||
2.35.3
|
||||
|
147
gdb-tui-fix-resizing-of-terminal-to-1-or-2-lines.patch
Normal file
147
gdb-tui-fix-resizing-of-terminal-to-1-or-2-lines.patch
Normal file
@ -0,0 +1,147 @@
|
||||
From c55a452eaf9390d5659d3205f762aa2cb84511e1 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Thu, 9 Nov 2023 09:05:01 +0100
|
||||
Subject: [PATCH 6/6] [gdb/tui] Fix resizing of terminal to 1 or 2 lines
|
||||
|
||||
When starting TUI in a terminal with 3 lines:
|
||||
...
|
||||
$ echo $LINES
|
||||
3
|
||||
$ gdb -q -tui
|
||||
...
|
||||
and resizing the terminal to 2 lines we run into a segfault.
|
||||
|
||||
The problem is that for the source window:
|
||||
- the minimum height is 3 (the default), but
|
||||
- the maximum height is only 2 because there are only 2 lines.
|
||||
|
||||
This discrepancy eventually leads to a call to newwin in make_window with:
|
||||
...
|
||||
(gdb) p height
|
||||
$1 = 3
|
||||
(gdb) p width
|
||||
$2 = 56
|
||||
(gdb) p y
|
||||
$3 = -1
|
||||
(gdb) p x
|
||||
$4 = 0
|
||||
...
|
||||
which results in a nullptr.
|
||||
|
||||
This violates the assumption here in tui_apply_current_layout:
|
||||
....
|
||||
/* Get the new list of currently visible windows. */
|
||||
std::vector<tui_win_info *> new_tui_windows;
|
||||
applied_layout->get_windows (&new_tui_windows);
|
||||
...
|
||||
that get_windows only returns visible windows, which leads to tui_windows
|
||||
holding a dangling pointer, which results in the segfault.
|
||||
|
||||
Fix this by:
|
||||
- making sure get_windows only returns visible windows, and
|
||||
- detecting the situation and dropping windows from the layout if
|
||||
there's no room for them.
|
||||
|
||||
Tested on x86_64-linux.
|
||||
|
||||
PR tui/31044
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31044
|
||||
---
|
||||
gdb/testsuite/gdb.tui/resize.exp | 9 +++++++++
|
||||
gdb/tui/tui-layout.c | 22 ++++++++++++++++++++--
|
||||
gdb/tui/tui-layout.h | 6 +++++-
|
||||
3 files changed, 34 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/gdb/testsuite/gdb.tui/resize.exp b/gdb/testsuite/gdb.tui/resize.exp
|
||||
index 60d5116886b..e15f8a2f507 100644
|
||||
--- a/gdb/testsuite/gdb.tui/resize.exp
|
||||
+++ b/gdb/testsuite/gdb.tui/resize.exp
|
||||
@@ -39,3 +39,12 @@ Term::check_contents "source at startup" "\\|.*21 *return 0"
|
||||
|
||||
Term::resize 40 90
|
||||
Term::check_box "source box after resize" 0 0 90 26
|
||||
+
|
||||
+# Check that resizing to less than 3 lines doesn't cause problems.
|
||||
+foreach lines { 2 1 } {
|
||||
+ with_test_prefix lines=$lines {
|
||||
+ Term::resize $lines 90 0
|
||||
+ Term::wait_for ""
|
||||
+ Term::check_region_contents "has prompt" 0 0 90 $lines "$gdb_prompt"
|
||||
+ }
|
||||
+}
|
||||
diff --git a/gdb/tui/tui-layout.c b/gdb/tui/tui-layout.c
|
||||
index 27abee02087..362c1447910 100644
|
||||
--- a/gdb/tui/tui-layout.c
|
||||
+++ b/gdb/tui/tui-layout.c
|
||||
@@ -442,6 +442,13 @@ tui_layout_window::apply (int x_, int y_, int width_, int height_,
|
||||
width = width_;
|
||||
height = height_;
|
||||
gdb_assert (m_window != nullptr);
|
||||
+ if (width == 0 || height == 0)
|
||||
+ {
|
||||
+ /* The window was dropped, so it's going to be deleted, reset the
|
||||
+ soon to be dangling pointer. */
|
||||
+ m_window = nullptr;
|
||||
+ return;
|
||||
+ }
|
||||
m_window->resize (height, width, x, y);
|
||||
}
|
||||
|
||||
@@ -823,6 +830,7 @@ tui_layout_split::apply (int x_, int y_, int width_, int height_,
|
||||
int available_size = m_vertical ? height : width;
|
||||
int last_index = -1;
|
||||
int total_weight = 0;
|
||||
+ int prev = -1;
|
||||
for (int i = 0; i < m_splits.size (); ++i)
|
||||
{
|
||||
bool cmd_win_already_exists = TUI_CMD_WIN != nullptr;
|
||||
@@ -854,6 +862,14 @@ tui_layout_split::apply (int x_, int y_, int width_, int height_,
|
||||
info[i].max_size = info[i].min_size;
|
||||
}
|
||||
|
||||
+ if (info[i].min_size > info[i].max_size)
|
||||
+ {
|
||||
+ /* There is not enough room for this window, drop it. */
|
||||
+ info[i].min_size = 0;
|
||||
+ info[i].max_size = 0;
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
if (info[i].min_size == info[i].max_size)
|
||||
available_size -= info[i].min_size;
|
||||
else
|
||||
@@ -864,10 +880,12 @@ tui_layout_split::apply (int x_, int y_, int width_, int height_,
|
||||
|
||||
/* Two adjacent boxed windows will share a border, making a bit
|
||||
more size available. */
|
||||
- if (i > 0
|
||||
- && m_splits[i - 1].layout->last_edge_has_border_p ()
|
||||
+ if (prev != -1
|
||||
+ && m_splits[prev].layout->last_edge_has_border_p ()
|
||||
&& m_splits[i].layout->first_edge_has_border_p ())
|
||||
info[i].share_box = true;
|
||||
+
|
||||
+ prev = i;
|
||||
}
|
||||
|
||||
/* If last_index is set then we have a window that is not of a fixed
|
||||
diff --git a/gdb/tui/tui-layout.h b/gdb/tui/tui-layout.h
|
||||
index 206f1117445..ec013a3f051 100644
|
||||
--- a/gdb/tui/tui-layout.h
|
||||
+++ b/gdb/tui/tui-layout.h
|
||||
@@ -185,7 +185,11 @@ class tui_layout_window : public tui_layout_base
|
||||
/* See tui_layout_base::get_windows. */
|
||||
void get_windows (std::vector<tui_win_info *> *windows) override
|
||||
{
|
||||
- windows->push_back (m_window);
|
||||
+ if (m_window != nullptr && m_window->is_visible ())
|
||||
+ {
|
||||
+ /* Only get visible windows. */
|
||||
+ windows->push_back (m_window);
|
||||
+ }
|
||||
}
|
||||
|
||||
protected:
|
||||
--
|
||||
2.35.3
|
||||
|
148
gdb-tui-fix-segfault-in-tui_find_disassembly_address.patch
Normal file
148
gdb-tui-fix-segfault-in-tui_find_disassembly_address.patch
Normal file
@ -0,0 +1,148 @@
|
||||
From 0f8f51e98c7f643b8ce32bc6f6d621ce902d7a66 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Thu, 28 Sep 2023 20:17:33 +0200
|
||||
Subject: [PATCH 2/6] [gdb/tui] Fix segfault in tui_find_disassembly_address
|
||||
|
||||
PR29040 describes a FAIL for test-case gdb.threads/next-fork-other-thread.exp
|
||||
and target board unix/-m32.
|
||||
|
||||
The FAIL happens due to the test executable running into an assert, which is
|
||||
caused by a forked child segfaulting, like so:
|
||||
...
|
||||
Program terminated with signal SIGSEGV, Segmentation fault.
|
||||
#0 0x00000000 in ?? ()
|
||||
...
|
||||
|
||||
I tried to reproduce the segfault with exec next-fork-other-thread-fork, using
|
||||
TUI layout asm.
|
||||
|
||||
I set a breakpoint at fork and ran to the breakpoint, and somewhere during the
|
||||
following session I ran into a gdb segfault here in
|
||||
tui_find_disassembly_address:
|
||||
...
|
||||
/* Disassemble forward. */
|
||||
next_addr = tui_disassemble (gdbarch, asm_lines, new_low, max_lines);
|
||||
last_addr = asm_lines.back ().addr;
|
||||
...
|
||||
due to asm_lines being empty after the call to tui_disassemble, while
|
||||
asm_lines.back () assumes that it's not empty.
|
||||
|
||||
I have not been able to reproduce that segfault in that original setting, I'm
|
||||
not sure of the exact scenario (though looking back it probably involved
|
||||
"set detach-on-fork off").
|
||||
|
||||
What likely happened is that I managed to reproduce PR29040, and TUI (attempted
|
||||
to) display the disassembly for address 0, which led to the gdb segfault.
|
||||
|
||||
When gdb_print_insn encounters an insn it cannot print because it can't read
|
||||
the memory, it throws a MEMORY_ERROR that is caught by tui_disassemble.
|
||||
|
||||
The specific bit that causes the gdb segfault is that if gdb_print_insn throws
|
||||
a MEMORY_ERROR for the first insn in tui_disassemble, it returns an empty
|
||||
asm_lines.
|
||||
|
||||
FWIW, I did manage to reproduce the gdb segfault as follows:
|
||||
...
|
||||
$ gdb -q \
|
||||
-iex "set pagination off" \
|
||||
/usr/bin/rustc \
|
||||
-ex "set breakpoint pending on" \
|
||||
-ex "b dl_main" \
|
||||
-ex run \
|
||||
-ex "up 4" \
|
||||
-ex "layout asm" \
|
||||
-ex "print \$pc"
|
||||
...
|
||||
<TUI>
|
||||
...
|
||||
$1 = (void (*)()) 0x1
|
||||
(gdb)
|
||||
...
|
||||
Now press <up>, and the segfault triggers.
|
||||
|
||||
Fix the segfault by handling asm_lines.empty () results of tui_disassemble in
|
||||
tui_find_disassembly_address.
|
||||
|
||||
I've written a unit test that exercises this scenario.
|
||||
|
||||
Tested on x86_64-linux.
|
||||
|
||||
Reviewed-by: Kevin Buettner <kevinb@redhat.com>
|
||||
|
||||
PR tui/30823
|
||||
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30823
|
||||
---
|
||||
gdb/tui/tui-disasm.c | 39 +++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 39 insertions(+)
|
||||
|
||||
diff --git a/gdb/tui/tui-disasm.c b/gdb/tui/tui-disasm.c
|
||||
index f0b55769d71..03c78aa1291 100644
|
||||
--- a/gdb/tui/tui-disasm.c
|
||||
+++ b/gdb/tui/tui-disasm.c
|
||||
@@ -41,6 +41,8 @@
|
||||
#include "objfiles.h"
|
||||
#include "cli/cli-style.h"
|
||||
#include "tui/tui-location.h"
|
||||
+#include "gdbsupport/selftest.h"
|
||||
+#include "inferior.h"
|
||||
|
||||
#include "gdb_curses.h"
|
||||
|
||||
@@ -203,6 +205,8 @@ tui_find_disassembly_address (struct gdbarch *gdbarch, CORE_ADDR pc, int from)
|
||||
instruction fails to disassemble we will take the address of the
|
||||
previous instruction that did disassemble as the result. */
|
||||
tui_disassemble (gdbarch, asm_lines, pc, max_lines + 1);
|
||||
+ if (asm_lines.empty ())
|
||||
+ return pc;
|
||||
new_low = asm_lines.back ().addr;
|
||||
}
|
||||
else
|
||||
@@ -244,6 +248,8 @@ tui_find_disassembly_address (struct gdbarch *gdbarch, CORE_ADDR pc, int from)
|
||||
|
||||
/* Disassemble forward. */
|
||||
next_addr = tui_disassemble (gdbarch, asm_lines, new_low, max_lines);
|
||||
+ if (asm_lines.empty ())
|
||||
+ break;
|
||||
last_addr = asm_lines.back ().addr;
|
||||
|
||||
/* If disassembling from the current value of NEW_LOW reached PC
|
||||
@@ -522,3 +528,36 @@ tui_disasm_window::display_start_addr (struct gdbarch **gdbarch_p,
|
||||
*gdbarch_p = m_gdbarch;
|
||||
*addr_p = m_start_line_or_addr.u.addr;
|
||||
}
|
||||
+
|
||||
+#if GDB_SELF_TEST
|
||||
+namespace selftests {
|
||||
+namespace tui {
|
||||
+namespace disasm {
|
||||
+
|
||||
+static void
|
||||
+run_tests ()
|
||||
+{
|
||||
+ if (current_inferior () != nullptr)
|
||||
+ {
|
||||
+ struct gdbarch *gdbarch = current_inferior ()->gdbarch;
|
||||
+
|
||||
+ /* Check that tui_find_disassembly_address robustly handles the case of
|
||||
+ being passed a PC for which gdb_print_insn throws a MEMORY_ERROR. */
|
||||
+ SELF_CHECK (tui_find_disassembly_address (gdbarch, 0, 1) == 0);
|
||||
+ SELF_CHECK (tui_find_disassembly_address (gdbarch, 0, -1) == 0);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+} /* namespace disasm */
|
||||
+} /* namespace tui */
|
||||
+} /* namespace selftests */
|
||||
+#endif /* GDB_SELF_TEST */
|
||||
+
|
||||
+void _initialize_tui_disasm ();
|
||||
+void
|
||||
+_initialize_tui_disasm ()
|
||||
+{
|
||||
+#if GDB_SELF_TEST
|
||||
+ selftests::register_test ("tui-disasm", selftests::tui::disasm::run_tests);
|
||||
+#endif
|
||||
+}
|
||||
--
|
||||
2.35.3
|
||||
|
57
gdb-tui-fix-wmaybe-uninitialized-in-tui_find_disasse.patch
Normal file
57
gdb-tui-fix-wmaybe-uninitialized-in-tui_find_disasse.patch
Normal file
@ -0,0 +1,57 @@
|
||||
From 0f2bdd8648e47e10334f8cc8e47b277d4064d0a2 Mon Sep 17 00:00:00 2001
|
||||
From: Tom de Vries <tdevries@suse.de>
|
||||
Date: Mon, 13 Nov 2023 09:31:20 +0100
|
||||
Subject: [PATCH 3/6] [gdb/tui] Fix Wmaybe-uninitialized in
|
||||
tui_find_disassembly_address
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
When building gdb with -O2, we run into:
|
||||
...
|
||||
gdb/tui/tui-disasm.c: In function ‘CORE_ADDR tui_find_disassembly_address \
|
||||
(gdbarch*, CORE_ADDR, int)’:
|
||||
gdb/tui/tui-disasm.c:293:7: warning: ‘last_addr’ may be used uninitialized \
|
||||
in this function [-Wmaybe-uninitialized]
|
||||
if (last_addr < pc)
|
||||
^~
|
||||
...
|
||||
|
||||
The warning triggers since commit 72535eb14bd ("[gdb/tui] Fix segfault in
|
||||
tui_find_disassembly_address").
|
||||
|
||||
Fix the warning by ensuring that last_addr is initialized at the point of
|
||||
use:
|
||||
...
|
||||
+ last_addr = asm_lines.back ().addr;
|
||||
if (last_addr < pc)
|
||||
...
|
||||
|
||||
Tested on x86_64-linux.
|
||||
---
|
||||
gdb/tui/tui-disasm.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/gdb/tui/tui-disasm.c b/gdb/tui/tui-disasm.c
|
||||
index 03c78aa1291..bbbc92c8183 100644
|
||||
--- a/gdb/tui/tui-disasm.c
|
||||
+++ b/gdb/tui/tui-disasm.c
|
||||
@@ -281,7 +281,6 @@ tui_find_disassembly_address (struct gdbarch *gdbarch, CORE_ADDR pc, int from)
|
||||
/* Take the best possible match we have. */
|
||||
new_low = *possible_new_low;
|
||||
next_addr = tui_disassemble (gdbarch, asm_lines, new_low, max_lines);
|
||||
- last_addr = asm_lines.back ().addr;
|
||||
gdb_assert (asm_lines.size () >= max_lines);
|
||||
}
|
||||
|
||||
@@ -290,6 +289,7 @@ tui_find_disassembly_address (struct gdbarch *gdbarch, CORE_ADDR pc, int from)
|
||||
We keep the disassembled instructions in the 'lines' window
|
||||
and shift it downward (increasing its addresses). */
|
||||
int pos = max_lines - 1;
|
||||
+ last_addr = asm_lines.back ().addr;
|
||||
if (last_addr < pc)
|
||||
do
|
||||
{
|
||||
--
|
||||
2.35.3
|
||||
|
154
gdb.changes
154
gdb.changes
@ -1,3 +1,157 @@
|
||||
-------------------------------------------------------------------
|
||||
Mon Nov 13 14:08:08 UTC 2023 - Tom de Vries <tdevries@suse.com>
|
||||
|
||||
- Maintenance script qa.sh:
|
||||
* Update PR31004 kfail.
|
||||
- Patches added (backport from gdb-patches):
|
||||
* gdb-fix-segfault-in-for_each_block-part-1.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Oct 31 11:59:43 UTC 2023 - Tom de Vries <tdevries@suse.com>
|
||||
|
||||
- Maintenance script qa.sh:
|
||||
* Update PR28561 kfail.
|
||||
* Remove PR31015 kfail.
|
||||
* Remove PR30547 kfail.
|
||||
- Patches added (backport from master):
|
||||
* gdb-symtab-add-producer_is_gas.patch
|
||||
* gdb-symtab-work-around-gas-pr28629.patch
|
||||
* gdb-tdep-fix-nr-array-elements-in-ppc64_aggregate_ca.patch
|
||||
* gdb-testsuite-fix-gdb.python-py-breakpoint.exp-with-.patch
|
||||
* gdb-tui-fix-segfault-in-tui_find_disassembly_address.patch
|
||||
* gdb-tui-fix-wmaybe-uninitialized-in-tui_find_disasse.patch
|
||||
* gdb-testsuite-add-wait_for_msg-arg-to-term-resize-fi.patch
|
||||
- Patches added (backport from gdb-patches):
|
||||
* gdb-fix-segfault-in-for_each_block-part-2.patch
|
||||
* gdb-tui-allow-command-window-of-1-or-2-lines.patch
|
||||
* gdb-tui-fix-resizing-of-terminal-to-1-or-2-lines.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Oct 31 09:02:42 UTC 2023 - Tom de Vries <tdevries@suse.com>
|
||||
|
||||
- Maintenance script qa.sh:
|
||||
* Remove PR28467, PR29418, PR29420, PR29814 and PR29408 kfail.
|
||||
* Remove gdb.tui/tui-layout-asm-short-prog.exp kfail.
|
||||
* Remove commit f68eca29d3b, 29004660c94, 301fe55e9c4,
|
||||
4d88ae0c7b5, e7d69e72bfd, 8b272d7671f, 85819864f7c, 167f3beb655
|
||||
and a0eda3df5b7 kfails.
|
||||
* Add PR31015 kfail.
|
||||
* Remove PR29793 kfail.
|
||||
* Remove gdb.arch/powerpc-bcl-prologue.exp kfail.
|
||||
* Remove PR29813 and PR29816 kfail.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Sun Oct 29 18:57:21 UTC 2023 - Tom de Vries <tdevries@suse.com>
|
||||
|
||||
- Maintenance script qa.sh:
|
||||
* Update PR28561 kfail.
|
||||
* Update PR29781 kfail.
|
||||
- Maintenance script qa-local.sh:
|
||||
* Add "Verify quilt setup" step.
|
||||
- Patches added (backport from master):
|
||||
* gdb-symtab-handle-self-reference-die.patch
|
||||
* gdb-symtab-handle-self-reference-in-inherit_abstract.patch
|
||||
* gdb-symtab-add-optimized-out-static-var-to-cooked-in.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Oct 26 12:51:55 UTC 2023 - Tom de Vries <tdevries@suse.com>
|
||||
|
||||
- Maintenance script qa.sh:
|
||||
* Add comment to kfail for PR30528.
|
||||
* Add UNRESOLVED kfail for gdb.base/gcore-excessive-memory.exp.
|
||||
* Add UNRESOLVED kfail for PR31001.
|
||||
* Remove PR27238 kfail.
|
||||
* Add powerpc64le hw watchpoint kfails.
|
||||
* Add PR31004 kfail.
|
||||
* Add PR30531 kfail.
|
||||
- Patches added (backport from master):
|
||||
* xcoffread.c-fix-werror-dangling-pointer-issue-with-m.patch
|
||||
* avoid-manual-memory-management-in-go-lang.c.patch
|
||||
* gdb-go-handle-v3-go_0-mangled-prefix.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Thu Oct 26 09:24:04 UTC 2023 - Tom de Vries <tdevries@suse.com>
|
||||
|
||||
- Patches added (backport from master):
|
||||
* gdb-symtab-don-t-deduplicate-variables-in-gdb-index.patch
|
||||
- Patches dropped (requires unsupported command):
|
||||
* gdb-testsuite-add-wait-for-index-cache-in-gdb.dwarf2.patch
|
||||
- Maintenance script qa.sh:
|
||||
* Added PR30528 kfail.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Oct 24 13:39:35 UTC 2023 - Tom de Vries <tdevries@suse.com>
|
||||
|
||||
- Patches added (manual import from fedora rawhide @ 52a4dab):
|
||||
* gdb-rhbz1773651-gdb-index-internal-error.patch
|
||||
- Patches added (backport from master):
|
||||
* gdb-support-rseq-auxvs.patch
|
||||
* gdb-symtab-fix-line-number-of-static-const-class-mem.patch
|
||||
* gdb-symtab-fix-too-many-symbols-in-gdbpy_lookup_stat.patch
|
||||
* gdb-symtab-handle-pu-in-iterate_over_some_symtabs.patch
|
||||
* gdb-symtab-work-around-pr-gas-29517.patch
|
||||
* gdb-testsuite-add-kfail-for-pr-ada-30908.patch
|
||||
* gdb-testsuite-add-xfail-for-gdb-29965-in-gdb.threads.patch
|
||||
* gdb-testsuite-fix-gdb.ada-mi_task_arg.exp-with-newer.patch
|
||||
* gdb-testsuite-fix-gdb.arch-i386-signal.exp-on-x86_64.patch
|
||||
* gdb-testsuite-fix-gdb.cp-m-static.exp-regression-on-.patch
|
||||
* gdb-testsuite-fix-gdb.dwarf2-nullptr_t.exp-with-cc-w.patch
|
||||
* gdb-testsuite-fix-regexps-in-gdb.base-step-over-sysc.patch
|
||||
* gdb-symtab-find-main-language-without-symtab-expansi.patch
|
||||
* gdb-testsuite-add-wait-for-index-cache-in-gdb.dwarf2.patch
|
||||
- Patches moved (from "Backport from gdb-patches" to
|
||||
"Backports from master, available in next release"):
|
||||
* gdb-cli-handle-pending-c-after-rl_callback_read_char.patch
|
||||
* gdb-testsuite-add-have_host_locale.patch
|
||||
- Maintenance script qa.sh:
|
||||
* Remove PR28463, PR28108, PR29247 and PR29160 kfails.
|
||||
* Remove PR30540, PR30908, PR29965 kfails.
|
||||
* Remove gdb.ada/mi_task_arg.exp kfail.
|
||||
- Limit "Suggests: %{python}-Pygments" to SLE-15 and later.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Sat Oct 21 08:05:18 UTC 2023 - Tom de Vries <tdevries@suse.com>
|
||||
|
||||
- Mention import-fedora.sh to fix warning.
|
||||
- Maintenance script qa.sh:
|
||||
* Update kfail for PR28561.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Fri Oct 20 10:43:32 UTC 2023 - Tom de Vries <tdevries@suse.com>
|
||||
|
||||
- Maintenance script import-fedora.sh:
|
||||
* New script. Move skipped patches list from gdb.spec to script.
|
||||
- Update to fedora 38 @ 82cc8e0.
|
||||
- Patch renamed:
|
||||
* pass-const-frame_info_ptr-reference-for-skip_-langua.patch ->
|
||||
gdb-rhbz2192105-ftbs-dangling-pointer
|
||||
- Patches added:
|
||||
* gdb-bz2237392-dwarf-obstack-allocation.patch
|
||||
* gdb-bz2237515-debuginfod-double-free.patch
|
||||
* gdb-rhbz2160211-excessive-core-file-warnings.patch
|
||||
* gdb-rhbz2196395-debuginfod-legacy-openssl-crash.patch
|
||||
* gdb-rhbz2233961-CVE-2022-4806.patch
|
||||
* gdb-rhbz2233965-memory-leak.patch
|
||||
- Maintenance script qa-local.sh:
|
||||
* Add openSUSE_Leap_15.5 and openSUSE_Factory_LegacyX86.
|
||||
* Add "List configs" item.
|
||||
* Skip i586 for SLE-11.
|
||||
- Maintenance script qa.sh:
|
||||
* Make sure exit status is 0
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Sep 27 09:22:47 UTC 2023 - Tom de Vries <tdevries@suse.com>
|
||||
|
||||
- Add "Suggests: %{python}-Pygments".
|
||||
- Maintenance script qa.sh:
|
||||
* Note investigation of some ada test-cases.
|
||||
* Update PR30547 kfail.
|
||||
* Add PR28561 kfail.
|
||||
* Update PKRU-related kfail.
|
||||
* Use openSUSE_Factory_LegacyX86.i586 instead of
|
||||
openSUSE_Factory.i586.
|
||||
* Remove PR27813 kfail and corresponding todo.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Sun Aug 20 00:41:09 UTC 2023 - Luciano Santos <luc14n0@opensuse.org>
|
||||
|
||||
|
232
gdb.spec
232
gdb.spec
@ -145,6 +145,7 @@ Source16: qa.sh
|
||||
Source17: qa-local.sh
|
||||
Source18: qa-remote.sh
|
||||
Source19: README.qa
|
||||
Source20: import-fedora.sh
|
||||
|
||||
%if %{build_testsuite}
|
||||
NoSource: 0
|
||||
@ -163,9 +164,10 @@ NoSource: 16
|
||||
NoSource: 17
|
||||
NoSource: 18
|
||||
NoSource: 19
|
||||
NoSource: 20
|
||||
%endif
|
||||
|
||||
# Fedora import from branch f38, commit fc4e284.
|
||||
# Fedora import from branch f38, commit 82cc8e0.
|
||||
|
||||
#Fedora Packages begin
|
||||
Patch2: gdb-6.3-gstack-20050411.patch
|
||||
@ -214,37 +216,17 @@ Patch54: gdb-opcodes-clflushopt-test.patch
|
||||
Patch55: gdb-rhbz1261564-aarch64-hw-watchpoint-test.patch
|
||||
Patch57: gdb-linux_perf-bundle.patch
|
||||
Patch59: gdb-rhbz1553104-s390x-arch12-test.patch
|
||||
Patch62: gdb-binutils29988-read_indexed_address.patch
|
||||
Patch60: gdb-binutils29988-read_indexed_address.patch
|
||||
Patch61: gdb-rhbz2192105-ftbs-dangling-pointer
|
||||
Patch62: gdb-rhbz2160211-excessive-core-file-warnings.patch
|
||||
Patch63: gdb-rhbz2196395-debuginfod-legacy-openssl-crash.patch
|
||||
Patch64: gdb-bz2237515-debuginfod-double-free.patch
|
||||
Patch65: gdb-bz2237392-dwarf-obstack-allocation.patch
|
||||
Patch66: gdb-rhbz2233961-CVE-2022-4806.patch
|
||||
Patch67: gdb-rhbz2233965-memory-leak.patch
|
||||
Patch68: gdb-rhbz1773651-gdb-index-internal-error.patch
|
||||
#Fedora Packages end
|
||||
|
||||
# Fedora Packages not copied:
|
||||
#
|
||||
# Not applicable for openSUSE:
|
||||
# - gdb-libexec-add-index.patch
|
||||
# - gdb-6.3-rh-testversion-20041202.patch
|
||||
# - gdb-6.6-buildid-locate-misleading-warning-missing-debuginfo-rhbz981154.patch
|
||||
# - gdb-6.8-bz466901-backtrace-full-prelinked.patch
|
||||
# - gdb-container-rh-pkg.patch
|
||||
#
|
||||
# Broken:
|
||||
# - gdb-6.5-BEA-testsuite.patch
|
||||
# over-specific test-case in a shell script
|
||||
# - gdb-6.5-readline-long-line-crash-test.patch
|
||||
# Hangs for horizontal-scroll-mode on, times out after 10 minutes.
|
||||
# - gdb-rhbz1156192-recursive-dlopen-test.patch
|
||||
# Fragile test-case, requires glibc to fail in a certain way.
|
||||
#
|
||||
# Obsolete:
|
||||
# - gdb-6.7-charsign-test.patch (dropped by fedora)
|
||||
# - gdb-6.7-ppc-clobbered-registers-O2-test.patch
|
||||
# - gdb-test-ivy-bridge.patch (dropped by fedora)
|
||||
# - gdb-ppc-power7-test.patch (dropped by fedora)
|
||||
# - gdb-6.3-bz140532-ppc-unwinding-test.patch (dropped by fedora)
|
||||
#
|
||||
# Dropped:
|
||||
# - gdb-rhbz2177655-aarch64-pauth-valid-regcache.patch (included in 13.2)
|
||||
# - gdb-rhbz2183595-rustc-inside_main.patch (included in 13.2)
|
||||
|
||||
# Fedora patches fixup
|
||||
# These need a number with at least four digits, otherwise patchlist.pl removes
|
||||
# them when upgrading.
|
||||
@ -308,38 +290,65 @@ Patch1505: gdb-testsuite-fix-gdb.base-step-over-syscall.exp-with-m32-amd-ca
|
||||
|
||||
# Backports from master, available in next release.
|
||||
|
||||
Patch2040: remove-some-unnecessary-includes-from-exp.y.patch
|
||||
Patch2041: gdb-testsuite-fix-gdb.gdb-python-helper.exp-with-o2-.patch
|
||||
Patch2042: gdb-testsuite-simplify-gdb.base-unwind-on-each-insn..patch
|
||||
Patch2043: gdb-testsuite-handle-output-after-prompt-in-gdb.thre.patch
|
||||
|
||||
Patch2075: gdb-testsuite-add-xfail-in-gdb.arch-i386-pkru.exp.patch
|
||||
Patch2076: gdb-testsuite-factor-out-proc-linux_kernel_version.patch
|
||||
Patch2077: gdb-testsuite-add-xfail-in-gdb.python-py-record-btra.patch
|
||||
Patch2078: gdb-testsuite-fix-gdb.threads-schedlock.exp-on-fast-.patch
|
||||
Patch2079: gdb-testsuite-simplify-gdb.arch-amd64-disp-step-avx..patch
|
||||
Patch2080: gdb-testsuite-fix-gdb.threads-schedlock.exp-for-gcc-.patch
|
||||
Patch2081: gdb-testsuite-add-xfail-case-in-gdb.python-py-record.patch
|
||||
Patch2082: aarch64-avoid-initializers-for-vlas.patch
|
||||
Patch2083: gdb-tdep-aarch64-fix-frame-address-of-last-insn.patch
|
||||
Patch2084: fix-pr30369-regression-on-aarch64-arm-pr30506.patch
|
||||
Patch2085: gdb-testsuite-fix-breakpoint-regexp-in-gdb.ada-out_o.patch
|
||||
Patch2086: gdb-testsuite-relax-breakpoint-count-check-in-gdb.py.patch
|
||||
Patch2087: gdb-testsuite-fix-buffer-overflow-in-gdb.base-signed.patch
|
||||
Patch2088: gdb-testsuite-require-syscall-time-in-gdb.reverse-ti.patch
|
||||
Patch2089: gdb-testsuite-handle-missing-gdc-in-gdb.dlang-dlang-.patch
|
||||
Patch2090: gdb-testsuite-add-basic-lmap-for-tcl-8.6.patch
|
||||
Patch2091: gdb-testsuite-fix-gdb.rust-watch.exp-on-ppc64le.patch
|
||||
Patch2092: gdb-testsuite-fix-gdb.python-py-breakpoint.exp-timeo.patch
|
||||
Patch2093: powerpc-fix-for-gdb.reverse-finish-precsave.exp-and-.patch
|
||||
Patch2094: powerpc-regression-fix-for-reverse-finish-command.patch
|
||||
Patch2095: gdb-testsuite-don-t-use-string-cat-in-gdb.dwarf2-dw2.patch
|
||||
Patch2096: move-step_until-procedure.patch
|
||||
Patch2097: pass-const-frame_info_ptr-reference-for-skip_-langua.patch
|
||||
Patch2000: remove-some-unnecessary-includes-from-exp.y.patch
|
||||
Patch2001: gdb-testsuite-fix-gdb.gdb-python-helper.exp-with-o2-.patch
|
||||
Patch2002: gdb-testsuite-simplify-gdb.base-unwind-on-each-insn..patch
|
||||
Patch2003: gdb-testsuite-handle-output-after-prompt-in-gdb.thre.patch
|
||||
Patch2004: gdb-testsuite-add-xfail-in-gdb.arch-i386-pkru.exp.patch
|
||||
Patch2005: gdb-testsuite-factor-out-proc-linux_kernel_version.patch
|
||||
Patch2006: gdb-testsuite-add-xfail-in-gdb.python-py-record-btra.patch
|
||||
Patch2007: gdb-testsuite-fix-gdb.threads-schedlock.exp-on-fast-.patch
|
||||
Patch2008: gdb-testsuite-simplify-gdb.arch-amd64-disp-step-avx..patch
|
||||
Patch2009: gdb-testsuite-fix-gdb.threads-schedlock.exp-for-gcc-.patch
|
||||
Patch2010: gdb-testsuite-add-xfail-case-in-gdb.python-py-record.patch
|
||||
Patch2011: aarch64-avoid-initializers-for-vlas.patch
|
||||
Patch2012: gdb-tdep-aarch64-fix-frame-address-of-last-insn.patch
|
||||
Patch2013: fix-pr30369-regression-on-aarch64-arm-pr30506.patch
|
||||
Patch2014: gdb-testsuite-fix-breakpoint-regexp-in-gdb.ada-out_o.patch
|
||||
Patch2015: gdb-testsuite-relax-breakpoint-count-check-in-gdb.py.patch
|
||||
Patch2016: gdb-testsuite-fix-buffer-overflow-in-gdb.base-signed.patch
|
||||
Patch2017: gdb-testsuite-require-syscall-time-in-gdb.reverse-ti.patch
|
||||
Patch2018: gdb-testsuite-handle-missing-gdc-in-gdb.dlang-dlang-.patch
|
||||
Patch2019: gdb-testsuite-add-basic-lmap-for-tcl-8.6.patch
|
||||
Patch2020: gdb-testsuite-fix-gdb.rust-watch.exp-on-ppc64le.patch
|
||||
Patch2021: gdb-testsuite-fix-gdb.python-py-breakpoint.exp-timeo.patch
|
||||
Patch2022: powerpc-fix-for-gdb.reverse-finish-precsave.exp-and-.patch
|
||||
Patch2023: powerpc-regression-fix-for-reverse-finish-command.patch
|
||||
Patch2024: gdb-testsuite-don-t-use-string-cat-in-gdb.dwarf2-dw2.patch
|
||||
Patch2025: move-step_until-procedure.patch
|
||||
Patch2026: gdb-testsuite-fix-gdb.arch-i386-signal.exp-on-x86_64.patch
|
||||
Patch2027: gdb-testsuite-fix-regexps-in-gdb.base-step-over-sysc.patch
|
||||
Patch2028: gdb-testsuite-add-kfail-for-pr-ada-30908.patch
|
||||
Patch2029: gdb-testsuite-fix-gdb.ada-mi_task_arg.exp-with-newer.patch
|
||||
Patch2030: gdb-testsuite-fix-gdb.cp-m-static.exp-regression-on-.patch
|
||||
Patch2031: gdb-symtab-fix-line-number-of-static-const-class-mem.patch
|
||||
Patch2032: gdb-symtab-handle-pu-in-iterate_over_some_symtabs.patch
|
||||
Patch2033: gdb-testsuite-fix-gdb.dwarf2-nullptr_t.exp-with-cc-w.patch
|
||||
Patch2034: gdb-symtab-fix-too-many-symbols-in-gdbpy_lookup_stat.patch
|
||||
Patch2035: gdb-support-rseq-auxvs.patch
|
||||
Patch2036: gdb-testsuite-add-xfail-for-gdb-29965-in-gdb.threads.patch
|
||||
Patch2037: gdb-cli-handle-pending-c-after-rl_callback_read_char.patch
|
||||
Patch2038: gdb-testsuite-add-have_host_locale.patch
|
||||
Patch2039: gdb-symtab-find-main-language-without-symtab-expansi.patch
|
||||
Patch2040: gdb-symtab-don-t-deduplicate-variables-in-gdb-index.patch
|
||||
Patch2041: xcoffread.c-fix-werror-dangling-pointer-issue-with-m.patch
|
||||
Patch2042: avoid-manual-memory-management-in-go-lang.c.patch
|
||||
Patch2043: gdb-go-handle-v3-go_0-mangled-prefix.patch
|
||||
Patch2044: gdb-symtab-handle-self-reference-die.patch
|
||||
Patch2045: gdb-symtab-handle-self-reference-in-inherit_abstract.patch
|
||||
Patch2046: gdb-symtab-add-optimized-out-static-var-to-cooked-in.patch
|
||||
Patch2047: gdb-testsuite-fix-gdb.python-py-breakpoint.exp-with-.patch
|
||||
Patch2048: gdb-tui-fix-segfault-in-tui_find_disassembly_address.patch
|
||||
# Part of upstream commit deb1ba4e38b ("[gdb/tui] Fix TUI resizing for TERM=ansi").
|
||||
Patch2049: gdb-testsuite-add-wait_for_msg-arg-to-term-resize-fi.patch
|
||||
|
||||
# Backports from master, not yet available in next release.
|
||||
|
||||
#
|
||||
Patch2070: gdb-symtab-work-around-pr-gas-29517.patch
|
||||
Patch2071: gdb-symtab-add-producer_is_gas.patch
|
||||
Patch2072: gdb-symtab-work-around-gas-pr28629.patch
|
||||
Patch2073: gdb-tdep-fix-nr-array-elements-in-ppc64_aggregate_ca.patch
|
||||
Patch2074: gdb-tui-fix-wmaybe-uninitialized-in-tui_find_disasse.patch
|
||||
|
||||
# Backport from gdb-patches
|
||||
|
||||
@ -351,10 +360,14 @@ Patch2101: gdb-testsuite-prevent-compilation-fails-with-unix-fpie-pie.patch
|
||||
Patch2104: gdb-testsuite-work-around-skip_prologue-problems-in-gdb.threads-process-dies-while-detaching.exp.patch
|
||||
# https://sourceware.org/pipermail/gdb-patches/2021-May/178990.html
|
||||
Patch2105: gdb-cli-add-ignore-errors-command.patch
|
||||
# https://sourceware.org/pipermail/gdb-patches/2023-May/199802.html
|
||||
Patch2106: gdb-cli-handle-pending-c-after-rl_callback_read_char.patch
|
||||
# https://sourceware.org/pipermail/gdb-patches/2023-June/200242.html
|
||||
Patch2107: gdb-testsuite-add-have_host_locale.patch
|
||||
# https://sourceware.org/pipermail/gdb-patches/2023-November/203942.html
|
||||
Patch2106: gdb-fix-segfault-in-for_each_block-part-2.patch
|
||||
# https://sourceware.org/pipermail/gdb-patches/2023-November/203928.html
|
||||
Patch2107: gdb-tui-allow-command-window-of-1-or-2-lines.patch
|
||||
# https://sourceware.org/pipermail/gdb-patches/2023-November/203929.html
|
||||
Patch2108: gdb-tui-fix-resizing-of-terminal-to-1-or-2-lines.patch
|
||||
# https://sourceware.org/pipermail/gdb-patches/2023-November/203943.html
|
||||
Patch2109: gdb-fix-segfault-in-for_each_block-part-1.patch
|
||||
|
||||
# Debug patches.
|
||||
|
||||
@ -583,6 +596,15 @@ Requires: libunwind
|
||||
|
||||
%if %{build_main}
|
||||
|
||||
%if 0%{!?_without_python:1}
|
||||
%if 0%{?suse_version} >= 1500
|
||||
# For SLE-15 and later, we use source-highlight by default, and
|
||||
# pygments as fallback. So, suggests rather than recommends is what we want.
|
||||
# Don't bother older releases with this.
|
||||
Suggests: %{python}-Pygments
|
||||
%endif
|
||||
%endif
|
||||
|
||||
%description
|
||||
GDB, the GNU debugger, allows you to debug programs written in C, C++,
|
||||
Java, and other languages, by executing them in a controlled fashion
|
||||
@ -687,7 +709,15 @@ find -name "*.info*"|xargs rm -f
|
||||
%patch55 -p1
|
||||
%patch57 -p1
|
||||
%patch59 -p1
|
||||
%patch60 -p1
|
||||
%patch61 -p1
|
||||
%patch62 -p1
|
||||
%patch63 -p1
|
||||
%patch64 -p1
|
||||
%patch65 -p1
|
||||
%patch66 -p1
|
||||
%patch67 -p1
|
||||
%patch68 -p1
|
||||
#Fedora patching end
|
||||
|
||||
%patch1000 -p1
|
||||
@ -718,34 +748,62 @@ find -name "*.info*"|xargs rm -f
|
||||
%patch1504 -p1
|
||||
%patch1505 -p1
|
||||
|
||||
%patch2000 -p1
|
||||
%patch2001 -p1
|
||||
%patch2002 -p1
|
||||
%patch2003 -p1
|
||||
%patch2004 -p1
|
||||
%patch2005 -p1
|
||||
%patch2006 -p1
|
||||
%patch2007 -p1
|
||||
%patch2008 -p1
|
||||
%patch2009 -p1
|
||||
%patch2010 -p1
|
||||
%patch2011 -p1
|
||||
%patch2012 -p1
|
||||
%patch2013 -p1
|
||||
%patch2014 -p1
|
||||
%patch2015 -p1
|
||||
%patch2016 -p1
|
||||
%patch2017 -p1
|
||||
%patch2018 -p1
|
||||
%patch2019 -p1
|
||||
%patch2020 -p1
|
||||
%patch2021 -p1
|
||||
%patch2022 -p1
|
||||
%patch2023 -p1
|
||||
%patch2024 -p1
|
||||
%patch2025 -p1
|
||||
%patch2026 -p1
|
||||
%patch2027 -p1
|
||||
%patch2028 -p1
|
||||
%patch2029 -p1
|
||||
%patch2030 -p1
|
||||
%patch2031 -p1
|
||||
%patch2032 -p1
|
||||
%patch2033 -p1
|
||||
%patch2034 -p1
|
||||
%patch2035 -p1
|
||||
%patch2036 -p1
|
||||
%patch2037 -p1
|
||||
%patch2038 -p1
|
||||
%patch2039 -p1
|
||||
%patch2040 -p1
|
||||
%patch2041 -p1
|
||||
%patch2042 -p1
|
||||
%patch2043 -p1
|
||||
%patch2044 -p1
|
||||
%patch2045 -p1
|
||||
%patch2046 -p1
|
||||
%patch2047 -p1
|
||||
%patch2048 -p1
|
||||
%patch2049 -p1
|
||||
|
||||
%patch2075 -p1
|
||||
%patch2076 -p1
|
||||
%patch2077 -p1
|
||||
%patch2078 -p1
|
||||
%patch2079 -p1
|
||||
%patch2080 -p1
|
||||
%patch2081 -p1
|
||||
%patch2082 -p1
|
||||
%patch2083 -p1
|
||||
%patch2084 -p1
|
||||
%patch2085 -p1
|
||||
%patch2086 -p1
|
||||
%patch2087 -p1
|
||||
%patch2088 -p1
|
||||
%patch2089 -p1
|
||||
%patch2090 -p1
|
||||
%patch2091 -p1
|
||||
%patch2092 -p1
|
||||
%patch2093 -p1
|
||||
%patch2094 -p1
|
||||
%patch2095 -p1
|
||||
%patch2096 -p1
|
||||
%patch2097 -p1
|
||||
%patch2070 -p1
|
||||
%patch2071 -p1
|
||||
%patch2072 -p1
|
||||
%patch2073 -p1
|
||||
%patch2074 -p1
|
||||
|
||||
%patch2100 -p1
|
||||
%patch2101 -p1
|
||||
@ -753,6 +811,8 @@ find -name "*.info*"|xargs rm -f
|
||||
%patch2105 -p1
|
||||
%patch2106 -p1
|
||||
%patch2107 -p1
|
||||
%patch2108 -p1
|
||||
%patch2109 -p1
|
||||
|
||||
#unpack libipt
|
||||
%if 0%{have_libipt}
|
||||
|
155
import-fedora.sh
Normal file
155
import-fedora.sh
Normal file
@ -0,0 +1,155 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Fedora Packages not copied:
|
||||
#
|
||||
skip_patches=(
|
||||
# Not applicable for openSUSE.
|
||||
gdb-add-index.patch
|
||||
gdb-6.3-rh-testversion-20041202.patch
|
||||
gdb-6.6-buildid-locate-misleading-warning-missing-debuginfo-rhbz981154.patch
|
||||
gdb-6.8-bz466901-backtrace-full-prelinked.patch
|
||||
gdb-container-rh-pkg.patch
|
||||
|
||||
# Broken.
|
||||
# Over-specific test-case in a shell script.
|
||||
gdb-6.5-BEA-testsuite.patch
|
||||
# Hangs for horizontal-scroll-mode on, times out after 10 minutes.
|
||||
gdb-6.5-readline-long-line-crash-test.patch
|
||||
|
||||
# Fragile test-case, requires glibc to fail in a certain way.
|
||||
gdb-rhbz1156192-recursive-dlopen-test.patch
|
||||
|
||||
# Obsolete (dropped by fedora).
|
||||
gdb-6.7-charsign-test.patch
|
||||
gdb-test-ivy-bridge.patch
|
||||
gdb-ppc-power7-test.patch
|
||||
gdb-6.3-bz140532-ppc-unwinding-test.patch
|
||||
|
||||
# Obsolete.
|
||||
gdb-6.7-charsign-test.patch
|
||||
gdb-6.7-ppc-clobbered-registers-O2-test.patch
|
||||
)
|
||||
|
||||
usage ()
|
||||
{
|
||||
echo "usage: $(basename "$0") <fedora package dir> "
|
||||
}
|
||||
|
||||
dir="$1"
|
||||
|
||||
if [ ! -f "$dir"/_patch_order ]; then
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mark1="^#Fedora Packages begin"
|
||||
mark2="^#Fedora Packages end"
|
||||
mark3="^#Fedora patching start"
|
||||
mark4="^#Fedora patching end"
|
||||
|
||||
remove_current_patches ()
|
||||
{
|
||||
# shellcheck disable=SC2207
|
||||
current_patches=($(awk "/$mark1/,/$mark2/{ print }" gdb.spec \
|
||||
| grep Patch \
|
||||
| awk '{print $2}'))
|
||||
|
||||
for current_patch in "${current_patches[@]}"; do
|
||||
rm -f "$current_patch"
|
||||
done
|
||||
}
|
||||
|
||||
skip ()
|
||||
{
|
||||
local p
|
||||
p="$1"
|
||||
|
||||
for skip_patch in "${skip_patches[@]}"; do
|
||||
if [ "$p" = "$skip_patch" ]; then
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
import_patches ()
|
||||
{
|
||||
# Get the parts of gdb.spec that we want to keep unchanged.
|
||||
awk "NR==1,/$mark1/" gdb.spec \
|
||||
> gdb.spec.1
|
||||
awk "/$mark2/,/$mark3/" gdb.spec \
|
||||
> gdb.spec.3
|
||||
awk "/$mark4/,0" gdb.spec \
|
||||
> gdb.spec.5
|
||||
|
||||
# Start generating the parts of gdb.spec that we want to change.
|
||||
f1=gdb.spec.2
|
||||
f2=gdb.spec.4
|
||||
rm -f $f1 $f2
|
||||
|
||||
# Handle each fedora patch.
|
||||
skipped_patches=()
|
||||
n=1
|
||||
# shellcheck disable=SC2013
|
||||
for p in $(cat "$dir"/_patch_order); do
|
||||
if skip "$p"; then
|
||||
echo "Skipped: $p"
|
||||
skipped_patches=("${skipped_patches[@]}" "$p")
|
||||
|
||||
# Keep numbers the same as in fedora package.
|
||||
n=$((n + 1))
|
||||
continue
|
||||
fi
|
||||
|
||||
cp "$dir"/"$p" .
|
||||
|
||||
printf \
|
||||
"%-16s%s\n" "Patch$n:" "$p" \
|
||||
>> $f1
|
||||
|
||||
echo \
|
||||
"%patch$n -p1" \
|
||||
>> $f2
|
||||
|
||||
n=$((n + 1))
|
||||
done
|
||||
|
||||
# Report which patches did not get skipped.
|
||||
for skip_patch in "${skip_patches[@]}"; do
|
||||
found=false
|
||||
for skipped_patch in "${skipped_patches[@]}"; do
|
||||
if [ "$skip_patch" = "$skipped_patch" ]; then
|
||||
found=true
|
||||
break
|
||||
fi
|
||||
done
|
||||
if ! $found; then
|
||||
echo "Not skipped: $skip_patch"
|
||||
fi
|
||||
done
|
||||
|
||||
# Assemble new gdb.spec.
|
||||
rm -f gdb.spec.new
|
||||
for n in $(seq 1 5); do
|
||||
cat gdb.spec."$n" \
|
||||
>> gdb.spec.new
|
||||
done
|
||||
|
||||
# Cleanup.
|
||||
for n in $(seq 1 5); do
|
||||
rm -f gdb.spec."$n"
|
||||
done
|
||||
|
||||
# Update gdb.spec.
|
||||
mv gdb.spec.new gdb.spec
|
||||
}
|
||||
|
||||
main ()
|
||||
{
|
||||
remove_current_patches
|
||||
|
||||
import_patches
|
||||
}
|
||||
|
||||
main "$@"
|
54
qa-local.sh
54
qa-local.sh
@ -9,23 +9,29 @@ logs=$root/logs
|
||||
pkgs=$root/pkgs
|
||||
|
||||
configs="
|
||||
openSUSE_Leap_15.5
|
||||
openSUSE_Leap_15.4
|
||||
openSUSE_Leap_15.3
|
||||
openSUSE_Factory
|
||||
openSUSE_Factory_LegacyX86
|
||||
SLE-15
|
||||
SLE-12
|
||||
SLE-11
|
||||
"
|
||||
|
||||
archs="x86_64 i586"
|
||||
|
||||
version=13.2
|
||||
|
||||
usage ()
|
||||
{
|
||||
echo "usage: $0 <1-4>"
|
||||
echo "1: Cleanup"
|
||||
echo "2: Do local builds without testsuite"
|
||||
echo "3: Do local builds with testsuite"
|
||||
echo "4: Verify local testsuite results"
|
||||
echo "2: List configs"
|
||||
echo "3: Verify quilt setup"
|
||||
echo "4: Do local builds without testsuite"
|
||||
echo "5: Do local builds with testsuite"
|
||||
echo "6: Verify local testsuite results"
|
||||
}
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
@ -71,16 +77,28 @@ acquire_sudo_rights ()
|
||||
done &
|
||||
}
|
||||
|
||||
archs="x86_64 i586"
|
||||
|
||||
have_combo ()
|
||||
{
|
||||
arch="$1"
|
||||
c="$2"
|
||||
|
||||
if [ "$arch" = "i586" ]; then
|
||||
case $c in
|
||||
SLE-12|SLE-15)
|
||||
case " $c " in
|
||||
" openSUSE_Factory ")
|
||||
# Doesn't have i586.
|
||||
return 1
|
||||
;;
|
||||
" SLE-11 "|" SLE-12 "|" SLE-15 ")
|
||||
# SLE-12 and SLE-15 don't have i586. SLE-11 does, but
|
||||
# we ignore that for now.
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
if [ "$arch" = "x86_64" ]; then
|
||||
case " $c " in
|
||||
" openSUSE_Factory_LegacyX86 ")
|
||||
# Doesn't have x86_64.
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
@ -94,6 +112,22 @@ case "$n" in
|
||||
;;
|
||||
|
||||
2)
|
||||
for arch in $archs; do
|
||||
for c in $configs; do
|
||||
if ! have_combo $arch $c; then
|
||||
continue
|
||||
fi
|
||||
echo "$c $arch"
|
||||
done
|
||||
done
|
||||
;;
|
||||
|
||||
3)
|
||||
quilt setup -d $root -v gdb.spec
|
||||
rm -Rf $root/gdb-*
|
||||
;;
|
||||
|
||||
4)
|
||||
acquire_sudo_rights
|
||||
|
||||
rm -Rf $logs/$n
|
||||
@ -127,7 +161,7 @@ case "$n" in
|
||||
done
|
||||
;;
|
||||
|
||||
3)
|
||||
5)
|
||||
acquire_sudo_rights
|
||||
|
||||
rm -Rf $logs/$n
|
||||
@ -186,7 +220,7 @@ case "$n" in
|
||||
done
|
||||
;;
|
||||
|
||||
4)
|
||||
6)
|
||||
for arch in $archs; do
|
||||
for c in $configs; do
|
||||
if ! have_combo $arch $c; then
|
||||
@ -194,7 +228,7 @@ case "$n" in
|
||||
fi
|
||||
echo "CONFIG: $c $arch"
|
||||
case $c in
|
||||
openSUSE_Factory)
|
||||
openSUSE_Factory|openSUSE_Factory_LegacyX86)
|
||||
bash qa.sh -local -$arch -factory $pkgs/gdb-testresults.$c.$arch
|
||||
;;
|
||||
SLE-12)
|
||||
|
243
qa.sh
243
qa.sh
@ -1,25 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Note:
|
||||
# Occasionally we run into PR28561 - "[gdb/testsuite] Error due to not
|
||||
# reading \r\n at end of mi prompt".
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=28561
|
||||
# Not sure how to filter for that.
|
||||
|
||||
# TODO:
|
||||
#
|
||||
# We run into FAILs like this:
|
||||
# FAIL: gdb.base/options.exp: test-print: \
|
||||
# tab complete "thread apply all print " (clearing input line) (timeout)
|
||||
# FAIL: gdb.base/options.exp: test-print: \
|
||||
# cmd complete "thread apply all print "
|
||||
# in various test-cases. One instance is reported here (
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=27813 ).
|
||||
# We could do a generic kfail for "(clearing input line) (timeout)", but that
|
||||
# doesn't filter out the following FAIL. We need to update the testsuite to
|
||||
# emit only one FAIL for this, or alternatively, add a possibility in this
|
||||
# script to KFAIL one and all following FAILs in the same test-case.
|
||||
|
||||
usage ()
|
||||
{
|
||||
echo "usage: $0 <1-5>"
|
||||
@ -152,33 +132,37 @@ kfail=(
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=26971
|
||||
"FAIL: gdb.arch/amd64-init-x87-values.exp: check_x87_regs_around_init: check post FLD1 value of .fop"
|
||||
"FAIL: gdb.arch/amd64-init-x87-values.exp: check_x87_regs_around_init: check post FLD1 value of .fioff"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=24845
|
||||
"FAIL: gdb.base/step-over-syscall.exp: clone: displaced=off: single step over clone"
|
||||
"FAIL: gdb.base/step-over-syscall.exp: clone: displaced=off: continue to marker \(clone\)"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=19436#c1
|
||||
"FAIL: gdb.cp/no-dmgl-verbose.exp: setting breakpoint at 'f\(std::string\)'"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=25504
|
||||
"FAIL: gdb.threads/process-dies-while-detaching.exp: single-process: continue: .*: continue"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=28065
|
||||
"FAIL: gdb.threads/access-mem-running-thread-exit.exp:"
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=27813
|
||||
"FAIL: gdb.cp/cpcompletion.exp:"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=25503
|
||||
"FAIL: gdb.threads/signal-while-stepping-over-bp-other-thread.exp: step \(pattern 3\)"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=26915
|
||||
"FAIL: gdb.threads/schedlock.exp: schedlock=off: .*: other threads ran - unlocked"
|
||||
"FAIL: gdb.threads/watchthreads-threaded.exp: watchpoint on args\[[1-3]\] hit in thread"
|
||||
"FAIL: gdb.threads/watchthreads-threaded.exp: watch args\[[1-3]\]"
|
||||
"FAIL: gdb.threads/watchthreads-threaded.exp: threaded watch loop"
|
||||
"FAIL: gdb.threads/watchthreads-threaded.exp: combination of threaded watchpoints = 30 \+ initial values"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=28479
|
||||
"FAIL: gdb.mi/mi-nonstop.exp: wait for thread exit \(timeout\)"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=26273
|
||||
"FAIL: gdb.threads/gcore-stale-thread.exp: save a corefile"
|
||||
"FAIL: gdb.threads/gcore-stale-thread.exp: exited thread is current due to non-stop"
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=28467
|
||||
# -pie, x86_64 -m32 or i586.
|
||||
"FAIL: gdb.base/nodebug.exp: p/c \(int\) array_index\(\"abcdef\",2\)"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=28617
|
||||
"FAIL: gdb.base/info-os.exp: get process groups \(timeout\)"
|
||||
"FAIL: gdb.base/info-os.exp: get threads \(timeout\)"
|
||||
@ -196,7 +180,9 @@ kfail=(
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=26363
|
||||
"FAIL: gdb.xml/tdesc-reload.exp: .*internal error"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=26761
|
||||
# Should be fixed in gdb-14.
|
||||
"FAIL: gdb.base/gdb-sigterm.exp: .*internal error"
|
||||
|
||||
# If a test-case fails to compile, it's not a GDB FAIL, ignore.
|
||||
@ -279,19 +265,21 @@ kfail=(
|
||||
"FAIL: gdb.base/info-os.exp: get shared-memory regions"
|
||||
"FAIL: gdb.base/info-os.exp: get threads"
|
||||
|
||||
#https://sourceware.org/bugzilla/show_bug.cgi?id=29790
|
||||
# Fails related to PKRU register. To be investigated. Might be fixed in
|
||||
# gdb 14, but related patches look non-trivial to backport.
|
||||
"FAIL: gdb.arch/i386-pkru.exp: pkru register"
|
||||
"FAIL: gdb.arch/i386-pkru.exp: read pkru register"
|
||||
"FAIL: gdb.arch/i386-pkru.exp: read value after setting value"
|
||||
"FAIL: gdb.arch/i386-pkru.exp: variable after reading pkru"
|
||||
"FAIL: gdb.base/gcore.exp: corefile restored all registers"
|
||||
"FAIL: gdb.reverse/insn-reverse.exp: rdrand: compare registers on insn"
|
||||
"FAIL: gdb.reverse/insn-reverse.exp: rdseed: compare registers on insn"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=28478
|
||||
"FAIL: gdb.gdb/selftest.exp: backtrace through signal handler"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=29781
|
||||
"FAIL: gdb.mi/mi-multi-commands.exp: args=: look for second command output, command length .* \(timeout\)"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=27813
|
||||
"FAIL: .*.exp: .*tab complete .* \(clearing input line\) \(timeout\)"
|
||||
"FAIL: .*.exp: .*cmd complete .*"
|
||||
"FAIL: gdb.mi/mi-multi-commands.exp: args=.*: look for second command output, command length .* \(timeout\)"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=27027
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=28464
|
||||
@ -312,6 +300,10 @@ kfail=(
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=30521
|
||||
"FAIL: gdb.base/printcmds.exp: print {unsigned char\[\]}{0xffffffff}"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=30528
|
||||
# Fixed in 15. Backportable to 14.
|
||||
"FAIL: gdb.dwarf2/per-bfd-sharing.exp: couldn't remove files in temporary cache dir"
|
||||
|
||||
) # kfail
|
||||
|
||||
kfail_sle12=(
|
||||
@ -373,11 +365,6 @@ kfail_sle12=(
|
||||
"FAIL: gdb.base/premature-dummy-frame-removal.exp: set debug frame on"
|
||||
"FAIL: gdb.base/longjmp-until-in-main.exp: until \\\$line, in main"
|
||||
|
||||
# Commit 2d77a94ff17 ("[gdb/testsuite] Require debug info for
|
||||
# gdb.tui/tui-layout-asm-short-prog.exp")
|
||||
"FAIL: gdb.tui/tui-layout-asm-short-prog.exp: check asm box contents"
|
||||
"FAIL: gdb.tui/tui-layout-asm-short-prog.exp: check asm box contents again"
|
||||
|
||||
# Test-cases that use -static but may turn out to be PIE when using
|
||||
# unix/-fPIE/-fpie.
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=29244
|
||||
@ -400,6 +387,10 @@ kfail_sle12=(
|
||||
"FAIL: gdb.fortran/module.exp: print var_d"
|
||||
"FAIL: gdb.fortran/module.exp: print var_x value 31"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=30531
|
||||
"FAIL: gdb.threads/clone-thread_db.exp: continue to clone_fn \(the program exited\)"
|
||||
"FAIL: gdb.threads/clone-thread_db.exp: continue to end \(the program is no longer running\)"
|
||||
|
||||
) # kfail_sle12
|
||||
|
||||
kfail_sle11=(
|
||||
@ -452,28 +443,24 @@ kfail_sle11=(
|
||||
|
||||
kfail_factory=(
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=28463
|
||||
"FAIL: gdb.ada/set_pckd_arr_elt.exp: scenario=minimal: print va.t\(1\) := 15"
|
||||
"FAIL: gdb.ada/set_pckd_arr_elt.exp: scenario=minimal: continue to update_small for va.t"
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=28108
|
||||
"FAIL: gdb.base/langs.exp: up to foo in langs.exp"
|
||||
"FAIL: gdb.base/langs.exp: up to cppsub_ in langs.exp"
|
||||
"FAIL: gdb.base/langs.exp: up to fsub in langs.exp"
|
||||
# https://sourceware.org/pipermail/gdb-patches/2021-October/182449.html
|
||||
"FAIL: gdb.threads/current-lwp-dead.exp: continue to breakpoint: fn_return"
|
||||
|
||||
# Similar error message to the one above, see if fixing that one fixes this.
|
||||
"FAIL: gdb.threads/clone-new-thread-event.exp: catch SIGUSR1"
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=27238
|
||||
"FAIL: gdb.go/package.exp: gdb_breakpoint: set breakpoint at package2.Foo"
|
||||
"FAIL: gdb.go/package.exp: going to first breakpoint \(the program exited\)"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=28551
|
||||
"FAIL: gdb.go/package.exp: going to first breakpoint \\(GDB internal error\\)"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=28468
|
||||
"FAIL: gdb.threads/signal-command-handle-nopass.exp: step-over (yes|no): signal SIGUSR1"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=28477
|
||||
"FAIL: gdb.base/step-over-syscall.exp: clone: displaced=off: continue to marker \(clone\)"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=26867
|
||||
"FAIL: gdb.threads/signal-sigtrap.exp: sigtrap thread 1: signal SIGTRAP reaches handler"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=28510
|
||||
"FAIL: gdb.debuginfod/fetch_src_and_symbols.exp: local_url: br main"
|
||||
"FAIL: gdb.debuginfod/fetch_src_and_symbols.exp: local_url: l"
|
||||
@ -481,21 +468,10 @@ kfail_factory=(
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=28667
|
||||
"FAIL: gdb.reverse/watch-precsave.exp: watchpoint hit, fourth time \\(GDB internal error\\)"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=29160
|
||||
"FAIL: gdb.ctf/.*.exp"
|
||||
"FAIL: gdb.base/ctf-.*.exp"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=29196
|
||||
"FAIL: gdb.base/gdb11531.exp: watchpoint variable triggers at next"
|
||||
"FAIL: gdb.base/gdb11531.exp: watchpoint variable triggers at continue"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=29247
|
||||
"FAIL: gdb.base/varargs.exp: print find_max_long_double_real\(4, ldc1, ldc2, ldc3, ldc4\)"
|
||||
|
||||
# We get "value has been optimized out", which is possible for an optimized gdb, due
|
||||
# to optimization of function c_print_type.
|
||||
"FAIL: gdb.gdb/python-helper.exp: print \*type->main_type"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=29253
|
||||
"FAIL: gdb.server/stop-reply-no-thread.exp: to_disable=threads: continue to main \(timeout\)"
|
||||
"FAIL: gdb.server/stop-reply-no-thread.exp: to_disable=threads: continue until exit \(timeout\)"
|
||||
@ -503,15 +479,6 @@ kfail_factory=(
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=29706
|
||||
"FAIL: gdb.base/eof-exit.exp: with non-dump terminal: with bracketed-paste-mode on: close GDB with eof \(missed the prompt\)"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=29965
|
||||
"FAIL: gdb.threads/process-exit-status-is-leader-exit-status.exp: iteration=.*: continue \(the program exited\)"
|
||||
|
||||
# To be investigated.
|
||||
"FAIL: gdb.ada/mi_task_arg.exp: -stack-list-arguments 1 \(unexpected output\)"
|
||||
"FAIL: gdb.ada/str_binop_equal.exp: print my_str = \"ABCD\""
|
||||
"FAIL: gdb.ada/widewide.exp: print my_wws = \" helo\""
|
||||
"FAIL: gdb.ada/widewide.exp: print my_ws = \"wide\""
|
||||
|
||||
# Looks like a problem with modern debug info, where stepping out of a
|
||||
# function takes more one step.
|
||||
"FAIL: gdb.base/rtld-step.exp: finish out of foo 1"
|
||||
@ -524,89 +491,39 @@ kfail_factory=(
|
||||
# Sets breakpoints in gdb build with lto. This is known to be slow, and
|
||||
# likely to cause timeouts.
|
||||
gdb.gdb/python-helper.exp
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=30540
|
||||
FAIL: gdb.base/auxv.exp: info auxv on live process
|
||||
FAIL: gdb.base/auxv.exp: info auxv on gcore-created dump
|
||||
|
||||
) # kfail_factory
|
||||
|
||||
kfail_aarch64=(
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=29408
|
||||
"FAIL: gdb.base/large-frame.exp: optimize=-O0: backtrace"
|
||||
"FAIL: gdb.base/large-frame.exp: optimize=-O1: backtrace"
|
||||
"FAIL: gdb.base/large-frame.exp: optimize=-O2: backtrace"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=29405
|
||||
"FAIL: gdb.base/step-over-syscall.exp: (fork|vfork): displaced=(on|off): pc after stepi matches insn addr after syscall"
|
||||
"FAIL: gdb.base/step-over-syscall.exp: (fork|vfork): displaced=(on|off): check_pc_after_cross_syscall: single step over fork final pc"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=29418
|
||||
"FAIL: gdb.ada/O2_float_param.exp: scenario=all: frame"
|
||||
"FAIL: gdb.ada/O2_float_param.exp: scenario=minimal: frame"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=29420
|
||||
"FAIL: gdb.ada/convvar_comp.exp: print \\\$item.started"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=29423
|
||||
"FAIL: gdb.base/watchpoint-unaligned.exp: continue \(timeout\)"
|
||||
"FAIL: gdb.base/watchpoint-unaligned.exp: size8twice write"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=28561
|
||||
# "[gdb/testsuite] Error due to not reading \r\n at end of mi prompt"
|
||||
# We match pretty aggressively here.
|
||||
"FAIL: gdb.mi/.*.exp:"
|
||||
"FAIL: gdb.python/.*-mi.exp:"
|
||||
"FAIL: gdb.python/py-mi-.*.exp:"
|
||||
"FAIL: gdb.ada/mi.*.exp:"
|
||||
"FAIL: gdb.base/annota.*.exp:"
|
||||
"FAIL: gdb.dwarf2/dw2-opt-structptr.exp: mi"
|
||||
|
||||
) # kfail_aarch64
|
||||
|
||||
kfail_powerpc64le=(
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=29420
|
||||
"FAIL: gdb.ada/convvar_comp.exp: print \\\$item.started"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=29814
|
||||
"FAIL: gdb.base/msym-bp-shl.exp: debug=0: before run: info breakpoint"
|
||||
"FAIL: gdb.base/msym-bp-shl.exp: debug=1: before run: info breakpoint"
|
||||
|
||||
# Commit a0eda3df5b7 ("PowerPC, fix support for printing the function
|
||||
# return value for non-trivial values").
|
||||
"FAIL: gdb.cp/non-trivial-retval.exp: finish from"
|
||||
"FAIL: gdb.ada/array_return.exp: value printed by finish of Create_Small_Float_Vector"
|
||||
"FAIL: gdb.base/gnu_vector.exp: call add_structvecs"
|
||||
|
||||
# Commit f68eca29d3b ("PowerPC, fix gdb.base/retval-large-struct.exp").
|
||||
"FAIL: gdb.base/retval-large-struct.exp: finish from return_large_struct"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=29792
|
||||
"FAIL: gdb.opt/solib-intra-step.exp: second-hit"
|
||||
|
||||
# Carl Love mentioned he's working on these.
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=29793#c2
|
||||
"FAIL: gdb.reverse/finish-precsave.exp"
|
||||
"FAIL: gdb.reverse/finish-reverse.exp"
|
||||
|
||||
# Commit 29004660c94 ("PowerPC fix for gdb.server/sysroot.exp").
|
||||
"FAIL: gdb.server/sysroot.exp: sysroot=local: continue to printf"
|
||||
"FAIL: gdb.server/sysroot.exp: sysroot=remote: continue to printf"
|
||||
|
||||
# Known to run into timeouts.
|
||||
"FAIL: gdb.gdb/python-helper.exp"
|
||||
|
||||
# Fedora test. Fails because it doesn't handle ppc64le.
|
||||
"FAIL: gdb.arch/powerpc-bcl-prologue.exp: powerpc arch test"
|
||||
|
||||
# Commit 301fe55e9c4 ("PowerPC: bp-permanent.exp, kill-after-signal fix").
|
||||
"FAIL: gdb.base/kill-after-signal.exp: stepi"
|
||||
"FAIL: gdb.base/bp-permanent.exp: always_inserted=off, sw_watchpoint=0: stepi signal with handler: mainline pc points at permanent breakpoint"
|
||||
"FAIL: gdb.base/bp-permanent.exp: always_inserted=off, sw_watchpoint=1: stepi signal with handler: mainline pc points at permanent breakpoint"
|
||||
"FAIL: gdb.base/bp-permanent.exp: always_inserted=on, sw_watchpoint=0: stepi signal with handler: mainline pc points at permanent breakpoint"
|
||||
"FAIL: gdb.base/bp-permanent.exp: always_inserted=on, sw_watchpoint=1: stepi signal with handler: mainline pc points at permanent breakpoint"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=29813
|
||||
"FAIL: gdb.base/vla-optimized-out.exp: o1: printed size of optimized out vla"
|
||||
|
||||
# Commit 4d88ae0c7b5 ("[gdb/testsuite] Fix gdb.base/maint.exp on powerpc64le").
|
||||
"FAIL: gdb.base/maint.exp: maint print objfiles: symtabs"
|
||||
|
||||
# Commit e7d69e72bfd ("gdb: always add the default register groups").
|
||||
"FAIL: gdb.xml/tdesc-regs.exp: maintenance print reggroups"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=30548
|
||||
"FAIL: gdb.base/inline-frame-cycle-unwind.exp: cycle at level [0-9]*: backtrace when the unwind is broken at frame [0-9]*"
|
||||
|
||||
@ -616,15 +533,6 @@ kfail_powerpc64le=(
|
||||
"FAIL: gdb.reverse/next-reverse-bkpt-over-sr.exp: reverse-next over call trips user breakpoint at function entry"
|
||||
"FAIL: gdb.reverse/next-reverse-bkpt-over-sr.exp: stopped at the right callee call"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=29816
|
||||
"FAIL: gdb.ada/float-bits.exp: print 16llf#4000921fb54442d18469898cc51701b8#"
|
||||
"FAIL: gdb.ada/float-bits.exp: print \\\$foo:=16llf#4000921fb54442d18469898cc51701b8#"
|
||||
"FAIL: gdb.ada/float-bits.exp: print internal long double variable after assignment"
|
||||
|
||||
# Commit 8b272d7671f ("[gdb/testsuite] Fix gdb.guile/scm-symtab.exp for
|
||||
# ppc64le").
|
||||
"FAIL: gdb.guile/scm-symtab.exp: test find-pc-line with resume address"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=29897
|
||||
"FAIL: gdb.base/run-control-while-bg-execution.exp: action1=.*: action2=start: start \(GDB internal error\)"
|
||||
"FAIL: gdb.base/run-control-while-bg-execution.exp: action1=.*: action2=run: run \(GDB internal error\)"
|
||||
@ -636,28 +544,59 @@ kfail_powerpc64le=(
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=30542
|
||||
"FAIL: gdb.base/watch-before-fork.exp: test: continue to catch fork"
|
||||
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=30543
|
||||
"FAIL: gdb.python/py-send-packet.exp: call python run_auxv_send_packet_test function"
|
||||
|
||||
# Cluster of fails related to hw watchpoint support.
|
||||
"FAIL: gdb.ada/scoped_watch.exp:"
|
||||
"FAIL: gdb.ada/task_watch.exp:"
|
||||
"FAIL: gdb.ada/watch_minus_l.exp:"
|
||||
"FAIL: gdb.base/watch-before-fork.exp:"
|
||||
"FAIL: gdb.base/watch-bitfields.exp:"
|
||||
"FAIL: gdb.base/watch-cond.exp:"
|
||||
"FAIL: gdb.base/watch-cond-infcall.exp:"
|
||||
"FAIL: gdb.base/watchpoint-during-step.exp:"
|
||||
"FAIL: gdb.base/watchpoint.exp:"
|
||||
"FAIL: gdb.base/watchpoint-hw-attach.exp:"
|
||||
"FAIL: gdb.base/watchpoint-hw-hit-once.exp:"
|
||||
"FAIL: gdb.base/watchpoints.exp:"
|
||||
"FAIL: gdb.base/watchpoint-solib.exp:"
|
||||
"FAIL: gdb.base/watchpoint-stops-at-right-insn.exp:"
|
||||
"FAIL: gdb.base/watchpoint-unaligned.exp:"
|
||||
"FAIL: gdb.base/watch-read.exp:"
|
||||
"FAIL: gdb.base/watch_thread_num.exp:"
|
||||
"FAIL: gdb.base/watch-vfork.exp:"
|
||||
"FAIL: gdb.cp/watch-cp.exp:"
|
||||
"FAIL: gdb.mi/mi-watch.exp:"
|
||||
"FAIL: gdb.threads/step-over-trips-on-watchpoint.exp:"
|
||||
"FAIL: gdb.threads/watchpoint-fork.exp:"
|
||||
"FAIL: gdb.threads/watchthreads2.exp:"
|
||||
"FAIL: gdb.threads/wp-replication.exp:"
|
||||
"FAIL: gdb.base/display.exp:"
|
||||
"FAIL: gdb.base/recurse.exp:"
|
||||
"FAIL: gdb.base/gdb11531.exp:"
|
||||
"FAIL: gdb.base/pr11022.exp:"
|
||||
"FAIL: gdb.base/value-double-free.exp: continue \(the program exited\)"
|
||||
"FAIL: gdb.base/value-double-free.exp: print empty\(\)"
|
||||
"FAIL: gdb.cp/annota2.exp: watch triggered on a.x \(timeout\)"
|
||||
"FAIL: gdb.cp/annota2.exp: annotate-quit"
|
||||
"FAIL: gdb.cp/annota3.exp: watch triggered on a.x \(timeout\)"
|
||||
"FAIL: gdb.cp/annota3.exp: annotate-quit \(pattern 1\)"
|
||||
"FAIL: gdb.mi/pr11022.exp:"
|
||||
"FAIL: gdb.python/py-breakpoint.exp: test_watchpoints: Test watchpoint write \(the program exited\)"
|
||||
"FAIL: gdb.python/py-breakpoint.exp: test_bkpt_internal: Test watchpoint write \(the program exited\)"
|
||||
"FAIL: gdb.python/py-breakpoint.exp: test_bkpt_eval_funcs: Test watchpoint write \(the program exited\)"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=31004
|
||||
"FAIL: gdb.base/run-control-while-bg-execution.exp: action1=.*: action2=run: run"
|
||||
)
|
||||
|
||||
kfail_powerpc64le_sle12=(
|
||||
|
||||
# Commit 85819864f7c ("[gdb/testsuite] Fix gdb.arch/altivec-regs.exp with
|
||||
# gcc 4.8.5").
|
||||
"FAIL: gdb.arch/altivec-regs.exp: down to vector_fun"
|
||||
"FAIL: gdb.arch/altivec-regs.exp: finish returned correct value"
|
||||
"FAIL: gdb.arch/altivec-regs.exp: print vector parameter a"
|
||||
"FAIL: gdb.arch/altivec-regs.exp: print vector parameter b"
|
||||
|
||||
)
|
||||
|
||||
kfail_s390x_s390=(
|
||||
|
||||
# Commit 167f3beb655 ("[gdb/testsuite] Fix gdb.base/write_mem.exp for big
|
||||
# endian")
|
||||
"FAIL: gdb.base/write_mem.exp: x /xh main"
|
||||
|
||||
)
|
||||
|
||||
# Plain s390 or s390x/-m31.
|
||||
@ -767,10 +706,12 @@ case $n in
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=28323
|
||||
"SLE-12.x86_64.*gdb.ada/mi_dyn_arr.exp"
|
||||
|
||||
# Gdb runs out of virtual memory, we can expect an internal error.
|
||||
"UNRESOLVED: gdb.base/gcore-excessive-memory.exp: attach"
|
||||
"UNRESOLVED: gdb.base/gcore-excessive-memory.exp: verify we can get to main"
|
||||
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=30547
|
||||
"UNRESOLVED: gdb.base/vfork-follow-parent.exp: resolution_method=schedule-multiple: continue to break_parent"
|
||||
# https://sourceware.org/bugzilla/show_bug.cgi?id=31001
|
||||
"UNRESOLVED: gdb.threads/async.exp: thread 1: current thread is 1"
|
||||
)
|
||||
|
||||
kfail_re=$(join "|" "${kfail[@]}")
|
||||
@ -936,7 +877,7 @@ case $n in
|
||||
|
||||
(
|
||||
# Known clean config: Factory i586
|
||||
config=openSUSE_Factory.i586/gdb-testresults
|
||||
config=openSUSE_Factory_LegacyX86.i586/gdb-testresults
|
||||
sums=("$config/gdb-i586-suse-linux-m32.-fno-PIE.-no-pie.sum"
|
||||
"$config/gdb-i586-suse-linux-m32.sum")
|
||||
|
||||
@ -1051,3 +992,5 @@ case $n in
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
true
|
||||
|
139
xcoffread.c-fix-werror-dangling-pointer-issue-with-m.patch
Normal file
139
xcoffread.c-fix-werror-dangling-pointer-issue-with-m.patch
Normal file
@ -0,0 +1,139 @@
|
||||
From c835eac78b389ce1e29aade9d0468c13854c1cb9 Mon Sep 17 00:00:00 2001
|
||||
From: Mark Wielaard <mark@klomp.org>
|
||||
Date: Sat, 29 Apr 2023 22:46:11 +0200
|
||||
Subject: [PATCH 1/3] xcoffread.c: Fix -Werror=dangling-pointer= issue with
|
||||
main_subfile.
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
GCC 13 points out that main_subfile has local function scope, but a
|
||||
pointer to it is assigned to the global inclTable array subfile
|
||||
element field:
|
||||
|
||||
In function ‘void process_linenos(CORE_ADDR, CORE_ADDR)’,
|
||||
inlined from ‘void aix_process_linenos(objfile*)’ at xcoffread.c:727:19,
|
||||
inlined from ‘void aix_process_linenos(objfile*)’ at xcoffread.c:720:1:
|
||||
xcoffread.c:629:37: error: storing the address of local variable ‘main_subfile’ in ‘*inclTable.19_45 + _28._inclTable::subfile’ [-Werror=dangling-pointer=]
|
||||
629 | inclTable[ii].subfile = &main_subfile;
|
||||
| ~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
|
||||
xcoffread.c: In function ‘void aix_process_linenos(objfile*)’:
|
||||
xcoffread.c:579:18: note: ‘main_subfile’ declared here
|
||||
579 | struct subfile main_subfile;
|
||||
| ^~~~~~~~~~~~
|
||||
xcoffread.c:496:19: note: ‘inclTable’ declared here
|
||||
496 | static InclTable *inclTable; /* global include table */
|
||||
| ^~~~~~~~~
|
||||
|
||||
Fix this by making main_subfile file static. And allocate and
|
||||
deallocated together with inclTable in allocate_include_entry and
|
||||
xcoff_symfile_finish. Adjust the use of main_subfile in
|
||||
process_linenos to take a pointer to the subfile.
|
||||
---
|
||||
gdb/xcoffread.c | 24 +++++++++++++-----------
|
||||
1 file changed, 13 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c
|
||||
index 52ae3aecb97..53779259b57 100644
|
||||
--- a/gdb/xcoffread.c
|
||||
+++ b/gdb/xcoffread.c
|
||||
@@ -501,6 +501,9 @@ static int inclIndx; /* last entry to table */
|
||||
static int inclLength; /* table length */
|
||||
static int inclDepth; /* nested include depth */
|
||||
|
||||
+/* subfile structure for the main compilation unit. */
|
||||
+static subfile *main_subfile;
|
||||
+
|
||||
static void allocate_include_entry (void);
|
||||
|
||||
static void
|
||||
@@ -551,6 +554,7 @@ allocate_include_entry (void)
|
||||
inclTable = XCNEWVEC (InclTable, INITIAL_INCLUDE_TABLE_LENGTH);
|
||||
inclLength = INITIAL_INCLUDE_TABLE_LENGTH;
|
||||
inclIndx = 0;
|
||||
+ main_subfile = new subfile;
|
||||
}
|
||||
else if (inclIndx >= inclLength)
|
||||
{
|
||||
@@ -578,9 +582,6 @@ process_linenos (CORE_ADDR start, CORE_ADDR end)
|
||||
file_ptr max_offset
|
||||
= XCOFF_DATA (this_symtab_objfile)->max_lineno_offset;
|
||||
|
||||
- /* subfile structure for the main compilation unit. */
|
||||
- struct subfile main_subfile;
|
||||
-
|
||||
/* In the main source file, any time we see a function entry, we
|
||||
reset this variable to function's absolute starting line number.
|
||||
All the following line numbers in the function are relative to
|
||||
@@ -599,7 +600,7 @@ process_linenos (CORE_ADDR start, CORE_ADDR end)
|
||||
/* All source lines were in the main source file. None in include
|
||||
files. */
|
||||
|
||||
- enter_line_range (&main_subfile, offset, 0, start, end,
|
||||
+ enter_line_range (main_subfile, offset, 0, start, end,
|
||||
&main_source_baseline);
|
||||
|
||||
else
|
||||
@@ -616,7 +617,7 @@ process_linenos (CORE_ADDR start, CORE_ADDR end)
|
||||
if (offset < inclTable[ii].begin)
|
||||
{
|
||||
enter_line_range
|
||||
- (&main_subfile, offset, inclTable[ii].begin - linesz,
|
||||
+ (main_subfile, offset, inclTable[ii].begin - linesz,
|
||||
start, 0, &main_source_baseline);
|
||||
}
|
||||
|
||||
@@ -627,9 +628,9 @@ process_linenos (CORE_ADDR start, CORE_ADDR end)
|
||||
|
||||
main_source_baseline = inclTable[ii].funStartLine;
|
||||
enter_line_range
|
||||
- (&main_subfile, inclTable[ii].begin, inclTable[ii].end,
|
||||
+ (main_subfile, inclTable[ii].begin, inclTable[ii].end,
|
||||
start, 0, &main_source_baseline);
|
||||
- inclTable[ii].subfile = &main_subfile;
|
||||
+ inclTable[ii].subfile = main_subfile;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -651,24 +652,24 @@ process_linenos (CORE_ADDR start, CORE_ADDR end)
|
||||
enter remaining lines of the main file, if any left. */
|
||||
if (offset < max_offset + 1 - linesz)
|
||||
{
|
||||
- enter_line_range (&main_subfile, offset, 0, start, end,
|
||||
+ enter_line_range (main_subfile, offset, 0, start, end,
|
||||
&main_source_baseline);
|
||||
}
|
||||
}
|
||||
|
||||
/* Process main file's line numbers. */
|
||||
- if (!main_subfile.line_vector_entries.empty ())
|
||||
+ if (!main_subfile->line_vector_entries.empty ())
|
||||
{
|
||||
/* Line numbers are not necessarily ordered. xlc compilation will
|
||||
put static function to the end. */
|
||||
- arrange_linetable (main_subfile.line_vector_entries);
|
||||
+ arrange_linetable (main_subfile->line_vector_entries);
|
||||
}
|
||||
|
||||
/* Now, process included files' line numbers. */
|
||||
|
||||
for (int ii = 0; ii < inclIndx; ++ii)
|
||||
{
|
||||
- if (inclTable[ii].subfile != ((struct subfile *) &main_subfile)
|
||||
+ if (inclTable[ii].subfile != main_subfile
|
||||
&& !inclTable[ii].subfile->line_vector_entries.empty ())
|
||||
{
|
||||
/* Line numbers are not necessarily ordered. xlc compilation will
|
||||
@@ -1811,6 +1812,7 @@ xcoff_symfile_finish (struct objfile *objfile)
|
||||
{
|
||||
xfree (inclTable);
|
||||
inclTable = NULL;
|
||||
+ delete main_subfile;
|
||||
}
|
||||
inclIndx = inclLength = inclDepth = 0;
|
||||
}
|
||||
|
||||
base-commit: 38a5283b23caca5317eaeb7927a5a11eccc6eb69
|
||||
--
|
||||
2.35.3
|
||||
|
Loading…
x
Reference in New Issue
Block a user