Rebase to FSF GDB 12.1.

Update gdb-6.6-buildid-locate.patch.
Update gdb-6.6-buildid-locate-rpm.patch.
Dropped backported patches from GDB 11.1 and 11.2.
This commit is contained in:
Kevin Buettner 2022-05-05 10:39:10 -07:00
parent 9320c99e53
commit 59e24d72dd
31 changed files with 126 additions and 2979 deletions

2
.gitignore vendored
View File

@ -1,4 +1,4 @@
/new-fedora-release
/gdb-libstdc++-v3-python-8.1.1-20180626.tar.xz
/v2.0.4.tar.gz
/gdb-11.2.tar.xz
/gdb-12.1.tar.xz

View File

@ -314,48 +314,3 @@ Patch074: gdb-rhbz1398387-tab-crash-test.patch
# =fedoratest
Patch075: gdb-rhbz1553104-s390x-arch12-test.patch
#Backport upstream patch which fixes internal-error: Unexpected
#type field location kind (RHBZ 1976887).
Patch076: gdb-rhbz1976887-field-location-kind.patch
# Backport test for RHBZ 1976887 (Kevin Buettner).
Patch077: gdb-test-for-rhbz1976887.patch
# Backport gdb.fortran testsuite changes in order to avoid Fortran
# lexical analyzer bug.
Patch078: gdb-rhbz2012976-paper-over-fortran-lex-problems.patch
# Backport manpage update
Patch079: gdb-rhbz-853071-update-manpages.patch
# Backport fix for dprintf bug (RH BZ 2022177).
Patch080: gdb-rhbz2022177-dprintf-1.patch
# Backport test case for dprintf bug (RH BZ 2022177).
Patch081: gdb-rhbz2022177-dprintf-2.patch
#Backport upstream commit from Aaron Merey
#3ea44f21299 gdb.texinfo: Expand documentation for debuginfod
Patch082: gdb-rhbz2024875-expand-documentation-for-debuginfod.patch
#Backport upstream commit from Aaron Merey
#7811fa5995f gdb: add set/show commands for managing debuginfod
Patch083: gdb-rhbz2024875-set_show-for-managing-debuginfod.patch
#Backport upstream commit from Tom Tromey
#2a8f1f47446 Fix unittest.exp failure due to 'set debuginfod' addition
Patch084: gdb-rhbz2024875-fix-unittest-failure.patch
#Backport upstream commit from Simon Marchi
#333f35b6315 gdb: pass/return setting setter/getter
#scalar values by value
Patch085: gdb-rhbz202487-rework-set-debuginfod.patch
#Backport upstream commit from Aaron Merey
#b9db26b4c44 [PR gdb/27026] CTRL-C is ignored when debug info is downloaded
Patch086: gdb-rhbz2024875-pr27026.patch
# Backport upstream patch from Aaron Merey which suppresses debuginfod
# progress messages when size is zero. (RH BZ 2068280).
Patch087: gdb-rhbz2068280-debuginfod-unavailable-size.patch

View File

@ -73,15 +73,3 @@
%patch073 -p1
%patch074 -p1
%patch075 -p1
%patch076 -p1
%patch077 -p1
%patch078 -p1
%patch079 -p1
%patch080 -p1
%patch081 -p1
%patch082 -p1
%patch083 -p1
%patch084 -p1
%patch085 -p1
%patch086 -p1
%patch087 -p1

View File

@ -1 +1 @@
ef6ec3333e80e39ce207c6c5d5628bdd5402111d
e53a8e8685685c97588f8319d993ea6cd5635e47

View File

@ -73,15 +73,3 @@ gdb-linux_perf-bundle.patch
gdb-libexec-add-index.patch
gdb-rhbz1398387-tab-crash-test.patch
gdb-rhbz1553104-s390x-arch12-test.patch
gdb-rhbz1976887-field-location-kind.patch
gdb-test-for-rhbz1976887.patch
gdb-rhbz2012976-paper-over-fortran-lex-problems.patch
gdb-rhbz-853071-update-manpages.patch
gdb-rhbz2022177-dprintf-1.patch
gdb-rhbz2022177-dprintf-2.patch
gdb-rhbz2024875-expand-documentation-for-debuginfod.patch
gdb-rhbz2024875-set_show-for-managing-debuginfod.patch
gdb-rhbz2024875-fix-unittest-failure.patch
gdb-rhbz202487-rework-set-debuginfod.patch
gdb-rhbz2024875-pr27026.patch
gdb-rhbz2068280-debuginfod-unavailable-size.patch

View File

@ -16,7 +16,7 @@ Subject: gdb-6.3-gstack-20050411.patch
diff --git a/gdb/Makefile.in b/gdb/Makefile.in
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -1753,7 +1753,7 @@ info install-info clean-info dvi pdf install-pdf html install-html: force
@@ -1767,7 +1767,7 @@ info install-info clean-info dvi pdf install-pdf html install-html: force
install: all
@$(MAKE) $(FLAGS_TO_PASS) install-only
@ -25,7 +25,7 @@ diff --git a/gdb/Makefile.in b/gdb/Makefile.in
transformed_name=`t='$(program_transform_name)'; \
echo gdb | sed -e "$$t"` ; \
if test "x$$transformed_name" = x; then \
@@ -1802,7 +1802,25 @@ install-guile:
@@ -1816,7 +1816,25 @@ install-guile:
install-python:
$(SHELL) $(srcdir)/../mkinstalldirs $(DESTDIR)$(GDB_DATADIR)/python/gdb
@ -52,8 +52,8 @@ diff --git a/gdb/Makefile.in b/gdb/Makefile.in
transformed_name=`t='$(program_transform_name)'; \
echo gdb | sed -e $$t` ; \
if test "x$$transformed_name" = x; then \
@@ -1825,6 +1843,18 @@ uninstall: force $(CONFIG_UNINSTALL)
fi
@@ -1847,6 +1865,18 @@ uninstall: force $(CONFIG_UNINSTALL)
rm -f $(DESTDIR)$(bindir)/$$transformed_name
@$(MAKE) DO=uninstall "DODIRS=$(SUBDIRS)" $(FLAGS_TO_PASS) subdir_do
+.PHONY: uninstall-gstack

View File

@ -27,7 +27,7 @@ diff --git a/gdb/testsuite/gdb.gdb/selftest.exp b/gdb/testsuite/gdb.gdb/selftest
diff --git a/gdb/top.c b/gdb/top.c
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -2195,7 +2195,7 @@ init_gdb_version_vars (void)
@@ -2234,7 +2234,7 @@ init_gdb_version_vars (void)
struct internalvar *major_version_var = create_internalvar ("_gdb_major");
struct internalvar *minor_version_var = create_internalvar ("_gdb_minor");
int vmajor = 0, vminor = 0, vrevision = 0;

View File

@ -44,7 +44,7 @@ glibc-debuginfo-2.7-2.x86_64: /usr/lib/debug/lib64/libc.so.6.debug:
diff --git a/gdb/printcmd.c b/gdb/printcmd.c
--- a/gdb/printcmd.c
+++ b/gdb/printcmd.c
@@ -1306,6 +1306,10 @@ process_print_command_args (const char *args, value_print_options *print_opts,
@@ -1301,6 +1301,10 @@ process_print_command_args (const char *args, value_print_options *print_opts,
if (exp != nullptr && *exp)
{

View File

@ -9,7 +9,7 @@ Subject: gdb-6.6-buildid-locate-rpm-librpm-workaround.patch
diff --git a/gdb/build-id.c b/gdb/build-id.c
--- a/gdb/build-id.c
+++ b/gdb/build-id.c
@@ -708,6 +708,19 @@ build_id_to_filename (const struct bfd_build_id *build_id, char **link_return)
@@ -712,6 +712,19 @@ build_id_to_filename (const struct bfd_build_id *build_id, char **link_return)
#include <dlfcn.h>
#endif

View File

@ -12,7 +12,7 @@ https://bugzilla.redhat.com/show_bug.cgi?id=953585
diff --git a/gdb/build-id.c b/gdb/build-id.c
--- a/gdb/build-id.c
+++ b/gdb/build-id.c
@@ -742,7 +742,11 @@ static int missing_rpm_list_entries;
@@ -746,7 +746,11 @@ static int missing_rpm_list_entries;
/* Returns the count of newly added rpms. */
static int
@ -24,7 +24,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
{
static int rpm_init_done = 0;
rpmts ts;
@@ -849,7 +853,11 @@ missing_rpm_enlist (const char *filename)
@@ -853,7 +857,11 @@ missing_rpm_enlist (const char *filename)
mi = rpmtsInitIterator_p (ts, RPMTAG_BASENAMES, filename, 0);
if (mi != NULL)
{
@ -36,7 +36,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
{
Header h;
char *debuginfo, **slot, *s, *s2;
@@ -967,6 +975,37 @@ missing_rpm_enlist (const char *filename)
@@ -971,6 +979,37 @@ missing_rpm_enlist (const char *filename)
xfree (debuginfo);
count++;
}
@ -74,7 +74,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
rpmdbFreeIterator_p (mi);
}
@@ -976,6 +1015,20 @@ missing_rpm_enlist (const char *filename)
@@ -980,6 +1019,20 @@ missing_rpm_enlist (const char *filename)
return count;
}
@ -98,7 +98,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -2801,6 +2801,16 @@ read_gdb_index_from_buffer (const char *filename,
@@ -2797,6 +2797,16 @@ read_gdb_index_from_buffer (const char *filename,
"set use-deprecated-index-sections on". */
if (version < 6 && !deprecated_ok)
{
@ -115,7 +115,7 @@ diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
static int warning_printed = 0;
if (!warning_printed)
{
@@ -2812,6 +2822,10 @@ to use the section anyway."),
@@ -2808,6 +2818,10 @@ to use the section anyway."),
warning_printed = 1;
}
return 0;

View File

@ -243,7 +243,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
#include "objfiles.h"
#include "observable.h"
#include "symfile.h"
@@ -697,8 +698,374 @@ build_id_to_filename (const struct bfd_build_id *build_id, char **link_return)
@@ -701,8 +702,374 @@ build_id_to_filename (const struct bfd_build_id *build_id, char **link_return)
return result;
}
@ -619,7 +619,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
avoidance. */
struct missing_filepair
@@ -752,11 +1119,17 @@ missing_filepair_change (void)
@@ -756,11 +1123,17 @@ missing_filepair_change (void)
/* All their memory came just from missing_filepair_OBSTACK. */
missing_filepair_hash = NULL;
}
@ -637,7 +637,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
missing_filepair_change ();
}
@@ -823,14 +1196,38 @@ debug_print_missing (const char *binary, const char *debug)
@@ -827,14 +1200,38 @@ debug_print_missing (const char *binary, const char *debug)
*slot = missing_filepair;
@ -696,7 +696,7 @@ diff --git a/gdb/config.in b/gdb/config.in
/* Define to 1 if translation of program messages to the user's native
language is requested. */
#undef ENABLE_NLS
@@ -250,6 +253,9 @@
@@ -259,6 +262,9 @@
/* Define if you have the mpfr library. */
#undef HAVE_LIBMPFR
@ -709,9 +709,9 @@ diff --git a/gdb/config.in b/gdb/config.in
diff --git a/gdb/configure b/gdb/configure
--- a/gdb/configure
+++ b/gdb/configure
@@ -771,6 +771,11 @@ PKG_CONFIG
HAVE_NATIVE_GCORE_TARGET
TARGET_OBS
@@ -775,6 +775,11 @@ TARGET_OBS
ENABLE_BFD_64_BIT_FALSE
ENABLE_BFD_64_BIT_TRUE
subdirs
+RPM_LIBS
+RPM_CFLAGS
@ -721,7 +721,7 @@ diff --git a/gdb/configure b/gdb/configure
GDB_DATADIR
DEBUGDIR
MAKEINFO_EXTRA_FLAGS
@@ -876,6 +881,7 @@ with_gdb_datadir
@@ -880,6 +885,7 @@ with_gdb_datadir
with_relocated_sources
with_auto_load_dir
with_auto_load_safe_path
@ -729,7 +729,7 @@ diff --git a/gdb/configure b/gdb/configure
enable_targets
enable_64_bit_bfd
enable_gdbmi
@@ -953,6 +959,8 @@ PKG_CONFIG_PATH
@@ -959,6 +965,8 @@ PKG_CONFIG_PATH
PKG_CONFIG_LIBDIR
DEBUGINFOD_CFLAGS
DEBUGINFOD_LIBS
@ -738,7 +738,7 @@ diff --git a/gdb/configure b/gdb/configure
YACC
YFLAGS
XMKMF'
@@ -1625,6 +1633,8 @@ Optional Packages:
@@ -1635,6 +1643,8 @@ Optional Packages:
do not restrict auto-loaded files locations
--with-debuginfod Enable debuginfo lookups with debuginfod
(auto/yes/no)
@ -747,7 +747,7 @@ diff --git a/gdb/configure b/gdb/configure
--with-libunwind-ia64 use libunwind frame unwinding for ia64 targets
--with-curses use the curses library instead of the termcap
library
@@ -1705,6 +1715,8 @@ Some influential environment variables:
@@ -1715,6 +1725,8 @@ Some influential environment variables:
C compiler flags for DEBUGINFOD, overriding pkg-config
DEBUGINFOD_LIBS
linker flags for DEBUGINFOD, overriding pkg-config
@ -756,7 +756,7 @@ diff --git a/gdb/configure b/gdb/configure
YACC The `Yet Another Compiler Compiler' implementation to use.
Defaults to the first program found out of: `bison -y', `byacc',
`yacc'.
@@ -6624,6 +6636,494 @@ _ACEOF
@@ -6634,6 +6646,494 @@ _ACEOF
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_auto_load_safe_path" >&5
$as_echo "$with_auto_load_safe_path" >&6; }
@ -1457,15 +1457,15 @@ diff --git a/gdb/configure.ac b/gdb/configure.ac
diff --git a/gdb/event-top.c b/gdb/event-top.c
--- a/gdb/event-top.c
+++ b/gdb/event-top.c
@@ -41,6 +41,7 @@
#include "gdbsupport/gdb_select.h"
@@ -42,6 +42,7 @@
#include "gdbsupport/gdb-sigmask.h"
#include "async-event.h"
#include "bt-utils.h"
+#include "symfile.h"
/* readline include files. */
#include "readline/readline.h"
@@ -363,6 +364,8 @@ display_gdb_prompt (const char *new_prompt)
@@ -374,6 +375,8 @@ display_gdb_prompt (const char *new_prompt)
/* Reset the nesting depth used when trace-commands is set. */
reset_command_nest_depth ();
@ -1474,7 +1474,7 @@ diff --git a/gdb/event-top.c b/gdb/event-top.c
/* Do not call the python hook on an explicit prompt change as
passed to this function, as this forms a secondary/local prompt,
IE, displayed but not set. */
@@ -773,7 +776,10 @@ command_line_handler (gdb::unique_xmalloc_ptr<char> &&rl)
@@ -800,7 +803,10 @@ command_line_handler (gdb::unique_xmalloc_ptr<char> &&rl)
command_handler (cmd);
if (ui->prompt_state != PROMPTED)

View File

@ -14,7 +14,7 @@ https://bugzilla.redhat.com/show_bug.cgi?id=1339862
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -1350,14 +1350,28 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm,
@@ -1250,14 +1250,28 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm,
}
{
@ -45,7 +45,7 @@ diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
if (build_id != NULL)
{
char *name, *build_id_filename;
@@ -1372,23 +1386,7 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm,
@@ -1272,23 +1286,7 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm,
xfree (name);
}
else

View File

@ -463,14 +463,15 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
if (found == NULL)
warning (_("File \"%s\" has no build-id, file skipped"),
@@ -66,56 +465,159 @@ build_id_verify (bfd *abfd, size_t check_len, const bfd_byte *check)
@@ -66,63 +465,166 @@ build_id_verify (bfd *abfd, size_t check_len, const bfd_byte *check)
return retval;
}
+static char *
+link_resolve (const char *symlink, int level)
+{
+ char buf[PATH_MAX + 1], *target, *retval;
+ char buf[PATH_MAX + 1], *retval;
+ gdb::unique_xmalloc_ptr<char> target;
+ ssize_t got;
+
+ if (level > 10)
@ -482,7 +483,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
+ buf[got] = '\0';
+
+ if (IS_ABSOLUTE_PATH (buf))
+ target = xstrdup (buf);
+ target = make_unique_xstrdup (buf);
+ else
+ {
+ const std::string dir (ldirname (symlink));
@ -496,8 +497,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
+ "%s", dir.c_str(), buf);
+ }
+
+ retval = link_resolve (target, level + 1);
+ xfree (target);
+ retval = link_resolve (target.get (), level + 1);
+ return retval;
+}
+
@ -516,42 +516,49 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
+
if (separate_debug_file_debug)
{
- printf_unfiltered (_(" Trying %s..."), link.c_str ());
+ printf_unfiltered (_(" Trying %s..."), orig_link.c_str ());
gdb_flush (gdb_stdout);
- fprintf_unfiltered (gdb_stdlog, _(" Trying %s..."), link.c_str ());
- gdb_flush (gdb_stdlog);
+ fprintf_unfiltered (gdb_stdlog, _(" Trying %s..."), orig_link.c_str ());
+ gdb_flush (gdb_stdout);
}
- /* lrealpath() is expensive even for the usually non-existent files. */
- gdb::unique_xmalloc_ptr<char> filename;
- if (access (link.c_str (), F_OK) == 0)
- filename.reset (lrealpath (link.c_str ()));
-
- if (filename == NULL)
- gdb::unique_xmalloc_ptr<char> filename_holder;
- const char *filename = nullptr;
- if (startswith (link, TARGET_SYSROOT_PREFIX))
- filename = link.c_str ();
- else if (access (link.c_str (), F_OK) == 0)
+ for (unsigned seqno = 0;; seqno++)
{
- if (separate_debug_file_debug)
- printf_unfiltered (_(" no, unable to compute real path\n"));
- filename_holder.reset (lrealpath (link.c_str ()));
- filename = filename_holder.get ();
- }
+ std::string link = orig_link;
- return {};
- }
- if (filename == NULL)
- {
- if (separate_debug_file_debug)
- fprintf_unfiltered (gdb_stdlog,
- _(" no, unable to compute real path\n"));
+ if (seqno > 0)
+ {
+ /* There can be multiple build-id symlinks pointing to real files
+ with the same build-id (such as hard links). Some of the real
+ files may not be installed. */
+
- return {};
- }
+ string_appendf (link, ".%u", seqno);
+ }
- /* We expect to be silent on the non-existing files. */
- gdb_bfd_ref_ptr debug_bfd = gdb_bfd_open (filename.get (), gnutarget);
- gdb_bfd_ref_ptr debug_bfd = gdb_bfd_open (filename, gnutarget);
+ ret_link = link;
- if (debug_bfd == NULL)
- {
- if (separate_debug_file_debug)
- printf_unfiltered (_(" no, unable to open.\n"));
- fprintf_unfiltered (gdb_stdlog, _(" no, unable to open.\n"));
+ struct stat statbuf_trash;
+
+ /* `access' automatically dereferences LINK. */
@ -562,27 +569,33 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
+ }
+
+ /* lrealpath() is expensive even for the usually non-existent files. */
+ gdb::unique_xmalloc_ptr<char> filename;
+
+ if (access (link.c_str (), F_OK) == 0)
+ filename.reset (lrealpath (link.c_str ()));
+ gdb::unique_xmalloc_ptr<char> filename_holder;
+ const char *filename = nullptr;
+ if (startswith (link, TARGET_SYSROOT_PREFIX))
+ filename = link.c_str ();
+ else if (access (link.c_str (), F_OK) == 0)
+ {
+ filename_holder.reset (lrealpath (link.c_str ()));
+ filename = filename_holder.get ();
+ }
+
+ if (filename == NULL)
+ {
+ if (separate_debug_file_debug)
+ printf_unfiltered (_(" no, unable to compute real path\n"));
+ fprintf_unfiltered (gdb_stdlog,
+ _(" no, unable to compute real path\n"));
+
+ continue;
+ }
+
+ /* We expect to be silent on the non-existing files. */
+ gdb_bfd_ref_ptr debug_bfd = gdb_bfd_open (filename.get (), gnutarget, -1);
+ gdb_bfd_ref_ptr debug_bfd = gdb_bfd_open (filename, gnutarget);
- return {};
+ if (debug_bfd == NULL)
+ {
+ if (separate_debug_file_debug)
+ printf_unfiltered (_(" no, unable to open.\n"));
+ fprintf_unfiltered (gdb_stdlog, _(" no, unable to open.\n"));
+
+ continue;
+ }
@ -590,7 +603,8 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
+ if (!build_id_verify (debug_bfd.get(), build_id_len, build_id))
+ {
+ if (separate_debug_file_debug)
+ printf_unfiltered (_(" no, build-id does not match.\n"));
+ fprintf_unfiltered (gdb_stdlog,
+ _(" no, build-id does not match.\n"));
+
+ continue;
+ }
@ -605,10 +619,10 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
+ if (ret_bfd != NULL)
{
if (separate_debug_file_debug)
- printf_unfiltered (_(" no, build-id does not match.\n"));
- fprintf_unfiltered (gdb_stdlog, _(" no, build-id does not match.\n"));
-
- return {};
+ printf_unfiltered (_(" yes!\n"));
+ fprintf_unfiltered (gdb_stdlog, _(" yes!\n"));
+ }
+ else
+ {
@ -632,7 +646,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
}
- if (separate_debug_file_debug)
- printf_unfiltered (_(" yes!\n"));
- fprintf_unfiltered (gdb_stdlog, _(" yes!\n"));
+ if (link_return != NULL)
+ {
+ if (ret_bfd != NULL)
@ -650,7 +664,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
}
/* Common code for finding BFDs of a given build-id. This function
@@ -124,7 +626,7 @@ build_id_to_debug_bfd_1 (const std::string &link, size_t build_id_len,
@@ -131,7 +633,7 @@ build_id_to_debug_bfd_1 (const std::string &link, size_t build_id_len,
static gdb_bfd_ref_ptr
build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id,
@ -659,7 +673,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
{
/* Keep backward compatibility so that DEBUG_FILE_DIRECTORY being "" will
cause "/.build-id/..." lookups. */
@@ -147,16 +649,17 @@ build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id,
@@ -154,16 +656,17 @@ build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id,
if (size > 0)
{
size--;
@ -680,8 +694,8 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
if (debug_bfd != NULL)
return debug_bfd;
@@ -170,7 +673,8 @@ build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id,
if (strcmp (gdb_sysroot, TARGET_SYSROOT_PREFIX) != 0)
@@ -174,7 +677,8 @@ build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id,
if (!gdb_sysroot.empty ())
{
link = gdb_sysroot + link;
- debug_bfd = build_id_to_debug_bfd_1 (link, build_id_len, build_id);
@ -690,7 +704,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
if (debug_bfd != NULL)
return debug_bfd;
}
@@ -179,38 +683,208 @@ build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id,
@@ -183,30 +687,187 @@ build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id,
return {};
}
@ -884,8 +898,9 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
if (build_id != NULL)
{
if (separate_debug_file_debug)
printf_unfiltered (_("\nLooking for separate debug info (build-id) for "
"%s\n"), objfile_name (objfile));
@@ -214,8 +875,21 @@ find_separate_debug_file_by_buildid (struct objfile *objfile)
_("\nLooking for separate debug info (build-id) for "
"%s\n"), objfile_name (objfile));
+ char *build_id_filename_cstr = NULL;
gdb_bfd_ref_ptr abfd (build_id_to_debug_bfd (build_id->size,
@ -906,7 +921,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c
/* Prevent looping on a stripped .debug file. */
if (abfd != NULL
&& filename_cmp (bfd_get_filename (abfd.get ()),
@@ -223,3 +897,22 @@ find_separate_debug_file_by_buildid (struct objfile *objfile)
@@ -228,3 +902,22 @@ find_separate_debug_file_by_buildid (struct objfile *objfile)
return std::string ();
}
@ -1056,7 +1071,7 @@ diff --git a/gdb/corelow.c b/gdb/corelow.c
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -21415,6 +21415,27 @@ information files.
@@ -21524,6 +21524,27 @@ information files.
@end table
@ -1087,7 +1102,7 @@ diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
diff --git a/gdb/dwarf2/index-cache.c b/gdb/dwarf2/index-cache.c
--- a/gdb/dwarf2/index-cache.c
+++ b/gdb/dwarf2/index-cache.c
@@ -95,7 +95,7 @@ index_cache::store (dwarf2_per_objfile *per_objfile)
@@ -97,7 +97,7 @@ index_cache::store (dwarf2_per_objfile *per_objfile)
return;
/* Get build id of objfile. */
@ -1095,8 +1110,8 @@ diff --git a/gdb/dwarf2/index-cache.c b/gdb/dwarf2/index-cache.c
+ const bfd_build_id *build_id = build_id_bfd_shdr_get (obj->obfd);
if (build_id == nullptr)
{
if (debug_index_cache)
@@ -113,7 +113,8 @@ index_cache::store (dwarf2_per_objfile *per_objfile)
index_cache_debug ("objfile %s has no build id",
@@ -114,7 +114,8 @@ index_cache::store (dwarf2_per_objfile *per_objfile)
if (dwz != nullptr)
{
@ -1109,7 +1124,7 @@ diff --git a/gdb/dwarf2/index-cache.c b/gdb/dwarf2/index-cache.c
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -5447,7 +5447,7 @@ get_gdb_index_contents_from_section (objfile *obj, T *section_owner)
@@ -5476,7 +5476,7 @@ get_gdb_index_contents_from_section (objfile *obj, T *section_owner)
static gdb::array_view<const gdb_byte>
get_gdb_index_contents_from_cache (objfile *obj, dwarf2_per_bfd *dwarf2_per_bfd)
{
@ -1118,7 +1133,7 @@ diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
if (build_id == nullptr)
return {};
@@ -5460,7 +5460,7 @@ get_gdb_index_contents_from_cache (objfile *obj, dwarf2_per_bfd *dwarf2_per_bfd)
@@ -5489,7 +5489,7 @@ get_gdb_index_contents_from_cache (objfile *obj, dwarf2_per_bfd *dwarf2_per_bfd)
static gdb::array_view<const gdb_byte>
get_gdb_index_contents_from_cache_dwz (objfile *obj, dwz_file *dwz)
{
@ -1130,7 +1145,7 @@ diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
diff --git a/gdb/elfread.c b/gdb/elfread.c
--- a/gdb/elfread.c
+++ b/gdb/elfread.c
@@ -1272,7 +1272,9 @@ elf_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags)
@@ -1270,7 +1270,9 @@ elf_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags)
&& objfile->separate_debug_objfile == NULL
&& objfile->separate_debug_objfile_backlink == NULL)
{
@ -1141,7 +1156,7 @@ diff --git a/gdb/elfread.c b/gdb/elfread.c
if (debugfile.empty ())
debugfile = find_separate_debug_file_by_debuglink (objfile);
@@ -1287,7 +1289,7 @@ elf_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags)
@@ -1285,7 +1287,7 @@ elf_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags)
else
{
has_dwarf2 = false;
@ -1150,7 +1165,7 @@ diff --git a/gdb/elfread.c b/gdb/elfread.c
if (build_id != nullptr)
{
@@ -1312,6 +1314,10 @@ elf_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags)
@@ -1310,6 +1312,10 @@ elf_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags)
has_dwarf2 = true;
}
}
@ -1164,7 +1179,7 @@ diff --git a/gdb/elfread.c b/gdb/elfread.c
diff --git a/gdb/exec.c b/gdb/exec.c
--- a/gdb/exec.c
+++ b/gdb/exec.c
@@ -237,7 +237,7 @@ validate_exec_file (int from_tty)
@@ -238,7 +238,7 @@ validate_exec_file (int from_tty)
current_exec_file = get_exec_file (0);
const bfd_build_id *exec_file_build_id
@ -1173,7 +1188,7 @@ diff --git a/gdb/exec.c b/gdb/exec.c
if (exec_file_build_id != nullptr)
{
/* Prepend the target prefix, to force gdb_bfd_open to open the
@@ -250,7 +250,7 @@ validate_exec_file (int from_tty)
@@ -251,7 +251,7 @@ validate_exec_file (int from_tty)
if (abfd != nullptr)
{
const bfd_build_id *target_exec_file_build_id
@ -1185,7 +1200,7 @@ diff --git a/gdb/exec.c b/gdb/exec.c
diff --git a/gdb/objfiles.h b/gdb/objfiles.h
--- a/gdb/objfiles.h
+++ b/gdb/objfiles.h
@@ -812,6 +812,10 @@ struct objfile
@@ -769,6 +769,10 @@ struct objfile
bool skip_jit_symbol_lookup = false;
};
@ -1228,7 +1243,7 @@ diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
static struct link_map_offsets *svr4_fetch_link_map_offsets (void);
static int svr4_have_link_map_offsets (void);
@@ -1348,9 +1349,51 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm,
@@ -1248,9 +1249,51 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm,
continue;
}
@ -1286,7 +1301,7 @@ diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
diff --git a/gdb/source.c b/gdb/source.c
--- a/gdb/source.c
+++ b/gdb/source.c
@@ -1178,7 +1178,7 @@ open_source_file (struct symtab *s)
@@ -1199,7 +1199,7 @@ open_source_file (struct symtab *s)
srcpath += s->filename;
}
@ -1381,7 +1396,7 @@ diff --git a/gdb/testsuite/gdb.base/new-ui-pending-input.exp b/gdb/testsuite/gdb
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -130,7 +130,8 @@ if ![info exists INTERNAL_GDBFLAGS] {
@@ -141,7 +141,8 @@ if ![info exists INTERNAL_GDBFLAGS] {
"-nx" \
"-data-directory $BUILD_DATA_DIRECTORY" \
{-iex "set height 0"} \
@ -1391,7 +1406,7 @@ diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
}
# The variable gdb_prompt is a regexp which matches the gdb prompt.
@@ -2130,6 +2131,17 @@ proc default_gdb_start { } {
@@ -2200,6 +2201,17 @@ proc default_gdb_start { } {
}
}

View File

@ -9,7 +9,7 @@ Subject: gdb-container-rh-pkg.patch
diff --git a/gdb/remote.c b/gdb/remote.c
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -14291,7 +14291,17 @@ remote_target::pid_to_exec_file (int pid)
@@ -14343,7 +14343,17 @@ remote_target::pid_to_exec_file (int pid)
char *annex = NULL;
if (packet_support (PACKET_qXfer_exec_file) != PACKET_ENABLE)

View File

@ -27,7 +27,7 @@ diff --git a/gdb/testsuite/gdb.base/solib-symbol.exp b/gdb/testsuite/gdb.base/so
if [get_compiler_info] {
return -1
@@ -71,8 +72,26 @@ gdb_test "br foo2" \
@@ -70,8 +71,26 @@ gdb_test "br foo2" \
"Breakpoint.*: foo2. .2 locations..*" \
"foo2 in mdlib"

View File

@ -12,7 +12,7 @@ https://bugzilla.redhat.com/show_bug.cgi?id=1270534
diff --git a/gdb/configure b/gdb/configure
--- a/gdb/configure
+++ b/gdb/configure
@@ -9552,6 +9552,7 @@ if test x"$prefer_curses" = xyes; then
@@ -9567,6 +9567,7 @@ if test x"$prefer_curses" = xyes; then
# search /usr/local/include, if ncurses is installed in /usr/local. A
# default installation of ncurses on alpha*-dec-osf* will lead to such
# a situation.
@ -20,7 +20,7 @@ diff --git a/gdb/configure b/gdb/configure
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing waddstr" >&5
$as_echo_n "checking for library containing waddstr... " >&6; }
if ${ac_cv_search_waddstr+:} false; then :
@@ -9576,7 +9577,7 @@ return waddstr ();
@@ -9591,7 +9592,7 @@ return waddstr ();
return 0;
}
_ACEOF
@ -29,7 +29,7 @@ diff --git a/gdb/configure b/gdb/configure
if test -z "$ac_lib"; then
ac_res="none required"
else
@@ -9650,6 +9651,7 @@ case $host_os in
@@ -9665,6 +9666,7 @@ case $host_os in
esac
# These are the libraries checked by Readline.
@ -37,7 +37,7 @@ diff --git a/gdb/configure b/gdb/configure
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing tgetent" >&5
$as_echo_n "checking for library containing tgetent... " >&6; }
if ${ac_cv_search_tgetent+:} false; then :
@@ -9674,7 +9676,7 @@ return tgetent ();
@@ -9689,7 +9691,7 @@ return tgetent ();
return 0;
}
_ACEOF
@ -49,7 +49,7 @@ diff --git a/gdb/configure b/gdb/configure
diff --git a/gdb/configure.ac b/gdb/configure.ac
--- a/gdb/configure.ac
+++ b/gdb/configure.ac
@@ -736,7 +736,8 @@ if test x"$prefer_curses" = xyes; then
@@ -713,7 +713,8 @@ if test x"$prefer_curses" = xyes; then
# search /usr/local/include, if ncurses is installed in /usr/local. A
# default installation of ncurses on alpha*-dec-osf* will lead to such
# a situation.
@ -59,7 +59,7 @@ diff --git a/gdb/configure.ac b/gdb/configure.ac
if test "$ac_cv_search_waddstr" != no; then
curses_found=yes
@@ -778,7 +779,8 @@ case $host_os in
@@ -755,7 +756,8 @@ case $host_os in
esac
# These are the libraries checked by Readline.

View File

@ -213,7 +213,7 @@ diff --git a/gdb/nat/linux-btrace.h b/gdb/nat/linux-btrace.h
diff --git a/gdbsupport/common.m4 b/gdbsupport/common.m4
--- a/gdbsupport/common.m4
+++ b/gdbsupport/common.m4
@@ -140,7 +140,7 @@ AC_DEFUN([GDB_AC_COMMON], [
@@ -156,7 +156,7 @@ AC_DEFUN([GDB_AC_COMMON], [
AC_PREPROC_IFELSE([AC_LANG_SOURCE([[
#include <linux/perf_event.h>
#ifndef PERF_ATTR_SIZE_VER5

View File

@ -1,258 +0,0 @@
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
From: Bruno Larsen <blarsen@redhat.com>
Date: Wed, 13 Oct 2021 09:43:13 -0300
Subject: gdb-rhbz-853071-update-manpages.patch
;; Backport manpage update
[gdb/doc]: Updated manpages to be consistent with help
Updated manpages to be consistent with help information provided by the
binary. The main changes are:
* Making all long-form options have '--', instead of a single '-';
* added most of the missing options to the manpage;
* removed the information about using '+' instead of '-', since it
doesn't seem to be supported anymore.
This also fixes 2 upstream bugs:
* https://sourceware.org/bugzilla/show_bug.cgi?id=23965; by adding
--args to the manpage
* https://sourceware.org/bugzilla/show_bug.cgi?id=10619; by adding the
double dashes
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -47030,14 +47030,7 @@ switch (die->tag)
@c man title gdb The GNU Debugger
@c man begin SYNOPSIS gdb
-gdb [@option{-help}] [@option{-nh}] [@option{-nx}] [@option{-q}]
-[@option{-batch}] [@option{-cd=}@var{dir}] [@option{-f}]
-[@option{-b}@w{ }@var{bps}]
- [@option{-tty=}@var{dev}] [@option{-s} @var{symfile}]
-[@option{-e}@w{ }@var{prog}] [@option{-se}@w{ }@var{prog}]
-[@option{-c}@w{ }@var{core}] [@option{-p}@w{ }@var{procID}]
- [@option{-x}@w{ }@var{cmds}] [@option{-d}@w{ }@var{dir}]
-[@var{prog}|@var{prog} @var{procID}|@var{prog} @var{core}]
+gdb [OPTIONS] [@var{prog}|@var{prog} @var{procID}|@var{prog} @var{core}]
@c man end
@c man begin DESCRIPTION gdb
@@ -47101,8 +47094,8 @@ Here are some of the most frequently needed @value{GDBN} commands:
@c pod2man highlights the right hand side of the @item lines.
@table @env
-@item break [@var{file}:]@var{function}
-Set a breakpoint at @var{function} (in @var{file}).
+@item break [@var{file}:][@var{function}|@var{line}]
+Set a breakpoint at @var{function} or @var{line} (in @var{file}).
@item run [@var{arglist}]
Start your program (with @var{arglist}, if specified).
@@ -47150,72 +47143,91 @@ as the @code{gdb} entry in the @code{info} program.
Any arguments other than options specify an executable
file and core file (or process ID); that is, the first argument
encountered with no
-associated option flag is equivalent to a @option{-se} option, and the second,
+associated option flag is equivalent to a @option{--se} option, and the second,
if any, is equivalent to a @option{-c} option if it's the name of a file.
Many options have
-both long and short forms; both are shown here. The long forms are also
+both long and abbreviated forms; both are shown here. The long forms are also
recognized if you truncate them, so long as enough of the option is
-present to be unambiguous. (If you prefer, you can flag option
-arguments with @option{+} rather than @option{-}, though we illustrate the
-more usual convention.)
+present to be unambiguous.
+
+The abbreviated forms are shown here with @samp{-} and long forms are shown
+with @samp{--} to reflect how they are shown in @option{--help}. However,
+@value{GDBN} recognizes all of the following conventions for most options:
+
+@table @code
+@item --option=@var{value}
+@item --option @var{value}
+@item -option=@var{value}
+@item -option @var{value}
+@item --o=@var{value}
+@item --o @var{value}
+@item -o=@var{value}
+@item -o @var{value}
+@end table
All the options and command line arguments you give are processed
in sequential order. The order makes a difference when the @option{-x}
option is used.
@table @env
-@item -help
+@item --help
@itemx -h
List all options, with brief explanations.
-@item -symbols=@var{file}
+@item --symbols=@var{file}
@itemx -s @var{file}
-Read symbol table from file @var{file}.
+Read symbol table from @var{file}.
-@item -write
+@item --write
Enable writing into executable and core files.
-@item -exec=@var{file}
+@item --exec=@var{file}
@itemx -e @var{file}
-Use file @var{file} as the executable file to execute when
+Use @var{file} as the executable file to execute when
appropriate, and for examining pure data in conjunction with a core
dump.
-@item -se=@var{file}
-Read symbol table from file @var{file} and use it as the executable
+@item --se=@var{file}
+Read symbol table from @var{file} and use it as the executable
file.
-@item -core=@var{file}
+@item --core=@var{file}
@itemx -c @var{file}
-Use file @var{file} as a core dump to examine.
+Use @var{file} as a core dump to examine.
-@item -command=@var{file}
+@item --command=@var{file}
@itemx -x @var{file}
-Execute @value{GDBN} commands from file @var{file}.
+Execute @value{GDBN} commands from @var{file}.
+@item --eval-command=@var{command}
@item -ex @var{command}
Execute given @value{GDBN} @var{command}.
-@item -directory=@var{directory}
+@item --init-eval-command=@var{command}
+@item -iex
+Execute @value{GDBN} @var{command} before loading the inferior.
+
+@item --directory=@var{directory}
@itemx -d @var{directory}
Add @var{directory} to the path to search for source files.
-@item -nh
+@item --nh
Do not execute commands from @file{~/.config/gdb/gdbinit},
@file{~/.gdbinit}, @file{~/.config/gdb/gdbearlyinit}, or
@file{~/.gdbearlyinit}
-@item -nx
+@item --nx
@itemx -n
Do not execute commands from any @file{.gdbinit} or
@file{.gdbearlyinit} initialization files.
-@item -quiet
+@item --quiet
+@item --silent
@itemx -q
``Quiet''. Do not print the introductory and copyright messages. These
messages are also suppressed in batch mode.
-@item -batch
+@item --batch
Run in batch mode. Exit with status @code{0} after processing all the command
files specified with @option{-x} (and @file{.gdbinit}, if not inhibited).
Exit with nonzero status if an error occurs in executing the @value{GDBN}
@@ -47233,11 +47245,71 @@ Program exited normally.
(which is ordinarily issued whenever a program running under @value{GDBN} control
terminates) is not issued when running in batch mode.
-@item -cd=@var{directory}
+@item --batch-silent
+Run in batch mode, just like @option{--batch}, but totally silent. All @value{GDBN}
+output is supressed (stderr is unaffected). This is much quieter than
+@option{--silent} and would be useless for an interactive session.
+
+This is particularly useful when using targets that give @samp{Loading section}
+messages, for example.
+
+Note that targets that give their output via @value{GDBN}, as opposed to writing
+directly to @code{stdout}, will also be made silent.
+
+@item --args @var{prog} [@var{arglist}]
+Change interpretation of command line so that arguments following this
+option are passed as arguments to the inferior. As an example, take
+the following command:
+
+@smallexample
+gdb ./a.out -q
+@end smallexample
+
+@noindent
+It would start @value{GDBN} with @option{-q}, not printing the introductory message. On
+the other hand, using:
+
+@smallexample
+gdb --args ./a.out -q
+@end smallexample
+
+@noindent
+starts @value{GDBN} with the introductory message, and passes the option to the inferior.
+
+@item --pid=@var{pid}
+Attach @value{GDBN} to an already running program, with the PID @var{pid}.
+
+@item --tui
+Open the terminal user interface.
+
+@item --readnow
+Read all symbols from the given symfile on the first access.
+
+@item --readnever
+Do not read symbol files.
+
+@item --dbx
+Run in DBX compatibility mode.
+
+@item --return-child-result
+@value{GDBN}'s exit code will be the same as the child's exit code.
+
+@item --configuration
+Print details about GDB configuration and then exit.
+
+@item --version
+Print version information and then exit.
+
+@item --cd=@var{directory}
Run @value{GDBN} using @var{directory} as its working directory,
instead of the current directory.
-@item -fullname
+@item --data-directory=@var{directory}
+@item -D
+Run @value{GDBN} using @var{directory} as its data directory. The data
+directory is where @value{GDBN} searches for its auxiliary files.
+
+@item --fullname
@itemx -f
Emacs sets this option when it runs @value{GDBN} as a subprocess. It tells
@value{GDBN} to output the full file name and line number in a standard,
@@ -47248,11 +47320,14 @@ and character position separated by colons, and a newline. The
Emacs-to-@value{GDBN} interface program uses the two @samp{\032}
characters as a signal to display the source code for the frame.
-@item -b @var{bps}
+@item -b @var{baudrate}
Set the line speed (baud rate or bits per second) of any serial
interface used by @value{GDBN} for remote debugging.
-@item -tty=@var{device}
+@item -l @var{timeout}
+Set timeout, in seconds, for remote debugging.
+
+@item --tty=@var{device}
Run using @var{device} for your program's standard input and output.
@end table
@c man end

View File

@ -1,30 +0,0 @@
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alexandra=20H=C3=A1jkov=C3=A1?= <ahajkova@redhat.com>
Date: Wed, 29 Sep 2021 10:58:50 +0200
Subject: gdb-rhbz1976887-field-location-kind.patch
;;Backport upstream patch which fixes internal-error: Unexpected
;;type field location kind (RHBZ 1976887).
gdbtypes.c: Add the case for FIELD_LOC_KIND_DWARF_BLOCK
The case for FIELD_LOC_KIND_DWARF_BLOCK was missing for
switch TYPE_FIELD_LOC_KIND. Thas caused an internal-error
under some circumstances.
Fixes bug 28030.
diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -5571,6 +5571,10 @@ copy_type_recursive (struct objfile *objfile,
xstrdup (TYPE_FIELD_STATIC_PHYSNAME (type,
i)));
break;
+ case FIELD_LOC_KIND_DWARF_BLOCK:
+ SET_FIELD_DWARF_BLOCK (new_type->field (i),
+ TYPE_FIELD_DWARF_BLOCK (type, i));
+ break;
default:
internal_error (__FILE__, __LINE__,
_("Unexpected type field location kind: %d"),

View File

@ -1,185 +0,0 @@
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
From: Kevin Buettner <kevinb@redhat.com>
Date: Mon, 11 Oct 2021 11:22:04 -0700
Subject: gdb-rhbz2012976-paper-over-fortran-lex-problems.patch
;; Backport gdb.fortran testsuite changes in order to avoid Fortran
;; lexical analyzer bug.
[gdb/testsuite] Fix FAIL in gdb.mi/mi-var-child-f.exp
When running test-case gdb.mi/mi-var-child-f.exp on openSUSE Tumbleweed
(with glibc 2.34) I run into:
...
(gdb) ^M
PASS: gdb.mi/mi-var-child-f.exp: mi runto prog_array
Expecting: ^(-var-create array \* array[^M
]+)?(\^done,name="array",numchild="[0-9]+",value=".*",type=.*,has_more="0"[^M
]+[(]gdb[)] ^M
[ ]*)
-var-create array * array^M
&"Attempt to use a type name as an expression.\n"^M
^error,msg="-var-create: unable to create variable object"^M
(gdb) ^M
FAIL: gdb.mi/mi-var-child-f.exp: create local variable array (unexpected output)
...
The problem is that the name array is used both:
- as the name for a local variable
- as the name of a type in glibc, in file malloc/dynarray-skeleton.c, as included
by nss/nss_files/files-hosts.c.
Fix this by ignoring the shared lib symbols.
Likewise in a couple of other fortran tests.
Tested on x86_64-linux.
diff --git a/gdb/testsuite/gdb.fortran/allocated.exp b/gdb/testsuite/gdb.fortran/allocated.exp
--- a/gdb/testsuite/gdb.fortran/allocated.exp
+++ b/gdb/testsuite/gdb.fortran/allocated.exp
@@ -25,11 +25,17 @@ if {[prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} \
return -1
}
+# Avoid shared lib symbols.
+gdb_test_no_output "set auto-solib-add off"
+
if ![fortran_runto_main] {
untested "could not run to main"
return -1
}
+# Avoid libc symbols, in particular the 'array' type.
+gdb_test_no_output "nosharedlibrary"
+
# Set all the breakpoints.
for { set i 1 } { $i < 6 } { incr i } {
gdb_breakpoint [gdb_get_line_number "Breakpoint $i"]
diff --git a/gdb/testsuite/gdb.fortran/array-slices-bad.exp b/gdb/testsuite/gdb.fortran/array-slices-bad.exp
--- a/gdb/testsuite/gdb.fortran/array-slices-bad.exp
+++ b/gdb/testsuite/gdb.fortran/array-slices-bad.exp
@@ -25,11 +25,17 @@ if {[prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} \
return -1
}
+# Avoid shared lib symbols.
+gdb_test_no_output "set auto-solib-add off"
+
if ![fortran_runto_main] {
untested "could not run to main"
return -1
}
+# Avoid libc symbols, in particular the 'array' type.
+gdb_test_no_output "nosharedlibrary"
+
# gdb_breakpoint [gdb_get_line_number "Display Message Breakpoint"]
gdb_breakpoint [gdb_get_line_number "First Breakpoint"]
gdb_breakpoint [gdb_get_line_number "Second Breakpoint"]
diff --git a/gdb/testsuite/gdb.fortran/array-slices-sub-slices.exp b/gdb/testsuite/gdb.fortran/array-slices-sub-slices.exp
--- a/gdb/testsuite/gdb.fortran/array-slices-sub-slices.exp
+++ b/gdb/testsuite/gdb.fortran/array-slices-sub-slices.exp
@@ -25,11 +25,17 @@ if {[prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} \
return -1
}
+# Avoid shared lib symbols.
+gdb_test_no_output "set auto-solib-add off"
+
if ![fortran_runto_main] {
untested "could not run to main"
return -1
}
+# Avoid libc symbols, in particular the 'array' type.
+gdb_test_no_output "nosharedlibrary"
+
# gdb_breakpoint [gdb_get_line_number "Display Message Breakpoint"]
gdb_breakpoint [gdb_get_line_number "Stop Here"]
gdb_breakpoint [gdb_get_line_number "Final Breakpoint"]
diff --git a/gdb/testsuite/gdb.fortran/array-slices.exp b/gdb/testsuite/gdb.fortran/array-slices.exp
--- a/gdb/testsuite/gdb.fortran/array-slices.exp
+++ b/gdb/testsuite/gdb.fortran/array-slices.exp
@@ -55,11 +55,17 @@ proc run_test { repack } {
clean_restart ${binfile}
+ # Avoid shared lib symbols.
+ gdb_test_no_output "set auto-solib-add off"
+
if ![fortran_runto_main] {
untested "could not run to main"
return -1
}
+ # Avoid libc symbols, in particular the 'array' type.
+ gdb_test_no_output "nosharedlibrary"
+
gdb_test_no_output "set fortran repack-array-slices $repack"
# gdb_breakpoint [gdb_get_line_number "Display Message Breakpoint"]
diff --git a/gdb/testsuite/gdb.fortran/lbound-ubound.exp b/gdb/testsuite/gdb.fortran/lbound-ubound.exp
--- a/gdb/testsuite/gdb.fortran/lbound-ubound.exp
+++ b/gdb/testsuite/gdb.fortran/lbound-ubound.exp
@@ -25,12 +25,17 @@ if {[prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} \
return -1
}
+# Avoid shared lib symbols.
+gdb_test_no_output "set auto-solib-add off"
if ![fortran_runto_main] {
untested "could not run to main"
return -1
}
+# Avoid libc symbols, in particular the 'array' type.
+gdb_test_no_output "nosharedlibrary"
+
gdb_breakpoint [gdb_get_line_number "Test Breakpoint"]
gdb_breakpoint [gdb_get_line_number "Final Breakpoint"]
diff --git a/gdb/testsuite/gdb.fortran/subarray.exp b/gdb/testsuite/gdb.fortran/subarray.exp
--- a/gdb/testsuite/gdb.fortran/subarray.exp
+++ b/gdb/testsuite/gdb.fortran/subarray.exp
@@ -27,16 +27,17 @@ if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug f90}]} {
return -1
}
-gdb_exit
-gdb_start
-gdb_reinitialize_dir $srcdir/$subdir
-gdb_load ${binfile}
+# Avoid shared lib symbols.
+gdb_test_no_output "set auto-solib-add off"
if ![fortran_runto_main] then {
perror "couldn't run to main"
continue
}
+# Avoid libc symbols, in particular the 'array' type.
+gdb_test_no_output "nosharedlibrary"
+
# Try to set breakpoint at the last write statement.
set bp_location [gdb_get_line_number "str(:)"]
diff --git a/gdb/testsuite/gdb.mi/mi-var-child-f.exp b/gdb/testsuite/gdb.mi/mi-var-child-f.exp
--- a/gdb/testsuite/gdb.mi/mi-var-child-f.exp
+++ b/gdb/testsuite/gdb.mi/mi-var-child-f.exp
@@ -36,8 +36,14 @@ if {[gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" \
mi_gdb_reinitialize_dir $srcdir/$subdir
mi_gdb_load ${binfile}
+# Avoid shared lib symbols.
+mi_gdb_test "-gdb-set auto-solib-add off" "\\^done"
+
mi_runto prog_array
+# Avoid libc symbols, in particular the 'array' type.
+mi_gdb_test "nosharedlibrary" ".*\\^done"
+
mi_create_varobj "array" "array" "create local variable array"

View File

@ -1,315 +0,0 @@
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
From: Kevin Buettner <kevinb@redhat.com>
Date: Wed, 10 Nov 2021 18:52:22 -0700
Subject: gdb-rhbz2022177-dprintf-1.patch
;; Backport fix for dprintf bug (RH BZ 2022177).
Fix PR 28308 - dprintf breakpoints not working when run from script
This commit fixes Bug 28308, titled "Strange interactions with
dprintf and break/commands":
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=28308
Since creating that bug report, I've found a somewhat simpler way of
reproducing the problem. I've encapsulated it into the GDB test case
which I've created along with this bug fix. The name of the new test
is gdb.base/dprintf-execution-x-script.exp, I'll demonstrate the
problem using this test case, though for brevity, I've placed all
relevant files in the same directory and have renamed the files to all
start with 'dp-bug' instead of 'dprintf-execution-x-script'.
The script file, named dp-bug.gdb, consists of the following commands:
dprintf increment, "dprintf in increment(), vi=%d\n", vi
break inc_vi
commands
continue
end
run
Note that the final command in this script is 'run'. When 'run' is
instead issued interactively, the bug does not occur. So, let's look
at the interactive case first in order to see the correct/expected
output:
$ gdb -q -x dp-bug.gdb dp-bug
... eliding buggy output which I'll discuss later ...
(gdb) run
Starting program: /mesquite2/sourceware-git/f34-master/bld/gdb/tmp/dp-bug
vi=0
dprintf in increment(), vi=0
Breakpoint 2, inc_vi () at dprintf-execution-x-script.c:26
26 in dprintf-execution-x-script.c
vi=1
dprintf in increment(), vi=1
Breakpoint 2, inc_vi () at dprintf-execution-x-script.c:26
26 in dprintf-execution-x-script.c
vi=2
dprintf in increment(), vi=2
Breakpoint 2, inc_vi () at dprintf-execution-x-script.c:26
26 in dprintf-execution-x-script.c
vi=3
[Inferior 1 (process 1539210) exited normally]
In this run, in which 'run' was issued from the gdb prompt (instead
of at the end of the script), there are three dprintf messages along
with three 'Breakpoint 2' messages. This is the correct output.
Now let's look at the output that I snipped above; this is the output
when 'run' is issued from the script loaded via GDB's -x switch:
$ gdb -q -x dp-bug.gdb dp-bug
Reading symbols from dp-bug...
Dprintf 1 at 0x40116e: file dprintf-execution-x-script.c, line 38.
Breakpoint 2 at 0x40113a: file dprintf-execution-x-script.c, line 26.
vi=0
dprintf in increment(), vi=0
Breakpoint 2, inc_vi () at dprintf-execution-x-script.c:26
26 dprintf-execution-x-script.c: No such file or directory.
vi=1
Breakpoint 2, inc_vi () at dprintf-execution-x-script.c:26
26 in dprintf-execution-x-script.c
vi=2
Breakpoint 2, inc_vi () at dprintf-execution-x-script.c:26
26 in dprintf-execution-x-script.c
vi=3
[Inferior 1 (process 1539175) exited normally]
In the output shown above, only the first dprintf message is printed.
The 2nd and 3rd dprintf messages are missing! However, all three
'Breakpoint 2...' messages are still printed.
Why does this happen?
bpstat_do_actions_1() in gdb/breakpoint.c contains the following
comment and code near the start of the function:
/* Avoid endless recursion if a `source' command is contained
in bs->commands. */
if (executing_breakpoint_commands)
return 0;
scoped_restore save_executing
= make_scoped_restore (&executing_breakpoint_commands, 1);
Also, as described by this comment prior to the 'async' field
in 'struct ui' in top.h, the main UI starts off in sync mode
when processing command line arguments:
/* True if the UI is in async mode, false if in sync mode. If in
sync mode, a synchronous execution command (e.g, "next") does not
return until the command is finished. If in async mode, then
running a synchronous command returns right after resuming the
target. Waiting for the command's completion is later done on
the top event loop. For the main UI, this starts out disabled,
until all the explicit command line arguments (e.g., `gdb -ex
"start" -ex "next"') are processed. */
This combination of things, the state of the static global
'executing_breakpoint_commands' plus the state of the async
field in the main UI causes this behavior.
This is a backtrace after hitting the dprintf breakpoint for
the second time when doing 'run' from the script file, i.e.
non-interactively:
Thread 1 "gdb" hit Breakpoint 3, bpstat_do_actions_1 (bsp=0x7fffffffc2b8)
at /ironwood1/sourceware-git/f34-master/bld/../../worktree-master/gdb/breakpoint.c:4431
4431 if (executing_breakpoint_commands)
#0 bpstat_do_actions_1 (bsp=0x7fffffffc2b8)
at gdb/breakpoint.c:4431
#1 0x00000000004d8bc6 in dprintf_after_condition_true (bs=0x1538090)
at gdb/breakpoint.c:13048
#2 0x00000000004c5caa in bpstat_stop_status (aspace=0x116dbc0, bp_addr=0x40116e, thread=0x137f450, ws=0x7fffffffc718,
stop_chain=0x1538090) at gdb/breakpoint.c:5498
#3 0x0000000000768d98 in handle_signal_stop (ecs=0x7fffffffc6f0)
at gdb/infrun.c:6172
#4 0x00000000007678d3 in handle_inferior_event (ecs=0x7fffffffc6f0)
at gdb/infrun.c:5662
#5 0x0000000000763cd5 in fetch_inferior_event ()
at gdb/infrun.c:4060
#6 0x0000000000746d7d in inferior_event_handler (event_type=INF_REG_EVENT)
at gdb/inf-loop.c:41
#7 0x00000000007a702f in handle_target_event (error=0, client_data=0x0)
at gdb/linux-nat.c:4207
#8 0x0000000000b8cd6e in gdb_wait_for_event (block=block@entry=0)
at gdbsupport/event-loop.cc:701
#9 0x0000000000b8d032 in gdb_wait_for_event (block=0)
at gdbsupport/event-loop.cc:597
#10 gdb_do_one_event () at gdbsupport/event-loop.cc:212
#11 0x00000000009d19b6 in wait_sync_command_done ()
at gdb/top.c:528
#12 0x00000000009d1a3f in maybe_wait_sync_command_done (was_sync=0)
at gdb/top.c:545
#13 0x00000000009d2033 in execute_command (p=0x7fffffffcb18 "", from_tty=0)
at gdb/top.c:676
#14 0x0000000000560d5b in execute_control_command_1 (cmd=0x13b9bb0, from_tty=0)
at gdb/cli/cli-script.c:547
#15 0x000000000056134a in execute_control_command (cmd=0x13b9bb0, from_tty=0)
at gdb/cli/cli-script.c:717
#16 0x00000000004c3bbe in bpstat_do_actions_1 (bsp=0x137f530)
at gdb/breakpoint.c:4469
#17 0x00000000004c3d40 in bpstat_do_actions ()
at gdb/breakpoint.c:4533
#18 0x00000000006a473a in command_handler (command=0x1399ad0 "run")
at gdb/event-top.c:624
#19 0x00000000009d182e in read_command_file (stream=0x113e540)
at gdb/top.c:443
#20 0x0000000000563697 in script_from_file (stream=0x113e540, file=0x13bb0b0 "dp-bug.gdb")
at gdb/cli/cli-script.c:1642
#21 0x00000000006abd63 in source_gdb_script (extlang=0xc44e80 <extension_language_gdb>, stream=0x113e540,
file=0x13bb0b0 "dp-bug.gdb") at gdb/extension.c:188
#22 0x0000000000544400 in source_script_from_stream (stream=0x113e540, file=0x7fffffffd91a "dp-bug.gdb",
file_to_open=0x13bb0b0 "dp-bug.gdb")
at gdb/cli/cli-cmds.c:692
#23 0x0000000000544557 in source_script_with_search (file=0x7fffffffd91a "dp-bug.gdb", from_tty=1, search_path=0)
at gdb/cli/cli-cmds.c:750
#24 0x00000000005445cf in source_script (file=0x7fffffffd91a "dp-bug.gdb", from_tty=1)
at gdb/cli/cli-cmds.c:759
#25 0x00000000007cf6d9 in catch_command_errors (command=0x5445aa <source_script(char const*, int)>,
arg=0x7fffffffd91a "dp-bug.gdb", from_tty=1, do_bp_actions=false)
at gdb/main.c:523
#26 0x00000000007cf85d in execute_cmdargs (cmdarg_vec=0x7fffffffd1b0, file_type=CMDARG_FILE, cmd_type=CMDARG_COMMAND,
ret=0x7fffffffd18c) at gdb/main.c:615
#27 0x00000000007d0c8e in captured_main_1 (context=0x7fffffffd3f0)
at gdb/main.c:1322
#28 0x00000000007d0eba in captured_main (data=0x7fffffffd3f0)
at gdb/main.c:1343
#29 0x00000000007d0f25 in gdb_main (args=0x7fffffffd3f0)
at gdb/main.c:1368
#30 0x00000000004186dd in main (argc=5, argv=0x7fffffffd508)
at gdb/gdb.c:32
There are two frames for bpstat_do_actions_1(), one at frame #16 and
the other at frame #0. The one at frame #16 is processing the actions
for Breakpoint 2, which is a 'continue'. The one at frame #0 is attempting
to process the dprintf breakpoint action. However, at this point,
the value of 'executing_breakpoint_commands' is 1, forcing an early
return, i.e. prior to executing the command(s) associated with the dprintf
breakpoint.
For the sake of comparison, this is what the stack looks like when hitting
the dprintf breakpoint for the second time when issuing the 'run'
command from the GDB prompt.
Thread 1 "gdb" hit Breakpoint 3, bpstat_do_actions_1 (bsp=0x7fffffffccd8)
at /ironwood1/sourceware-git/f34-master/bld/../../worktree-master/gdb/breakpoint.c:4431
4431 if (executing_breakpoint_commands)
#0 bpstat_do_actions_1 (bsp=0x7fffffffccd8)
at gdb/breakpoint.c:4431
#1 0x00000000004d8bc6 in dprintf_after_condition_true (bs=0x16b0290)
at gdb/breakpoint.c:13048
#2 0x00000000004c5caa in bpstat_stop_status (aspace=0x116dbc0, bp_addr=0x40116e, thread=0x13f0e60, ws=0x7fffffffd138,
stop_chain=0x16b0290) at gdb/breakpoint.c:5498
#3 0x0000000000768d98 in handle_signal_stop (ecs=0x7fffffffd110)
at gdb/infrun.c:6172
#4 0x00000000007678d3 in handle_inferior_event (ecs=0x7fffffffd110)
at gdb/infrun.c:5662
#5 0x0000000000763cd5 in fetch_inferior_event ()
at gdb/infrun.c:4060
#6 0x0000000000746d7d in inferior_event_handler (event_type=INF_REG_EVENT)
at gdb/inf-loop.c:41
#7 0x00000000007a702f in handle_target_event (error=0, client_data=0x0)
at gdb/linux-nat.c:4207
#8 0x0000000000b8cd6e in gdb_wait_for_event (block=block@entry=0)
at gdbsupport/event-loop.cc:701
#9 0x0000000000b8d032 in gdb_wait_for_event (block=0)
at gdbsupport/event-loop.cc:597
#10 gdb_do_one_event () at gdbsupport/event-loop.cc:212
#11 0x00000000007cf512 in start_event_loop ()
at gdb/main.c:421
#12 0x00000000007cf631 in captured_command_loop ()
at gdb/main.c:481
#13 0x00000000007d0ebf in captured_main (data=0x7fffffffd3f0)
at gdb/main.c:1353
#14 0x00000000007d0f25 in gdb_main (args=0x7fffffffd3f0)
at gdb/main.c:1368
#15 0x00000000004186dd in main (argc=5, argv=0x7fffffffd508)
at gdb/gdb.c:32
This relatively short backtrace is due to the current UI's async field
being set to 1.
Yet another thing to be aware of regarding this problem is the
difference in the way that commands associated to dprintf breakpoints
versus regular breakpoints are handled. While they both use a command
list associated with the breakpoint, regular breakpoints will place
the commands to be run on the bpstat chain constructed in
bp_stop_status(). These commands are run later on. For dprintf
breakpoints, commands are run via the 'after_condition_true' function
pointer directly from bpstat_stop_status(). (The 'commands' field in
the bpstat is cleared in dprintf_after_condition_true(). This
prevents the dprintf commands from being run again later on when other
commands on the bpstat chain are processed.)
Another thing that I noticed is that dprintf breakpoints are the only
type of breakpoint which use 'after_condition_true'. This suggests
that one possible way of fixing this problem, that of making dprintf
breakpoints work more like regular breakpoints, probably won't work.
(I must admit, however, that my understanding of this code isn't
complete enough to say why. I'll trust that whoever implemented it
had a good reason for doing it this way.)
The comment referenced earlier regarding 'executing_breakpoint_commands'
states that the reason for checking this variable is to avoid
potential endless recursion when a 'source' command appears in
bs->commands. We know that a dprintf command is constrained to either
1) execution of a GDB printf command, 2) an inferior function call of
a printf-like function, or 3) execution of an agent-printf command.
Therefore, infinite recursion due to a 'source' command cannot happen
when executing commands upon hitting a dprintf breakpoint.
I chose to fix this problem by having dprintf_after_condition_true()
directly call execute_control_commands(). This means that it no
longer attempts to go through bpstat_do_actions_1() avoiding the
infinite recursion check for potential 'source' commands on the
command chain. I think it simplifies this code a little bit too, a
definite bonus.
Summary:
* breakpoint.c (dprintf_after_condition_true): Don't call
bpstat_do_actions_1(). Call execute_control_commands()
instead.
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -13043,9 +13043,6 @@ dprintf_print_recreate (struct breakpoint *tp, struct ui_file *fp)
static void
dprintf_after_condition_true (struct bpstats *bs)
{
- struct bpstats tmp_bs;
- struct bpstats *tmp_bs_p = &tmp_bs;
-
/* dprintf's never cause a stop. This wasn't set in the
check_status hook instead because that would make the dprintf's
condition not be evaluated. */
@@ -13056,14 +13053,9 @@ dprintf_after_condition_true (struct bpstats *bs)
bpstat_do_actions, if a breakpoint that causes a stop happens to
be set at same address as this dprintf, or even if running the
commands here throws. */
- tmp_bs.commands = bs->commands;
- bs->commands = NULL;
-
- bpstat_do_actions_1 (&tmp_bs_p);
-
- /* 'tmp_bs.commands' will usually be NULL by now, but
- bpstat_do_actions_1 may return early without processing the whole
- list. */
+ counted_command_line cmds = std::move (bs->commands);
+ gdb_assert (cmds != nullptr);
+ execute_control_commands (cmds.get (), 0);
}
/* The breakpoint_ops structure to be used on static tracepoints with

View File

@ -1,194 +0,0 @@
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
From: Kevin Buettner <kevinb@redhat.com>
Date: Wed, 10 Nov 2021 18:55:43 -0700
Subject: gdb-rhbz2022177-dprintf-2.patch
;; Backport test case for dprintf bug (RH BZ 2022177).
Test case for Bug 28308
The purpose of this test is described in the comments in
dprintf-execution-x-script.exp.
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=28308
The name of this new test was based on that of an existing test,
bp-cmds-execution-x-script.exp. I started off by copying that test,
adding to it, and then rewriting almost all of it. It's different
enough that I decided that listing the copyright year as 2021
was sufficient.
diff --git a/gdb/testsuite/gdb.base/dprintf-execution-x-script.c b/gdb/testsuite/gdb.base/dprintf-execution-x-script.c
new file mode 100644
--- /dev/null
+++ b/gdb/testsuite/gdb.base/dprintf-execution-x-script.c
@@ -0,0 +1,53 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2021 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+volatile int vi = 0;
+
+void
+inc_vi ()
+{
+ vi++;
+}
+
+void
+print_vi ()
+{
+ printf ("vi=%d\n", vi);
+}
+
+void
+increment ()
+{
+ inc_vi ();
+}
+
+int
+main (int argc, char **argv)
+{
+ print_vi ();
+ increment ();
+ print_vi ();
+ increment ();
+ print_vi ();
+ increment ();
+ print_vi ();
+
+ exit (0);
+}
diff --git a/gdb/testsuite/gdb.base/dprintf-execution-x-script.exp b/gdb/testsuite/gdb.base/dprintf-execution-x-script.exp
new file mode 100644
--- /dev/null
+++ b/gdb/testsuite/gdb.base/dprintf-execution-x-script.exp
@@ -0,0 +1,85 @@
+# Copyright 2021 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 that commands in a GDB script file run via GDB's -x flag work
+# as expected. Specifically, the script creates a dprintf breakpoint
+# as well as a normal breakpoint that has "continue" in its command
+# list, and then does "run". Correct output from GDB is checked as
+# part of this test.
+
+# Bail out if the target can't use the 'run' command.
+if ![target_can_use_run_cmd] {
+ return 0
+}
+
+standard_testfile
+
+if {[build_executable "failed to prepare" $testfile $srcfile debug]} {
+ return -1
+}
+
+# This is the name of the GDB script to load.
+set x_file ${srcdir}/${subdir}/$testfile.gdb
+
+# Create context in which the global, GDBFLAGS, will be restored at
+# the end of the block. All commands run within the block are
+# actually run in the outer context. (This is why 'res' is available
+# outside of the save_vars block.)
+save_vars { GDBFLAGS } {
+ # Set flags with which to start GDB.
+ append GDBFLAGS " -ex \"set height unlimited\""
+ append GDBFLAGS " -x \"$x_file\""
+ append GDBFLAGS " --args \"$binfile\""
+
+ # Start GDB with above flags.
+ set res [gdb_spawn]
+}
+
+set test "load and run script with -x"
+if { $res != 0} {
+ fail $test
+ return -1
+}
+
+# The script loaded via -x contains a run command; while running, GDB
+# is expected to print three messages from dprintf breakpoints along
+# with three interspersed messages from an ordinary breakpoint (which
+# was set up with a continue command). Set up pattern D to match
+# output from hitting the dprintf breakpoint and B for the ordinary
+# breakpoint. Then set PAT to contain the entire pattern of expected
+# output from the interspersed dprintf and ordinary breakpoints along
+# with some (additional) expected output from the dprintf breakpoints,
+# i.e. 0, 1, and 2.
+set d "dprintf in increment.., vi="
+set b "Breakpoint ., inc_vi"
+set pat "${d}0.*?$b.*?${d}1.*?$b.*?${d}2.*?$b.*?"
+
+proc do_test {cmd test} {
+ gdb_test $cmd "$::pat$::inferior_exited_re normally.*" $test
+}
+
+# Check output from running script with -x
+do_test "" $test
+
+# Restart GDB and 'source' the script; this will (still) run the program
+# due to the 'run' command in the script.
+clean_restart $binfile
+do_test "source $x_file" "load and run script using source command"
+
+# This should leave us at the gdb prompt; Run program again using
+# already established breakpoints, i.e. those loaded from the
+# script. Prior to fixing PR 28308, this was the only test that
+# would pass.
+do_test "run" "run again"
diff --git a/gdb/testsuite/gdb.base/dprintf-execution-x-script.gdb b/gdb/testsuite/gdb.base/dprintf-execution-x-script.gdb
new file mode 100644
--- /dev/null
+++ b/gdb/testsuite/gdb.base/dprintf-execution-x-script.gdb
@@ -0,0 +1,21 @@
+# Copyright 2021 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/>. */
+
+dprintf increment, "dprintf in increment(), vi=%d\n", vi
+break inc_vi
+commands
+ continue
+end
+run

View File

@ -1,475 +0,0 @@
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alexandra=20H=C3=A1jkov=C3=A1?= <ahajkova@redhat.com>
Date: Wed, 5 Jan 2022 19:07:23 +0100
Subject: gdb-rhbz202487-rework-set-debuginfod.patch
;;Backport upstream commit from Simon Marchi
;;333f35b6315 gdb: pass/return setting setter/getter
;;scalar values by value
gdb: rework "set debuginfod" commands
As discussed here [1], do some re-work in the "set debuginfod commands".
First, use "set debuginfod enabled on/off/ask" instead of "set
debuginfod on/off/ask". This is more MI-friendly, and it gives an
output that makes more sense in "info set", for example.
Then, make the show commands not call "error" when debuginfod support is
not compiled in. This makes the commands "show" and "show debuginfod"
stop early, breaking gdb.base/default.exp:
Running /home/smarchi/src/binutils-gdb/gdb/testsuite/gdb.base/default.exp ...
FAIL: gdb.base/default.exp: info set
FAIL: gdb.base/default.exp: show
- Make the "debuginfod enabled" setting default to "off" when debuginfod
support is not compiled in, and "ask" otherwise.
- Make the setter of "debuginfod enabled" error out when debuginfod
support is not compiled in, so that "debuginfod enabled" will always
remain "off" in that case.
- Make the setter of "debuginfod verbose" work in any case. I don't
see the harm in letting the user change that setting, since the user will
hit an error if they try to enable the use of debuginfod.
- I would do the same for the "debuginfod urls" setter, but because
this one needs to see the DEBUGINFOD_URLS_ENV_VAR macro, provided by
libdebuginfod, I made that one error out as well if debuginfod
support is not compiled it (otherwise, I would have left it like
"debuginfod verbose". Alternatively, we could hard-code
"DEBUGINFOD_URLS" in the code (in fact, it was prior to this patch,
but I think it was an oversight, as other spots use
DEBUGINFOD_URLS_ENV_VAR), or use a dummy string to store the setting,
but I don't really see the value in that.
Rename debuginfod_enable to debuginfod_enabled, just so it matches the
setting name.
[1] https://sourceware.org/pipermail/gdb-patches/2021-October/182937.html
Change-Id: I45fdb2993f668226a5639228951362b7800f09d5
Co-Authored-By: Aaron Merey <amerey@redhat.com>
diff --git a/gdb/debuginfod-support.c b/gdb/debuginfod-support.c
--- a/gdb/debuginfod-support.c
+++ b/gdb/debuginfod-support.c
@@ -32,8 +32,22 @@ static const char debuginfod_on[] = "on";
static const char debuginfod_off[] = "off";
static const char debuginfod_ask[] = "ask";
-static const char *debuginfod_enable = debuginfod_ask;
-static unsigned debuginfod_verbose = 1;
+static const char *debuginfod_enabled_enum[] =
+{
+ debuginfod_on,
+ debuginfod_off,
+ debuginfod_ask,
+ nullptr
+};
+
+static const char *debuginfod_enabled =
+#if defined(HAVE_LIBDEBUGINFOD)
+ debuginfod_ask;
+#else
+ debuginfod_off;
+#endif
+
+static unsigned int debuginfod_verbose = 1;
/* This is never actually used. URLs are always pulled from the
environment. */
@@ -60,64 +74,6 @@ debuginfod_debuginfo_query (const unsigned char *build_id,
#define NO_IMPL _("Support for debuginfod is not compiled into GDB.")
-/* Stub set/show commands that indicate debuginfod is not supported. */
-
-static void
-set_debuginfod_on_command (const char *args, int from_tty)
-{
- error (NO_IMPL);
- debuginfod_enable = debuginfod_off;
-}
-
-static void
-set_debuginfod_off_command (const char *args, int from_tty)
-{
- error (NO_IMPL);
- debuginfod_enable = debuginfod_off;
-}
-
-static void
-set_debuginfod_ask_command (const char *args, int from_tty)
-{
- error (NO_IMPL);
- debuginfod_enable = debuginfod_off;
-}
-
-static void
-show_debuginfod_status_command (const char *args, int from_tty)
-{
- error (NO_IMPL);
-}
-
-static void
-set_debuginfod_urls_command (const char *ignore, int from_tty,
- struct cmd_list_element *c)
-{
- error (NO_IMPL);
-}
-
-static void
-show_debuginfod_urls_command (struct ui_file *file, int from_tty,
- struct cmd_list_element *cmd, const char *value)
-{
- error (NO_IMPL);
-}
-
-static void
-set_debuginfod_verbose_command (const char *args, int from_tty,
- struct cmd_list_element *c)
-{
- error (NO_IMPL);
- debuginfod_verbose = 0;
-}
-
-static void
-show_debuginfod_verbose_command (struct ui_file *file, int from_tty,
- struct cmd_list_element *cmd,
- const char *value)
-{
- error (NO_IMPL);
-}
#else
#include <elfutils/debuginfod.h>
@@ -145,81 +101,6 @@ struct debuginfod_client_deleter
using debuginfod_client_up
= std::unique_ptr<debuginfod_client, debuginfod_client_deleter>;
-/* Enable debuginfod. */
-
-static void
-set_debuginfod_on_command (const char *args, int from_tty)
-{
- debuginfod_enable = debuginfod_on;
-}
-
-/* Disable debuginfod. */
-
-static void
-set_debuginfod_off_command (const char *args, int from_tty)
-{
- debuginfod_enable = debuginfod_off;
-}
-
-/* Before next query, ask user whether to enable debuginfod. */
-
-static void
-set_debuginfod_ask_command (const char *args, int from_tty)
-{
- debuginfod_enable = debuginfod_ask;
-}
-
-/* Show whether debuginfod is enabled. */
-
-static void
-show_debuginfod_status_command (const char *args, int from_tty)
-{
- printf_unfiltered (_("Debuginfod functionality is currently set to " \
- "\"%s\".\n"), debuginfod_enable);
-}
-
-/* Set the URLs that debuginfod will query. */
-
-static void
-set_debuginfod_urls_command (const char *new_value, int from_tty,
- struct cmd_list_element *c)
-{
- if (setenv ("DEBUGINFOD_URLS", new_value, 1) != 0)
- warning (_("Unable to set debuginfod URLs: %s"), safe_strerror (errno));
-}
-
-/* Show the URLs that debuginfod will query. */
-
-static void
-show_debuginfod_urls_command (struct ui_file *file, int from_tty,
- struct cmd_list_element *cmd, const char *value)
-{
- if (value == nullptr || value[0] == '\0')
- fprintf_unfiltered (file, _("Debuginfod URLs have not been set.\n"));
- else
- fprintf_filtered (file, _("Debuginfod URLs are currently set to:\n%s\n"),
- value);
-}
-
-/* No-op setter used for compatibility when gdb is built without debuginfod. */
-
-static void
-set_debuginfod_verbose_command (const char *args, int from_tty,
- struct cmd_list_element *c)
-{
- return;
-}
-
-/* Show verbosity. */
-
-static void
-show_debuginfod_verbose_command (struct ui_file *file, int from_tty,
- struct cmd_list_element *cmd, const char *value)
-{
- fprintf_filtered (file, _("Debuginfod verbose output is set to %s.\n"),
- value);
-}
-
static int
progressfn (debuginfod_client *c, long cur, long total)
{
@@ -276,15 +157,15 @@ get_debuginfod_client ()
whether to enable debuginfod. */
static bool
-debuginfod_enabled ()
+debuginfod_is_enabled ()
{
const char *urls = getenv (DEBUGINFOD_URLS_ENV_VAR);
if (urls == nullptr || urls[0] == '\0'
- || debuginfod_enable == debuginfod_off)
+ || debuginfod_enabled == debuginfod_off)
return false;
- if (debuginfod_enable == debuginfod_ask)
+ if (debuginfod_enabled == debuginfod_ask)
{
int resp = nquery (_("\nThis GDB supports auto-downloading debuginfo " \
"from the following URLs:\n%s\nEnable debuginfod " \
@@ -293,16 +174,16 @@ debuginfod_enabled ()
if (!resp)
{
printf_filtered (_("Debuginfod has been disabled.\nTo make this " \
- "setting permanent, add \'set debuginfod off\' " \
- "to .gdbinit.\n"));
- debuginfod_enable = debuginfod_off;
+ "setting permanent, add \'set debuginfod " \
+ "enabled off\' to .gdbinit.\n"));
+ debuginfod_enabled = debuginfod_off;
return false;
}
printf_filtered (_("Debuginfod has been enabled.\nTo make this " \
- "setting permanent, add \'set debuginfod on\' " \
- "to .gdbinit.\n"));
- debuginfod_enable = debuginfod_on;
+ "setting permanent, add \'set debuginfod enabled " \
+ "on\' to .gdbinit.\n"));
+ debuginfod_enabled = debuginfod_on;
}
return true;
@@ -316,7 +197,7 @@ debuginfod_source_query (const unsigned char *build_id,
const char *srcpath,
gdb::unique_xmalloc_ptr<char> *destname)
{
- if (!debuginfod_enabled ())
+ if (!debuginfod_is_enabled ())
return scoped_fd (-ENOSYS);
debuginfod_client *c = get_debuginfod_client ();
@@ -353,7 +234,7 @@ debuginfod_debuginfo_query (const unsigned char *build_id,
const char *filename,
gdb::unique_xmalloc_ptr<char> *destname)
{
- if (!debuginfod_enabled ())
+ if (!debuginfod_is_enabled ())
return scoped_fd (-ENOSYS);
debuginfod_client *c = get_debuginfod_client ();
@@ -381,6 +262,67 @@ debuginfod_debuginfo_query (const unsigned char *build_id,
}
#endif
+/* Set callback for "set debuginfod enabled". */
+
+static void
+set_debuginfod_enabled (const char *args, int from_tty,
+ struct cmd_list_element *c)
+{
+#if defined(HAVE_LIBDEBUGINFOD)
+ /* Value is already set. */
+#else
+ error (NO_IMPL);
+#endif
+}
+
+/* Show callback for "set debuginfod enabled". */
+
+static void
+show_debuginfod_enabled (ui_file *file, int from_tty, cmd_list_element *cmd,
+ const char *value)
+{
+ printf_unfiltered (_("Debuginfod functionality is currently set to "
+ "\"%s\".\n"), debuginfod_enabled);
+}
+
+/* Set callback for "set debuginfod urls". */
+
+static void
+set_debuginfod_urls (const char *args, int from_tty,
+ struct cmd_list_element *c)
+{
+#if defined(HAVE_LIBDEBUGINFOD)
+ gdb_assert (debuginfod_urls != nullptr);
+ if (setenv (DEBUGINFOD_URLS_ENV_VAR, debuginfod_urls, 1) != 0)
+ warning (_("Unable to set debuginfod URLs: %s"), safe_strerror (errno));
+#else
+ error (NO_IMPL);
+#endif
+}
+
+/* Show callback for "set debuginfod urls". */
+
+static void
+show_debuginfod_urls (ui_file *file, int from_tty, cmd_list_element *cmd,
+ const char *value)
+{
+ if (value[0] == '\0')
+ fprintf_unfiltered (file, _("Debuginfod URLs have not been set.\n"));
+ else
+ fprintf_filtered (file, _("Debuginfod URLs are currently set to:\n%s\n"),
+ value);
+}
+
+/* Show callback for "set debuginfod verbose". */
+
+static void
+show_debuginfod_verbose_command (ui_file *file, int from_tty,
+ cmd_list_element *cmd, const char *value)
+{
+ fprintf_filtered (file, _("Debuginfod verbose output is set to %s.\n"),
+ value);
+}
+
/* Register debuginfod commands. */
void _initialize_debuginfod ();
@@ -396,23 +338,17 @@ _initialize_debuginfod ()
_("Show debuginfod options."),
&show_debuginfod_prefix_list, 0, &showlist);
- /* set debuginfod on */
- add_cmd ("on", class_run, set_debuginfod_on_command,
- _("Enable debuginfod."), &set_debuginfod_prefix_list);
-
- /* set debuginfod off */
- add_cmd ("off", class_run, set_debuginfod_off_command,
- _("Disable debuginfod."), &set_debuginfod_prefix_list);
-
- /* set debuginfod ask */
- add_cmd ("ask", class_run, set_debuginfod_ask_command, _("\
-Ask the user whether to enable debuginfod before performing the next query."),
- &set_debuginfod_prefix_list);
-
- /* show debuginfod status */
- add_cmd ("status", class_run, show_debuginfod_status_command,
- _("Show whether debuginfod is set to \"on\", \"off\" or \"ask\"."),
- &show_debuginfod_prefix_list);
+ add_setshow_enum_cmd ("enabled", class_run, debuginfod_enabled_enum,
+ &debuginfod_enabled,
+ _("Set whether to use debuginfod."),
+ _("Show whether to use debuginfod."),
+ _("\
+When on, enable the use of debuginfod to download missing debug info and\n\
+source files."),
+ set_debuginfod_enabled,
+ show_debuginfod_enabled,
+ &set_debuginfod_prefix_list,
+ &show_debuginfod_prefix_list);
/* set/show debuginfod urls */
add_setshow_string_noescape_cmd ("urls", class_run, &debuginfod_urls, _("\
@@ -421,8 +357,8 @@ Show the list of debuginfod server URLs."), _("\
Manage the space-separated list of debuginfod server URLs that GDB will query \
when missing debuginfo, executables or source files.\nThe default value is \
copied from the DEBUGINFOD_URLS environment variable."),
- set_debuginfod_urls_command,
- show_debuginfod_urls_command,
+ set_debuginfod_urls,
+ show_debuginfod_urls,
&set_debuginfod_prefix_list,
&show_debuginfod_prefix_list);
if (getenv ("DEBUGINFOD_URLS") != nullptr)
@@ -436,7 +372,7 @@ Set verbosity of debuginfod output."), _("\
Show debuginfod debugging."), _("\
When set to a non-zero value, display verbose output for each debuginfod \
query.\nTo disable, set to zero. Verbose output is displayed by default."),
- set_debuginfod_verbose_command,
+ nullptr,
show_debuginfod_verbose_command,
&set_debuginfod_prefix_list,
&show_debuginfod_prefix_list);
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -47046,27 +47046,28 @@ regarding @code{debuginfod}.
@value{GDBN} provides the following commands for configuring @code{debuginfod}.
@table @code
-@kindex set debuginfod
-@anchor{set debuginfod}
-@item set debuginfod
-@itemx set debuginfod on
+@kindex set debuginfod enabled
+@anchor{set debuginfod enabled}
+@item set debuginfod enabled
+@itemx set debuginfod enabled on
@cindex enable debuginfod
@value{GDBN} will attempt to query @code{debuginfod} servers when missing debug
info or source files.
-@item set debuginfod off
+@item set debuginfod enabled off
@value{GDBN} will not attempt to query @code{debuginfod} servers when missing
-debug info or source files. By default, @code{debuginfod} is set to @code{off}
-for non-interactive sessions.
+debug info or source files. By default, @code{debuginfod enabled} is set to
+@code{off} for non-interactive sessions.
-@item set debuginfod ask
+@item set debuginfod enabled ask
@value{GDBN} will prompt the user to enable or disable @code{debuginfod} before
-attempting to perform the next query. By default, @code{debuginfod} is set to
-@code{ask} for interactive sessions.
+attempting to perform the next query. By default, @code{debuginfod enabled}
+is set to @code{ask} for interactive sessions.
-@kindex show debuginfod status
-@item show debuginfod status
-Show whether @code{debuginfod} is set to @code{on}, @code{off} or @code{ask}.
+@kindex show debuginfod enabled
+@item show debuginfod enabled
+Display whether @code{debuginfod enabled} is set to @code{on}, @code{off} or
+@code{ask}.
@kindex set debuginfod urls
@cindex configure debuginfod URLs
diff --git a/gdb/testsuite/gdb.debuginfod/fetch_src_and_symbols.exp b/gdb/testsuite/gdb.debuginfod/fetch_src_and_symbols.exp
--- a/gdb/testsuite/gdb.debuginfod/fetch_src_and_symbols.exp
+++ b/gdb/testsuite/gdb.debuginfod/fetch_src_and_symbols.exp
@@ -236,7 +236,7 @@ proc local_url { } {
clean_restart
gdb_test "file $binfile" ".*No debugging symbols.*" \
"file [file tail $binfile] cmd"
- gdb_test_no_output "set debuginfod off"
+ gdb_test_no_output "set debuginfod enabled off"
gdb_test_no_output "set debuginfod urls http://127.0.0.1:$port"
# gdb shouldn't find the debuginfo since debuginfod has been disabled
@@ -244,7 +244,7 @@ proc local_url { } {
"file [file tail $binfile] cmd off"
# Enable debuginfod and fetch the debuginfo
- gdb_test_no_output "set debuginfod on"
+ gdb_test_no_output "set debuginfod enabled on"
gdb_test "file $binfile" ".*Reading symbols from.*debuginfo.*" \
"file [file tail $binfile] cmd on"
}

View File

@ -1,152 +0,0 @@
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alexandra=20H=C3=A1jkov=C3=A1?= <ahajkova@redhat.com>
Date: Wed, 5 Jan 2022 17:08:22 +0100
Subject: gdb-rhbz2024875-expand-documentation-for-debuginfod.patch
;;Backport upstream commit from Aaron Merey
;;3ea44f21299 gdb.texinfo: Expand documentation for debuginfod
gdb.texinfo: Expand documentation for debuginfod
Add section describing GDB's usage of debuginfod.
Refer to this new section in the description of the '--with-debuginfod'
configure option.
Mention debuginfod in the 'Separate Debug Files' section.
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -184,6 +184,7 @@ software in general. We will miss him.
the operating system
* Trace File Format:: GDB trace file format
* Index Section Format:: .gdb_index section format
+* Debuginfod:: Download debugging resources with @code{debuginfod}
* Man Pages:: Manual pages
* Copying:: GNU General Public License says
how you can copy and share GDB
@@ -21373,7 +21374,9 @@ For the ``build ID'' method, @value{GDBN} looks in the
a file named @file{@var{nn}/@var{nnnnnnnn}.debug}, where @var{nn} are the
first 2 hex characters of the build ID bit string, and @var{nnnnnnnn}
are the rest of the bit string. (Real build ID strings are 32 or more
-hex characters, not 10.)
+hex characters, not 10.) @value{GDBN} can automatically query
+@code{debuginfod} servers using build IDs in order to download separate debug
+files that cannot be found locally. For more information see @ref{Debuginfod}.
@end itemize
So, for example, suppose you ask @value{GDBN} to debug
@@ -21394,6 +21397,10 @@ debug information files, in the indicated order:
@file{/usr/lib/debug/usr/bin/ls.debug}.
@end itemize
+If the debug file still has not been found and @code{debuginfod}
+(@pxref{Debuginfod}) is enabled, @value{GDBN} will attempt to download the
+file from @code{debuginfod} servers.
+
@anchor{debug-file-directory}
Global debugging info directories default to what is set by @value{GDBN}
configure option @option{--with-separate-debug-dir}. During @value{GDBN} run
@@ -38746,12 +38753,12 @@ Use the curses library instead of the termcap library, for text-mode
terminal operations.
@item --with-debuginfod
-Build @value{GDBN} with libdebuginfod, the debuginfod client library.
-Used to automatically fetch source files and separate debug files from
-debuginfod servers using the associated executable's build ID. Enabled
-by default if libdebuginfod is installed and found at configure time.
-debuginfod is packaged with elfutils, starting with version 0.178. You
-can get the latest version from `https://sourceware.org/elfutils/'.
+Build @value{GDBN} with @file{libdebuginfod}, the @code{debuginfod} client
+library. Used to automatically fetch ELF, DWARF and source files from
+@code{debuginfod} servers using build IDs associated with any missing
+files. Enabled by default if @file{libdebuginfod} is installed and found
+at configure time. For more information regarding @code{debuginfod} see
+@ref{Debuginfod}.
@item --with-libunwind-ia64
Use the libunwind library for unwinding function call stack on ia64
@@ -47012,6 +47019,82 @@ switch (die->tag)
@}
@end smallexample
+@node Debuginfod
+@appendix Download debugging resources with Debuginfod
+@cindex debuginfod
+
+@code{debuginfod} is an HTTP server for distributing ELF, DWARF and source
+files.
+
+With the @code{debuginfod} client library, @file{libdebuginfod}, @value{GDBN}
+can query servers using the build IDs associated with missing debug info,
+executables and source files in order to download them on demand.
+
+For instructions on building @value{GDBN} with @file{libdebuginfod},
+@pxref{Configure Options,,--with-debuginfod}. @code{debuginfod} is packaged
+with @code{elfutils}, starting with version 0.178. See
+@uref{https://sourceware.org/elfutils/Debuginfod.html} for more information
+regarding @code{debuginfod}.
+
+@menu
+* Debuginfod Settings:: Configuring debuginfod with @value{GDBN}
+@end menu
+
+@node Debuginfod Settings
+@section Debuginfod Settings
+
+@value{GDBN} provides the following commands for configuring @code{debuginfod}.
+
+@table @code
+@kindex set debuginfod
+@anchor{set debuginfod}
+@item set debuginfod
+@itemx set debuginfod on
+@cindex enable debuginfod
+@value{GDBN} will attempt to query @code{debuginfod} servers when missing debug
+info or source files.
+
+@item set debuginfod off
+@value{GDBN} will not attempt to query @code{debuginfod} servers when missing
+debug info or source files. By default, @code{debuginfod} is set to @code{off}
+for non-interactive sessions.
+
+@item set debuginfod ask
+@value{GDBN} will prompt the user to enable or disable @code{debuginfod} before
+attempting to perform the next query. By default, @code{debuginfod} is set to
+@code{ask} for interactive sessions.
+
+@kindex show debuginfod status
+@item show debuginfod status
+Show whether @code{debuginfod} is set to @code{on}, @code{off} or @code{ask}.
+
+@kindex set debuginfod urls
+@cindex configure debuginfod URLs
+@item set debuginfod urls
+@itemx set debuginfod urls @var{urls}
+Set the space-separated list of URLs that @code{debuginfod} will attempt to
+query. Only @code{http://}, @code{https://} and @code{file://} protocols
+should be used. The default value of @code{debuginfod urls} is copied from
+the @var{DEBUGINFOD_URLS} environment variable.
+
+@kindex show debuginfod urls
+@item show debuginfod urls
+Display the list of URLs that @code{debuginfod} will attempt to query.
+
+@kindex set debuginfod verbose
+@cindex debuginfod verbosity
+@item set debuginfod verbose
+@itemx set debuginfod verbose @var{n}
+Enable or disable @code{debuginfod}-related output. Use a non-zero value
+to enable and @code{0} to disable. @code{debuginfod} output is shown by
+default.
+
+@kindex show debuginfod verbose
+@item show debuginfod verbose
+Show the current verbosity setting.
+
+@end table
+
@node Man Pages
@appendix Manual pages
@cindex Man pages

View File

@ -1,37 +0,0 @@
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alexandra=20H=C3=A1jkov=C3=A1?= <ahajkova@redhat.com>
Date: Sun, 31 Oct 2021 11:34:06 -0600
Subject: gdb-rhbz2024875-fix-unittest-failure.patch
;;Backport upstream commit from Tom Tromey
;;2a8f1f47446 Fix unittest.exp failure due to 'set debuginfod' addition
Fix unittest.exp failure due to 'set debuginfod' addition
The 'set debuginfod' change caused a regression in unittest.exp:
Running selftest help_doc_invariants.
help doc broken invariant: command 'info set debuginfod' help doc first line is not terminated with a '.' character
help doc broken invariant: command 'set debuginfod' help doc first line is not terminated with a '.' character
help doc broken invariant: command 'show debuginfod' help doc first line is not terminated with a '.' character
Self test failed: self-test failed at ../../binutils-gdb/gdb/unittests/command-def-selftests.c:100
This patch fixes the problem. I'm checking it in.
diff --git a/gdb/debuginfod-support.c b/gdb/debuginfod-support.c
--- a/gdb/debuginfod-support.c
+++ b/gdb/debuginfod-support.c
@@ -389,11 +389,11 @@ _initialize_debuginfod ()
{
/* set/show debuginfod */
add_basic_prefix_cmd ("debuginfod", class_run,
- _("Set debuginfod options"),
+ _("Set debuginfod options."),
&set_debuginfod_prefix_list, 0, &setlist);
add_show_prefix_cmd ("debuginfod", class_run,
- _("Show debuginfod options"),
+ _("Show debuginfod options."),
&show_debuginfod_prefix_list, 0, &showlist);
/* set debuginfod on */

View File

@ -1,60 +0,0 @@
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alexandra=20H=C3=A1jkov=C3=A1?= <ahajkova@redhat.com>
Date: Wed, 5 Jan 2022 22:42:27 +0100
Subject: gdb-rhbz2024875-pr27026.patch
;;Backport upstream commit from Aaron Merey
;;b9db26b4c44 [PR gdb/27026] CTRL-C is ignored when debug info is downloaded
[PR gdb/27026] CTRL-C is ignored when debug info is downloaded
During debuginfod downloads, ctrl-c should result in the download
being cancelled and skipped. However in some cases, ctrl-c fails to
get delivered to gdb during downloading. This can result in downloads
being unskippable.
Fix this by ensuring that target_terminal::ours is in effect for the
duration of each download.
Co-authored-by: Tom de Vries <tdevries@suse.de>
https://sourceware.org/bugzilla/show_bug.cgi?id=27026#c3
diff --git a/gdb/debuginfod-support.c b/gdb/debuginfod-support.c
--- a/gdb/debuginfod-support.c
+++ b/gdb/debuginfod-support.c
@@ -23,6 +23,7 @@
#include "gdbsupport/gdb_optional.h"
#include "cli/cli-cmds.h"
#include "cli/cli-style.h"
+#include "target.h"
/* Set/show debuginfod commands. */
static cmd_list_element *set_debuginfod_prefix_list;
@@ -208,6 +209,13 @@ debuginfod_source_query (const unsigned char *build_id,
user_data data ("source file", srcpath);
debuginfod_set_user_data (c, &data);
+ gdb::optional<target_terminal::scoped_restore_terminal_state> term_state;
+ if (target_supports_terminal_ours ())
+ {
+ term_state.emplace ();
+ target_terminal::ours ();
+ }
+
scoped_fd fd (debuginfod_find_source (c,
build_id,
build_id_len,
@@ -246,6 +254,13 @@ debuginfod_debuginfo_query (const unsigned char *build_id,
user_data data ("separate debug info for", filename);
debuginfod_set_user_data (c, &data);
+ gdb::optional<target_terminal::scoped_restore_terminal_state> term_state;
+ if (target_supports_terminal_ours ())
+ {
+ term_state.emplace ();
+ target_terminal::ours ();
+ }
+
scoped_fd fd (debuginfod_find_debuginfo (c, build_id, build_id_len,
&dname));
debuginfod_set_user_data (c, nullptr);

View File

@ -1,414 +0,0 @@
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alexandra=20H=C3=A1jkov=C3=A1?= <ahajkova@redhat.com>
Date: Wed, 5 Jan 2022 17:18:31 +0100
Subject: gdb-rhbz2024875-set_show-for-managing-debuginfod.patch
;;Backport upstream commit from Aaron Merey
;;7811fa5995f gdb: add set/show commands for managing debuginfod
gdb: add set/show commands for managing debuginfod
Add 'set debuginfod' command. Accepts 'on', 'off' or 'ask' as an
argument. 'on' enables debuginfod for the current session. 'off'
disables debuginfod for the current session. 'ask' will prompt
the user to either enable or disable debuginfod when the next query
is about to be performed:
This GDB supports auto-downloading debuginfo from the following URLs:
<URL1> <URL2> ...
Enable debuginfod for this session? (y or [n]) y
Debuginfod has been enabled.
To make this setting permanent, add 'set debuginfod on' to .gdbinit.
For interactive sessions, 'ask' is the default. For non-interactive
sessions, 'off' is the default.
Add 'show debuginfod status' command. Displays whether debuginfod
is set to 'on', 'off' or 'ask'.
Add 'set/show debuginfod urls' commands. Accepts a string of
space-separated debuginfod server URLs to be queried. The default
value is copied from the DEBUGINFOD_URLS environment variable.
Finally add 'set/show debuginfod verbose' commands to control whether
debuginfod-related output is displayed. Verbose output is enabled
by default.
(gdb) run
Starting program: /bin/sleep 5
Download failed: No route to host. Continuing without debug info for /lib64/libc.so.6.
If GDB is not built with debuginfod then these commands will just display
Support for debuginfod is not compiled into GDB.
diff --git a/gdb/debuginfod-support.c b/gdb/debuginfod-support.c
--- a/gdb/debuginfod-support.c
+++ b/gdb/debuginfod-support.c
@@ -18,10 +18,26 @@
#include "defs.h"
#include <errno.h>
-#include "cli/cli-style.h"
#include "gdbsupport/scoped_fd.h"
#include "debuginfod-support.h"
#include "gdbsupport/gdb_optional.h"
+#include "cli/cli-cmds.h"
+#include "cli/cli-style.h"
+
+/* Set/show debuginfod commands. */
+static cmd_list_element *set_debuginfod_prefix_list;
+static cmd_list_element *show_debuginfod_prefix_list;
+
+static const char debuginfod_on[] = "on";
+static const char debuginfod_off[] = "off";
+static const char debuginfod_ask[] = "ask";
+
+static const char *debuginfod_enable = debuginfod_ask;
+static unsigned debuginfod_verbose = 1;
+
+/* This is never actually used. URLs are always pulled from the
+ environment. */
+static char *debuginfod_urls;
#ifndef HAVE_LIBDEBUGINFOD
scoped_fd
@@ -41,6 +57,67 @@ debuginfod_debuginfo_query (const unsigned char *build_id,
{
return scoped_fd (-ENOSYS);
}
+
+#define NO_IMPL _("Support for debuginfod is not compiled into GDB.")
+
+/* Stub set/show commands that indicate debuginfod is not supported. */
+
+static void
+set_debuginfod_on_command (const char *args, int from_tty)
+{
+ error (NO_IMPL);
+ debuginfod_enable = debuginfod_off;
+}
+
+static void
+set_debuginfod_off_command (const char *args, int from_tty)
+{
+ error (NO_IMPL);
+ debuginfod_enable = debuginfod_off;
+}
+
+static void
+set_debuginfod_ask_command (const char *args, int from_tty)
+{
+ error (NO_IMPL);
+ debuginfod_enable = debuginfod_off;
+}
+
+static void
+show_debuginfod_status_command (const char *args, int from_tty)
+{
+ error (NO_IMPL);
+}
+
+static void
+set_debuginfod_urls_command (const char *ignore, int from_tty,
+ struct cmd_list_element *c)
+{
+ error (NO_IMPL);
+}
+
+static void
+show_debuginfod_urls_command (struct ui_file *file, int from_tty,
+ struct cmd_list_element *cmd, const char *value)
+{
+ error (NO_IMPL);
+}
+
+static void
+set_debuginfod_verbose_command (const char *args, int from_tty,
+ struct cmd_list_element *c)
+{
+ error (NO_IMPL);
+ debuginfod_verbose = 0;
+}
+
+static void
+show_debuginfod_verbose_command (struct ui_file *file, int from_tty,
+ struct cmd_list_element *cmd,
+ const char *value)
+{
+ error (NO_IMPL);
+}
#else
#include <elfutils/debuginfod.h>
@@ -68,6 +145,81 @@ struct debuginfod_client_deleter
using debuginfod_client_up
= std::unique_ptr<debuginfod_client, debuginfod_client_deleter>;
+/* Enable debuginfod. */
+
+static void
+set_debuginfod_on_command (const char *args, int from_tty)
+{
+ debuginfod_enable = debuginfod_on;
+}
+
+/* Disable debuginfod. */
+
+static void
+set_debuginfod_off_command (const char *args, int from_tty)
+{
+ debuginfod_enable = debuginfod_off;
+}
+
+/* Before next query, ask user whether to enable debuginfod. */
+
+static void
+set_debuginfod_ask_command (const char *args, int from_tty)
+{
+ debuginfod_enable = debuginfod_ask;
+}
+
+/* Show whether debuginfod is enabled. */
+
+static void
+show_debuginfod_status_command (const char *args, int from_tty)
+{
+ printf_unfiltered (_("Debuginfod functionality is currently set to " \
+ "\"%s\".\n"), debuginfod_enable);
+}
+
+/* Set the URLs that debuginfod will query. */
+
+static void
+set_debuginfod_urls_command (const char *new_value, int from_tty,
+ struct cmd_list_element *c)
+{
+ if (setenv ("DEBUGINFOD_URLS", new_value, 1) != 0)
+ warning (_("Unable to set debuginfod URLs: %s"), safe_strerror (errno));
+}
+
+/* Show the URLs that debuginfod will query. */
+
+static void
+show_debuginfod_urls_command (struct ui_file *file, int from_tty,
+ struct cmd_list_element *cmd, const char *value)
+{
+ if (value == nullptr || value[0] == '\0')
+ fprintf_unfiltered (file, _("Debuginfod URLs have not been set.\n"));
+ else
+ fprintf_filtered (file, _("Debuginfod URLs are currently set to:\n%s\n"),
+ value);
+}
+
+/* No-op setter used for compatibility when gdb is built without debuginfod. */
+
+static void
+set_debuginfod_verbose_command (const char *args, int from_tty,
+ struct cmd_list_element *c)
+{
+ return;
+}
+
+/* Show verbosity. */
+
+static void
+show_debuginfod_verbose_command (struct ui_file *file, int from_tty,
+ struct cmd_list_element *cmd, const char *value)
+{
+ fprintf_filtered (file, _("Debuginfod verbose output is set to %s.\n"),
+ value);
+}
+
static int
progressfn (debuginfod_client *c, long cur, long total)
{
@@ -120,6 +272,42 @@ get_debuginfod_client ()
return global_client.get ();
}
+/* Check if debuginfod is enabled. If configured to do so, ask the user
+ whether to enable debuginfod. */
+
+static bool
+debuginfod_enabled ()
+{
+ const char *urls = getenv (DEBUGINFOD_URLS_ENV_VAR);
+
+ if (urls == nullptr || urls[0] == '\0'
+ || debuginfod_enable == debuginfod_off)
+ return false;
+
+ if (debuginfod_enable == debuginfod_ask)
+ {
+ int resp = nquery (_("\nThis GDB supports auto-downloading debuginfo " \
+ "from the following URLs:\n%s\nEnable debuginfod " \
+ "for this session? "),
+ urls);
+ if (!resp)
+ {
+ printf_filtered (_("Debuginfod has been disabled.\nTo make this " \
+ "setting permanent, add \'set debuginfod off\' " \
+ "to .gdbinit.\n"));
+ debuginfod_enable = debuginfod_off;
+ return false;
+ }
+
+ printf_filtered (_("Debuginfod has been enabled.\nTo make this " \
+ "setting permanent, add \'set debuginfod on\' " \
+ "to .gdbinit.\n"));
+ debuginfod_enable = debuginfod_on;
+ }
+
+ return true;
+}
+
/* See debuginfod-support.h */
scoped_fd
@@ -128,8 +316,7 @@ debuginfod_source_query (const unsigned char *build_id,
const char *srcpath,
gdb::unique_xmalloc_ptr<char> *destname)
{
- const char *urls_env_var = getenv (DEBUGINFOD_URLS_ENV_VAR);
- if (urls_env_var == NULL || urls_env_var[0] == '\0')
+ if (!debuginfod_enabled ())
return scoped_fd (-ENOSYS);
debuginfod_client *c = get_debuginfod_client ();
@@ -147,8 +334,7 @@ debuginfod_source_query (const unsigned char *build_id,
nullptr));
debuginfod_set_user_data (c, nullptr);
- /* TODO: Add 'set debug debuginfod' command to control when error messages are shown. */
- if (fd.get () < 0 && fd.get () != -ENOENT)
+ if (debuginfod_verbose > 0 && fd.get () < 0 && fd.get () != -ENOENT)
printf_filtered (_("Download failed: %s. Continuing without source file %ps.\n"),
safe_strerror (-fd.get ()),
styled_string (file_name_style.style (), srcpath));
@@ -167,8 +353,7 @@ debuginfod_debuginfo_query (const unsigned char *build_id,
const char *filename,
gdb::unique_xmalloc_ptr<char> *destname)
{
- const char *urls_env_var = getenv (DEBUGINFOD_URLS_ENV_VAR);
- if (urls_env_var == NULL || urls_env_var[0] == '\0')
+ if (!debuginfod_enabled ())
return scoped_fd (-ENOSYS);
debuginfod_client *c = get_debuginfod_client ();
@@ -184,7 +369,7 @@ debuginfod_debuginfo_query (const unsigned char *build_id,
&dname));
debuginfod_set_user_data (c, nullptr);
- if (fd.get () < 0 && fd.get () != -ENOENT)
+ if (debuginfod_verbose > 0 && fd.get () < 0 && fd.get () != -ENOENT)
printf_filtered (_("Download failed: %s. Continuing without debug info for %ps.\n"),
safe_strerror (-fd.get ()),
styled_string (file_name_style.style (), filename));
@@ -195,3 +380,64 @@ debuginfod_debuginfo_query (const unsigned char *build_id,
return fd;
}
#endif
+
+/* Register debuginfod commands. */
+
+void _initialize_debuginfod ();
+void
+_initialize_debuginfod ()
+{
+ /* set/show debuginfod */
+ add_basic_prefix_cmd ("debuginfod", class_run,
+ _("Set debuginfod options"),
+ &set_debuginfod_prefix_list, 0, &setlist);
+
+ add_show_prefix_cmd ("debuginfod", class_run,
+ _("Show debuginfod options"),
+ &show_debuginfod_prefix_list, 0, &showlist);
+
+ /* set debuginfod on */
+ add_cmd ("on", class_run, set_debuginfod_on_command,
+ _("Enable debuginfod."), &set_debuginfod_prefix_list);
+
+ /* set debuginfod off */
+ add_cmd ("off", class_run, set_debuginfod_off_command,
+ _("Disable debuginfod."), &set_debuginfod_prefix_list);
+
+ /* set debuginfod ask */
+ add_cmd ("ask", class_run, set_debuginfod_ask_command, _("\
+Ask the user whether to enable debuginfod before performing the next query."),
+ &set_debuginfod_prefix_list);
+
+ /* show debuginfod status */
+ add_cmd ("status", class_run, show_debuginfod_status_command,
+ _("Show whether debuginfod is set to \"on\", \"off\" or \"ask\"."),
+ &show_debuginfod_prefix_list);
+
+ /* set/show debuginfod urls */
+ add_setshow_string_noescape_cmd ("urls", class_run, &debuginfod_urls, _("\
+Set the list of debuginfod server URLs."), _("\
+Show the list of debuginfod server URLs."), _("\
+Manage the space-separated list of debuginfod server URLs that GDB will query \
+when missing debuginfo, executables or source files.\nThe default value is \
+copied from the DEBUGINFOD_URLS environment variable."),
+ set_debuginfod_urls_command,
+ show_debuginfod_urls_command,
+ &set_debuginfod_prefix_list,
+ &show_debuginfod_prefix_list);
+ if (getenv ("DEBUGINFOD_URLS") != nullptr)
+ debuginfod_urls = xstrdup (getenv ("DEBUGINFOD_URLS"));
+
+
+ /* set/show debuginfod verbose */
+ add_setshow_zuinteger_cmd ("verbose", class_support,
+ &debuginfod_verbose, _("\
+Set verbosity of debuginfod output."), _("\
+Show debuginfod debugging."), _("\
+When set to a non-zero value, display verbose output for each debuginfod \
+query.\nTo disable, set to zero. Verbose output is displayed by default."),
+ set_debuginfod_verbose_command,
+ show_debuginfod_verbose_command,
+ &set_debuginfod_prefix_list,
+ &show_debuginfod_prefix_list);
+}
diff --git a/gdb/testsuite/gdb.debuginfod/fetch_src_and_symbols.exp b/gdb/testsuite/gdb.debuginfod/fetch_src_and_symbols.exp
--- a/gdb/testsuite/gdb.debuginfod/fetch_src_and_symbols.exp
+++ b/gdb/testsuite/gdb.debuginfod/fetch_src_and_symbols.exp
@@ -217,7 +217,8 @@ proc local_url { } {
setenv DEBUGINFOD_URLS http://127.0.0.1:$port
# gdb should now find the symbol and source files
- clean_restart $binfile
+ clean_restart
+ gdb_test "file $binfile" "" "file [file tail $binfile]" "Enable debuginfod?.*" "y"
gdb_test_no_output "set substitute-path $outputdir /dev/null" \
"set substitute-path"
gdb_test "br main" "Breakpoint 1 at.*file.*"
@@ -226,8 +227,26 @@ proc local_url { } {
# gdb should now find the debugaltlink file
clean_restart
gdb_test "file ${binfile}_alt.o" \
- ".*Reading symbols from ${binfile}_alt.o\.\.\.*" \
- "file [file tail ${binfile}_alt.o]"
+ ".*Downloading.*separate debug info.*" \
+ "file [file tail ${binfile}_alt.o]" \
+ ".*Enable debuginfod?.*" "y"
+
+ # Configure debuginfod with commands
+ unsetenv DEBUGINFOD_URLS
+ clean_restart
+ gdb_test "file $binfile" ".*No debugging symbols.*" \
+ "file [file tail $binfile] cmd"
+ gdb_test_no_output "set debuginfod off"
+ gdb_test_no_output "set debuginfod urls http://127.0.0.1:$port"
+
+ # gdb shouldn't find the debuginfo since debuginfod has been disabled
+ gdb_test "file $binfile" ".*No debugging symbols.*" \
+ "file [file tail $binfile] cmd off"
+
+ # Enable debuginfod and fetch the debuginfo
+ gdb_test_no_output "set debuginfod on"
+ gdb_test "file $binfile" ".*Reading symbols from.*debuginfo.*" \
+ "file [file tail $binfile] cmd on"
}
set envlist \

View File

@ -1,94 +0,0 @@
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
From: Kevin Buettner <kevinb@redhat.com>
Date: Fri, 25 Mar 2022 17:52:35 -0700
Subject: gdb-rhbz2068280-debuginfod-unavailable-size.patch
;; Backport upstream patch from Aaron Merey which suppresses debuginfod
;; progress messages when size is zero. (RH BZ 2068280).
Remove download size from debuginfod progress messages if unavailable
Currently debuginfod progress update messages include the size of
each download:
Downloading 7.5 MB separate debug info for /lib/libxyz.so.0
This value originates from the Content-Length HTTP header of the
transfer. However this header is not guaranteed to be present for
each download. This can happen when debuginfod servers compress files
on-the-fly at the time of transfer. In this case gdb wrongly prints
"-0.00 MB" as the size.
This patch removes download sizes from progress messages when they are
not available. It also removes usage of the progress bar until
a more thorough reworking of progress updating is implemented. [1]
[1] https://sourceware.org/pipermail/gdb-patches/2022-February/185798.html
diff --git a/gdb/debuginfod-support.c b/gdb/debuginfod-support.c
--- a/gdb/debuginfod-support.c
+++ b/gdb/debuginfod-support.c
@@ -81,12 +81,12 @@ debuginfod_debuginfo_query (const unsigned char *build_id,
struct user_data
{
user_data (const char *desc, const char *fname)
- : desc (desc), fname (fname)
+ : desc (desc), fname (fname), has_printed (false)
{ }
const char * const desc;
const char * const fname;
- gdb::optional<ui_out::progress_meter> meter;
+ bool has_printed;
};
/* Deleter for a debuginfod_client. */
@@ -116,24 +116,32 @@ progressfn (debuginfod_client *c, long cur, long total)
return 1;
}
- if (total == 0)
- return 0;
-
- if (!data->meter.has_value ())
+ if (!data->has_printed)
{
- float size_in_mb = 1.0f * total / (1024 * 1024);
- string_file styled_filename (current_uiout->can_emit_style_escape ());
- fprintf_styled (&styled_filename,
- file_name_style.style (),
- "%s",
- data->fname);
- std::string message
- = string_printf ("Downloading %.2f MB %s %s", size_in_mb, data->desc,
- styled_filename.c_str());
- data->meter.emplace (current_uiout, message, 1);
- }
+ /* Include the transfer size, if available. */
+ if (total > 0)
+ {
+ float size = 1.0f * total / 1024;
+ const char *unit = "KB";
+
+ /* If size is greater than 0.01 MB, set unit to MB. */
+ if (size > 10.24)
+ {
+ size /= 1024;
+ unit = "MB";
+ }
+
+ printf_filtered ("Downloading %.2f %s %s %ps...\n",
+ size, unit, data->desc,
+ styled_string (file_name_style.style (),
+ data->fname));
+ }
+ else
+ printf_filtered ("Downloading %s %ps...\n", data->desc,
+ styled_string (file_name_style.style (), data->fname));
- current_uiout->progress ((double)cur / (double)total);
+ data->has_printed = true;
+ }
return 0;
}

View File

@ -1,592 +0,0 @@
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alexandra=20H=C3=A1jkov=C3=A1?= <ahajkova@redhat.com>
Date: Wed, 29 Sep 2021 11:14:51 +0200
Subject: gdb-test-for-rhbz1976887.patch
;; Backport test for RHBZ 1976887 (Kevin Buettner).
Test case reproducing PR28030 bug
The original reproducer for PR28030 required use of a specific
compiler version - gcc-c++-11.1.1-3.fc34 is mentioned in the PR,
though it seems probable that other gcc versions might also be able to
reproduce the bug as well. This commit introduces a test case which,
using the DWARF assembler, provides a reproducer which is independent
of the compiler version. (Well, it'll work with whatever compilers
the DWARF assembler works with.)
To the best of my knowledge, it's also the first test case which uses
the DWARF assembler to provide debug info for a shared object. That
being the case, I provided more than the usual commentary which should
allow this case to be used as a template when a combo shared
library / DWARF assembler test case is required in the future.
I provide some details regarding the bug in a comment near the
beginning of locexpr-dml.exp.
This problem was difficult to reproduce; I found myself constantly
referring to the backtrace while trying to figure out what (else) I
might be missing while trying to create a reproducer. Below is a
partial backtrace which I include for posterity.
#0 internal_error (
file=0xc50110 "/ironwood1/sourceware-git/f34-pr28030/bld/../../worktree-pr28030/gdb/gdbtypes.c", line=5575,
fmt=0xc520c0 "Unexpected type field location kind: %d")
at /ironwood1/sourceware-git/f34-pr28030/bld/../../worktree-pr28030/gdbsupport/errors.cc:51
#1 0x00000000006ef0c5 in copy_type_recursive (objfile=0x1635930,
type=0x274c260, copied_types=0x30bb290)
at /ironwood1/sourceware-git/f34-pr28030/bld/../../worktree-pr28030/gdb/gdbtypes.c:5575
#2 0x00000000006ef382 in copy_type_recursive (objfile=0x1635930,
type=0x274ca10, copied_types=0x30bb290)
at /ironwood1/sourceware-git/f34-pr28030/bld/../../worktree-pr28030/gdb/gdbtypes.c:5602
#3 0x0000000000a7409a in preserve_one_value (value=0x24269f0,
objfile=0x1635930, copied_types=0x30bb290)
at /ironwood1/sourceware-git/f34-pr28030/bld/../../worktree-pr28030/gdb/value.c:2529
#4 0x000000000072012a in gdbscm_preserve_values (
extlang=0xc55720 <extension_language_guile>, objfile=0x1635930,
copied_types=0x30bb290)
at /ironwood1/sourceware-git/f34-pr28030/bld/../../worktree-pr28030/gdb/guile/scm-value.c:94
#5 0x00000000006a3f82 in preserve_ext_lang_values (objfile=0x1635930,
copied_types=0x30bb290)
at /ironwood1/sourceware-git/f34-pr28030/bld/../../worktree-pr28030/gdb/extension.c:568
#6 0x0000000000a7428d in preserve_values (objfile=0x1635930)
at /ironwood1/sourceware-git/f34-pr28030/bld/../../worktree-pr28030/gdb/value.c:2579
#7 0x000000000082d514 in objfile::~objfile (this=0x1635930,
__in_chrg=<optimized out>)
at /ironwood1/sourceware-git/f34-pr28030/bld/../../worktree-pr28030/gdb/objfiles.c:549
#8 0x0000000000831cc8 in std::_Sp_counted_ptr<objfile*, (__gnu_cxx::_Lock_policy)2>::_M_dispose (this=0x1654580)
at /usr/include/c++/11/bits/shared_ptr_base.h:348
#9 0x00000000004e6617 in std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release (this=0x1654580) at /usr/include/c++/11/bits/shared_ptr_base.h:168
#10 0x00000000004e1d2f in std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count (this=0x190bb88, __in_chrg=<optimized out>)
at /usr/include/c++/11/bits/shared_ptr_base.h:705
#11 0x000000000082feee in std::__shared_ptr<objfile, (__gnu_cxx::_Lock_policy)2>::~__shared_ptr (this=0x190bb80, __in_chrg=<optimized out>)
at /usr/include/c++/11/bits/shared_ptr_base.h:1154
#12 0x000000000082ff0a in std::shared_ptr<objfile>::~shared_ptr (
this=0x190bb80, __in_chrg=<optimized out>)
at /usr/include/c++/11/bits/shared_ptr.h:122
#13 0x000000000085ed7e in __gnu_cxx::new_allocator<std::_List_node<std::shared_ptr<objfile> > >::destroy<std::shared_ptr<objfile> > (this=0x114bc00,
__p=0x190bb80) at /usr/include/c++/11/ext/new_allocator.h:168
#14 0x000000000085e88d in std::allocator_traits<std::allocator<std::_List_node<std::shared_ptr<objfile> > > >::destroy<std::shared_ptr<objfile> > (__a=...,
__p=0x190bb80) at /usr/include/c++/11/bits/alloc_traits.h:531
#15 0x000000000085e50c in std::__cxx11::list<std::shared_ptr<objfile>, std::allocator<std::shared_ptr<objfile> > >::_M_erase (this=0x114bc00, __position=
std::shared_ptr<objfile> (expired, weak count 1) = {get() = 0x1635930})
at /usr/include/c++/11/bits/stl_list.h:1925
#16 0x000000000085df0e in std::__cxx11::list<std::shared_ptr<objfile>, std::allocator<std::shared_ptr<objfile> > >::erase (this=0x114bc00, __position=
std::shared_ptr<objfile> (expired, weak count 1) = {get() = 0x1635930})
at /usr/include/c++/11/bits/list.tcc:158
#17 0x000000000085c748 in program_space::remove_objfile (this=0x114bbc0,
objfile=0x1635930)
at /ironwood1/sourceware-git/f34-pr28030/bld/../../worktree-pr28030/gdb/progspace.c:210
#18 0x000000000082d3ae in objfile::unlink (this=0x1635930)
at /ironwood1/sourceware-git/f34-pr28030/bld/../../worktree-pr28030/gdb/objfiles.c:487
#19 0x000000000082e68c in objfile_purge_solibs ()
at /ironwood1/sourceware-git/f34-pr28030/bld/../../worktree-pr28030/gdb/objfiles.c:875
#20 0x000000000092dd37 in no_shared_libraries (ignored=0x0, from_tty=1)
at /ironwood1/sourceware-git/f34-pr28030/bld/../../worktree-pr28030/gdb/solib.c:1236
#21 0x00000000009a37fe in target_pre_inferior (from_tty=1)
at /ironwood1/sourceware-git/f34-pr28030/bld/../../worktree-pr28030/gdb/target.c:2496
#22 0x00000000007454d6 in run_command_1 (args=0x0, from_tty=1,
run_how=RUN_NORMAL)
at /ironwood1/sourceware-git/f34-pr28030/bld/../../worktree-pr28030/gdb/infcmd.c:437
I'll note a few points regarding this backtrace:
Frame #1 is where the internal error occurs. It's caused by an
unhandled case for FIELD_LOC_KIND_DWARF_BLOCK. The fix for this bug
adds support for this case.
Frame #22 - it's a partial backtrace - shows that GDB is attempting to
(re)run the program. You can see the exact command sequence that was
used for reproducing this problem in the PR (at
https://sourceware.org/bugzilla/show_bug.cgi?id=28030), but in a
nutshell, after starting the program and advancing to the appropriate
source line, GDB was asked to step into libstdc++; a "finish" command
was issued, returning a value. The fact that a value was returned is
very important. GDB was then used to step back into libstdc++. A
breakpoint was set on a source line in the library after which a "run"
command was issued.
Frame #19 shows a call to objfile_purge_solibs. It's aptly named.
Frame #7 is a call to the destructor for one of the objfile solibs; it
turned out to be the one for libstdc++.
Frames #6 thru #3 show various value preservation frames. If you look
at preserve_values() in gdb/value.c, the value history is preserved
first, followed by internal variables, followed by values for the
extension languages (python and guile).
diff --git a/gdb/testsuite/gdb.dwarf2/locexpr-data-member-location-lib.c b/gdb/testsuite/gdb.dwarf2/locexpr-data-member-location-lib.c
new file mode 100644
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/locexpr-data-member-location-lib.c
@@ -0,0 +1,48 @@
+/* Copyright (C) 2021 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "locexpr-data-member-location.h"
+
+struct A g_A = {3, 4};
+struct B g_B = { {8, 9}, 10, 11 };
+
+B *
+foo ()
+{ /* foo prologue */
+ asm ("foo_label: .globl foo_label");
+ return &g_B; /* foo return */
+} /* foo end */
+
+B *
+bar (B *v)
+{ /* bar prologue */
+ asm ("bar_label: .globl bar_label");
+ return v; /* bar return */
+} /* bar end */
+
+/* Some of the DWARF assembler procs (e.g. function_range) compile
+ this file, expecting it to be a complete program with a main()
+ function. When IS_SHAREDLIB is NOT defined, we have main() as
+ defined below. */
+
+#ifndef IS_SHAREDLIB
+int
+main ()
+{
+ B *b = foo ();
+}
+#endif
diff --git a/gdb/testsuite/gdb.dwarf2/locexpr-data-member-location-main.c b/gdb/testsuite/gdb.dwarf2/locexpr-data-member-location-main.c
new file mode 100644
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/locexpr-data-member-location-main.c
@@ -0,0 +1,27 @@
+/* Copyright (C) 2021 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "locexpr-data-member-location.h"
+
+int
+main (void)
+{
+ B *v1;
+ v1 = bar (foo ());
+
+ return 0;
+}
diff --git a/gdb/testsuite/gdb.dwarf2/locexpr-data-member-location.exp b/gdb/testsuite/gdb.dwarf2/locexpr-data-member-location.exp
new file mode 100644
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/locexpr-data-member-location.exp
@@ -0,0 +1,349 @@
+# Copyright 2021 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/>.
+
+# This test case uses the DWARF assembler to reproduce the problem
+# described by PR28030. The bug turned out to be that
+# FIELD_LOC_KIND_DWARF_BLOCK was not handled when recursively copying
+# a value's type when preserving the value history during the freeing
+# up of objfiles associated with a shared object. (Yes, figuring out
+# how to make this happen in a concise test case turned out to be
+# challenging.)
+#
+# The following elements proved to be necessary for reproducing the
+# problem:
+#
+# 1) A location expression needed to be used with
+# DW_AT_data_member_location rather than a simple offset.
+# Moreover, this location expression needed to use opcodes
+# which GDB's DWARF reader could not convert to a simple
+# offset. (Note, however, that GDB could probably be improved
+# to handle the opcodes chosen for this test; if decode_locdesc()
+# in dwarf2/read.c is ever updated to handle both DW_OP_pick and
+# DW_OP_drop, then this test could end up passing even if
+# the bug it's intended to test has not been fixed.)
+#
+# 2) The debug info containing the above DWARF info needed
+# to be associated with a shared object since the problem
+# occurred while GDB was preserving values during the
+# purging of shared objects.
+#
+# 3) After performing some simple gdb commands, the program is
+# run again. In the course of running the objfile destructor
+# associated with the shared object, values are preserved
+# along with their types. As noted earlier, it was during
+# the recursive type copy that the bug was observed.
+#
+# Therefore, due to #2 above, this test case creates debug info
+# which is then used by a shared object.
+
+# This test can't be run on targets lacking shared library support.
+if [skip_shlib_tests] {
+ return 0
+}
+
+load_lib dwarf.exp
+
+# This test can only be run on targets which support DWARF-2 and use gas.
+if ![dwarf2_support] {
+ return 0
+}
+
+# gdb_test_file_name is the name of this file without the .exp
+# extension. Use it to form basenames for the main program
+# and shared object.
+set main_basename ${::gdb_test_file_name}-main
+set lib_basename ${::gdb_test_file_name}-lib
+
+# We're generating DWARF assembly for the shared object; therefore,
+# the source file for the library / shared object must be listed first
+# (in the standard_testfile invocation) since ${srcfile} is used by
+# get_func_info (for determining the start, end, and length of a
+# function).
+#
+# The output of Dwarf::assemble will be placed in $lib_basename.S
+# which will be ${srcfile3} after the execution of standard_testfile.
+
+standard_testfile $lib_basename.c $main_basename.c $lib_basename.S
+
+set libsrc "${::srcdir}/${::subdir}/${::srcfile}"
+set lib_so [standard_output_file ${lib_basename}.so]
+set asm_file [standard_output_file ${::srcfile3}]
+
+# We need to know the size of some types in order to write some of the
+# debugging info that we're about to generate. For that, we ask GDB
+# by debugging the shared object associated with this test case.
+
+# Compile the shared library: -DIS_SHAREDLIB prevents main() from
+# being defined. Note that debugging symbols will be present for
+# this compilation.
+if {[gdb_compile_shlib $libsrc $lib_so \
+ {additional_flags=-DIS_SHAREDLIB debug}] != ""} {
+ untested "failed to compile shared library"
+ return
+}
+
+# Start a fresh GDB and load the shared library.
+clean_restart $lib_so
+
+# Using our running GDB session, determine sizes of several types.
+set long_size [get_sizeof "long" -1]
+set addr_size [get_sizeof "void *" -1]
+set struct_A_size [get_sizeof "g_A" -1]
+set struct_B_size [get_sizeof "g_B" -1]
+
+if { $long_size == -1 || $addr_size == -1 \
+ || $struct_A_size == -1 || $struct_B_size == -1} {
+ perror "Can't determine type sizes"
+ return
+}
+
+# Retrieve struct offset of MBR in struct TP
+proc get_offsetof { tp mbr } {
+ return [get_integer_valueof "&((${tp} *) 0)->${mbr}" -1]
+}
+
+# Use running GDB session to get struct offsets
+set A_a [get_offsetof A a]
+set A_x [get_offsetof A x]
+set B_a [get_offsetof B a]
+set B_b [get_offsetof B b]
+set B_x2 [get_offsetof B x2]
+
+# Create the DWARF.
+Dwarf::assemble ${asm_file} {
+ declare_labels L
+
+ # Find start, end, and length of functions foo and bar.
+ # These calls to get_func_info will create and set variables
+ # foo_start, bar_start, foo_end, bar_end, foo_len, and
+ # bar_len.
+ #
+ # In order to get the right answers, get_func_info (and,
+ # underneath, function_range) should use the same compiler flags
+ # as those used to make a shared object. For any targets that get
+ # this far, -fpic is probably correct.
+ #
+ # Also, it should be noted that IS_SHAREDLIB is NOT defined as one
+ # of the additional flags. Not defining IS_SHAREDLIB will cause a
+ # main() to be defined for the compilation of the shared library
+ # source file which happens as a result of using get_func_info;
+ # this is currently required in order to this facility.
+ set flags {additional_flags=-fpic debug}
+ get_func_info foo $flags
+ get_func_info bar $flags
+
+ cu {} {
+ DW_TAG_compile_unit {
+ {DW_AT_language @DW_LANG_C_plus_plus}
+ {name ${::srcfile}}
+ {stmt_list $L DW_FORM_sec_offset}
+ } {
+ declare_labels int_label class_A_label class_B_label \
+ B_ptr_label
+
+ int_label: DW_TAG_base_type {
+ {DW_AT_byte_size ${::long_size} DW_FORM_udata}
+ {DW_AT_encoding @DW_ATE_signed}
+ {DW_AT_name "int"}
+ }
+
+ class_A_label: DW_TAG_class_type {
+ {DW_AT_name "A"}
+ {DW_AT_byte_size ${::struct_A_size} DW_FORM_sdata}
+ } {
+ DW_TAG_member {
+ {DW_AT_name "a"}
+ {DW_AT_type :$int_label}
+ {DW_AT_data_member_location ${::A_a} DW_FORM_udata}
+ }
+ DW_TAG_member {
+ {DW_AT_name "x"}
+ {DW_AT_type :$int_label}
+ {DW_AT_data_member_location ${::A_x} DW_FORM_udata}
+ }
+ }
+
+ class_B_label: DW_TAG_class_type {
+ {DW_AT_name "B"}
+ {DW_AT_byte_size ${::struct_B_size} DW_FORM_sdata}
+ } {
+ # While there are easier / better ways to specify an
+ # offset used by DW_AT_data_member_location than that
+ # used below, we need a location expression here in
+ # order to reproduce the bug. Moreover, this location
+ # expression needs to use opcodes that aren't handled
+ # by decode_locdesc() in dwarf2/read.c; if we use
+ # opcodes that _are_ handled by that function, the
+ # location expression will be converted into a simple
+ # offset - which will then (again) not reproduce the
+ # bug. At the time that this test was written,
+ # neither DW_OP_pick nor DW_OP_drop were being handled
+ # by decode_locdesc(); this is why those opcodes were
+ # chosen.
+ DW_TAG_inheritance {
+ {DW_AT_type :$class_A_label}
+ {DW_AT_data_member_location {
+ DW_OP_constu ${::B_a}
+ DW_OP_plus
+ DW_OP_pick 0
+ DW_OP_drop} SPECIAL_expr}
+ {DW_AT_accessibility 1 DW_FORM_data1}
+ }
+ DW_TAG_member {
+ {DW_AT_name "b"}
+ {DW_AT_type :$int_label}
+ {DW_AT_data_member_location ${::B_b} DW_FORM_udata}
+ }
+ DW_TAG_member {
+ {DW_AT_name "x2"}
+ {DW_AT_type :$int_label}
+ {DW_AT_data_member_location ${::B_x2} DW_FORM_udata}
+ }
+ }
+
+ B_ptr_label: DW_TAG_pointer_type {
+ {DW_AT_type :$class_B_label}
+ {DW_AT_byte_size ${::addr_size} DW_FORM_sdata}
+ }
+
+ DW_TAG_variable {
+ {DW_AT_name "g_A"}
+ {DW_AT_type :$class_A_label}
+ {DW_AT_external 1 flag}
+ {DW_AT_location {DW_OP_addr [gdb_target_symbol "g_A"]} \
+ SPECIAL_expr}
+ }
+
+ DW_TAG_variable {
+ {DW_AT_name "g_B"}
+ {DW_AT_type :$class_B_label}
+ {DW_AT_external 1 flag}
+ {DW_AT_location {DW_OP_addr [gdb_target_symbol "g_B"]} \
+ SPECIAL_expr}
+ }
+
+ # We can't use MACRO_AT for the definitions of foo and bar
+ # because it doesn't provide a way to pass the appropriate
+ # flags. Therefore, we list the name, low_pc, and high_pc
+ # explicitly.
+ DW_TAG_subprogram {
+ {DW_AT_name foo}
+ {DW_AT_low_pc $foo_start DW_FORM_addr}
+ {DW_AT_high_pc $foo_end DW_FORM_addr}
+ {DW_AT_type :${B_ptr_label}}
+ {DW_AT_external 1 flag}
+ }
+
+ DW_TAG_subprogram {
+ {DW_AT_name bar}
+ {DW_AT_low_pc $bar_start DW_FORM_addr}
+ {DW_AT_high_pc $bar_end DW_FORM_addr}
+ {DW_AT_type :${B_ptr_label}}
+ {DW_AT_external 1 flag}
+ } {
+ DW_TAG_formal_parameter {
+ {DW_AT_name v}
+ {DW_AT_type :${B_ptr_label}}
+ }
+ }
+ }
+ }
+
+ lines {version 2} L {
+ include_dir "${::srcdir}/${::subdir}"
+ file_name "${::srcfile}" 1
+
+ # Generate a line table program.
+ program {
+ {DW_LNE_set_address $foo_start}
+ {line [gdb_get_line_number "foo prologue"]}
+ {DW_LNS_copy}
+ {DW_LNE_set_address foo_label}
+ {line [gdb_get_line_number "foo return"]}
+ {DW_LNS_copy}
+ {line [gdb_get_line_number "foo end"]}
+ {DW_LNS_copy}
+ {DW_LNE_set_address $foo_end}
+ {DW_LNS_advance_line 1}
+ {DW_LNS_copy}
+ {DW_LNE_end_sequence}
+
+ {DW_LNE_set_address $bar_start}
+ {line [gdb_get_line_number "bar prologue"]}
+ {DW_LNS_copy}
+ {DW_LNE_set_address bar_label}
+ {line [gdb_get_line_number "bar return"]}
+ {DW_LNS_copy}
+ {line [gdb_get_line_number "bar end"]}
+ {DW_LNS_copy}
+ {DW_LNE_set_address $bar_end}
+ {DW_LNS_advance_line 1}
+ {DW_LNS_copy}
+ {DW_LNE_end_sequence}
+ }
+ }
+}
+
+# Compile the shared object again, but this time include / use the
+# DWARF info that we've created above. Note that (again)
+# -DIS_SHAREDLIB is used to prevent inclusion of main() in the shared
+# object. Also note the use of the "nodebug" option. Any debugging
+# information that we need will be provided by the DWARF info created
+# above.
+if {[gdb_compile_shlib [list $libsrc $asm_file] $lib_so \
+ {additional_flags=-DIS_SHAREDLIB nodebug}] != ""} {
+ untested "failed to compile shared library"
+ return
+}
+
+# Compile the main program for use with the shared object.
+if [prepare_for_testing "failed to prepare" ${testfile} \
+ ${::srcfile2} [list debug shlib=$lib_so]] {
+ return -1
+}
+
+# Do whatever is necessary to make sure that the shared library is
+# loaded for remote targets.
+gdb_load_shlib ${lib_so}
+
+if ![runto_main] then {
+ fail "can't run to main"
+ return
+}
+
+# Step into foo so that we can finish out of it.
+gdb_test "step" "foo .. at .* foo end.*" "step into foo"
+
+# Finishing out of foo will create a value that will later need to
+# be preserved when restarting the program.
+gdb_test "finish" "= \\(class B \\*\\) ${::hex} .*" "finish out of foo"
+
+# Dereferencing and printing the return value isn't necessary
+# for reproducing the bug, but we should make sure that the
+# return value is what we expect it to be.
+gdb_test "p *$" { = {<A> = {a = 8, x = 9}, b = 10, x2 = 11}} \
+ "dereference return value"
+
+# The original PR28030 reproducer stepped back into the shared object,
+# so we'll do the same here:
+gdb_test "step" "bar \\(.*" "step into bar"
+
+# We don't want a clean restart here since that will be too clean.
+# The original reproducer for PR28030 set a breakpoint in the shared
+# library and then restarted via "run". The command below does roughly
+# the same thing. It's at this step that an internal error would
+# occur for PR28030. The "message" argument tells runto to turn on
+# the printing of PASSes while runto is doing its job.
+runto "bar" message
diff --git a/gdb/testsuite/gdb.dwarf2/locexpr-data-member-location.h b/gdb/testsuite/gdb.dwarf2/locexpr-data-member-location.h
new file mode 100644
--- /dev/null
+++ b/gdb/testsuite/gdb.dwarf2/locexpr-data-member-location.h
@@ -0,0 +1,30 @@
+/* Copyright (C) 2021 Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 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/>. */
+
+typedef struct A {
+ long a;
+ long x;
+} A;
+
+typedef struct B {
+ A a;
+ long b;
+ long x2;
+} B;
+
+extern B *foo ();
+extern B *bar (B *v);

View File

@ -29,15 +29,15 @@
Name: %{?scl_prefix}gdb
# Freeze it when GDB gets branched
%global snapsrc 20200208
%global snapsrc 20220501
# See timestamp of source gnulib installed into gnulib/ .
%global snapgnulib 20210105
%global tarname gdb-%{version}
Version: 11.2
Version: 12.1
# The release always contains a leading reserved number, start it at 1.
# `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
Release: 2%{?dist}
Release: 1%{?dist}
License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and LGPLv3+ and BSD and Public Domain and GFDL
# Do not provide URL for snapshots as the file lasts there only for 2 days.
@ -326,7 +326,7 @@ BuildRequires: opencl-headers ocl-icd-devel%{bits_local} ocl-icd-devel%{bits_oth
%endif
%if 0%{!?rhel:1}
# Fedora arm+ppc64le do not yet have fpc built.
%ifnarch %{arm} ppc64le
%ifnarch s390x
BuildRequires: fpc
%endif
%endif
@ -928,7 +928,7 @@ touch -r %{SOURCE4} $RPM_BUILD_ROOT%{_sysconfdir}/gdbinit
for i in `find $RPM_BUILD_ROOT%{_datadir}/gdb/python/gdb -name "*.py"`
do
# Files could be also patched getting the current time.
touch -r $RPM_BUILD_DIR/%{gdb_src}/gdb/ChangeLog $i
touch -r $RPM_BUILD_DIR/%{gdb_src}/gdb/version.in $i
done
%if 0%{?_enable_debug_packages:1} && 0%{!?_without_python:1}
@ -974,7 +974,7 @@ cp -a $RPM_BUILD_DIR/%{gdb_src}/%{libstdcxxpython}/libstdcxx \
%endif # 0%{?rhel:1} && 0%{?rhel} <= 7
for i in `find $RPM_BUILD_ROOT%{_datadir}/gdb -name "*.py"`; do
# Files are installed by install(1) not preserving the timestamps.
touch -r $RPM_BUILD_DIR/%{gdb_src}/gdb/ChangeLog $i
touch -r $RPM_BUILD_DIR/%{gdb_src}/gdb/version.in $i
done
%endif # 0%{!?_without_python:1}
@ -1020,6 +1020,7 @@ ln -s gstack $RPM_BUILD_ROOT%{_bindir}/pstack
# Documentation only for development.
rm -f $RPM_BUILD_ROOT%{_infodir}/gdbint*
rm -f $RPM_BUILD_ROOT%{_infodir}/stabs*
rm -f $RPM_BUILD_ROOT%{_infodir}/ctf-spec*
# Delete this too because the dir file will be updated at rpm install time.
# We don't want a gdb specific one overwriting the system wide one.
@ -1143,6 +1144,12 @@ fi
%endif
%changelog
* Wed May 4 2022 Kevin Buettner - 12.1-1
- Rebase to FSF GDB 12.1.
- Update gdb-6.6-buildid-locate.patch.
- Update gdb-6.6-buildid-locate-rpm.patch.
- Dropped backported patches from GDB 11.1 and 11.2.
* Fri Mar 25 2022 Kevin Buettner - 11.2-2
- Backport upstream patch which removes sizes from debuginfod download
messages when the size is not available (RHBZ 2068280, Aaron Merey).

View File

@ -1,3 +1,3 @@
SHA512 (gdb-libstdc++-v3-python-8.1.1-20180626.tar.xz) = a8b1c54dd348cfeb37da73f968742896be3dd13a4215f8d8519870c2abea915f5176c3fa6989ddd10f20020a16f0fab20cbae68ee8d58a82234d8778023520f8
SHA512 (v2.0.4.tar.gz) = 596d2dac25fdbd3e5660d7e1feeb7e8d5d359d1d0e19b62ef593449037df236db1d4d98820f0031061b5573ed67797a85a77fb9991e215abaabc4bfe16ceaec8
SHA512 (gdb-11.2.tar.xz) = 07e9026423438049b11f4f784d57401ece4e940570f613bd6958b3714fe7fbc2c048470bcce3e7d7d9f93331cdf3881d30dcc964cb113a071143a02b28e5b127
SHA512 (gdb-12.1.tar.xz) = 425568d2e84672177d0fb87b1ad7daafdde097648d605e30cf0656970f66adc6a82ca2d83375ea4be583e9683a340e5bfdf5819668ddf66728200141ae50ff2d