From ed8730b4d9720b8c71cb7de29ce2165f730955cc Mon Sep 17 00:00:00 2001 From: Kevin Buettner Date: Thu, 5 Nov 2020 14:17:24 -0700 Subject: [PATCH] Rebase to FSF GDB 10.1. Bump 'snapgnulib' date. Drop gdb-rhbz1818011-bfd-gcc10-error.patch. Drop gdb-rhbz1822715-fix-python-deprecation.patch. Drop gdb-rhbz1829702-fix-python39.patch. Drop gdb-rhbz1838777-debuginfod.patch. Drop gdb-rhbz1844458-use-fputX_unfiltered.patch. Drop gdb-rhbz1869484-deleted-working-directory. Adjust build-id related patches. Ajust VLA patches. --- .gitignore | 2 +- _gdb.spec.Patch.include | 33 - _gdb.spec.patch.include | 9 - _git_upstream_commit | 2 +- _patch_order | 6 - gdb-6.3-gstack-20050411.patch | 6 +- gdb-6.3-rh-testversion-20041202.patch | 2 +- gdb-6.3-test-self-20050110.patch | 2 +- ...337-resolve-tls-without-debuginfo-v2.patch | 2 +- ...379-solib-trampoline-lookup-lock-fix.patch | 6 +- gdb-6.6-buildid-locate-core-as-arg.patch | 42 +- ...buildid-locate-rpm-librpm-workaround.patch | 2 +- gdb-6.6-buildid-locate-rpm-scl.patch | 18 +- gdb-6.6-buildid-locate-rpm.patch | 69 +- ...6.6-buildid-locate-solib-missing-ids.patch | 4 +- gdb-6.6-buildid-locate.patch | 156 ++- gdb-6.7-testsuite-stable-results.patch | 2 +- gdb-6.8-quit-never-aborts.patch | 20 +- gdb-archer-pie-addons-keep-disabled.patch | 29 +- gdb-archer-pie-addons.patch | 32 +- gdb-archer-vla-tests.patch | 14 +- gdb-attach-fail-reasons-5of5.patch | 262 ++-- gdb-bz1219747-attach-kills.patch | 2 +- gdb-bz533176-fortran-omp-step.patch | 4 +- gdb-container-rh-pkg.patch | 4 +- gdb-fedora-libncursesw.patch | 12 +- gdb-gnat-dwarf-crash-3of3.patch | 43 +- gdb-jit-reader-multilib.patch | 4 +- gdb-linux_perf-bundle.patch | 36 +- gdb-ltofix.patch | 12 - gdb-moribund-utrace-workaround.patch | 8 +- gdb-rhbz1818011-bfd-gcc10-error.patch | 49 - gdb-rhbz1822715-fix-python-deprecation.patch | 70 - gdb-rhbz1829702-fix-python39.patch | 224 ---- gdb-rhbz1838777-debuginfod.patch | 1188 ----------------- gdb-rhbz1844458-use-fputX_unfiltered.patch | 120 -- gdb-rhbz1869484-deleted-working-directory | 240 ---- gdb-runtest-pie-override.patch | 4 +- gdb-vla-intel-fix-print-char-array.patch | 14 +- gdb-vla-intel-fortran-strides.patch | 235 ++-- gdb-vla-intel-fortran-vla-strings.patch | 253 ++-- gdb-vla-intel-stringbt-fix.patch | 10 +- gdb-vla-intel-tests.patch | 11 +- gdb.spec | 23 +- sources | 2 +- 45 files changed, 634 insertions(+), 2654 deletions(-) delete mode 100644 gdb-ltofix.patch delete mode 100644 gdb-rhbz1818011-bfd-gcc10-error.patch delete mode 100644 gdb-rhbz1822715-fix-python-deprecation.patch delete mode 100644 gdb-rhbz1829702-fix-python39.patch delete mode 100644 gdb-rhbz1838777-debuginfod.patch delete mode 100644 gdb-rhbz1844458-use-fputX_unfiltered.patch delete mode 100644 gdb-rhbz1869484-deleted-working-directory diff --git a/.gitignore b/.gitignore index b83cfdf..bf9d24a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ /binutils-gdb /gdb-libstdc++-v3-python-8.1.1-20180626.tar.xz -/gdb-9.2.tar.xz /v2.0.2.tar.gz +/gdb-10.1.tar.xz diff --git a/_gdb.spec.Patch.include b/_gdb.spec.Patch.include index 24289d3..7060bcd 100644 --- a/_gdb.spec.Patch.include +++ b/_gdb.spec.Patch.include @@ -37,10 +37,6 @@ Patch009: gdb-6.3-test-movedir-20050125.patch #=fedoratest Patch010: gdb-6.3-threaded-watchpoints2-20050225.patch -# Notify observers that the inferior has been created -#=fedoratest -Patch011: gdb-6.3-inferior-notification-20050721.patch - # Verify printing of inherited members test #=fedoratest Patch012: gdb-6.3-inheritancetest-20050726.patch @@ -102,10 +98,6 @@ Patch025: gdb-6.6-testsuite-timeouts.patch #=fedoratest Patch026: gdb-6.6-bz237572-ppc-atomic-sequence-test.patch -# Test kernel VDSO decoding while attaching to an i386 process. -#=fedoratest -Patch027: gdb-6.3-attach-see-vdso-test.patch - # Test leftover zombie process (BZ 243845). #=fedoratest Patch028: gdb-6.5-bz243845-stale-testing-zombie-test.patch @@ -143,10 +135,6 @@ Patch035: gdb-6.5-ia64-libunwind-leak-test.patch #=fedoratest Patch036: gdb-6.5-missed-trap-on-step-test.patch -# Test gcore memory and time requirements for large inferiors. -#=fedoratest -Patch037: gdb-6.5-gcore-buffer-limit-test.patch - # Test GCORE for shmid 0 shared memory mappings. #=fedoratest: But it is broken anyway, sometimes the case being tested is not reproducible. Patch038: gdb-6.3-mapping-zero-inode-test.patch @@ -394,24 +382,3 @@ Patch096: gdb-vla-intel-fix-print-char-array.patch # =fedoratest Patch097: gdb-rhbz1553104-s390x-arch12-test.patch -# Fix int conversion error from bfd/elf.c when compiling with gcc 10 -Patch098: gdb-rhbz1818011-bfd-gcc10-error.patch - -# Backport fix for deprecation of PyEval_InitThreads in Python 3.9. -Patch099: gdb-rhbz1822715-fix-python-deprecation.patch - -# Backport "Fix Python 3.9 related runtime problems" -# Kevin Buettner and Keith Seitz -Patch100: gdb-rhbz1829702-fix-python39.patch - -# Fix fput?_unfiltered functions -# RH BZ 1844458 (Sergio Durigan Junior and Tom Tromey) -Patch101: gdb-rhbz1844458-use-fputX_unfiltered.patch - -# Backport debuginofd support. -# (Aaron Merey, RH BZ 183877) -Patch102: gdb-rhbz1838777-debuginfod.patch - -# Backport patches fixing abort when working directory is deleted. -Patch103: gdb-rhbz1869484-deleted-working-directory - diff --git a/_gdb.spec.patch.include b/_gdb.spec.patch.include index 0557da6..7880e19 100644 --- a/_gdb.spec.patch.include +++ b/_gdb.spec.patch.include @@ -8,7 +8,6 @@ %patch008 -p1 %patch009 -p1 %patch010 -p1 -%patch011 -p1 %patch012 -p1 %patch013 -p1 %patch014 -p1 @@ -24,7 +23,6 @@ %patch024 -p1 %patch025 -p1 %patch026 -p1 -%patch027 -p1 %patch028 -p1 %patch029 -p1 %patch030 -p1 @@ -34,7 +32,6 @@ %patch034 -p1 %patch035 -p1 %patch036 -p1 -%patch037 -p1 %patch038 -p1 %patch039 -p1 %patch040 -p1 @@ -95,9 +92,3 @@ %patch095 -p1 %patch096 -p1 %patch097 -p1 -%patch098 -p1 -%patch099 -p1 -%patch100 -p1 -%patch101 -p1 -%patch102 -p1 -%patch103 -p1 diff --git a/_git_upstream_commit b/_git_upstream_commit index 751b241..8f2b797 100644 --- a/_git_upstream_commit +++ b/_git_upstream_commit @@ -1 +1 @@ -e7fe0803b6427d3906e991bbb3b7fd2f0fd05e00 +606e3fd147ed9a00df165e46f30fe5c46dcda345 diff --git a/_patch_order b/_patch_order index 5ea9527..a45566e 100644 --- a/_patch_order +++ b/_patch_order @@ -95,9 +95,3 @@ gdb-rhbz1398387-tab-crash-test.patch gdb-archer.patch gdb-vla-intel-fix-print-char-array.patch gdb-rhbz1553104-s390x-arch12-test.patch -gdb-rhbz1818011-bfd-gcc10-error.patch -gdb-rhbz1822715-fix-python-deprecation.patch -gdb-rhbz1829702-fix-python39.patch -gdb-rhbz1844458-use-fputX_unfiltered.patch -gdb-rhbz1838777-debuginfod.patch -gdb-rhbz1869484-deleted-working-directory diff --git a/gdb-6.3-gstack-20050411.patch b/gdb-6.3-gstack-20050411.patch index 982863a..4413611 100644 --- a/gdb-6.3-gstack-20050411.patch +++ b/gdb-6.3-gstack-20050411.patch @@ -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 -@@ -1768,7 +1768,7 @@ info install-info clean-info dvi pdf install-pdf html install-html: force +@@ -1726,7 +1726,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 \ -@@ -1817,7 +1817,25 @@ install-guile: +@@ -1775,7 +1775,25 @@ install-guile: install-python: $(SHELL) $(srcdir)/../mkinstalldirs $(DESTDIR)$(GDB_DATADIR)/python/gdb @@ -52,7 +52,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 \ -@@ -1840,6 +1858,18 @@ uninstall: force $(CONFIG_UNINSTALL) +@@ -1798,6 +1816,18 @@ uninstall: force $(CONFIG_UNINSTALL) fi @$(MAKE) DO=uninstall "DODIRS=$(SUBDIRS)" $(FLAGS_TO_PASS) subdir_do diff --git a/gdb-6.3-rh-testversion-20041202.patch b/gdb-6.3-rh-testversion-20041202.patch index 48ca4b5..c1e7395 100644 --- a/gdb-6.3-rh-testversion-20041202.patch +++ b/gdb-6.3-rh-testversion-20041202.patch @@ -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 -@@ -2096,7 +2096,7 @@ init_gdb_version_vars (void) +@@ -2163,7 +2163,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; diff --git a/gdb-6.3-test-self-20050110.patch b/gdb-6.3-test-self-20050110.patch index 5662a0e..2709093 100644 --- a/gdb-6.3-test-self-20050110.patch +++ b/gdb-6.3-test-self-20050110.patch @@ -17,7 +17,7 @@ Subject: gdb-6.3-test-self-20050110.patch diff --git a/gdb/testsuite/lib/selftest-support.exp b/gdb/testsuite/lib/selftest-support.exp --- a/gdb/testsuite/lib/selftest-support.exp +++ b/gdb/testsuite/lib/selftest-support.exp -@@ -151,18 +151,18 @@ proc do_self_tests {function body} { +@@ -152,18 +152,18 @@ proc do_self_tests {function body} { } # Remove any old copy lying around. diff --git a/gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch b/gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch index a89de0a..5cdf65f 100644 --- a/gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch +++ b/gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch @@ -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 -@@ -1214,6 +1214,10 @@ print_command_1 (const char *args, int voidprint) +@@ -1210,6 +1210,10 @@ print_command_1 (const char *args, int voidprint) if (exp != nullptr && *exp) { diff --git a/gdb-6.5-bz218379-solib-trampoline-lookup-lock-fix.patch b/gdb-6.5-bz218379-solib-trampoline-lookup-lock-fix.patch index 0a66b3d..54c1a1e 100644 --- a/gdb-6.5-bz218379-solib-trampoline-lookup-lock-fix.patch +++ b/gdb-6.5-bz218379-solib-trampoline-lookup-lock-fix.patch @@ -11,7 +11,7 @@ https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=218379 diff --git a/gdb/symtab.c b/gdb/symtab.c --- a/gdb/symtab.c +++ b/gdb/symtab.c -@@ -3166,6 +3166,13 @@ find_pc_sect_line (CORE_ADDR pc, struct obj_section *section, int notcurrent) +@@ -3169,6 +3169,13 @@ find_pc_sect_line (CORE_ADDR pc, struct obj_section *section, int notcurrent) msymbol->linkage_name ()); */ ; /* fall through */ @@ -23,5 +23,5 @@ diff --git a/gdb/symtab.c b/gdb/symtab.c + warning ("In stub for %s (0x%s); interlocked, please submit the binary to http://bugzilla.redhat.com", msymbol.minsym->linkage_name (), paddress (target_gdbarch (), pc)); + /* fall through */ else - return find_pc_line (BMSYMBOL_VALUE_ADDRESS (mfunsym), 0); - } + { + /* Detect an obvious case of infinite recursion. If this diff --git a/gdb-6.6-buildid-locate-core-as-arg.patch b/gdb-6.6-buildid-locate-core-as-arg.patch index d182ae1..45b915d 100644 --- a/gdb-6.6-buildid-locate-core-as-arg.patch +++ b/gdb-6.6-buildid-locate-core-as-arg.patch @@ -73,7 +73,7 @@ diff --git a/gdb/exec.c b/gdb/exec.c #include "frame.h" #include "inferior.h" #include "target.h" -@@ -345,12 +347,27 @@ exec_file_attach (const char *filename, int from_tty) +@@ -495,12 +497,27 @@ exec_file_attach (const char *filename, int from_tty) if (!bfd_check_format_matches (exec_bfd, bfd_object, &matching)) { @@ -88,8 +88,8 @@ diff --git a/gdb/exec.c b/gdb/exec.c /* Make sure to close exec_bfd, or else "run" might try to use it. */ exec_close (); -- error (_("\"%s\": not in executable format: %s"), -- scratch_pathname, +- error (_("\"%ps\": not in executable format: %s"), +- styled_string (file_name_style.style (), scratch_pathname), - gdb_bfd_errmsg (bfd_get_error (), matching).c_str ()); + + if (is_core != 0) @@ -98,29 +98,16 @@ diff --git a/gdb/exec.c b/gdb/exec.c + "Please specify an executable to debug."), + scratch_pathname); + else -+ error (_("\"%ss\": not in executable format: %s"), -+ scratch_pathname, ++ error (_("\"%ps\": not in executable format: %s"), ++ styled_string (file_name_style.style (), scratch_pathname), + gdb_bfd_errmsg (bfd_get_error (), matching).c_str ()); } if (build_section_table (exec_bfd, §ions, §ions_end)) -diff --git a/gdb/gdbsupport/common-exceptions.h b/gdb/gdbsupport/common-exceptions.h ---- a/gdb/gdbsupport/common-exceptions.h -+++ b/gdb/gdbsupport/common-exceptions.h -@@ -106,6 +106,9 @@ enum errors { - "_ERROR" is appended to the name. */ - MAX_COMPLETIONS_REACHED_ERROR, - -+ /* Attempt to load a core file as executable. */ -+ IS_CORE_ERROR, -+ - /* Add more errors here. */ - NR_ERRORS - }; diff --git a/gdb/main.c b/gdb/main.c --- a/gdb/main.c +++ b/gdb/main.c -@@ -467,6 +467,34 @@ struct cmdarg +@@ -524,6 +524,34 @@ struct cmdarg char *string; }; @@ -155,7 +142,7 @@ diff --git a/gdb/main.c b/gdb/main.c static void captured_main_1 (struct captured_main_args *context) { -@@ -907,6 +935,8 @@ captured_main_1 (struct captured_main_args *context) +@@ -959,6 +987,8 @@ captured_main_1 (struct captured_main_args *context) { symarg = argv[optind]; execarg = argv[optind]; @@ -164,7 +151,7 @@ diff --git a/gdb/main.c b/gdb/main.c optind++; } -@@ -1063,12 +1093,25 @@ captured_main_1 (struct captured_main_args *context) +@@ -1114,12 +1144,25 @@ captured_main_1 (struct captured_main_args *context) && symarg != NULL && strcmp (execarg, symarg) == 0) { @@ -194,3 +181,16 @@ diff --git a/gdb/main.c b/gdb/main.c ret = catch_command_errors (symbol_file_add_main_adapter, symarg, !batch_flag); } +diff --git a/gdbsupport/common-exceptions.h b/gdbsupport/common-exceptions.h +--- a/gdbsupport/common-exceptions.h ++++ b/gdbsupport/common-exceptions.h +@@ -106,6 +106,9 @@ enum errors { + "_ERROR" is appended to the name. */ + MAX_COMPLETIONS_REACHED_ERROR, + ++ /* Attempt to load a core file as executable. */ ++ IS_CORE_ERROR, ++ + /* Add more errors here. */ + NR_ERRORS + }; diff --git a/gdb-6.6-buildid-locate-rpm-librpm-workaround.patch b/gdb-6.6-buildid-locate-rpm-librpm-workaround.patch index abea6e6..c86ec6b 100644 --- a/gdb-6.6-buildid-locate-rpm-librpm-workaround.patch +++ b/gdb-6.6-buildid-locate-rpm-librpm-workaround.patch @@ -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 -@@ -709,6 +709,19 @@ build_id_to_filename (const struct bfd_build_id *build_id, char **link_return) +@@ -708,6 +708,19 @@ build_id_to_filename (const struct bfd_build_id *build_id, char **link_return) #include #endif diff --git a/gdb-6.6-buildid-locate-rpm-scl.patch b/gdb-6.6-buildid-locate-rpm-scl.patch index ca683ed..09f930f 100644 --- a/gdb-6.6-buildid-locate-rpm-scl.patch +++ b/gdb-6.6-buildid-locate-rpm-scl.patch @@ -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 -@@ -743,7 +743,11 @@ static int missing_rpm_list_entries; +@@ -742,7 +742,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; -@@ -850,7 +854,11 @@ missing_rpm_enlist (const char *filename) +@@ -849,7 +853,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; -@@ -968,6 +976,37 @@ missing_rpm_enlist (const char *filename) +@@ -967,6 +975,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); } -@@ -977,6 +1016,20 @@ missing_rpm_enlist (const char *filename) +@@ -976,6 +1015,20 @@ missing_rpm_enlist (const char *filename) return count; } @@ -95,10 +95,10 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c static bool missing_rpm_list_compar (const char *ap, const char *bp) { -diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c ---- a/gdb/dwarf2read.c -+++ b/gdb/dwarf2read.c -@@ -3497,6 +3497,16 @@ read_gdb_index_from_buffer (struct objfile *objfile, +diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c +--- a/gdb/dwarf2/read.c ++++ b/gdb/dwarf2/read.c +@@ -3025,6 +3025,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/dwarf2read.c b/gdb/dwarf2read.c static int warning_printed = 0; if (!warning_printed) { -@@ -3508,6 +3518,10 @@ to use the section anyway."), +@@ -3036,6 +3046,10 @@ to use the section anyway."), warning_printed = 1; } return 0; diff --git a/gdb-6.6-buildid-locate-rpm.patch b/gdb-6.6-buildid-locate-rpm.patch index 6e1cef8..83b83b0 100644 --- a/gdb-6.6-buildid-locate-rpm.patch +++ b/gdb-6.6-buildid-locate-rpm.patch @@ -240,10 +240,10 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c #include "gdbcmd.h" #include "gdbcore.h" +#include "inferior.h" - #include "libbfd.h" #include "objfiles.h" #include "observable.h" -@@ -698,8 +699,374 @@ build_id_to_filename (const struct bfd_build_id *build_id, char **link_return) + #include "symfile.h" +@@ -697,8 +698,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 -@@ -753,11 +1120,17 @@ missing_filepair_change (void) +@@ -752,11 +1119,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 (); } -@@ -824,14 +1197,38 @@ debug_print_missing (const char *binary, const char *debug) +@@ -823,14 +1196,38 @@ debug_print_missing (const char *binary, const char *debug) *slot = missing_filepair; @@ -686,9 +686,9 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c diff --git a/gdb/config.in b/gdb/config.in --- a/gdb/config.in +++ b/gdb/config.in -@@ -36,6 +36,9 @@ - /* Define to BFD's default target vector. */ - #undef DEFAULT_BFD_VEC +@@ -39,6 +39,9 @@ + /* Handle .ctf type-info sections */ + #undef ENABLE_LIBCTF +/* librpm version specific library name to dlopen. */ +#undef DLOPEN_LIBRPM @@ -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 -@@ -245,6 +248,9 @@ +@@ -247,6 +250,9 @@ /* Define if you have the mpfr library. */ #undef HAVE_LIBMPFR @@ -709,7 +709,7 @@ diff --git a/gdb/config.in b/gdb/config.in diff --git a/gdb/configure b/gdb/configure --- a/gdb/configure +++ b/gdb/configure -@@ -761,6 +761,11 @@ CODESIGN_CERT +@@ -769,6 +769,11 @@ PKG_CONFIG HAVE_NATIVE_GCORE_TARGET TARGET_OBS subdirs @@ -721,7 +721,7 @@ diff --git a/gdb/configure b/gdb/configure GDB_DATADIR DEBUGDIR MAKEINFO_EXTRA_FLAGS -@@ -864,6 +869,7 @@ with_gdb_datadir +@@ -873,6 +878,7 @@ with_gdb_datadir with_relocated_sources with_auto_load_dir with_auto_load_safe_path @@ -729,42 +729,34 @@ diff --git a/gdb/configure b/gdb/configure enable_targets enable_64_bit_bfd enable_gdbmi -@@ -926,6 +932,11 @@ CCC - CPP - MAKEINFO - MAKEINFOFLAGS -+PKG_CONFIG -+PKG_CONFIG_PATH -+PKG_CONFIG_LIBDIR +@@ -949,6 +955,8 @@ PKG_CONFIG_PATH + PKG_CONFIG_LIBDIR + DEBUGINFOD_CFLAGS + DEBUGINFOD_LIBS +RPM_CFLAGS +RPM_LIBS YACC YFLAGS XMKMF' -@@ -1598,6 +1609,8 @@ Optional Packages: - [--with-auto-load-dir] - --without-auto-load-safe-path +@@ -1621,6 +1629,8 @@ Optional Packages: do not restrict auto-loaded files locations + --with-debuginfod Enable debuginfo lookups with debuginfod + (auto/yes/no) + --with-rpm query rpm database for missing debuginfos (yes/no, + def. auto=librpm.so) --with-libunwind-ia64 use libunwind frame unwinding for ia64 targets --with-curses use the curses library instead of the termcap library -@@ -1661,6 +1674,13 @@ Some influential environment variables: - MAKEINFO Parent configure detects if it is of sufficient version. - MAKEINFOFLAGS - Parameters for MAKEINFO. -+ PKG_CONFIG path to pkg-config utility -+ PKG_CONFIG_PATH -+ directories to add to pkg-config's search path -+ PKG_CONFIG_LIBDIR -+ path overriding pkg-config's built-in search path +@@ -1702,6 +1712,8 @@ Some influential environment variables: + C compiler flags for DEBUGINFOD, overriding pkg-config + DEBUGINFOD_LIBS + linker flags for DEBUGINFOD, overriding pkg-config + RPM_CFLAGS C compiler flags for RPM, overriding pkg-config + RPM_LIBS linker flags for RPM, overriding pkg-config YACC The `Yet Another Compiler Compiler' implementation to use. Defaults to the first program found out of: `bison -y', `byacc', `yacc'. -@@ -6587,6 +6607,494 @@ _ACEOF +@@ -6666,6 +6678,494 @@ _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_auto_load_safe_path" >&5 $as_echo "$with_auto_load_safe_path" >&6; } @@ -1262,7 +1254,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 -@@ -144,6 +144,199 @@ AC_DEFINE_DIR(AUTO_LOAD_SAFE_PATH, escape_dir, +@@ -143,6 +143,199 @@ AC_DEFINE_DIR(AUTO_LOAD_SAFE_PATH, escape_dir, [Directories safe to hold auto-loaded files.]) AC_MSG_RESULT([$with_auto_load_safe_path]) @@ -1465,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 "ser-event.h" - #include "gdb_select.h" +@@ -42,6 +42,7 @@ + #include "gdbsupport/gdb_select.h" #include "gdbsupport/gdb-sigmask.h" + #include "async-event.h" +#include "symfile.h" /* readline include files. */ #include "readline/readline.h" -@@ -363,6 +364,8 @@ display_gdb_prompt (const char *new_prompt) +@@ -364,6 +365,8 @@ display_gdb_prompt (const char *new_prompt) /* Reset the nesting depth used when trace-commands is set. */ reset_command_nest_depth (); @@ -1482,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. */ -@@ -772,7 +775,10 @@ command_line_handler (gdb::unique_xmalloc_ptr &&rl) +@@ -773,7 +776,10 @@ command_line_handler (gdb::unique_xmalloc_ptr &&rl) command_handler (cmd); if (ui->prompt_state != PROMPTED) @@ -1497,12 +1489,11 @@ diff --git a/gdb/event-top.c b/gdb/event-top.c diff --git a/gdb/symfile.h b/gdb/symfile.h --- a/gdb/symfile.h +++ b/gdb/symfile.h -@@ -542,6 +542,8 @@ extern void generic_load (const char *args, int from_tty); +@@ -560,6 +560,7 @@ extern void generic_load (const char *args, int from_tty); /* build-id support. */ extern struct bfd_build_id *build_id_addr_get (CORE_ADDR addr); extern void debug_print_missing (const char *binary, const char *debug); +extern void debug_flush_missing (void); -+#define BUILD_ID_MAIN_EXECUTABLE_FILENAME _("the main executable file") + #define BUILD_ID_MAIN_EXECUTABLE_FILENAME _("the main executable file") /* From dwarf2read.c */ - diff --git a/gdb-6.6-buildid-locate-solib-missing-ids.patch b/gdb-6.6-buildid-locate-solib-missing-ids.patch index 73b763a..f1f5e83 100644 --- a/gdb-6.6-buildid-locate-solib-missing-ids.patch +++ b/gdb-6.6-buildid-locate-solib-missing-ids.patch @@ -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 -@@ -1346,14 +1346,27 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm, +@@ -1340,14 +1340,27 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm, } { @@ -44,7 +44,7 @@ diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c if (build_id != NULL) { char *name, *build_id_filename; -@@ -1368,23 +1381,7 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm, +@@ -1362,23 +1375,7 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm, xfree (name); } else diff --git a/gdb-6.6-buildid-locate.patch b/gdb-6.6-buildid-locate.patch index 504c6a9..6c9fb81 100644 --- a/gdb-6.6-buildid-locate.patch +++ b/gdb-6.6-buildid-locate.patch @@ -9,7 +9,7 @@ Subject: gdb-6.6-buildid-locate.patch diff --git a/bfd/libbfd-in.h b/bfd/libbfd-in.h --- a/bfd/libbfd-in.h +++ b/bfd/libbfd-in.h -@@ -127,7 +127,7 @@ static inline char * +@@ -121,7 +121,7 @@ static inline char * bfd_strdup (const char *str) { size_t len = strlen (str) + 1; @@ -21,7 +21,7 @@ diff --git a/bfd/libbfd-in.h b/bfd/libbfd-in.h diff --git a/bfd/libbfd.h b/bfd/libbfd.h --- a/bfd/libbfd.h +++ b/bfd/libbfd.h -@@ -132,7 +132,7 @@ static inline char * +@@ -126,7 +126,7 @@ static inline char * bfd_strdup (const char *str) { size_t len = strlen (str) + 1; @@ -33,7 +33,7 @@ diff --git a/bfd/libbfd.h b/bfd/libbfd.h diff --git a/gdb/build-id.c b/gdb/build-id.c --- a/gdb/build-id.c +++ b/gdb/build-id.c -@@ -24,13 +24,71 @@ +@@ -24,13 +24,70 @@ #include "gdbsupport/gdb_vecs.h" #include "symfile.h" #include "objfiles.h" @@ -46,7 +46,6 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c +#include "gdb_bfd.h" +#include "gdbcmd.h" #include "gdbcore.h" -+#include "libbfd.h" +#include "objfiles.h" +#include "observable.h" +#include "symfile.h" @@ -106,7 +105,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c { if (!bfd_check_format (abfd, bfd_object) && !bfd_check_format (abfd, bfd_core)) -@@ -43,6 +101,348 @@ build_id_bfd_get (bfd *abfd) +@@ -43,6 +100,348 @@ build_id_bfd_get (bfd *abfd) return NULL; } @@ -455,7 +454,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c /* See build-id.h. */ int -@@ -51,7 +451,7 @@ build_id_verify (bfd *abfd, size_t check_len, const bfd_byte *check) +@@ -51,7 +450,7 @@ build_id_verify (bfd *abfd, size_t check_len, const bfd_byte *check) const struct bfd_build_id *found; int retval = 0; @@ -464,7 +463,7 @@ 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 +466,159 @@ build_id_verify (bfd *abfd, size_t check_len, const bfd_byte *check) +@@ -66,56 +465,159 @@ build_id_verify (bfd *abfd, size_t check_len, const bfd_byte *check) return retval; } @@ -543,7 +542,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c + files may not be installed. */ - /* 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.get (), gnutarget); + string_appendf (link, ".%u", seqno); + } @@ -651,7 +650,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 +627,7 @@ build_id_to_debug_bfd_1 (const std::string &link, size_t build_id_len, +@@ -124,7 +626,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, @@ -660,7 +659,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 +650,17 @@ build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id, +@@ -147,16 +649,17 @@ build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id, if (size > 0) { size--; @@ -681,7 +680,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c if (debug_bfd != NULL) return debug_bfd; -@@ -170,7 +674,8 @@ build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id, +@@ -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) { link = gdb_sysroot + link; @@ -691,7 +690,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c if (debug_bfd != NULL) return debug_bfd; } -@@ -179,38 +684,208 @@ build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id, +@@ -179,38 +683,208 @@ build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id, return {}; } @@ -907,7 +906,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 +898,21 @@ find_separate_debug_file_by_buildid (struct objfile *objfile) +@@ -223,3 +897,21 @@ find_separate_debug_file_by_buildid (struct objfile *objfile) return std::string (); } @@ -1003,8 +1002,8 @@ diff --git a/gdb/corelow.c b/gdb/corelow.c #include "inferior.h" #include "infrun.h" #include "symtab.h" -@@ -322,6 +326,8 @@ add_to_thread_list (bfd *abfd, asection *asect, void *reg_sect_arg) - inferior_ptid = ptid; /* Yes, make it current. */ +@@ -362,6 +366,8 @@ add_to_thread_list (bfd *abfd, asection *asect, void *reg_sect_arg) + switch_to_thread (thr); /* Yes, make it current. */ } +static bool build_id_core_loads = true; @@ -1012,7 +1011,7 @@ diff --git a/gdb/corelow.c b/gdb/corelow.c /* Issue a message saying we have no core to debug, if FROM_TTY. */ static void -@@ -358,19 +364,25 @@ core_file_command (const char *filename, int from_tty) +@@ -398,19 +404,25 @@ core_file_command (const char *filename, int from_tty) static void locate_exec_from_corefile_build_id (bfd *abfd, int from_tty) { @@ -1040,10 +1039,10 @@ diff --git a/gdb/corelow.c b/gdb/corelow.c } /* See gdbcore.h. */ -@@ -998,4 +1010,11 @@ void - _initialize_corelow (void) - { - add_target (core_target_info, core_target_open, filename_completer); +@@ -1189,4 +1201,11 @@ _initialize_corelow () + maintenance_print_core_file_backed_mappings, + _("Print core file's file-backed mappings."), + &maintenanceprintlist); + + add_setshow_boolean_cmd ("build-id-core-loads", class_files, + &build_id_core_loads, _("\ @@ -1055,7 +1054,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 -@@ -20862,6 +20862,27 @@ information files. +@@ -21074,6 +21074,27 @@ information files. @end table @@ -1083,10 +1082,10 @@ diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo @cindex @code{.gnu_debuglink} sections @cindex debug link sections A debug link is a special section of the executable file named -diff --git a/gdb/dwarf-index-cache.c b/gdb/dwarf-index-cache.c ---- a/gdb/dwarf-index-cache.c -+++ b/gdb/dwarf-index-cache.c -@@ -94,7 +94,7 @@ index_cache::store (struct dwarf2_per_objfile *dwarf2_per_objfile) +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) return; /* Get build id of objfile. */ @@ -1095,7 +1094,7 @@ diff --git a/gdb/dwarf-index-cache.c b/gdb/dwarf-index-cache.c if (build_id == nullptr) { if (debug_index_cache) -@@ -112,7 +112,8 @@ index_cache::store (struct dwarf2_per_objfile *dwarf2_per_objfile) +@@ -113,7 +113,8 @@ index_cache::store (dwarf2_per_objfile *per_objfile) if (dwz != nullptr) { @@ -1105,28 +1104,28 @@ diff --git a/gdb/dwarf-index-cache.c b/gdb/dwarf-index-cache.c if (dwz_build_id == nullptr) { -diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c ---- a/gdb/dwarf2read.c -+++ b/gdb/dwarf2read.c -@@ -2718,7 +2718,7 @@ dwarf2_get_dwz_file (struct dwarf2_per_objfile *dwarf2_per_objfile) +diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c +--- a/gdb/dwarf2/read.c ++++ b/gdb/dwarf2/read.c +@@ -2218,7 +2218,7 @@ dwarf2_get_dwz_file (dwarf2_per_bfd *per_bfd) } if (dwz_bfd == NULL) - dwz_bfd = build_id_to_debug_bfd (buildid_len, buildid); + dwz_bfd = build_id_to_debug_bfd (buildid_len, buildid, NULL); - if (dwz_bfd == NULL) - error (_("could not find '.gnu_debugaltlink' file for %s"), -@@ -6276,7 +6276,7 @@ get_gdb_index_contents_from_section (objfile *obj, T *section_owner) + if (dwz_bfd == nullptr) + { +@@ -5980,7 +5980,7 @@ get_gdb_index_contents_from_section (objfile *obj, T *section_owner) static gdb::array_view - get_gdb_index_contents_from_cache (objfile *obj, dwarf2_per_objfile *dwarf2_obj) + get_gdb_index_contents_from_cache (objfile *obj, dwarf2_per_bfd *dwarf2_per_bfd) { - const bfd_build_id *build_id = build_id_bfd_get (obj->obfd); + const bfd_build_id *build_id = build_id_bfd_shdr_get (obj->obfd); if (build_id == nullptr) return {}; -@@ -6289,7 +6289,7 @@ get_gdb_index_contents_from_cache (objfile *obj, dwarf2_per_objfile *dwarf2_obj) +@@ -5993,7 +5993,7 @@ get_gdb_index_contents_from_cache (objfile *obj, dwarf2_per_bfd *dwarf2_per_bfd) static gdb::array_view get_gdb_index_contents_from_cache_dwz (objfile *obj, dwz_file *dwz) { @@ -1138,7 +1137,7 @@ diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c diff --git a/gdb/elfread.c b/gdb/elfread.c --- a/gdb/elfread.c +++ b/gdb/elfread.c -@@ -1299,7 +1299,9 @@ elf_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) +@@ -1298,7 +1298,9 @@ elf_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) && objfile->separate_debug_objfile == NULL && objfile->separate_debug_objfile_backlink == NULL) { @@ -1149,35 +1148,61 @@ diff --git a/gdb/elfread.c b/gdb/elfread.c if (debugfile.empty ()) debugfile = find_separate_debug_file_by_debuglink (objfile); -@@ -1311,8 +1313,12 @@ elf_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) - symbol_file_add_separate (debug_bfd.get (), debugfile.c_str (), - symfile_flags, objfile); - } -- else -- has_dwarf2 = false; -+ /* Check if any separate debug info has been extracted out. */ -+ else if (bfd_get_section_by_name (objfile->obfd, ".gnu_debuglink") -+ != NULL) -+ debug_print_missing (objfile_name (objfile), build_id_filename.get ()); -+ else -+ has_dwarf2 = false; - } +@@ -1313,7 +1315,7 @@ elf_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) + else + { + has_dwarf2 = false; +- const struct bfd_build_id *build_id = build_id_bfd_get (objfile->obfd); ++ const struct bfd_build_id *build_id = build_id_bfd_shdr_get (objfile->obfd); - /* Read the CTF section only if there is no DWARF info. */ + if (build_id != nullptr) + { +@@ -1338,6 +1340,10 @@ elf_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) + has_dwarf2 = true; + } + } ++ /* Check if any separate debug info has been extracted out. */ ++ else if (bfd_get_section_by_name (objfile->obfd, ".gnu_debuglink") ++ != NULL) ++ debug_print_missing (objfile_name (objfile), build_id_filename.get ()); + } + } + } +diff --git a/gdb/exec.c b/gdb/exec.c +--- a/gdb/exec.c ++++ b/gdb/exec.c +@@ -264,7 +264,7 @@ validate_exec_file (int from_tty) + reopen_exec_file (); + current_exec_file = get_exec_file (0); + +- const bfd_build_id *exec_file_build_id = build_id_bfd_get (exec_bfd); ++ const bfd_build_id *exec_file_build_id = build_id_bfd_shdr_get (exec_bfd); + if (exec_file_build_id != nullptr) + { + /* Prepend the target prefix, to force gdb_bfd_open to open the +@@ -277,7 +277,7 @@ validate_exec_file (int from_tty) + if (abfd != nullptr) + { + const bfd_build_id *target_exec_file_build_id +- = build_id_bfd_get (abfd.get ()); ++ = build_id_bfd_shdr_get (abfd.get ()); + + if (target_exec_file_build_id != nullptr) + { diff --git a/gdb/objfiles.h b/gdb/objfiles.h --- a/gdb/objfiles.h +++ b/gdb/objfiles.h -@@ -627,6 +627,10 @@ struct objfile - htab_up static_links; +@@ -714,6 +714,10 @@ struct objfile + bool skip_jit_symbol_lookup = false; }; +/* This file was loaded according to the BUILD_ID_CORE_LOADS rules. */ + +#define OBJF_BUILD_ID_CORE_LOADED static_cast(1 << 12) + - /* Declarations for functions defined in objfiles.c */ + /* A deleter for objfile. */ - extern struct gdbarch *get_objfile_arch (const struct objfile *); + struct objfile_deleter diff --git a/gdb/python/py-objfile.c b/gdb/python/py-objfile.c --- a/gdb/python/py-objfile.c +++ b/gdb/python/py-objfile.c @@ -1210,7 +1235,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); -@@ -1344,9 +1345,51 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm, +@@ -1338,9 +1339,51 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm, continue; } @@ -1265,10 +1290,22 @@ diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c /* If this entry has no name, or its name matches the name for the main executable, don't include it in the list. */ +diff --git a/gdb/source.c b/gdb/source.c +--- a/gdb/source.c ++++ b/gdb/source.c +@@ -1165,7 +1165,7 @@ open_source_file (struct symtab *s) + srcpath += s->filename; + } + +- const struct bfd_build_id *build_id = build_id_bfd_get (ofp->obfd); ++ const struct bfd_build_id *build_id = build_id_bfd_shdr_get (ofp->obfd); + + /* Query debuginfod for the source file. */ + if (build_id != nullptr && !srcpath.empty ()) diff --git a/gdb/symfile.h b/gdb/symfile.h --- a/gdb/symfile.h +++ b/gdb/symfile.h -@@ -532,12 +532,17 @@ void expand_symtabs_matching +@@ -550,12 +550,18 @@ void expand_symtabs_matching void map_symbol_filenames (symbol_filename_ftype *fun, void *data, int need_fullname); @@ -1282,6 +1319,7 @@ diff --git a/gdb/symfile.h b/gdb/symfile.h +/* build-id support. */ +extern struct bfd_build_id *build_id_addr_get (CORE_ADDR addr); +extern void debug_print_missing (const char *binary, const char *debug); ++#define BUILD_ID_MAIN_EXECUTABLE_FILENAME _("the main executable file") + /* From dwarf2read.c */ @@ -1289,7 +1327,7 @@ diff --git a/gdb/symfile.h b/gdb/symfile.h diff --git a/gdb/testsuite/gdb.base/corefile.exp b/gdb/testsuite/gdb.base/corefile.exp --- a/gdb/testsuite/gdb.base/corefile.exp +++ b/gdb/testsuite/gdb.base/corefile.exp -@@ -311,3 +311,33 @@ gdb_test_multiple "core-file $corefile" $test { +@@ -343,3 +343,33 @@ gdb_test_multiple "core-file $corefile" $test { pass $test } } @@ -1337,7 +1375,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 -@@ -1891,6 +1891,17 @@ proc default_gdb_start { } { +@@ -2011,6 +2011,17 @@ proc default_gdb_start { } { } } @@ -1358,7 +1396,7 @@ diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp diff --git a/gdb/testsuite/lib/mi-support.exp b/gdb/testsuite/lib/mi-support.exp --- a/gdb/testsuite/lib/mi-support.exp +++ b/gdb/testsuite/lib/mi-support.exp -@@ -309,6 +309,16 @@ proc default_mi_gdb_start { args } { +@@ -308,6 +308,16 @@ proc default_mi_gdb_start { args } { warning "Couldn't set the width to 0." } } diff --git a/gdb-6.7-testsuite-stable-results.patch b/gdb-6.7-testsuite-stable-results.patch index ec8f9c2..0eca1a7 100644 --- a/gdb-6.7-testsuite-stable-results.patch +++ b/gdb-6.7-testsuite-stable-results.patch @@ -28,7 +28,7 @@ frames-invalid can happen asynchronously. diff --git a/gdb/testsuite/gdb.base/fileio.c b/gdb/testsuite/gdb.base/fileio.c --- a/gdb/testsuite/gdb.base/fileio.c +++ b/gdb/testsuite/gdb.base/fileio.c -@@ -560,6 +560,28 @@ strerrno (int err) +@@ -559,6 +559,28 @@ strerrno (int err) int main () { diff --git a/gdb-6.8-quit-never-aborts.patch b/gdb-6.8-quit-never-aborts.patch index 4dd01c5..a682469 100644 --- a/gdb-6.8-quit-never-aborts.patch +++ b/gdb-6.8-quit-never-aborts.patch @@ -16,7 +16,7 @@ on the debugger termination). diff --git a/gdb/defs.h b/gdb/defs.h --- a/gdb/defs.h +++ b/gdb/defs.h -@@ -168,6 +168,10 @@ extern void default_quit_handler (void); +@@ -177,6 +177,10 @@ extern void default_quit_handler (void); /* Flag that function quit should call quit_force. */ extern volatile int sync_quit_force_run; @@ -30,24 +30,24 @@ diff --git a/gdb/defs.h b/gdb/defs.h diff --git a/gdb/extension.c b/gdb/extension.c --- a/gdb/extension.c +++ b/gdb/extension.c -@@ -823,6 +823,11 @@ check_quit_flag (void) - int i, result = 0; - const struct extension_language_defn *extlang; +@@ -769,6 +769,11 @@ check_quit_flag (void) + { + int result = 0; +#ifdef NEED_DETACH_SIGSTOP + if (quit_flag_cleanup) + return 0; +#endif + - ALL_ENABLED_EXTENSION_LANGUAGES (i, extlang) + for (const struct extension_language_defn *extlang : extension_languages) { - if (extlang->ops->check_quit_flag != NULL) + if (extlang->ops != nullptr diff --git a/gdb/top.c b/gdb/top.c --- a/gdb/top.c +++ b/gdb/top.c -@@ -1703,7 +1703,13 @@ quit_force (int *exit_arg, int from_tty) - - qt.from_tty = from_tty; +@@ -1770,7 +1770,13 @@ quit_force (int *exit_arg, int from_tty) + else if (return_child_result) + exit_code = return_child_result_value; +#ifndef NEED_DETACH_SIGSTOP /* We want to handle any quit errors and exit regardless. */ @@ -62,7 +62,7 @@ diff --git a/gdb/top.c b/gdb/top.c diff --git a/gdb/utils.c b/gdb/utils.c --- a/gdb/utils.c +++ b/gdb/utils.c -@@ -102,6 +102,13 @@ static std::chrono::steady_clock::duration prompt_for_continue_wait_time; +@@ -103,6 +103,13 @@ static std::chrono::steady_clock::duration prompt_for_continue_wait_time; static bool debug_timestamp = false; diff --git a/gdb-archer-pie-addons-keep-disabled.patch b/gdb-archer-pie-addons-keep-disabled.patch index 40ab16b..ed02f2c 100644 --- a/gdb-archer-pie-addons-keep-disabled.patch +++ b/gdb-archer-pie-addons-keep-disabled.patch @@ -8,12 +8,12 @@ Subject: gdb-archer-pie-addons-keep-disabled.patch diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c -@@ -15396,6 +15396,51 @@ static struct cmd_list_element *enablebreaklist = NULL; +@@ -15431,6 +15431,50 @@ static struct cmd_list_element *enablebreaklist = NULL; cmd_list_element *commands_cmd_element = nullptr; +void -+breakpoints_relocate (struct objfile *objfile, struct section_offsets *delta) ++breakpoints_relocate (struct objfile *objfile, section_offsets &delta) +{ + struct bp_location *bl, **blp_tmp; + int changed = 0; @@ -32,7 +32,7 @@ diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c + CORE_ADDR relocated_address; + CORE_ADDR delta_offset; + -+ delta_offset = ANOFFSET (delta, osect->the_bfd_section->index); ++ delta_offset = delta[osect->the_bfd_section->index]; + if (delta_offset == 0) + continue; + relocated_address = bl->address + delta_offset; @@ -56,19 +56,18 @@ diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c + bp_location_is_less_than); +} + -+void _initialize_breakpoint (void); + void _initialize_breakpoint (); void - _initialize_breakpoint (void) - { + _initialize_breakpoint () diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h --- a/gdb/breakpoint.h +++ b/gdb/breakpoint.h -@@ -1696,6 +1696,9 @@ extern const char *ep_parse_optional_if_clause (const char **arg); +@@ -1691,6 +1691,9 @@ extern const char *ep_parse_optional_if_clause (const char **arg); UIOUT iff debugging multiple threads. */ extern void maybe_print_thread_hit_breakpoint (struct ui_out *uiout); +extern void breakpoints_relocate (struct objfile *objfile, -+ struct section_offsets *delta); ++ section_offsets &delta); + /* Print the specified breakpoint. */ extern void print_breakpoint (breakpoint *bp); @@ -76,7 +75,7 @@ diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h diff --git a/gdb/objfiles.c b/gdb/objfiles.c --- a/gdb/objfiles.c +++ b/gdb/objfiles.c -@@ -816,6 +816,11 @@ objfile_relocate1 (struct objfile *objfile, +@@ -742,6 +742,11 @@ objfile_relocate1 (struct objfile *objfile, obj_section_addr (s)); } @@ -88,15 +87,3 @@ diff --git a/gdb/objfiles.c b/gdb/objfiles.c /* Data changed. */ return 1; } -diff --git a/gdb/value.c b/gdb/value.c ---- a/gdb/value.c -+++ b/gdb/value.c -@@ -2840,7 +2840,7 @@ value_static_field (struct type *type, int fieldno) - case FIELD_LOC_KIND_PHYSADDR: - retval = value_at_lazy (TYPE_FIELD_TYPE (type, fieldno), - TYPE_FIELD_STATIC_PHYSADDR (type, fieldno) -- + (TYPE_OBJFILE (type) == NULL ? 0 : TYPE_OBJFILE (type)->section_offsets[SECT_OFF_TEXT (TYPE_OBJFILE (type))])); -+ + (TYPE_OBJFILE (type) == NULL ? 0 : ANOFFSET (TYPE_OBJFILE (type)->section_offsets, SECT_OFF_TEXT (TYPE_OBJFILE (type))))); - break; - case FIELD_LOC_KIND_PHYSNAME: - { diff --git a/gdb-archer-pie-addons.patch b/gdb-archer-pie-addons.patch index e3af3a9..f0c68db 100644 --- a/gdb-archer-pie-addons.patch +++ b/gdb-archer-pie-addons.patch @@ -8,7 +8,7 @@ Subject: gdb-archer-pie-addons.patch diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h -@@ -516,6 +516,7 @@ enum field_loc_kind +@@ -649,6 +649,7 @@ enum field_loc_kind { FIELD_LOC_KIND_BITPOS, /**< bitpos */ FIELD_LOC_KIND_ENUMVAL, /**< enumval */ @@ -16,7 +16,7 @@ diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h FIELD_LOC_KIND_PHYSADDR, /**< physaddr */ FIELD_LOC_KIND_PHYSNAME, /**< physname */ FIELD_LOC_KIND_DWARF_BLOCK /**< dwarf_block */ -@@ -566,6 +567,7 @@ union field_location +@@ -699,6 +700,7 @@ union field_location field. Otherwise, physname is the mangled label of the static field. */ @@ -24,37 +24,13 @@ diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h CORE_ADDR physaddr; const char *physname; -@@ -1474,6 +1476,7 @@ extern void set_type_vptr_basetype (struct type *, struct type *); - #define FIELD_ENUMVAL_LVAL(thisfld) ((thisfld).loc.enumval) - #define FIELD_ENUMVAL(thisfld) (FIELD_ENUMVAL_LVAL (thisfld) + 0) - #define FIELD_STATIC_PHYSNAME(thisfld) ((thisfld).loc.physname) -+/* This address is unrelocated by the objfile's ANOFFSET. */ - #define FIELD_STATIC_PHYSADDR(thisfld) ((thisfld).loc.physaddr) - #define FIELD_DWARF_BLOCK(thisfld) ((thisfld).loc.dwarf_block) - #define SET_FIELD_BITPOS(thisfld, bitpos) \ -@@ -1485,6 +1488,7 @@ extern void set_type_vptr_basetype (struct type *, struct type *); - #define SET_FIELD_PHYSNAME(thisfld, name) \ - (FIELD_LOC_KIND (thisfld) = FIELD_LOC_KIND_PHYSNAME, \ - FIELD_STATIC_PHYSNAME (thisfld) = (name)) -+/* This address is unrelocated by the objfile's ANOFFSET. */ - #define SET_FIELD_PHYSADDR(thisfld, addr) \ - (FIELD_LOC_KIND (thisfld) = FIELD_LOC_KIND_PHYSADDR, \ - FIELD_STATIC_PHYSADDR (thisfld) = (addr)) -@@ -1501,6 +1505,7 @@ extern void set_type_vptr_basetype (struct type *, struct type *); - #define TYPE_FIELD_BITPOS(thistype, n) FIELD_BITPOS (TYPE_FIELD (thistype, n)) - #define TYPE_FIELD_ENUMVAL(thistype, n) FIELD_ENUMVAL (TYPE_FIELD (thistype, n)) - #define TYPE_FIELD_STATIC_PHYSNAME(thistype, n) FIELD_STATIC_PHYSNAME (TYPE_FIELD (thistype, n)) -+/* This address is unrelocated by the objfile's ANOFFSET. */ - #define TYPE_FIELD_STATIC_PHYSADDR(thistype, n) FIELD_STATIC_PHYSADDR (TYPE_FIELD (thistype, n)) - #define TYPE_FIELD_DWARF_BLOCK(thistype, n) FIELD_DWARF_BLOCK (TYPE_FIELD (thistype, n)) - #define TYPE_FIELD_ARTIFICIAL(thistype, n) FIELD_ARTIFICIAL(TYPE_FIELD(thistype,n)) diff --git a/gdb/value.c b/gdb/value.c --- a/gdb/value.c +++ b/gdb/value.c -@@ -2839,7 +2839,8 @@ value_static_field (struct type *type, int fieldno) +@@ -2850,7 +2850,8 @@ value_static_field (struct type *type, int fieldno) { case FIELD_LOC_KIND_PHYSADDR: - retval = value_at_lazy (TYPE_FIELD_TYPE (type, fieldno), + retval = value_at_lazy (type->field (fieldno).type (), - TYPE_FIELD_STATIC_PHYSADDR (type, fieldno)); + TYPE_FIELD_STATIC_PHYSADDR (type, fieldno) + + (TYPE_OBJFILE (type) == NULL ? 0 : TYPE_OBJFILE (type)->section_offsets[SECT_OFF_TEXT (TYPE_OBJFILE (type))])); diff --git a/gdb-archer-vla-tests.patch b/gdb-archer-vla-tests.patch index 9921940..47c98d3 100644 --- a/gdb-archer-vla-tests.patch +++ b/gdb-archer-vla-tests.patch @@ -3689,7 +3689,7 @@ new file mode 100644 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 -@@ -170,6 +170,11 @@ proc gdb_unload {} { +@@ -224,6 +224,11 @@ proc gdb_unload {} { send_gdb "y\n" answer exp_continue } @@ -3705,12 +3705,12 @@ diff --git a/gdb/testsuite/lib/pascal.exp b/gdb/testsuite/lib/pascal.exp --- a/gdb/testsuite/lib/pascal.exp +++ b/gdb/testsuite/lib/pascal.exp @@ -37,6 +37,9 @@ proc pascal_init {} { - global pascal_compiler_is_fpc - global gpc_compiler - global fpc_compiler -+ global fpcversion_major -+ global fpcversion_minor -+ global fpcversion_release + gdb_persistent_global pascal_compiler_is_fpc + gdb_persistent_global gpc_compiler + gdb_persistent_global fpc_compiler ++ gdb_persistent_global fpcversion_major ++ gdb_persistent_global fpcversion_minor ++ gdb_persistent_global fpcversion_release global env if { $pascal_init_done == 1 } { diff --git a/gdb-attach-fail-reasons-5of5.patch b/gdb-attach-fail-reasons-5of5.patch index 5b3b6d3..8830be3 100644 --- a/gdb-attach-fail-reasons-5of5.patch +++ b/gdb-attach-fail-reasons-5of5.patch @@ -45,7 +45,7 @@ gdb/gdbserver/ diff --git a/gdb/config.in b/gdb/config.in --- a/gdb/config.in +++ b/gdb/config.in -@@ -251,6 +251,9 @@ +@@ -253,6 +253,9 @@ /* Define if librpm library is being used. */ #undef HAVE_LIBRPM @@ -55,7 +55,7 @@ diff --git a/gdb/config.in b/gdb/config.in /* Define to 1 if you have the header file. */ #undef HAVE_LIBUNWIND_IA64_H -@@ -386,6 +389,9 @@ +@@ -388,6 +391,9 @@ /* Define to 1 if you have the `scm_new_smob' function. */ #undef HAVE_SCM_NEW_SMOB @@ -68,7 +68,7 @@ diff --git a/gdb/config.in b/gdb/config.in diff --git a/gdb/configure b/gdb/configure --- a/gdb/configure +++ b/gdb/configure -@@ -16434,6 +16434,64 @@ cat >>confdefs.h <<_ACEOF +@@ -16861,6 +16861,64 @@ cat >>confdefs.h <<_ACEOF _ACEOF @@ -136,7 +136,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 -@@ -1964,6 +1964,10 @@ case $host_os in +@@ -1900,6 +1900,10 @@ case $host_os in esac AC_DEFINE_UNQUOTED(GDBINIT,"$gdbinit",[The .gdbinit filename.]) @@ -147,136 +147,10 @@ diff --git a/gdb/configure.ac b/gdb/configure.ac dnl Handle optional features that can be enabled. # Support for --with-sysroot is a copy of GDB_AC_WITH_DIR, -diff --git a/gdb/gdbserver/config.in b/gdb/gdbserver/config.in ---- a/gdb/gdbserver/config.in -+++ b/gdb/gdbserver/config.in -@@ -125,6 +125,9 @@ - /* Define to 1 if you have the `dl' library (-ldl). */ - #undef HAVE_LIBDL - -+/* Define to 1 if you have the `selinux' library (-lselinux). */ -+#undef HAVE_LIBSELINUX -+ - /* Define if the target supports branch tracing. */ - #undef HAVE_LINUX_BTRACE - -@@ -210,6 +213,9 @@ - /* Define to 1 if you have the `pwrite' function. */ - #undef HAVE_PWRITE - -+/* Define to 1 if you have the header file. */ -+#undef HAVE_SELINUX_SELINUX_H -+ - /* Define to 1 if you have the `setns' function. */ - #undef HAVE_SETNS - -diff --git a/gdb/gdbserver/configure b/gdb/gdbserver/configure ---- a/gdb/gdbserver/configure -+++ b/gdb/gdbserver/configure -@@ -9398,6 +9398,64 @@ if $want_ipa ; then - fi - fi - -+for ac_header in selinux/selinux.h -+do : -+ ac_fn_c_check_header_mongrel "$LINENO" "selinux/selinux.h" "ac_cv_header_selinux_selinux_h" "$ac_includes_default" -+if test "x$ac_cv_header_selinux_selinux_h" = x""yes; then : -+ cat >>confdefs.h <<_ACEOF -+#define HAVE_SELINUX_SELINUX_H 1 -+_ACEOF -+ -+fi -+ -+done -+ -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for security_get_boolean_active in -lselinux" >&5 -+$as_echo_n "checking for security_get_boolean_active in -lselinux... " >&6; } -+if test "${ac_cv_lib_selinux_security_get_boolean_active+set}" = set; then : -+ $as_echo_n "(cached) " >&6 -+else -+ ac_check_lib_save_LIBS=$LIBS -+LIBS="-lselinux $LIBS" -+cat confdefs.h - <<_ACEOF >conftest.$ac_ext -+/* end confdefs.h. */ -+ -+/* Override any GCC internal prototype to avoid an error. -+ Use char because int might match the return type of a GCC -+ builtin and then its argument prototype would still apply. */ -+#ifdef __cplusplus -+extern "C" -+#endif -+char security_get_boolean_active (); -+int -+main () -+{ -+return security_get_boolean_active (); -+ ; -+ return 0; -+} -+_ACEOF -+if ac_fn_c_try_link "$LINENO"; then : -+ ac_cv_lib_selinux_security_get_boolean_active=yes -+else -+ ac_cv_lib_selinux_security_get_boolean_active=no -+fi -+rm -f core conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext -+LIBS=$ac_check_lib_save_LIBS -+fi -+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_selinux_security_get_boolean_active" >&5 -+$as_echo "$ac_cv_lib_selinux_security_get_boolean_active" >&6; } -+if test "x$ac_cv_lib_selinux_security_get_boolean_active" = x""yes; then : -+ cat >>confdefs.h <<_ACEOF -+#define HAVE_LIBSELINUX 1 -+_ACEOF -+ -+ LIBS="-lselinux $LIBS" -+ -+fi -+ -+ - - - -diff --git a/gdb/gdbserver/configure.ac b/gdb/gdbserver/configure.ac ---- a/gdb/gdbserver/configure.ac -+++ b/gdb/gdbserver/configure.ac -@@ -465,6 +465,10 @@ if $want_ipa ; then - fi - fi - -+dnl Check security_get_boolean_active availability. -+AC_CHECK_HEADERS(selinux/selinux.h) -+AC_CHECK_LIB(selinux, security_get_boolean_active) -+ - AC_SUBST(GDBSERVER_DEPFILES) - AC_SUBST(GDBSERVER_LIBS) - AC_SUBST(srv_xmlbuiltin) -diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c ---- a/gdb/gdbserver/linux-low.c -+++ b/gdb/gdbserver/linux-low.c -@@ -968,7 +968,16 @@ linux_ptrace_fun () - { - if (ptrace (PTRACE_TRACEME, 0, (PTRACE_TYPE_ARG3) 0, - (PTRACE_TYPE_ARG4) 0) < 0) -- trace_start_error_with_name ("ptrace"); -+ { -+ int save_errno = errno; -+ -+ std::string msg (linux_ptrace_create_warnings ()); -+ -+ msg += _("Cannot trace created process"); -+ -+ errno = save_errno; -+ trace_start_error_with_name (msg.c_str ()); -+ } - - if (setpgid (0, 0) < 0) - trace_start_error_with_name ("setpgid"); diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c -@@ -1092,7 +1092,16 @@ linux_nat_target::create_inferior (const char *exec_file, +@@ -1103,7 +1103,16 @@ linux_nat_target::create_inferior (const char *exec_file, /* Make sure we report all signals during startup. */ pass_signals ({}); @@ -354,3 +228,129 @@ diff --git a/gdb/nat/linux-ptrace.h b/gdb/nat/linux-ptrace.h extern void linux_check_ptrace_features (void); extern void linux_enable_event_reporting (pid_t pid, int attached); extern void linux_disable_event_reporting (pid_t pid); +diff --git a/gdbserver/config.in b/gdbserver/config.in +--- a/gdbserver/config.in ++++ b/gdbserver/config.in +@@ -143,6 +143,9 @@ + /* Define if you have the ipt library. */ + #undef HAVE_LIBIPT + ++/* Define to 1 if you have the `selinux' library (-lselinux). */ ++#undef HAVE_LIBSELINUX ++ + /* Define if the target supports branch tracing. */ + #undef HAVE_LINUX_BTRACE + +@@ -249,6 +252,9 @@ + /* Define to 1 if you have the `sbrk' function. */ + #undef HAVE_SBRK + ++/* Define to 1 if you have the header file. */ ++#undef HAVE_SELINUX_SELINUX_H ++ + /* Define to 1 if you have the `setns' function. */ + #undef HAVE_SETNS + +diff --git a/gdbserver/configure b/gdbserver/configure +--- a/gdbserver/configure ++++ b/gdbserver/configure +@@ -10683,6 +10683,64 @@ if $want_ipa ; then + fi + fi + ++for ac_header in selinux/selinux.h ++do : ++ ac_fn_c_check_header_mongrel "$LINENO" "selinux/selinux.h" "ac_cv_header_selinux_selinux_h" "$ac_includes_default" ++if test "x$ac_cv_header_selinux_selinux_h" = x""yes; then : ++ cat >>confdefs.h <<_ACEOF ++#define HAVE_SELINUX_SELINUX_H 1 ++_ACEOF ++ ++fi ++ ++done ++ ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for security_get_boolean_active in -lselinux" >&5 ++$as_echo_n "checking for security_get_boolean_active in -lselinux... " >&6; } ++if test "${ac_cv_lib_selinux_security_get_boolean_active+set}" = set; then : ++ $as_echo_n "(cached) " >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-lselinux $LIBS" ++cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++/* Override any GCC internal prototype to avoid an error. ++ Use char because int might match the return type of a GCC ++ builtin and then its argument prototype would still apply. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++char security_get_boolean_active (); ++int ++main () ++{ ++return security_get_boolean_active (); ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_link "$LINENO"; then : ++ ac_cv_lib_selinux_security_get_boolean_active=yes ++else ++ ac_cv_lib_selinux_security_get_boolean_active=no ++fi ++rm -f core conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_selinux_security_get_boolean_active" >&5 ++$as_echo "$ac_cv_lib_selinux_security_get_boolean_active" >&6; } ++if test "x$ac_cv_lib_selinux_security_get_boolean_active" = x""yes; then : ++ cat >>confdefs.h <<_ACEOF ++#define HAVE_LIBSELINUX 1 ++_ACEOF ++ ++ LIBS="-lselinux $LIBS" ++ ++fi ++ ++ + + + +diff --git a/gdbserver/configure.ac b/gdbserver/configure.ac +--- a/gdbserver/configure.ac ++++ b/gdbserver/configure.ac +@@ -401,6 +401,10 @@ if $want_ipa ; then + fi + fi + ++dnl Check security_get_boolean_active availability. ++AC_CHECK_HEADERS(selinux/selinux.h) ++AC_CHECK_LIB(selinux, security_get_boolean_active) ++ + AC_SUBST(GDBSERVER_DEPFILES) + AC_SUBST(GDBSERVER_LIBS) + AC_SUBST(srv_xmlbuiltin) +diff --git a/gdbserver/linux-low.cc b/gdbserver/linux-low.cc +--- a/gdbserver/linux-low.cc ++++ b/gdbserver/linux-low.cc +@@ -932,7 +932,16 @@ linux_ptrace_fun () + { + if (ptrace (PTRACE_TRACEME, 0, (PTRACE_TYPE_ARG3) 0, + (PTRACE_TYPE_ARG4) 0) < 0) +- trace_start_error_with_name ("ptrace"); ++ { ++ int save_errno = errno; ++ ++ std::string msg (linux_ptrace_create_warnings ()); ++ ++ msg += _("Cannot trace created process"); ++ ++ errno = save_errno; ++ trace_start_error_with_name (msg.c_str ()); ++ } + + if (setpgid (0, 0) < 0) + trace_start_error_with_name ("setpgid"); diff --git a/gdb-bz1219747-attach-kills.patch b/gdb-bz1219747-attach-kills.patch index 69c8658..fb3a349 100644 --- a/gdb-bz1219747-attach-kills.patch +++ b/gdb-bz1219747-attach-kills.patch @@ -80,7 +80,7 @@ gdb/testsuite/ChangeLog diff --git a/gdb/main.c b/gdb/main.c --- a/gdb/main.c +++ b/gdb/main.c -@@ -1148,7 +1148,10 @@ captured_main_1 (struct captured_main_args *context) +@@ -1199,7 +1199,10 @@ captured_main_1 (struct captured_main_args *context) { ret = catch_command_errors (attach_command, pid_or_core_arg, !batch_flag); diff --git a/gdb-bz533176-fortran-omp-step.patch b/gdb-bz533176-fortran-omp-step.patch index ee426ce..5264115 100644 --- a/gdb-bz533176-fortran-omp-step.patch +++ b/gdb-bz533176-fortran-omp-step.patch @@ -30,7 +30,7 @@ debugging problem of GOMP outside of the scope of this Bug. diff --git a/gdb/infrun.c b/gdb/infrun.c --- a/gdb/infrun.c +++ b/gdb/infrun.c -@@ -6453,6 +6453,16 @@ process_event_stop_test (struct execution_control_state *ecs) +@@ -6788,6 +6788,16 @@ process_event_stop_test (struct execution_control_state *ecs) if (ecs->event_thread->control.step_over_calls == STEP_OVER_ALL) { @@ -47,7 +47,7 @@ diff --git a/gdb/infrun.c b/gdb/infrun.c /* We're doing a "next". Normal (forward) execution: set a breakpoint at the -@@ -6486,6 +6496,7 @@ process_event_stop_test (struct execution_control_state *ecs) +@@ -6821,6 +6831,7 @@ process_event_stop_test (struct execution_control_state *ecs) keep_going (ecs); return; diff --git a/gdb-container-rh-pkg.patch b/gdb-container-rh-pkg.patch index b095d4b..04a7f3c 100644 --- a/gdb-container-rh-pkg.patch +++ b/gdb-container-rh-pkg.patch @@ -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 -@@ -13916,7 +13916,17 @@ remote_target::pid_to_exec_file (int pid) +@@ -14031,7 +14031,17 @@ remote_target::pid_to_exec_file (int pid) char *annex = NULL; if (packet_support (PACKET_qXfer_exec_file) != PACKET_ENABLE) @@ -26,5 +26,5 @@ diff --git a/gdb/remote.c b/gdb/remote.c + return NULL; + } - inf = find_inferior_pid (pid); + inferior *inf = find_inferior_pid (this, pid); if (inf == NULL) diff --git a/gdb-fedora-libncursesw.patch b/gdb-fedora-libncursesw.patch index 960193f..7c620fb 100644 --- a/gdb-fedora-libncursesw.patch +++ b/gdb-fedora-libncursesw.patch @@ -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 -@@ -9375,6 +9375,7 @@ if test x"$prefer_curses" = xyes; then +@@ -9649,6 +9649,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 : -@@ -9399,7 +9400,7 @@ return waddstr (); +@@ -9673,7 +9674,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 -@@ -9473,6 +9474,7 @@ case $host_os in +@@ -9747,6 +9748,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 : -@@ -9497,7 +9499,7 @@ return tgetent (); +@@ -9771,7 +9773,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 -@@ -717,7 +717,8 @@ if test x"$prefer_curses" = xyes; then +@@ -712,7 +712,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 -@@ -759,7 +760,8 @@ case $host_os in +@@ -754,7 +755,8 @@ case $host_os in esac # These are the libraries checked by Readline. diff --git a/gdb-gnat-dwarf-crash-3of3.patch b/gdb-gnat-dwarf-crash-3of3.patch index 52892e4..4197661 100644 --- a/gdb-gnat-dwarf-crash-3of3.patch +++ b/gdb-gnat-dwarf-crash-3of3.patch @@ -39,10 +39,10 @@ gdb/ * dwarf2read.c (process_die): Change gdb_assert to complaint. -diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c ---- a/gdb/dwarf2read.c -+++ b/gdb/dwarf2read.c -@@ -10657,6 +10657,13 @@ private: +diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c +--- a/gdb/dwarf2/read.c ++++ b/gdb/dwarf2/read.c +@@ -10162,6 +10162,13 @@ class process_die_scope static void process_die (struct die_info *die, struct dwarf2_cu *cu) { @@ -56,27 +56,10 @@ diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c process_die_scope scope (die, cu); switch (die->tag) -diff --git a/gdb/infrun.c b/gdb/infrun.c ---- a/gdb/infrun.c -+++ b/gdb/infrun.c -@@ -601,6 +601,13 @@ holding the child stopped. Try \"set detach-on-fork\" or \ - target_pid_to_str (process_ptid).c_str ()); - } - -+#ifdef NEED_DETACH_SIGSTOP -+ /* We should check PID_WAS_STOPPED and detach it stopped accordingly. -+ In this point of code it cannot be 1 as we would not get FORK -+ executed without CONTINUE first which resets PID_WAS_STOPPED. -+ We would have to first TARGET_STOP and WAITPID it as with running -+ inferior PTRACE_DETACH, SIGSTOP will ignore the signal. */ -+#endif - target_detach (parent_inf, 0); - } - diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c -@@ -189,6 +189,12 @@ struct linux_nat_target *linux_target; +@@ -190,6 +190,12 @@ struct linux_nat_target *linux_target; /* Does the current host support PTRACE_GETREGSET? */ enum tribool have_ptrace_getregset = TRIBOOL_UNKNOWN; @@ -89,17 +72,17 @@ diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c static unsigned int debug_linux_nat; static void show_debug_linux_nat (struct ui_file *file, int from_tty, -@@ -1030,6 +1036,9 @@ linux_nat_post_attach_wait (ptid_t ptid, int *signalled) - if (debug_linux_nat) - fprintf_unfiltered (gdb_stdlog, - "LNPAW: Attaching to a stopped process\n"); +@@ -1044,6 +1050,9 @@ linux_nat_post_attach_wait (ptid_t ptid, int *signalled) + if (linux_proc_pid_is_stopped (pid)) + { + linux_nat_debug_printf ("Attaching to a stopped process"); +#ifdef NEED_DETACH_SIGSTOP + pid_was_stopped = ptid.pid (); +#endif /* The process is definitely stopped. It is in a job control stop, unless the kernel predates the TASK_STOPPED / -@@ -1361,6 +1370,25 @@ get_detach_signal (struct lwp_info *lp) +@@ -1359,6 +1368,25 @@ get_detach_signal (struct lwp_info *lp) return gdb_signal_to_host (signo); } @@ -125,7 +108,7 @@ diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c return 0; } -@@ -1509,6 +1537,10 @@ linux_nat_target::detach (inferior *inf, int from_tty) +@@ -1502,6 +1530,10 @@ linux_nat_target::detach (inferior *inf, int from_tty) detach_one_lwp (main_lwp, &signo); detach_success (inf); @@ -136,7 +119,7 @@ diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c } } -@@ -1766,6 +1798,16 @@ linux_nat_target::resume (ptid_t ptid, int step, enum gdb_signal signo) +@@ -1744,6 +1776,16 @@ linux_nat_target::resume (ptid_t ptid, int step, enum gdb_signal signo) return; } @@ -153,7 +136,7 @@ diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c if (resume_many) iterate_over_lwps (ptid, [=] (struct lwp_info *info) { -@@ -3770,6 +3812,10 @@ linux_nat_target::mourn_inferior () +@@ -3617,6 +3659,10 @@ linux_nat_target::mourn_inferior () /* Let the arch-specific native code know this process is gone. */ linux_target->low_forget_process (pid); diff --git a/gdb-jit-reader-multilib.patch b/gdb-jit-reader-multilib.patch index ec41f13..4bce5fc 100644 --- a/gdb-jit-reader-multilib.patch +++ b/gdb-jit-reader-multilib.patch @@ -9,7 +9,7 @@ Subject: gdb-jit-reader-multilib.patch diff --git a/gdb/configure b/gdb/configure --- a/gdb/configure +++ b/gdb/configure -@@ -9694,10 +9694,12 @@ _ACEOF +@@ -9968,10 +9968,12 @@ _ACEOF @@ -28,7 +28,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 -@@ -808,10 +808,12 @@ AC_CHECK_SIZEOF(unsigned long long) +@@ -803,10 +803,12 @@ AC_CHECK_SIZEOF(unsigned long long) AC_CHECK_SIZEOF(unsigned long) AC_CHECK_SIZEOF(unsigned __int128) diff --git a/gdb-linux_perf-bundle.patch b/gdb-linux_perf-bundle.patch index db9e7c8..728f463 100644 --- a/gdb-linux_perf-bundle.patch +++ b/gdb-linux_perf-bundle.patch @@ -6,30 +6,6 @@ Subject: gdb-linux_perf-bundle.patch ;; [dts+el7] [x86*] Bundle linux_perf.h for libipt (RH BZ 1256513). ;;=fedora -diff --git a/gdb/configure b/gdb/configure ---- a/gdb/configure -+++ b/gdb/configure -@@ -11905,7 +11905,7 @@ else - - #include - #ifndef PERF_ATTR_SIZE_VER5 --# error -+// error // PERF_ATTR_SIZE_VER5_BUNDLE is not available here - Fedora+RHEL - #endif - - _ACEOF -diff --git a/gdb/configure.ac b/gdb/configure.ac ---- a/gdb/configure.ac -+++ b/gdb/configure.ac -@@ -1414,7 +1414,7 @@ else - AC_PREPROC_IFELSE([AC_LANG_SOURCE([[ - #include - #ifndef PERF_ATTR_SIZE_VER5 --# error -+// error // PERF_ATTR_SIZE_VER5_BUNDLE is not available here - Fedora+RHEL - #endif - ]])], [perf_event=yes], [perf_event=no]) - if test "$perf_event" != yes; then diff --git a/gdb/gdb.c b/gdb/gdb.c --- a/gdb/gdb.c +++ b/gdb/gdb.c @@ -234,3 +210,15 @@ diff --git a/gdb/nat/linux-btrace.h b/gdb/nat/linux-btrace.h struct target_ops; #if HAVE_LINUX_PERF_EVENT_H +diff --git a/gdbsupport/common.m4 b/gdbsupport/common.m4 +--- a/gdbsupport/common.m4 ++++ b/gdbsupport/common.m4 +@@ -145,7 +145,7 @@ AC_DEFUN([GDB_AC_COMMON], [ + AC_PREPROC_IFELSE([AC_LANG_SOURCE([[ + #include + #ifndef PERF_ATTR_SIZE_VER5 +- # error ++ // error // PERF_ATTR_SIZE_VER5_BUNDLE is not available here - Fedora+RHEL + #endif + ]])], [perf_event=yes], [perf_event=no]) + if test "$perf_event" != yes; then diff --git a/gdb-ltofix.patch b/gdb-ltofix.patch deleted file mode 100644 index e30f6f8..0000000 --- a/gdb-ltofix.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Nrup a/gdb/gdbserver/ax.c b/gdb/gdbserver/ax.c ---- a/gdb/gdbserver/ax.c 2019-11-18 18:49:19.000000000 -0700 -+++ b/gdb/gdbserver/ax.c 2019-12-19 21:30:19.512505411 -0700 -@@ -25,7 +25,7 @@ - static void ax_vdebug (const char *, ...) ATTRIBUTE_PRINTF (1, 2); - - #ifdef IN_PROCESS_AGENT --int debug_agent = 0; -+bool debug_agent = 0; - #endif - - static void diff --git a/gdb-moribund-utrace-workaround.patch b/gdb-moribund-utrace-workaround.patch index f2da872..869fc75 100644 --- a/gdb-moribund-utrace-workaround.patch +++ b/gdb-moribund-utrace-workaround.patch @@ -14,10 +14,10 @@ Bug in FSF GDB exploited by the ptrace-on-utrace interaction. diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c -@@ -11904,6 +11904,8 @@ update_global_location_list (enum ugll_insert_mode insert_mode) - traps we can no longer explain. */ - - old_loc->events_till_retirement = 3 * (thread_count () + 1); +@@ -11948,6 +11948,8 @@ update_global_location_list (enum ugll_insert_mode insert_mode) + = 3 * (thread_count (proc_target) + 1); + else + old_loc->events_till_retirement = 1; + /* Red Hat Bug 590623. */ + old_loc->events_till_retirement *= 10; old_loc->owner = NULL; diff --git a/gdb-rhbz1818011-bfd-gcc10-error.patch b/gdb-rhbz1818011-bfd-gcc10-error.patch deleted file mode 100644 index 6740326..0000000 --- a/gdb-rhbz1818011-bfd-gcc10-error.patch +++ /dev/null @@ -1,49 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Kevin Buettner -Date: Wed, 8 Apr 2020 16:15:52 -0400 -Subject: gdb-rhbz1818011-bfd-gcc10-error.patch -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -;; Fix int conversion error from bfd/elf.c when compiling with gcc 10 - -Original commit message from H.J. Lu is below: - -bfd: Change num_group to unsigned int - -elf.c failed with to with GCC 10 as of - -commit 906b3eb9df6c577d3f6e9c3ea5c9d7e4d1e90536 -Author: Martin Liska -Date: Tue Mar 24 11:40:10 2020 +0100 - - Improve endianess detection. - - PR lto/94249 - * plugin-api.h: Add more robust endianess detection. - -binutils-gdb/bfd/elf.c: In function ‘setup_group’: -binutils-gdb/bfd/elf.c:740:35: error: overflow in conversion from ‘unsigned int’ to ‘int’ changes value from ‘num_group = 4294967295’ to ‘-1’ [-Werror=overflow] - 740 | elf_tdata (abfd)->num_group = num_group = -1; - | ^~~~~~~~~ -cc1: all warnings being treated as errors -make[2]: *** [Makefile:1608: elf.lo] Error 1 - -Change num_group in elf_obj_tdata to unsigned int to compile with GCC 10. - - PR binutils/25717 - * elf-bfd.h (elf_obj_tdata): Change num_group to unsigned int. - -diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h ---- a/bfd/elf-bfd.h -+++ b/bfd/elf-bfd.h -@@ -1937,7 +1937,7 @@ struct elf_obj_tdata - struct sdt_note *sdt_note_head; - - Elf_Internal_Shdr **group_sect_ptr; -- int num_group; -+ unsigned int num_group; - - /* Index into group_sect_ptr, updated by setup_group when finding a - section's group. Used to optimize subsequent group searches. */ diff --git a/gdb-rhbz1822715-fix-python-deprecation.patch b/gdb-rhbz1822715-fix-python-deprecation.patch deleted file mode 100644 index 6d7c10b..0000000 --- a/gdb-rhbz1822715-fix-python-deprecation.patch +++ /dev/null @@ -1,70 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Kevin Buettner -Date: Thu, 16 Apr 2020 05:27:26 -0700 -Subject: gdb-rhbz1822715-fix-python-deprecation.patch - -;; Backport fix for deprecation of PyEval_InitThreads in Python 3.9. - -Fix compilation of python/python.c for Python 3.9 - -This commit fixes a compilation warning/error when building GDB -with Python 3.9: - -g++ -x c++ -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -DDNF_DEBUGINFO_INSTALL -I. -I../../gdb -I../../gdb/config -DLOCALEDIR="\"/usr/share/locale\"" -DHAVE_CONFIG_H -I../../gdb/../include/opcode -I../bfd -I../../gdb/../bfd -I../../gdb/../include -I../libdecnumber -I../../gdb/../libdecnumber -I../../gdb/../gnulib/import -I../gnulib/import -DTUI=1 -I/usr/include/guile/2.0 -pthread -I/usr/include/python3.9 -I/usr/include/python3.9 -I../../gdb/.. -pthread -Wall -Wpointer-arith -Wno-unused -Wunused-value -Wunused-variable -Wunused-function -Wno-switch -Wno-char-subscripts -Wempty-body -Wunused-but-set-parameter -Wunused-but-set-variable -Wno-sign-compare -Wno-error=maybe-uninitialized -Wno-mismatched-tags -Wsuggest-override -Wimplicit-fallthrough=3 -Wduplicated-cond -Wshadow=local -Wdeprecated-copy -Wdeprecated-copy-dtor -Wredundant-move -Wformat -Wformat-nonliteral -Wno-unused -Werror -c -o ser-tcp.o -MT ser-tcp.o -MMD -MP -MF ./.deps/ser-tcp.Tpo ../../gdb/ser-tcp.c -../../gdb/python/python.c: In function 'bool do_start_initialization()': -../../gdb/python/python.c:1621:23: error: 'void PyEval_InitThreads()' is deprecated [-Werror=deprecated-declarations] - 1621 | PyEval_InitThreads (); - | ^ -In file included from /usr/include/python3.9/Python.h:141, - from ../../gdb/python/python-internal.h:86, - from ../../gdb/python/python.c:92: -/usr/include/python3.9/ceval.h:132:37: note: declared here - 132 | Py_DEPRECATED(3.9) PyAPI_FUNC(void) PyEval_InitThreads(void); - | ^~~~~~~~~~~~~~~~~~ - -Information about the deprecated function can be found here: - -https://docs.python.org/3.9/whatsnew/3.9.html#deprecated - -Specifically, with regard to PyEval_InitThreads(), it says: - - The PyEval_InitThreads() and PyEval_ThreadsInitialized() functions - are now deprecated and will be removed in Python 3.11. Calling - PyEval_InitThreads() now does nothing. The GIL is initialized by - Py_Initialize() since Python 3.7. (Contributed by Victor Stinner - in bpo-39877.) - -I chose to disable the call with a #if test using PY_VERSION_HEX. -There is precedent for use of PY_VERSION_HEX; it's used in two places -in python-internal.h. I noticed that under certain circumstances -python-internal.h defines PyEval_InitThreads to be nothing, which -accomplishes the same thing. I considered doing something similar for -this case, but decided against it because, at some point in the future, -the presence of PyEval_InitThreads() without some explanation will be -confusing to a reader who won't be able to find PyEval_InitThreads in -the current (future for us) Python API. IMO, use of the #if along -with an accompanying comment seemed more straightforward. - -gdb/ChangeLog: - - * python/python.c (do_start_initialization): Don't call - PyEval_InitThreads for Python 3.9 and beyond. - -Change-Id: I0679fc10b6b76761a99538568f13188c6d8014e0 - -diff --git a/gdb/python/python.c b/gdb/python/python.c ---- a/gdb/python/python.c -+++ b/gdb/python/python.c -@@ -1618,7 +1618,12 @@ do_start_initialization () - #endif - - Py_Initialize (); -+#if PY_VERSION_HEX < 0x03090000 -+ /* PyEval_InitThreads became deprecated in Python 3.9 and will -+ be removed in Python 3.11. Prior to Python 3.7, this call was -+ required to initialize the GIL. */ - PyEval_InitThreads (); -+#endif - - #ifdef IS_PY3K - gdb_module = PyImport_ImportModule ("_gdb"); diff --git a/gdb-rhbz1829702-fix-python39.patch b/gdb-rhbz1829702-fix-python39.patch deleted file mode 100644 index d4eef56..0000000 --- a/gdb-rhbz1829702-fix-python39.patch +++ /dev/null @@ -1,224 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Keith Seitz -Date: Thu, 4 Jun 2020 17:16:48 -0700 -Subject: gdb-rhbz1829702-fix-python39.patch - -;; Backport "Fix Python 3.9 related runtime problems" -;; Kevin Buettner and Keith Seitz - -commit c47bae859a5af0d95224d90000df0e529f7c5aa0 -Author: Kevin Buettner -Date: Wed May 27 20:05:40 2020 -0700 - - Fix Python3.9 related runtime problems - - Python3.9b1 is now available on Rawhide. GDB w/ Python 3.9 support - can be built using the configure switch -with-python=/usr/bin/python3.9. - - Attempting to run gdb/Python3.9 segfaults on startup: - - #0 0x00007ffff7b0582c in PyEval_ReleaseLock () from /lib64/libpython3.9 -.so.1.0 - #1 0x000000000069ccbf in do_start_initialization () - at worktree-test1/gdb/python/python.c:1789 - #2 _initialize_python () - at worktree-test1/gdb/python/python.c:1877 - #3 0x00000000007afb0a in initialize_all_files () at init.c:237 - ... - - Consulting the the documentation... - - https://docs.python.org/3/c-api/init.html - - ...we find that PyEval_ReleaseLock() has been deprecated since version - 3.2. It recommends using PyEval_SaveThread or PyEval_ReleaseThread() - instead. In do_start_initialization, in gdb/python/python.c, we - can replace the calls to PyThreadState_Swap() and PyEval_ReleaseLock() - with a single call to PyEval_SaveThread. (Thanks to Keith Seitz - for working this out.) - - With that in place, GDB gets a little bit further. It still dies - on startup, but the backtrace is different: - - #0 0x00007ffff7b04306 in PyOS_InterruptOccurred () - from /lib64/libpython3.9.so.1.0 - #1 0x0000000000576e86 in check_quit_flag () - at worktree-test1/gdb/extension.c:776 - #2 0x0000000000576f8a in set_active_ext_lang (now_active=now_active@entry=0x983c00 ) - at worktree-test1/gdb/extension.c:705 - #3 0x000000000069d399 in gdbpy_enter::gdbpy_enter (this=0x7fffffffd2d0, - gdbarch=0x0, language=0x0) - at worktree-test1/gdb/python/python.c:211 - #4 0x0000000000686e00 in python_new_inferior (inf=0xddeb10) - at worktree-test1/gdb/python/py-inferior.c:251 - #5 0x00000000005d9fb9 in std::function::operator()(inferior*) const (__args#0=, this=0xccad20) - at /usr/include/c++/10/bits/std_function.h:617 - #6 gdb::observers::observable::notify (args#0=0xddeb10, - this=) - at worktree-test1/gdb/../gdbsupport/observable.h:106 - #7 add_inferior_silent (pid=0) - at worktree-test1/gdb/inferior.c:113 - #8 0x00000000005dbcb8 in initialize_inferiors () - at worktree-test1/gdb/inferior.c:947 - ... - - We checked with some Python Developers and were told that we should - acquire the GIL prior to calling any Python C API function. We - definitely don't have the GIL for calls of PyOS_InterruptOccurred(). - - I moved class_gdbpy_gil earlier in the file and use it in - gdbpy_check_quit_flag() to acquire (and automatically release) the - GIL. - - With those changes in place, I was able to run to a GDB prompt. But, - when trying to quit, it segfaulted again due to due to some other - problems with gdbpy_check_quit_flag(): - - Thread 1 "gdb" received signal SIGSEGV, Segmentation fault. - 0x00007ffff7bbab0c in new_threadstate () from /lib64/libpython3.9.so.1.0 - (top-gdb) bt 8 - #0 0x00007ffff7bbab0c in new_threadstate () from /lib64/libpython3.9.so.1.0 - #1 0x00007ffff7afa5ea in PyGILState_Ensure.cold () - from /lib64/libpython3.9.so.1.0 - #2 0x000000000069b58c in gdbpy_gil::gdbpy_gil (this=) - at worktree-test1/gdb/python/python.c:278 - #3 gdbpy_check_quit_flag (extlang=) - at worktree-test1/gdb/python/python.c:278 - #4 0x0000000000576e96 in check_quit_flag () - at worktree-test1/gdb/extension.c:776 - #5 0x000000000057700c in restore_active_ext_lang (previous=0xe9c050) - at worktree-test1/gdb/extension.c:729 - #6 0x000000000088913a in do_my_cleanups ( - pmy_chain=0xc31870 , - old_chain=0xae5720 ) - at worktree-test1/gdbsupport/cleanups.cc:131 - #7 do_final_cleanups () - at worktree-test1/gdbsupport/cleanups.cc:143 - - In this case, we're trying to call a Python C API function after - Py_Finalize() has been called from finalize_python(). I made - finalize_python set gdb_python_initialized to false and then cause - check_quit_flag() to return early when it's false. - - With these changes in place, GDB seems to be working again with - Python3.9b1. I think it likely that there are other problems lurking. - I wouldn't be surprised to find that there are other calls into Python - where we don't first make sure that we have the GIL. Further changes - may well be needed. - - I see no regressions testing on Rawhide using a GDB built with the - default Python version (3.8.3) versus one built using Python 3.9b1. - - I've also tested on Fedora 28, 29, 30, 31, and 32 (all x86_64) using - the default (though updated) system installed versions of Python on - those OSes. This means that I've tested against Python versions - 2.7.15, 2.7.17, 2.7.18, 3.7.7, 3.8.2, and 3.8.3. In each case GDB - still builds without problem and shows no regressions after applying - this patch. - - gdb/ChangeLog: - - 2020-MM-DD Kevin Buettner - Keith Seitz - - * python/python.c (do_start_initialization): For Python 3.9 and - later, call PyEval_SaveThread instead of PyEval_ReleaseLock. - (class gdbpy_gil): Move to earlier in file. - (finalize_python): Set gdb_python_initialized. - (gdbpy_check_quit_flag): Acquire GIL via gdbpy_gil. Return early - when not initialized. - -diff --git a/gdb/python/python.c b/gdb/python/python.c ---- a/gdb/python/python.c -+++ b/gdb/python/python.c -@@ -234,6 +234,30 @@ gdbpy_enter::~gdbpy_enter () - PyGILState_Release (m_state); - } - -+/* A helper class to save and restore the GIL, but without touching -+ the other globals that are handled by gdbpy_enter. */ -+ -+class gdbpy_gil -+{ -+public: -+ -+ gdbpy_gil () -+ : m_state (PyGILState_Ensure ()) -+ { -+ } -+ -+ ~gdbpy_gil () -+ { -+ PyGILState_Release (m_state); -+ } -+ -+ DISABLE_COPY_AND_ASSIGN (gdbpy_gil); -+ -+private: -+ -+ PyGILState_STATE m_state; -+}; -+ - /* Set the quit flag. */ - - static void -@@ -247,6 +271,10 @@ gdbpy_set_quit_flag (const struct extension_language_defn *extlang) - static int - gdbpy_check_quit_flag (const struct extension_language_defn *extlang) - { -+ if (!gdb_python_initialized) -+ return 0; -+ -+ gdbpy_gil gil; - return PyOS_InterruptOccurred (); - } - -@@ -924,30 +952,6 @@ gdbpy_source_script (const struct extension_language_defn *extlang, - - /* Posting and handling events. */ - --/* A helper class to save and restore the GIL, but without touching -- the other globals that are handled by gdbpy_enter. */ -- --class gdbpy_gil --{ --public: -- -- gdbpy_gil () -- : m_state (PyGILState_Ensure ()) -- { -- } -- -- ~gdbpy_gil () -- { -- PyGILState_Release (m_state); -- } -- -- DISABLE_COPY_AND_ASSIGN (gdbpy_gil); -- --private: -- -- PyGILState_STATE m_state; --}; -- - /* A single event. */ - struct gdbpy_event - { -@@ -1548,6 +1552,7 @@ finalize_python (void *ignore) - - Py_Finalize (); - -+ gdb_python_initialized = false; - restore_active_ext_lang (previous_active); - } - -@@ -1720,8 +1725,7 @@ do_start_initialization () - return false; - - /* Release the GIL while gdb runs. */ -- PyThreadState_Swap (NULL); -- PyEval_ReleaseLock (); -+ PyEval_SaveThread (); - - make_final_cleanup (finalize_python, NULL); - diff --git a/gdb-rhbz1838777-debuginfod.patch b/gdb-rhbz1838777-debuginfod.patch deleted file mode 100644 index 6c91851..0000000 --- a/gdb-rhbz1838777-debuginfod.patch +++ /dev/null @@ -1,1188 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Keith Seitz -Date: Tue, 9 Jun 2020 08:29:41 -0700 -Subject: gdb-rhbz1838777-debuginfod.patch - -;; Backport debuginofd support. -;; (Aaron Merey, RH BZ 183877) - -commit 0d79cdc494d5eb9db26a602d62c92d49f83f407e -Author: Aaron Merey -Date: Wed Feb 26 17:40:49 2020 -0500 - - Add debuginfod support to GDB - - debuginfod is a lightweight web service that indexes ELF/DWARF debugging - resources by build-id and serves them over HTTP. - - This patch enables GDB to query debuginfod servers for separate debug - files and source code when it is otherwise not able to find them. - - GDB can be built with debuginfod using the --with-debuginfod configure - option. - - This requires that libdebuginfod be installed and found at configure time. - - debuginfod is packaged with elfutils, starting with version 0.178. - - For more information see https://sourceware.org/elfutils/. - - Tested on x86_64 Fedora 31. - - gdb/ChangeLog: - 2020-02-26 Aaron Merey - - * Makefile.in: Handle optional debuginfod support. - * NEWS: Update. - * README: Add --with-debuginfod summary. - * config.in: Regenerate. - * configure: Regenerate. - * configure.ac: Handle optional debuginfod support. - * debuginfod-support.c: debuginfod helper functions. - * debuginfod-support.h: Ditto. - * doc/gdb.texinfo: Add --with-debuginfod to configure options - summary. - * dwarf2/read.c (dwarf2_get_dwz_file): Query debuginfod servers - when a dwz file cannot be found. - * elfread.c (elf_symfile_read): Query debuginfod servers when a - debuginfo file cannot be found. - * source.c (open_source_file): Query debuginfod servers when a - source file cannot be found. - * top.c (print_gdb_configuration): Include - --{with,without}-debuginfod in the output. - - gdb/testsuite/ChangeLog: - 2020-02-26 Aaron Merey - - * gdb.debuginfod: New directory for debuginfod tests. - * gdb.debuginfod/main.c: New test file. - * gdb.debuginfod/fetch_src_and_symbols.exp: New tests. - -diff --git a/config/debuginfod.m4 b/config/debuginfod.m4 -new file mode 100644 ---- /dev/null -+++ b/config/debuginfod.m4 -@@ -0,0 +1,38 @@ -+dnl Copyright (C) 1997-2019 Free Software Foundation, Inc. -+dnl This file is free software, distributed under the terms of the GNU -+dnl General Public License. As a special exception to the GNU General -+dnl Public License, this file may be distributed as part of a program -+dnl that contains a configuration script generated by Autoconf, under -+dnl the same distribution terms as the rest of that program. -+ -+AC_DEFUN([AC_DEBUGINFOD], -+[ -+# Enable debuginfod -+AC_ARG_WITH([debuginfod], -+ AC_HELP_STRING([--with-debuginfod], -+ [Enable debuginfo lookups with debuginfod (auto/yes/no)]), -+ [], [with_debuginfod=auto]) -+AC_MSG_CHECKING([whether to use debuginfod]) -+AC_MSG_RESULT([$with_debuginfod]) -+ -+if test "${with_debuginfod}" = no; then -+ AC_MSG_WARN([debuginfod support disabled; some features may be unavailable.]) -+else -+ AC_CHECK_LIB([debuginfod], [debuginfod_begin], [have_debuginfod_lib=yes]) -+ AC_CHECK_DECL([debuginfod_begin], [have_debuginfod_h=yes], [], -+ [#include ]) -+ if test "x$have_debuginfod_lib" = "xyes" -a \ -+ "x$have_debuginfod_h" = "xyes"; then -+ AC_DEFINE([HAVE_LIBDEBUGINFOD], [1], -+ [Define to 1 if debuginfod is enabled.]) -+ AC_SUBST([LIBDEBUGINFOD], ["-ldebuginfod"]) -+ else -+ AC_SUBST([LIBDEBUGINFOD], []) -+ if test "$with_debuginfod" = yes; then -+ AC_MSG_ERROR([debuginfod is missing or unusable]) -+ else -+ AC_MSG_WARN([debuginfod is missing or unusable; some features may be unavailable.]) -+ fi -+ fi -+fi -+]) -diff --git a/gdb/Makefile.in b/gdb/Makefile.in ---- a/gdb/Makefile.in -+++ b/gdb/Makefile.in -@@ -612,7 +612,8 @@ CLIBS = $(SIM) $(READLINE) $(OPCODES) $(BFD) $(LIBCTF) $(ZLIB) \ - @LIBS@ @GUILE_LIBS@ @PYTHON_LIBS@ \ - $(LIBEXPAT) $(LIBLZMA) $(LIBBABELTRACE) $(LIBIPT) \ - $(LIBIBERTY) $(WIN32LIBS) $(LIBGNU) $(LIBICONV) $(LIBMPFR) \ -- $(SRCHIGH_LIBS) $(LIBXXHASH) $(PTHREAD_LIBS) -+ $(SRCHIGH_LIBS) $(LIBXXHASH) $(PTHREAD_LIBS) \ -+ @LIBDEBUGINFOD@ - CDEPS = $(NAT_CDEPS) $(SIM) $(BFD) $(READLINE_DEPS) $(LIBCTF) \ - $(OPCODES) $(INTL_DEPS) $(LIBIBERTY) $(CONFIG_DEPS) $(LIBGNU) - -@@ -1016,6 +1017,7 @@ COMMON_SFILES = \ - dbxread.c \ - dcache.c \ - debug.c \ -+ debuginfod-support.c \ - dictionary.c \ - disasm.c \ - disasm-selftests.c \ -diff --git a/gdb/NEWS b/gdb/NEWS ---- a/gdb/NEWS -+++ b/gdb/NEWS -@@ -932,6 +932,20 @@ SH-5/SH64 running OpenBSD SH-5/SH64 support in sh*-*-openbsd* - manual for a further description of this feature. - - -+* GDB now supports debuginfod, an HTTP server for distributing ELF/DWARF -+ debugging information as well as source code. -+ -+ When built with debuginfod, GDB can automatically query debuginfod -+ servers for the separate debug files and source code of the executable -+ being debugged. -+ -+ To build GDB with debuginfod, pass --with-debuginfod to configure (this -+ requires libdebuginfod, the debuginfod client library). -+ -+ debuginfod is distributed with elfutils, starting with version 0.178. -+ -+ You can get the latest version from https://sourceware.org/elfutils. -+ - * New features in the GDB remote stub, GDBserver - - ** GDBserver is now able to start inferior processes with a -diff --git a/gdb/README b/gdb/README ---- a/gdb/README -+++ b/gdb/README -@@ -432,6 +432,15 @@ more obscure GDB `configure' options are not listed here. - Use the curses library instead of the termcap library, for - text-mode terminal operations. - -+`--with-debuginfod' -+ Build GDB 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/'. -+ - `--with-libunwind-ia64' - Use the libunwind library for unwinding function call stack on ia64 - target platforms. -diff --git a/gdb/config.in b/gdb/config.in ---- a/gdb/config.in -+++ b/gdb/config.in -@@ -230,6 +230,9 @@ - /* Define if you have the babeltrace library. */ - #undef HAVE_LIBBABELTRACE - -+/* Define to 1 if debuginfod is enabled. */ -+#undef HAVE_LIBDEBUGINFOD -+ - /* Define if you have the expat library. */ - #undef HAVE_LIBEXPAT - -diff --git a/gdb/configure b/gdb/configure ---- a/gdb/configure -+++ b/gdb/configure -@@ -758,6 +758,7 @@ REPORT_BUGS_TEXI - REPORT_BUGS_TO - PKGVERSION - CODESIGN_CERT -+LIBDEBUGINFOD - HAVE_NATIVE_GCORE_TARGET - TARGET_OBS - subdirs -@@ -875,6 +876,7 @@ enable_64_bit_bfd - enable_gdbmi - enable_tui - enable_gdbtk -+with_debuginfod - with_libunwind_ia64 - with_curses - enable_profiling -@@ -1611,6 +1613,8 @@ Optional Packages: - do not restrict auto-loaded files locations - --with-rpm query rpm database for missing debuginfos (yes/no, - def. auto=librpm.so) -+ --with-debuginfod Enable debuginfo lookups with debuginfod -+ (auto/yes/no) - --with-libunwind-ia64 use libunwind frame unwinding for ia64 targets - --with-curses use the curses library instead of the termcap - library -@@ -2271,6 +2275,52 @@ rm -f conftest.val - - } # ac_fn_c_compute_int - -+# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES -+# --------------------------------------------- -+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR -+# accordingly. -+ac_fn_c_check_decl () -+{ -+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack -+ as_decl_name=`echo $2|sed 's/ *(.*//'` -+ as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 -+$as_echo_n "checking whether $as_decl_name is declared... " >&6; } -+if eval \${$3+:} false; then : -+ $as_echo_n "(cached) " >&6 -+else -+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -+/* end confdefs.h. */ -+$4 -+int -+main () -+{ -+#ifndef $as_decl_name -+#ifdef __cplusplus -+ (void) $as_decl_use; -+#else -+ (void) $as_decl_name; -+#endif -+#endif -+ -+ ; -+ return 0; -+} -+_ACEOF -+if ac_fn_c_try_compile "$LINENO"; then : -+ eval "$3=yes" -+else -+ eval "$3=no" -+fi -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+fi -+eval ac_res=\$$3 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -+$as_echo "$ac_res" >&6; } -+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno -+ -+} # ac_fn_c_check_decl -+ - # ac_fn_c_check_func LINENO FUNC VAR - # ---------------------------------- - # Tests whether FUNC exists, setting the cache variable VAR accordingly -@@ -2449,52 +2499,6 @@ $as_echo "$ac_res" >&6; } - - } # ac_fn_c_check_type - --# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES --# --------------------------------------------- --# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR --# accordingly. --ac_fn_c_check_decl () --{ -- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack -- as_decl_name=`echo $2|sed 's/ *(.*//'` -- as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` -- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 --$as_echo_n "checking whether $as_decl_name is declared... " >&6; } --if eval \${$3+:} false; then : -- $as_echo_n "(cached) " >&6 --else -- cat confdefs.h - <<_ACEOF >conftest.$ac_ext --/* end confdefs.h. */ --$4 --int --main () --{ --#ifndef $as_decl_name --#ifdef __cplusplus -- (void) $as_decl_use; --#else -- (void) $as_decl_name; --#endif --#endif -- -- ; -- return 0; --} --_ACEOF --if ac_fn_c_try_compile "$LINENO"; then : -- eval "$3=yes" --else -- eval "$3=no" --fi --rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext --fi --eval ac_res=\$$3 -- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 --$as_echo "$ac_res" >&6; } -- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno -- --} # ac_fn_c_check_decl -- - # ac_fn_cxx_try_link LINENO - # ------------------------- - # Try to link conftest.$ac_ext, and return whether this succeeded. -@@ -6658,8 +6662,8 @@ $as_echo_n "checking specific librpm version... " >&6; } - if test "$cross_compiling" = yes; then : - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 - $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} --as_fn_error "cannot run test program while cross compiling --See \`config.log' for more details." "$LINENO" 5; } -+as_fn_error $? "cannot run test program while cross compiling -+See \`config.log' for more details" "$LINENO" 5; } - else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext - /* end confdefs.h. */ -@@ -6830,7 +6834,7 @@ $as_echo "#define HAVE_LIBRPM 1" >>confdefs.h - $as_echo "no" >&6; } - LIBS="$save_LIBS" - if $DLOPEN_REQUIRE; then -- as_fn_error "Specific name $LIBRPM was requested but it could not be opened." "$LINENO" 5 -+ as_fn_error $? "Specific name $LIBRPM was requested but it could not be opened." "$LINENO" 5 - fi - - -@@ -6845,7 +6849,7 @@ if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then - set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 - $as_echo_n "checking for $ac_word... " >&6; } --if test "${ac_cv_path_PKG_CONFIG+set}" = set; then : -+if ${ac_cv_path_PKG_CONFIG+:} false; then : - $as_echo_n "(cached) " >&6 - else - case $PKG_CONFIG in -@@ -6859,7 +6863,7 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 -@@ -6888,7 +6892,7 @@ if test -z "$ac_cv_path_PKG_CONFIG"; then - set dummy pkg-config; ac_word=$2 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 - $as_echo_n "checking for $ac_word... " >&6; } --if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then : -+if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : - $as_echo_n "(cached) " >&6 - else - case $ac_pt_PKG_CONFIG in -@@ -6902,7 +6906,7 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 -@@ -7086,7 +7090,7 @@ $as_echo "#define HAVE_LIBRPM 1" >>confdefs.h - LIBS="$LIBS $RPM_LIBS" - else - if $RPM_REQUIRE; then -- as_fn_error "$RPM_PKG_ERRORS" "$LINENO" 5 -+ as_fn_error $? "$RPM_PKG_ERRORS" "$LINENO" 5 - else - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $RPM_PKG_ERRORS" >&5 - $as_echo "$as_me: WARNING: $RPM_PKG_ERRORS" >&2;} -@@ -7332,8 +7336,92 @@ $as_echo "$as_me: WARNING: gdbtk isn't supported on $host; disabling" >&2;} - enable_gdbtk=no ;; - esac - --# Libunwind support for ia64. -+# Handle optional debuginfod support -+ -+# Enable debuginfod -+ -+# Check whether --with-debuginfod was given. -+if test "${with_debuginfod+set}" = set; then : -+ withval=$with_debuginfod; -+else -+ with_debuginfod=auto -+fi -+ -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use debuginfod" >&5 -+$as_echo_n "checking whether to use debuginfod... " >&6; } -+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_debuginfod" >&5 -+$as_echo "$with_debuginfod" >&6; } -+ -+if test "${with_debuginfod}" = no; then -+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: debuginfod support disabled; some features may be unavailable." >&5 -+$as_echo "$as_me: WARNING: debuginfod support disabled; some features may be unavailable." >&2;} -+else -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for debuginfod_begin in -ldebuginfod" >&5 -+$as_echo_n "checking for debuginfod_begin in -ldebuginfod... " >&6; } -+if ${ac_cv_lib_debuginfod_debuginfod_begin+:} false; then : -+ $as_echo_n "(cached) " >&6 -+else -+ ac_check_lib_save_LIBS=$LIBS -+LIBS="-ldebuginfod $LIBS" -+cat confdefs.h - <<_ACEOF >conftest.$ac_ext -+/* end confdefs.h. */ -+ -+/* Override any GCC internal prototype to avoid an error. -+ Use char because int might match the return type of a GCC -+ builtin and then its argument prototype would still apply. */ -+#ifdef __cplusplus -+extern "C" -+#endif -+char debuginfod_begin (); -+int -+main () -+{ -+return debuginfod_begin (); -+ ; -+ return 0; -+} -+_ACEOF -+if ac_fn_c_try_link "$LINENO"; then : -+ ac_cv_lib_debuginfod_debuginfod_begin=yes -+else -+ ac_cv_lib_debuginfod_debuginfod_begin=no -+fi -+rm -f core conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext -+LIBS=$ac_check_lib_save_LIBS -+fi -+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_debuginfod_debuginfod_begin" >&5 -+$as_echo "$ac_cv_lib_debuginfod_debuginfod_begin" >&6; } -+if test "x$ac_cv_lib_debuginfod_debuginfod_begin" = xyes; then : -+ have_debuginfod_lib=yes -+fi -+ -+ ac_fn_c_check_decl "$LINENO" "debuginfod_begin" "ac_cv_have_decl_debuginfod_begin" "#include -+" -+if test "x$ac_cv_have_decl_debuginfod_begin" = xyes; then : -+ have_debuginfod_h=yes -+fi -+ -+ if test "x$have_debuginfod_lib" = "xyes" -a \ -+ "x$have_debuginfod_h" = "xyes"; then -+ -+$as_echo "#define HAVE_LIBDEBUGINFOD 1" >>confdefs.h -+ -+ LIBDEBUGINFOD="-ldebuginfod" - -+ else -+ -+ if test "$with_debuginfod" = yes; then -+ as_fn_error $? "debuginfod is missing or unusable" "$LINENO" 5 -+ else -+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: debuginfod is missing or unusable; some features may be unavailable." >&5 -+$as_echo "$as_me: WARNING: debuginfod is missing or unusable; some features may be unavailable." >&2;} -+ fi -+ fi -+fi -+ -+ -+# Libunwind support for ia64. - - # Check whether --with-libunwind-ia64 was given. - if test "${with_libunwind_ia64+set}" = set; then : -@@ -16441,7 +16529,7 @@ _ACEOF - for ac_header in selinux/selinux.h - do : - ac_fn_c_check_header_mongrel "$LINENO" "selinux/selinux.h" "ac_cv_header_selinux_selinux_h" "$ac_includes_default" --if test "x$ac_cv_header_selinux_selinux_h" = x""yes; then : -+if test "x$ac_cv_header_selinux_selinux_h" = xyes; then : - cat >>confdefs.h <<_ACEOF - #define HAVE_SELINUX_SELINUX_H 1 - _ACEOF -@@ -16452,7 +16540,7 @@ done - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for security_get_boolean_active in -lselinux" >&5 - $as_echo_n "checking for security_get_boolean_active in -lselinux... " >&6; } --if test "${ac_cv_lib_selinux_security_get_boolean_active+set}" = set; then : -+if ${ac_cv_lib_selinux_security_get_boolean_active+:} false; then : - $as_echo_n "(cached) " >&6 - else - ac_check_lib_save_LIBS=$LIBS -@@ -16486,7 +16574,7 @@ LIBS=$ac_check_lib_save_LIBS - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_selinux_security_get_boolean_active" >&5 - $as_echo "$ac_cv_lib_selinux_security_get_boolean_active" >&6; } --if test "x$ac_cv_lib_selinux_security_get_boolean_active" = x""yes; then : -+if test "x$ac_cv_lib_selinux_security_get_boolean_active" = xyes; then : - cat >>confdefs.h <<_ACEOF - #define HAVE_LIBSELINUX 1 - _ACEOF -diff --git a/gdb/configure.ac b/gdb/configure.ac ---- a/gdb/configure.ac -+++ b/gdb/configure.ac -@@ -18,6 +18,8 @@ dnl along with this program. If not, see . - - dnl Process this file with autoconf to produce a configure script. - -+m4_include(../config/debuginfod.m4) -+ - AC_INIT(main.c) - AC_CONFIG_HEADERS(config.h:config.in, [echo > stamp-h]) - AM_MAINTAINER_MODE -@@ -516,8 +518,10 @@ case $host_os in - enable_gdbtk=no ;; - esac - --# Libunwind support for ia64. -+# Handle optional debuginfod support -+AC_DEBUGINFOD - -+# Libunwind support for ia64. - AC_ARG_WITH(libunwind-ia64, - AS_HELP_STRING([--with-libunwind-ia64], - [use libunwind frame unwinding for ia64 targets]),, -diff --git a/gdb/debuginfod-support.c b/gdb/debuginfod-support.c -new file mode 100644 ---- /dev/null -+++ b/gdb/debuginfod-support.c -@@ -0,0 +1,155 @@ -+/* debuginfod utilities for GDB. -+ Copyright (C) 2020 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 . */ -+ -+#include "defs.h" -+#include -+#include "cli/cli-style.h" -+#include "gdbsupport/scoped_fd.h" -+#include "debuginfod-support.h" -+ -+#ifndef HAVE_LIBDEBUGINFOD -+scoped_fd -+debuginfod_source_query (const unsigned char *build_id, -+ int build_id_len, -+ const char *srcpath, -+ gdb::unique_xmalloc_ptr *destname) -+{ -+ return scoped_fd (-ENOSYS); -+} -+ -+scoped_fd -+debuginfod_debuginfo_query (const unsigned char *build_id, -+ int build_id_len, -+ const char *filename, -+ gdb::unique_xmalloc_ptr *destname) -+{ -+ return scoped_fd (-ENOSYS); -+} -+#else -+#include -+ -+/* TODO: Use debuginfod API extensions instead of these globals. */ -+static std::string desc; -+static std::string fname; -+static bool has_printed; -+ -+static int -+progressfn (debuginfod_client *c, long cur, long total) -+{ -+ if (check_quit_flag ()) -+ { -+ printf_filtered ("Cancelling download of %s %ps...\n", -+ desc.c_str (), -+ styled_string (file_name_style.style (), fname.c_str ())); -+ return 1; -+ } -+ -+ if (!has_printed && total != 0) -+ { -+ /* Print this message only once. */ -+ has_printed = true; -+ printf_filtered ("Downloading %s %ps...\n", -+ desc.c_str (), -+ styled_string (file_name_style.style (), fname.c_str ())); -+ } -+ -+ return 0; -+} -+ -+static debuginfod_client * -+debuginfod_init () -+{ -+ debuginfod_client *c = debuginfod_begin (); -+ -+ if (c != nullptr) -+ debuginfod_set_progressfn (c, progressfn); -+ -+ return c; -+} -+ -+/* See debuginfod-support.h */ -+ -+scoped_fd -+debuginfod_source_query (const unsigned char *build_id, -+ int build_id_len, -+ const char *srcpath, -+ gdb::unique_xmalloc_ptr *destname) -+{ -+ if (getenv (DEBUGINFOD_URLS_ENV_VAR) == NULL) -+ return scoped_fd (-ENOSYS); -+ -+ debuginfod_client *c = debuginfod_init (); -+ -+ if (c == nullptr) -+ return scoped_fd (-ENOMEM); -+ -+ desc = std::string ("source file"); -+ fname = std::string (srcpath); -+ has_printed = false; -+ -+ scoped_fd fd (debuginfod_find_source (c, -+ build_id, -+ build_id_len, -+ srcpath, -+ nullptr)); -+ -+ /* TODO: Add 'set debug debuginfod' command to control when error messages are shown. */ -+ if (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)); -+ else -+ destname->reset (xstrdup (srcpath)); -+ -+ debuginfod_end (c); -+ return fd; -+} -+ -+/* See debuginfod-support.h */ -+ -+scoped_fd -+debuginfod_debuginfo_query (const unsigned char *build_id, -+ int build_id_len, -+ const char *filename, -+ gdb::unique_xmalloc_ptr *destname) -+{ -+ if (getenv (DEBUGINFOD_URLS_ENV_VAR) == NULL) -+ return scoped_fd (-ENOSYS); -+ -+ debuginfod_client *c = debuginfod_init (); -+ -+ if (c == nullptr) -+ return scoped_fd (-ENOMEM); -+ -+ desc = std::string ("separate debug info for"); -+ fname = std::string (filename); -+ has_printed = false; -+ char *dname = nullptr; -+ -+ scoped_fd fd (debuginfod_find_debuginfo (c, build_id, build_id_len, &dname)); -+ -+ if (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)); -+ -+ destname->reset (dname); -+ debuginfod_end (c); -+ return fd; -+} -+#endif -diff --git a/gdb/debuginfod-support.h b/gdb/debuginfod-support.h -new file mode 100644 ---- /dev/null -+++ b/gdb/debuginfod-support.h -@@ -0,0 +1,62 @@ -+/* debuginfod utilities for GDB. -+ Copyright (C) 2020 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 . */ -+ -+#ifndef DEBUGINFOD_SUPPORT_H -+#define DEBUGINFOD_SUPPORT_H -+ -+/* Query debuginfod servers for a source file associated with an -+ executable with BUILD_ID. BUILD_ID can be given as a binary blob or -+ a null-terminated string. If given as a binary blob, BUILD_ID_LEN -+ should be the number of bytes. If given as a null-terminated string, -+ BUILD_ID_LEN should be 0. -+ -+ SRC_PATH should be the source file's absolute path that includes the -+ compilation directory of the CU associated with the source file. -+ For example if a CU's compilation directory is `/my/build` and the -+ source file path is `/my/source/foo.c`, then SRC_PATH should be -+ `/my/build/../source/foo.c`. -+ -+ If the file is successfully retrieved, its path on the local machine -+ is stored in DESTNAME. If GDB is not built with debuginfod, this -+ function returns -ENOSYS. */ -+ -+extern scoped_fd -+debuginfod_source_query (const unsigned char *build_id, -+ int build_id_len, -+ const char *src_path, -+ gdb::unique_xmalloc_ptr *destname); -+ -+/* Query debuginfod servers for a debug info file with BUILD_ID. -+ BUILD_ID can be given as a binary blob or a null-terminated string. -+ If given as a binary blob, BUILD_ID_LEN should be the number of bytes. -+ If given as a null-terminated string, BUILD_ID_LEN should be 0. -+ -+ FILENAME should be the name or path of the main binary associated with -+ the separate debug info. It is used for printing messages to the user. -+ -+ If the file is successfully retrieved, its path on the local machine -+ is stored in DESTNAME. If GDB is not built with debuginfod, this -+ function returns -ENOSYS. */ -+ -+extern scoped_fd -+debuginfod_debuginfo_query (const unsigned char *build_id, -+ int build_id_len, -+ const char *filename, -+ gdb::unique_xmalloc_ptr *destname); -+ -+#endif /* DEBUGINFOD_SUPPORT_H */ -diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo ---- a/gdb/doc/gdb.texinfo -+++ b/gdb/doc/gdb.texinfo -@@ -37726,6 +37726,14 @@ supported). - 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/'. -+ - @item --with-libunwind-ia64 - Use the libunwind library for unwinding function call stack on ia64 - target platforms. See http://www.nongnu.org/libunwind/index.html for -diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c ---- a/gdb/dwarf2read.c -+++ b/gdb/dwarf2read.c -@@ -77,6 +77,7 @@ - #include "gdbsupport/selftest.h" - #include "rust-lang.h" - #include "gdbsupport/pathstuff.h" -+#include "debuginfod-support.h" - - /* When == 1, print basic high level tracing messages. - When > 1, be more verbose. -@@ -2717,6 +2718,29 @@ dwarf2_get_dwz_file (struct dwarf2_per_objfile *dwarf2_per_objfile) - dwz_bfd.reset (nullptr); - } - -+ if (dwz_bfd == nullptr) -+ { -+ gdb::unique_xmalloc_ptr alt_filename; -+ const char *origname = dwarf2_per_objfile->objfile->original_name; -+ -+ scoped_fd fd (debuginfod_debuginfo_query (buildid, -+ buildid_len, -+ origname, -+ &alt_filename)); -+ -+ if (fd.get () >= 0) -+ { -+ /* File successfully retrieved from server. */ -+ dwz_bfd = gdb_bfd_open (alt_filename.get (), gnutarget, -1); -+ -+ if (dwz_bfd == nullptr) -+ warning (_("File \"%s\" from debuginfod cannot be opened as bfd"), -+ alt_filename.get ()); -+ else if (!build_id_verify (dwz_bfd.get (), buildid_len, buildid)) -+ dwz_bfd.reset (nullptr); -+ } -+ } -+ - if (dwz_bfd == NULL) - dwz_bfd = build_id_to_debug_bfd (buildid_len, buildid, NULL); - -diff --git a/gdb/elfread.c b/gdb/elfread.c ---- a/gdb/elfread.c -+++ b/gdb/elfread.c -@@ -49,6 +49,8 @@ - #include "mdebugread.h" - #include "ctfread.h" - #include "gdbsupport/gdb_string_view.h" -+#include "gdbsupport/scoped_fd.h" -+#include "debuginfod-support.h" - - /* Forward declarations. */ - extern const struct sym_fns elf_sym_fns_gdb_index; -@@ -1313,12 +1315,42 @@ elf_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) - symbol_file_add_separate (debug_bfd.get (), debugfile.c_str (), - symfile_flags, objfile); - } -- /* Check if any separate debug info has been extracted out. */ -- else if (bfd_get_section_by_name (objfile->obfd, ".gnu_debuglink") -- != NULL) -- debug_print_missing (objfile_name (objfile), build_id_filename.get ()); - else -- has_dwarf2 = false; -+ { -+ has_dwarf2 = false; -+ const struct bfd_build_id *build_id = build_id_bfd_shdr_get (objfile->obfd); -+ -+ if (build_id != nullptr) -+ { -+ gdb::unique_xmalloc_ptr symfile_path; -+ scoped_fd fd (debuginfod_debuginfo_query (build_id->data, -+ build_id->size, -+ objfile->original_name, -+ &symfile_path)); -+ -+ if (fd.get () >= 0) -+ { -+ /* File successfully retrieved from server. */ -+ gdb_bfd_ref_ptr debug_bfd (symfile_bfd_open (symfile_path.get ())); -+ -+ if (debug_bfd == nullptr) -+ warning (_("File \"%s\" from debuginfod cannot be opened as bfd"), -+ objfile->original_name); -+ else if (build_id_verify (debug_bfd.get (), build_id->size, build_id->data)) -+ { -+ symbol_file_add_separate (debug_bfd.get (), symfile_path.get (), -+ symfile_flags, objfile); -+ has_dwarf2 = true; -+ } -+ } -+ /* Check if any separate debug info has been extracted out. */ -+ else if (bfd_get_section_by_name (objfile->obfd, ".gnu_debuglink") -+ != NULL) -+ debug_print_missing (objfile_name (objfile), build_id_filename.get ()); -+ else -+ has_dwarf2 = false; -+ } -+ } - } - - /* Read the CTF section only if there is no DWARF info. */ -diff --git a/gdb/source.c b/gdb/source.c ---- a/gdb/source.c -+++ b/gdb/source.c -@@ -47,6 +47,8 @@ - #include "gdbsupport/pathstuff.h" - #include "source-cache.h" - #include "cli/cli-style.h" -+#include "build-id.h" -+#include "debuginfod-support.h" - - #define OPEN_MODE (O_RDONLY | O_BINARY) - #define FDOPEN_MODE FOPEN_RB -@@ -1122,6 +1124,34 @@ open_source_file (struct symtab *s) - s->fullname = NULL; - scoped_fd fd = find_and_open_source (s->filename, SYMTAB_DIRNAME (s), - &fullname); -+ -+ if (fd.get () < 0) -+ { -+ if (SYMTAB_COMPUNIT (s) != nullptr) -+ { -+ const objfile *ofp = COMPUNIT_OBJFILE (SYMTAB_COMPUNIT (s)); -+ -+ std::string srcpath; -+ if (IS_ABSOLUTE_PATH (s->filename)) -+ srcpath = s->filename; -+ else if (SYMTAB_DIRNAME (s) != nullptr) -+ { -+ srcpath = SYMTAB_DIRNAME (s); -+ srcpath += SLASH_STRING; -+ srcpath += s->filename; -+ } -+ -+ const struct bfd_build_id *build_id = build_id_bfd_shdr_get (ofp->obfd); -+ -+ /* Query debuginfod for the source file. */ -+ if (build_id != nullptr) -+ fd = debuginfod_source_query (build_id->data, -+ build_id->size, -+ srcpath.c_str (), -+ &fullname); -+ } -+ } -+ - s->fullname = fullname.release (); - return fd; - } -diff --git a/gdb/testsuite/gdb.debuginfod/fetch_src_and_symbols.exp b/gdb/testsuite/gdb.debuginfod/fetch_src_and_symbols.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.debuginfod/fetch_src_and_symbols.exp -@@ -0,0 +1,215 @@ -+# Copyright 2020 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+# Test debuginfod functionality -+ -+standard_testfile main.c -+ -+load_lib dwarf.exp -+ -+if { [which debuginfod] == 0 } { -+ untested "cannot find debuginfod" -+ return -1 -+} -+ -+if { [which curl] == 0 } { -+ untested "cannot find curl" -+ return -1 -+} -+ -+# Skip testing if gdb was not configured with debuginfod -+if { [string first "with-debuginfod" \ -+ [eval exec $GDB $INTERNAL_GDBFLAGS --configuration]] == -1 } { -+ untested "gdb not configured with debuginfod" -+ return -1 -+} -+ -+set cache [standard_output_file ".client_cache"] -+set db [standard_output_file ".debuginfod.db"] -+ -+# Delete any preexisting test files -+file delete -force $cache -+file delete -force $db -+ -+set sourcetmp [standard_output_file tmp-${srcfile}] -+set outputdir [standard_output_file {}] -+ -+# Make a copy source file that we can move around -+if { [catch {file copy -force ${srcdir}/${subdir}/${srcfile} \ -+ [standard_output_file ${sourcetmp}]}] != 0 } { -+ error "create temporary file" -+ return -1 -+} -+ -+if { [gdb_compile "$sourcetmp" "$binfile" executable {debug}] != "" } { -+ fail "compile" -+ return -1 -+} -+ -+setenv DEBUGINFOD_URLS "" -+setenv DEBUGINFOD_TIMEOUT 30 -+setenv DEBUGINFOD_CACHE_PATH $cache -+ -+# Test that gdb cannot find source without debuginfod -+clean_restart $binfile -+gdb_test_no_output "set substitute-path $outputdir /dev/null" -+gdb_test "list" ".*No such file or directory.*" -+ -+# Strip symbols into separate file and move it so gdb cannot find it without debuginfod -+if { [gdb_gnu_strip_debug $binfile ""] != 0 } { -+ fail "strip debuginfo" -+ return -1 -+} -+ -+set debugdir [standard_output_file "debug"] -+set debuginfo [standard_output_file "fetch_src_and_symbols.debug"] -+ -+file mkdir $debugdir -+file rename -force $debuginfo $debugdir -+ -+# Test that gdb cannot find symbols without debuginfod -+clean_restart $binfile -+gdb_test "file" ".*No symbol file.*" -+ -+# Write some assembly that just has a .gnu_debugaltlink section. -+# Copied from testsuite/gdb.dwarf2/dwzbuildid.exp. -+proc write_just_debugaltlink {filename dwzname buildid} { -+ set asm_file [standard_output_file $filename] -+ -+ Dwarf::assemble $asm_file { -+ upvar dwzname dwzname -+ upvar buildid buildid -+ -+ gnu_debugaltlink $dwzname $buildid -+ -+ # Only the DWARF reader checks .gnu_debugaltlink, so make sure -+ # there is a bit of DWARF in here. -+ cu {} { -+ compile_unit {{language @DW_LANG_C}} { -+ } -+ } -+ } -+} -+ -+# Write some DWARF that also sets the buildid. -+# Copied from testsuite/gdb.dwarf2/dwzbuildid.exp. -+proc write_dwarf_file {filename buildid {value 99}} { -+ set asm_file [standard_output_file $filename] -+ -+ Dwarf::assemble $asm_file { -+ declare_labels int_label int_label2 -+ -+ upvar buildid buildid -+ upvar value value -+ -+ build_id $buildid -+ -+ cu {} { -+ compile_unit {{language @DW_LANG_C}} { -+ int_label2: base_type { -+ {name int} -+ {byte_size 4 sdata} -+ {encoding @DW_ATE_signed} -+ } -+ -+ constant { -+ {name the_int} -+ {type :$int_label2} -+ {const_value $value data1} -+ } -+ } -+ } -+ } -+} -+ -+set buildid "01234567890abcdef0123456" -+ -+write_just_debugaltlink ${binfile}_has_altlink.S ${binfile}_dwz.o $buildid -+write_dwarf_file ${binfile}_dwz.S $buildid -+ -+if {[gdb_compile ${binfile}_has_altlink.S ${binfile}_alt.o object nodebug] != ""} { -+ fail "compile main with altlink" -+ return -1 -+} -+ -+if {[gdb_compile ${binfile}_dwz.S ${binfile}_dwz.o object nodebug] != ""} { -+ fail "compile altlink" -+ return -1 -+} -+ -+file rename -force ${binfile}_dwz.o $debugdir -+ -+# Test that gdb cannot find dwz without debuginfod. -+clean_restart -+gdb_test "file ${binfile}_alt.o" ".*could not find '.gnu_debugaltlink'.*" -+ -+# Find an unused port -+set port 7999 -+set found 0 -+while { ! $found } { -+ incr port -+ if { $port == 65536 } { -+ fail "no available ports" -+ return -1 -+ } -+ -+ spawn debuginfod -vvvv -d $db -p $port -F $debugdir -+ expect { -+ "started http server on IPv4 IPv6 port=$port" { set found 1 } -+ "failed to bind to port" { kill_wait_spawned_process $spawn_id } -+ timeout { -+ fail "find port timeout" -+ return -1 -+ } -+ } -+} -+ -+set metrics [list "ready 1" \ -+ "thread_work_total{role=\"traverse\"} 1" \ -+ "thread_work_pending{role=\"scan\"} 0" \ -+ "thread_busy{role=\"scan\"} 0"] -+ -+# Check server metrics to confirm init has completed. -+foreach m $metrics { -+ set timelim 20 -+ while { $timelim != 0 } { -+ sleep 0.5 -+ catch {exec curl -s http://127.0.0.1:$port/metrics} got -+ -+ if { [regexp $m $got] } { -+ break -+ } -+ -+ incr timelim -1 -+ } -+ -+ if { $timelim == 0 } { -+ fail "server init timeout" -+ return -1 -+ } -+} -+ -+# Point the client to the server -+setenv DEBUGINFOD_URLS http://127.0.0.1:$port -+ -+# gdb should now find the symbol and source files -+clean_restart $binfile -+gdb_test_no_output "set substitute-path $outputdir /dev/null" -+gdb_test "br main" "Breakpoint 1 at.*file.*" -+gdb_test "l" ".*This program is distributed in the hope.*" -+ -+# gdb should now find the debugaltlink file -+clean_restart -+gdb_test "file ${binfile}_alt.o" ".*Reading symbols from ${binfile}_alt.o\.\.\.*" -diff --git a/gdb/testsuite/gdb.debuginfod/main.c b/gdb/testsuite/gdb.debuginfod/main.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.debuginfod/main.c -@@ -0,0 +1,25 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2020 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 . */ -+ -+/* Dummy main function. */ -+ -+int -+main() -+{ -+ asm ("main_label: .globl main_label"); -+ return 0; -+} -diff --git a/gdb/top.c b/gdb/top.c ---- a/gdb/top.c -+++ b/gdb/top.c -@@ -1513,6 +1513,17 @@ This GDB was configured as follows:\n\ - --without-python\n\ - ")); - #endif -+ -+#if HAVE_LIBDEBUGINFOD -+ fprintf_filtered (stream, _("\ -+ --with-debuginfod\n\ -+")); -+#else -+ fprintf_filtered (stream, _("\ -+ --without-debuginfod\n\ -+")); -+#endif -+ - #if HAVE_GUILE - fprintf_filtered (stream, _("\ - --with-guile\n\ diff --git a/gdb-rhbz1844458-use-fputX_unfiltered.patch b/gdb-rhbz1844458-use-fputX_unfiltered.patch deleted file mode 100644 index 1acf7a5..0000000 --- a/gdb-rhbz1844458-use-fputX_unfiltered.patch +++ /dev/null @@ -1,120 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Sergio Durigan Junior -Date: Wed, 19 Feb 2020 16:40:48 -0500 -Subject: gdb-rhbz1844458-use-fputX_unfiltered.patch - -;; Fix fput?_unfiltered functions -;; RH BZ 1844458 (Sergio Durigan Junior and Tom Tromey) - -Make '{putchar,fputc}_unfiltered' use 'fputs_unfiltered' - -There is currently a regression when using -'{putchar,fputc}_unfiltered' with 'puts_unfiltered' which was -introduced by one of the commits that reworked the unfiltered print -code. - -The regression makes it impossible to use '{putchar,fputc}_unfiltered' -with 'puts_unfiltered', because the former writes directly to the -ui_file stream using 'stream->write', while the latter uses a buffered -mechanism (see 'wrap_buffer') and delays the printing. - -If you do a quick & dirty hack on e.g. top.c:show_gdb_datadir: - - @@ -2088,6 +2088,13 @@ static void - show_gdb_datadir (struct ui_file *file, int from_tty, - struct cmd_list_element *c, const char *value) - { - + putchar_unfiltered ('\n'); - + puts_unfiltered ("TEST"); - + putchar_unfiltered ('>'); - + puts_unfiltered ("PUTS"); - + puts_unfiltered ("PUTS"); - + putchar_unfiltered ('\n'); - -rebuild GDB and invoke the "show data-directory" command, you will -see: - - (gdb) show data-directory - - > - TESTPUTSGDB's data directory is "/usr/local/share/gdb". - -Note how the '>' was printed before the output, and "TEST" and "PUTS" -were printed together. - -My first attempt to fix this was to always call 'flush_wrap_buffer' at -the end of 'fputs_maybe_filtered', since it seemed to me that the -function should always print what was requested. But I wasn't sure -this was the right thing to do, so I talked to Tom on IRC and he gave -me another, simpler idea: make '{putchar,fputc}_unfiltered' call into -the already existing 'fputs_unfiltered' function. - -This patch implements the idea. I regtested it on the Buildbot, and -no regressions were detected. - -gdb/ChangeLog: -2020-02-20 Sergio Durigan Junior - Tom Tromey - - * utils.c (fputs_maybe_filtered): Call 'stream->puts' instead - of 'fputc_unfiltered'. - (putchar_unfiltered): Call 'fputc_unfiltered'. - (fputc_unfiltered): Call 'fputs_unfiltered'. - -diff --git a/gdb/utils.c b/gdb/utils.c ---- a/gdb/utils.c -+++ b/gdb/utils.c -@@ -1783,7 +1783,12 @@ fputs_maybe_filtered (const char *linebuffer, struct ui_file *stream, - newline -- if chars_per_line is right, we - probably just overflowed anyway; if it's wrong, - let us keep going. */ -- fputc_unfiltered ('\n', stream); -+ /* XXX: The ideal thing would be to call -+ 'stream->putc' here, but we can't because it -+ currently calls 'fputc_unfiltered', which ends up -+ calling us, which generates an infinite -+ recursion. */ -+ stream->puts ("\n"); - } - else - { -@@ -1828,7 +1833,12 @@ fputs_maybe_filtered (const char *linebuffer, struct ui_file *stream, - wrap_here ((char *) 0); /* Spit out chars, cancel - further wraps. */ - lines_printed++; -- fputc_unfiltered ('\n', stream); -+ /* XXX: The ideal thing would be to call -+ 'stream->putc' here, but we can't because it -+ currently calls 'fputc_unfiltered', which ends up -+ calling us, which generates an infinite -+ recursion. */ -+ stream->puts ("\n"); - lineptr++; - } - } -@@ -1923,10 +1933,7 @@ fputs_highlighted (const char *str, const compiled_regex &highlight, - int - putchar_unfiltered (int c) - { -- char buf = c; -- -- ui_file_write (gdb_stdout, &buf, 1); -- return c; -+ return fputc_unfiltered (c, gdb_stdout); - } - - /* Write character C to gdb_stdout using GDB's paging mechanism and return C. -@@ -1941,9 +1948,11 @@ putchar_filtered (int c) - int - fputc_unfiltered (int c, struct ui_file *stream) - { -- char buf = c; -+ char buf[2]; - -- ui_file_write (stream, &buf, 1); -+ buf[0] = c; -+ buf[1] = 0; -+ fputs_unfiltered (buf, stream); - return c; - } - diff --git a/gdb-rhbz1869484-deleted-working-directory b/gdb-rhbz1869484-deleted-working-directory deleted file mode 100644 index f9584ea..0000000 --- a/gdb-rhbz1869484-deleted-working-directory +++ /dev/null @@ -1,240 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Kevin Buettner -Date: Thu, 20 Aug 2020 20:52:12 -0700 -Subject: gdb-rhbz1869484-deleted-working-directory - -;; Backport patches fixing abort when working directory is deleted. - -Guard against 'current_directory == NULL' on gdb_abspath (PR gdb/23613) - -Ref.: https://bugzilla.redhat.com/show_bug.cgi?id=1728147 -Ref.: https://sourceware.org/bugzilla/show_bug.cgi?id=23613 - -Hi, - -This bug has been reported against Fedora GDB, but there's also an -upstream bug. The problem reported is that GDB segfaults when the -working directory is deleted. It's pretty use to reproduce it: - - mkdir bla - cd bla - rmdir ../bla - gdb echo - -Debugging the problem is a bit tricky, because, since the current -directory doesn't exist anymore, a corefile cannot be saved there. -After a few attempts, I came up with the following: - - gdb -ex 'shell mkdir bla' -ex 'cd bla' -ex 'shell rmdir ../bla' -ex 'r echo' ./gdb/gdb - -This assumes that you're inside a build directory which contains -./gdb/gdb, of course. - -After investigating it, I found that the problem happens at -gdb_abspath, where we're dereferencing 'current_directory' without -checking if it's NULL: - - ... - (concat (current_directory, - IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1]) - ? "" : SLASH_STRING, - ... - -So I fixed the problem with the patch below. The idea is that, if -'current_directory' is NULL, then the final string returned should be -just the "path". - -After fixing the bug, I found a similar one reported against our -bugzilla: PR gdb/23613. The problem is the same, but the reproducer -is a bit different. - -I really tried writing a testcase for this, but unfortunately it's -apparently not possible to start GDB inside a non-existent directory -with DejaGNU. - -I regression tested this patch on the BuildBot, and no regressions -were found. - -gdb/ChangeLog: -2019-12-14 Sergio Durigan Junior - - https://bugzilla.redhat.com/show_bug.cgi?id=1728147 - PR gdb/23613 - * bsd-kvm.c (bsd_kvm_target_open): Use 'gdb_abspath'. - * corelow.c: Include 'gdbsupport/pathstuff.h'. - (core_target_open): Use 'gdb_abspath'. - * gdbsupport/pathstuff.c (gdb_abspath): Guard against - 'current_directory == NULL' case. - * gdbsupport/pathstuff.h (gdb_abspath): Expand comment and - explain what happens when 'current_directory' is NULL. - * go32-nat.c (go32_nat_target::wait): Check if - 'current_directory' is NULL before call to 'chdir'. - * source.c (add_path): Use 'gdb_abspath'. - * top.c: Include 'gdbsupport/pathstuff.h'. - (init_history): Use 'gdb_abspath'. - (set_history_filename): Likewise. - * tracefile-tfile.c: Include 'gdbsupport/pathstuff.h'. - (tfile_target_open): Use 'gdb_abspath'. - -Change-Id: Ibb0932fa25bc5c2d3ae4a7f64bd7f32885ca403b - -diff --git a/gdb/bsd-kvm.c b/gdb/bsd-kvm.c ---- a/gdb/bsd-kvm.c -+++ b/gdb/bsd-kvm.c -@@ -114,14 +114,13 @@ bsd_kvm_target_open (const char *arg, int from_tty) - - if (arg) - { -- char *temp; -- - filename = tilde_expand (arg); - if (filename[0] != '/') - { -- temp = concat (current_directory, "/", filename, (char *)NULL); -+ gdb::unique_xmalloc_ptr temp (gdb_abspath (filename)); -+ - xfree (filename); -- filename = temp; -+ filename = temp.release (); - } - } - -diff --git a/gdb/corelow.c b/gdb/corelow.c ---- a/gdb/corelow.c -+++ b/gdb/corelow.c -@@ -48,6 +48,7 @@ - #include "completer.h" - #include "gdbsupport/filestuff.h" - #include "build-id.h" -+#include "gdbsupport/pathstuff.h" - - #ifndef O_LARGEFILE - #define O_LARGEFILE 0 -@@ -407,8 +408,7 @@ core_target_open (const char *arg, int from_tty) - - gdb::unique_xmalloc_ptr filename (tilde_expand (arg)); - if (!IS_ABSOLUTE_PATH (filename.get ())) -- filename.reset (concat (current_directory, "/", -- filename.get (), (char *) NULL)); -+ filename = gdb_abspath (filename.get ()); - - flags = O_BINARY | O_LARGEFILE; - if (write_files) -diff --git a/gdb/gdbsupport/pathstuff.c b/gdb/gdbsupport/pathstuff.c ---- a/gdb/gdbsupport/pathstuff.c -+++ b/gdb/gdbsupport/pathstuff.c -@@ -134,7 +134,7 @@ gdb_abspath (const char *path) - if (path[0] == '~') - return gdb_tilde_expand_up (path); - -- if (IS_ABSOLUTE_PATH (path)) -+ if (IS_ABSOLUTE_PATH (path) || current_directory == NULL) - return make_unique_xstrdup (path); - - /* Beware the // my son, the Emacs barfs, the botch that catch... */ -diff --git a/gdb/gdbsupport/pathstuff.h b/gdb/gdbsupport/pathstuff.h ---- a/gdb/gdbsupport/pathstuff.h -+++ b/gdb/gdbsupport/pathstuff.h -@@ -44,7 +44,10 @@ extern gdb::unique_xmalloc_ptr - - Contrary to "gdb_realpath", this function uses CURRENT_DIRECTORY - for the path expansion. This may lead to scenarios the current -- working directory (CWD) is different than CURRENT_DIRECTORY. */ -+ working directory (CWD) is different than CURRENT_DIRECTORY. -+ -+ If CURRENT_DIRECTORY is NULL, this function returns a copy of -+ PATH. */ - - extern gdb::unique_xmalloc_ptr gdb_abspath (const char *path); - -diff --git a/gdb/go32-nat.c b/gdb/go32-nat.c ---- a/gdb/go32-nat.c -+++ b/gdb/go32-nat.c -@@ -507,7 +507,8 @@ go32_nat_target::wait (ptid_t ptid, struct target_waitstatus *status, - } - - getcwd (child_cwd, sizeof (child_cwd)); /* in case it has changed */ -- chdir (current_directory); -+ if (current_directory != NULL) -+ chdir (current_directory); - - if (a_tss.tss_irqn == 0x21) - { -diff --git a/gdb/source.c b/gdb/source.c ---- a/gdb/source.c -+++ b/gdb/source.c -@@ -542,8 +542,7 @@ add_path (const char *dirname, char **which_path, int parse_separators) - new_name_holder.reset (concat (name, ".", (char *) NULL)); - #endif - else if (!IS_ABSOLUTE_PATH (name) && name[0] != '$') -- new_name_holder.reset (concat (current_directory, SLASH_STRING, name, -- (char *) NULL)); -+ new_name_holder = gdb_abspath (name); - else - new_name_holder.reset (savestring (name, p - name)); - name = new_name_holder.get (); -diff --git a/gdb/top.c b/gdb/top.c ---- a/gdb/top.c -+++ b/gdb/top.c -@@ -54,6 +54,7 @@ - #include "gdb_select.h" - #include "gdbsupport/scope-exit.h" - #include "gdbarch.h" -+#include "gdbsupport/pathstuff.h" - - /* readline include files. */ - #include "readline/readline.h" -@@ -2020,12 +2021,13 @@ init_history (void) - that was read. */ - #ifdef __MSDOS__ - /* No leading dots in file names are allowed on MSDOS. */ -- history_filename = concat (current_directory, "/_gdb_history", -- (char *)NULL); -+ const char *fname = "_gdb_history"; - #else -- history_filename = concat (current_directory, "/.gdb_history", -- (char *)NULL); -+ const char *fname = ".gdb_history"; - #endif -+ -+ gdb::unique_xmalloc_ptr temp (gdb_abspath (fname)); -+ history_filename = temp.release (); - } - read_history (history_filename); - } -@@ -2103,8 +2105,12 @@ set_history_filename (const char *args, - directories the file written will be the same as the one - that was read. */ - if (!IS_ABSOLUTE_PATH (history_filename)) -- history_filename = reconcat (history_filename, current_directory, "/", -- history_filename, (char *) NULL); -+ { -+ gdb::unique_xmalloc_ptr temp (gdb_abspath (history_filename)); -+ -+ xfree (history_filename); -+ history_filename = temp.release (); -+ } - } - - static void -diff --git a/gdb/tracefile-tfile.c b/gdb/tracefile-tfile.c ---- a/gdb/tracefile-tfile.c -+++ b/gdb/tracefile-tfile.c -@@ -32,6 +32,7 @@ - #include "xml-tdesc.h" - #include "target-descriptions.h" - #include "gdbsupport/buffer.h" -+#include "gdbsupport/pathstuff.h" - #include - - #ifndef O_LARGEFILE -@@ -470,8 +471,7 @@ tfile_target_open (const char *arg, int from_tty) - - gdb::unique_xmalloc_ptr filename (tilde_expand (arg)); - if (!IS_ABSOLUTE_PATH (filename.get ())) -- filename.reset (concat (current_directory, "/", filename.get (), -- (char *) NULL)); -+ filename = gdb_abspath (filename.get ()); - - flags = O_BINARY | O_LARGEFILE; - flags |= O_RDONLY; diff --git a/gdb-runtest-pie-override.patch b/gdb-runtest-pie-override.patch index cd0ca0c..25c2bb8 100644 --- a/gdb-runtest-pie-override.patch +++ b/gdb-runtest-pie-override.patch @@ -25,7 +25,7 @@ a problem with make -j parallelization of the testsuite. diff --git a/gdb/testsuite/lib/future.exp b/gdb/testsuite/lib/future.exp --- a/gdb/testsuite/lib/future.exp +++ b/gdb/testsuite/lib/future.exp -@@ -195,6 +195,10 @@ proc gdb_default_target_compile {source destfile type options} { +@@ -197,6 +197,10 @@ proc gdb_default_target_compile_1 {source destfile type options} { set ldflags "" set dest [target_info name] @@ -36,7 +36,7 @@ diff --git a/gdb/testsuite/lib/future.exp b/gdb/testsuite/lib/future.exp if {[info exists CFLAGS_FOR_TARGET]} { append add_flags " $CFLAGS_FOR_TARGET" } -@@ -529,10 +533,6 @@ proc gdb_default_target_compile {source destfile type options} { +@@ -531,10 +535,6 @@ proc gdb_default_target_compile_1 {source destfile type options} { } } diff --git a/gdb-vla-intel-fix-print-char-array.patch b/gdb-vla-intel-fix-print-char-array.patch index ce2035c..20508da 100644 --- a/gdb-vla-intel-fix-print-char-array.patch +++ b/gdb-vla-intel-fix-print-char-array.patch @@ -22,15 +22,13 @@ And adjust its testcase. diff --git a/gdb/f-valprint.c b/gdb/f-valprint.c --- a/gdb/f-valprint.c +++ b/gdb/f-valprint.c -@@ -319,8 +319,22 @@ f_val_print (struct type *type, int embedded_offset, - original_value, &opts, 0, stream); +@@ -310,7 +310,21 @@ f_value_print_inner (struct value *val, struct ui_file *stream, int recurse, + value_print_scalar_formatted (val, &opts, 0, stream); } else -- val_print_scalar_formatted (type, embedded_offset, -- original_value, options, 0, stream); +- value_print_scalar_formatted (val, options, 0, stream); + { -+ val_print_scalar_formatted (type, embedded_offset, -+ original_value, options, 0, stream); ++ value_print_scalar_formatted (val, options, 0, stream); + /* C and C++ has no single byte int type, char is used instead. + Since we don't know whether the value is really intended to + be used as an integer or a character, print the character @@ -40,7 +38,7 @@ diff --git a/gdb/f-valprint.c b/gdb/f-valprint.c + LONGEST c; + + fputs_filtered (" ", stream); -+ c = unpack_long (type, valaddr + embedded_offset); ++ c = unpack_long (type, valaddr); + LA_PRINT_CHAR ((unsigned char) c, type, stream); + } + } @@ -50,7 +48,7 @@ diff --git a/gdb/f-valprint.c b/gdb/f-valprint.c diff --git a/gdb/testsuite/gdb.fortran/printing-types.exp b/gdb/testsuite/gdb.fortran/printing-types.exp --- a/gdb/testsuite/gdb.fortran/printing-types.exp +++ b/gdb/testsuite/gdb.fortran/printing-types.exp -@@ -29,7 +29,7 @@ if {![runto MAIN__]} then { +@@ -30,7 +30,7 @@ if {![fortran_runto_main]} then { gdb_breakpoint [gdb_get_line_number "write"] gdb_continue_to_breakpoint "write" diff --git a/gdb-vla-intel-fortran-strides.patch b/gdb-vla-intel-fortran-strides.patch index 4f468eb..32f8bdb 100644 --- a/gdb-vla-intel-fortran-strides.patch +++ b/gdb-vla-intel-fortran-strides.patch @@ -37,7 +37,7 @@ dbfd7140bf4c0500d1f5d192be781f83f78f7922 diff --git a/gdb/eval.c b/gdb/eval.c --- a/gdb/eval.c +++ b/gdb/eval.c -@@ -372,29 +372,324 @@ init_array_element (struct value *array, struct value *element, +@@ -371,29 +371,323 @@ init_array_element (struct value *array, struct value *element, return index; } @@ -56,16 +56,16 @@ diff --git a/gdb/eval.c b/gdb/eval.c { - int pc = (*pos) + 1; - LONGEST low_bound, high_bound; -- struct type *range = check_typedef (TYPE_INDEX_TYPE (value_type (array))); +- struct type *range = check_typedef (value_type (array)->index_type ()); - enum range_type range_type - = (enum range_type) longest_to_int (exp->elts[pc].longconst); - - *pos += 3; - - if (range_type == LOW_BOUND_DEFAULT || range_type == BOTH_BOUND_DEFAULT) -- low_bound = TYPE_LOW_BOUND (range); +- low_bound = range->bounds ()->low.const_val (); - else -- low_bound = value_as_long (evaluate_subexp (NULL_TYPE, exp, pos, noside)); +- low_bound = value_as_long (evaluate_subexp (nullptr, exp, pos, noside)); + int i, dim_count = 0; + struct value *new_array = array; + struct type *array_type = check_typedef (value_type (new_array)); @@ -139,16 +139,16 @@ diff --git a/gdb/eval.c b/gdb/eval.c + upper bound. */ + if ((range->f90_range_type & SUBARRAY_LOW_BOUND) + == SUBARRAY_LOW_BOUND) -+ range->low = value_as_long (evaluate_subexp (NULL_TYPE, exp, ++ range->low = value_as_long (evaluate_subexp (nullptr, exp, + pos, noside)); + if ((range->f90_range_type & SUBARRAY_HIGH_BOUND) + == SUBARRAY_HIGH_BOUND) -+ range->high = value_as_long (evaluate_subexp (NULL_TYPE, exp, ++ range->high = value_as_long (evaluate_subexp (nullptr, exp, + pos, noside)); + + /* Assign the user's stride value if provided. */ + if ((range->f90_range_type & SUBARRAY_STRIDE) == SUBARRAY_STRIDE) -+ range->stride = value_as_long (evaluate_subexp (NULL_TYPE, exp, ++ range->stride = value_as_long (evaluate_subexp (nullptr, exp, + pos, noside)); + + /* Assign the default stride value '1'. */ @@ -156,9 +156,9 @@ diff --git a/gdb/eval.c b/gdb/eval.c + range->stride = 1; - if (range_type == HIGH_BOUND_DEFAULT || range_type == BOTH_BOUND_DEFAULT) -- high_bound = TYPE_HIGH_BOUND (range); +- high_bound = range->bounds ()->high.const_val (); - else -- high_bound = value_as_long (evaluate_subexp (NULL_TYPE, exp, pos, noside)); +- high_bound = value_as_long (evaluate_subexp (nullptr, exp, pos, noside)); + /* Check the provided stride value is illegal, aka '0'. */ + if (range->stride == 0) + error (_("Stride must not be 0")); @@ -183,7 +183,7 @@ diff --git a/gdb/eval.c b/gdb/eval.c + for (i = nargs - 1; i >= 0; i--) + { + struct subscript_store *index = &subscript_array[i]; -+ struct type *index_type = TYPE_INDEX_TYPE (array_type); ++ struct type *index_type = array_type->index_type (); + + switch (index->kind) + { @@ -199,17 +199,17 @@ diff --git a/gdb/eval.c b/gdb/eval.c + /* If no lower bound was provided by the user, we take the + default boundary. Same for the high bound. */ + if ((range->f90_range_type & SUBARRAY_LOW_BOUND) == 0) -+ range->low = TYPE_LOW_BOUND (index_type); ++ range->low = index_type->bounds ()->low.const_val (); + + if ((range->f90_range_type & SUBARRAY_HIGH_BOUND) == 0) -+ range->high = TYPE_HIGH_BOUND (index_type); ++ range->high = index_type->bounds ()->high.const_val (); + + /* Both user provided low and high bound have to be inside the + array bounds. Throw an error if not. */ -+ if (range->low < TYPE_LOW_BOUND (index_type) -+ || range->low > TYPE_HIGH_BOUND (index_type) -+ || range->high < TYPE_LOW_BOUND (index_type) -+ || range->high > TYPE_HIGH_BOUND (index_type)) ++ if (range->low < index_type->bounds ()->low.const_val () ++ || range->low > index_type->bounds ()->high.const_val () ++ || range->high < index_type->bounds ()->low.const_val () ++ || range->high > index_type->bounds ()->high.const_val ()) + error (_("provided bound(s) outside array bound(s)")); + + /* For a negative stride the lower boundary must be larger than the @@ -241,7 +241,7 @@ diff --git a/gdb/eval.c b/gdb/eval.c + for (i = nargs - 1; i >= 0; i--) + { + struct subscript_store *index = &subscript_array[i]; -+ struct type *index_type = TYPE_INDEX_TYPE (array_type); ++ struct type *index_type = array_type->index_type (); + + switch (index->kind) + { @@ -289,12 +289,12 @@ diff --git a/gdb/eval.c b/gdb/eval.c + cannot do the range checks for us. So we have to make sure + ourselves that the user provided index is inside the + array bounds. Throw an error if not. */ -+ if (index->U.number < TYPE_LOW_BOUND (index_type) -+ && index->U.number > TYPE_HIGH_BOUND (index_type)) ++ if (index->U.number < index_type->bounds ()->low.const_val () ++ && index->U.number > index_type->bounds ()->high.const_val ()) + error (_("provided bound(s) outside array bound(s)")); + -+ if (index->U.number > TYPE_LOW_BOUND (index_type) -+ && index->U.number > TYPE_HIGH_BOUND (index_type)) ++ if (index->U.number > index_type->bounds ()->low.const_val () ++ && index->U.number > index_type->bounds ()->high.const_val ()) + error (_("provided bound(s) outside array bound(s)")); + + new_array = value_slice_1 (new_array, @@ -364,8 +364,7 @@ diff --git a/gdb/eval.c b/gdb/eval.c + elt_type, + range_type); + -+ TYPE_CODE (interim_array_type) -+ = TYPE_CODE (value_type (new_array)); ++ interim_array_type->set_code ( value_type (new_array)->code ()); + + v = allocate_value (interim_array_type); + @@ -381,7 +380,7 @@ diff --git a/gdb/eval.c b/gdb/eval.c } -@@ -1235,19 +1530,6 @@ evaluate_funcall (type *expect_type, expression *exp, int *pos, +@@ -1233,19 +1527,6 @@ evaluate_funcall (type *expect_type, expression *exp, int *pos, return eval_call (exp, noside, nargs, argvec, var_func_name, expect_type); } @@ -395,13 +394,13 @@ diff --git a/gdb/eval.c b/gdb/eval.c - enum noside noside) -{ - for (int i = 0; i < nargs; ++i) -- evaluate_subexp (NULL_TYPE, exp, pos, noside); +- evaluate_subexp (nullptr, exp, pos, noside); -} - - struct value * - evaluate_subexp_standard (struct type *expect_type, - struct expression *exp, int *pos, -@@ -1942,33 +2224,8 @@ evaluate_subexp_standard (struct type *expect_type, + /* Return true if type is integral or reference to integral */ + + static bool +@@ -1953,33 +2234,8 @@ evaluate_subexp_standard (struct type *expect_type, switch (code) { case TYPE_CODE_ARRAY: @@ -436,7 +435,7 @@ diff --git a/gdb/eval.c b/gdb/eval.c case TYPE_CODE_PTR: case TYPE_CODE_FUNC: -@@ -2388,49 +2645,6 @@ evaluate_subexp_standard (struct type *expect_type, +@@ -2400,49 +2656,6 @@ evaluate_subexp_standard (struct type *expect_type, } return (arg1); @@ -484,22 +483,22 @@ diff --git a/gdb/eval.c b/gdb/eval.c - } - case BINOP_LOGICAL_AND: - arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside); + arg1 = evaluate_subexp (nullptr, exp, pos, noside); if (noside == EVAL_SKIP) -@@ -3350,6 +3564,9 @@ calc_f77_array_dims (struct type *array_type) +@@ -3360,6 +3573,9 @@ calc_f77_array_dims (struct type *array_type) int ndimen = 1; struct type *tmp_type; -+ if (TYPE_CODE (array_type) == TYPE_CODE_STRING) ++ if (array_type->code () == TYPE_CODE_STRING) + return 1; + - if ((TYPE_CODE (array_type) != TYPE_CODE_ARRAY)) + if ((array_type->code () != TYPE_CODE_ARRAY)) error (_("Can't get dimensions for a non-array type")); diff --git a/gdb/expprint.c b/gdb/expprint.c --- a/gdb/expprint.c +++ b/gdb/expprint.c -@@ -580,17 +580,14 @@ print_subexp_standard (struct expression *exp, int *pos, +@@ -576,17 +576,14 @@ print_subexp_standard (struct expression *exp, int *pos, longest_to_int (exp->elts[pc + 1].longconst); *pos += 2; @@ -521,7 +520,7 @@ diff --git a/gdb/expprint.c b/gdb/expprint.c print_subexp (exp, pos, stream, PREC_ABOVE_COMMA); fputs_filtered (")", stream); return; -@@ -1107,22 +1104,24 @@ dump_subexp_body_standard (struct expression *exp, +@@ -1103,22 +1100,24 @@ dump_subexp_body_standard (struct expression *exp, switch (range_type) { @@ -554,7 +553,7 @@ diff --git a/gdb/expprint.c b/gdb/expprint.c fputs_filtered ("ExclusiveRange 'EXP..EXP'", stream); break; default: -@@ -1130,11 +1129,9 @@ dump_subexp_body_standard (struct expression *exp, +@@ -1126,11 +1125,9 @@ dump_subexp_body_standard (struct expression *exp, break; } @@ -710,18 +709,9 @@ diff --git a/gdb/f-valprint.c b/gdb/f-valprint.c diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c -@@ -936,7 +936,7 @@ create_range_type (struct type *result_type, struct type *index_type, - TYPE_RANGE_DATA (result_type)->high = *high_bound; - TYPE_RANGE_DATA (result_type)->bias = bias; - -- /* Initialize the stride to be a constant, the value will already be zero -+ /* bias the stride to be a constant, the value will already be zero - thanks to the use of TYPE_ZALLOC above. */ - TYPE_RANGE_DATA (result_type)->stride.kind = PROP_CONST; - -@@ -1001,7 +1001,8 @@ create_static_range_type (struct type *result_type, struct type *index_type, - high.kind = PROP_CONST; - high.data.const_val = high_bound; +@@ -1006,7 +1006,8 @@ create_static_range_type (struct type *result_type, struct type *index_type, + low.set_const_val (low_bound); + high.set_const_val (high_bound); - result_type = create_range_type (result_type, index_type, &low, &high, 0); + result_type = create_range_type (result_type, index_type, @@ -729,29 +719,13 @@ diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c return result_type; } -@@ -1236,6 +1237,7 @@ create_array_type_with_stride (struct type *result_type, - if (get_discrete_bounds (range_type, &low_bound, &high_bound) < 0) - low_bound = high_bound = 0; - element_type = check_typedef (element_type); -+ - /* Be careful when setting the array length. Ada arrays can be - empty arrays with the high_bound being smaller than the low_bound. - In such cases, the array length should be zero. */ diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h -@@ -803,7 +803,6 @@ struct main_type - /* * Union member used for range types. */ +@@ -1615,6 +1615,15 @@ extern unsigned type_align (struct type *); + space in struct type. */ + extern bool set_type_align (struct type *, ULONGEST); - struct range_bounds *bounds; -- - } flds_bnds; - - /* * Slot to point to additional language-specific fields of this -@@ -1365,6 +1364,15 @@ extern bool set_type_align (struct type *, ULONGEST); - #define TYPE_BIT_STRIDE(range_type) \ - (TYPE_RANGE_DATA(range_type)->stride.data.const_val \ - * (TYPE_RANGE_DATA(range_type)->flag_is_byte_stride ? 8 : 1)) +#define TYPE_BYTE_STRIDE(range_type) \ + TYPE_RANGE_DATA(range_type)->stride.data.const_val +#define TYPE_BYTE_STRIDE_BLOCK(range_type) \ @@ -761,19 +735,36 @@ diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h +#define TYPE_BYTE_STRIDE_KIND(range_type) \ + TYPE_RANGE_DATA(range_type)->stride.kind + - /* Property accessors for the type data location. */ #define TYPE_DATA_LOCATION(thistype) \ -@@ -1400,6 +1408,9 @@ extern bool set_type_align (struct type *, ULONGEST); - TYPE_HIGH_BOUND_UNDEFINED(TYPE_INDEX_TYPE(arraytype)) - #define TYPE_ARRAY_LOWER_BOUND_IS_UNDEFINED(arraytype) \ - TYPE_LOW_BOUND_UNDEFINED(TYPE_INDEX_TYPE(arraytype)) -+#define TYPE_ARRAY_STRIDE_IS_UNDEFINED(arraytype) \ -+ (TYPE_BYTE_STRIDE(TYPE_INDEX_TYPE(arraytype)) == 0) -+ + ((thistype)->dyn_prop (DYN_PROP_DATA_LOCATION)) +@@ -1633,6 +1642,26 @@ extern bool set_type_align (struct type *, ULONGEST); + #define TYPE_ASSOCIATED_PROP(thistype) \ + ((thistype)->dyn_prop (DYN_PROP_ASSOCIATED)) - #define TYPE_ARRAY_UPPER_BOUND_VALUE(arraytype) \ - (TYPE_HIGH_BOUND(TYPE_INDEX_TYPE((arraytype)))) ++/* Accessors for struct range_bounds data attached to an array type's ++ index type. */ ++ ++#define TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED(arraytype) \ ++ ((arraytype)->index_type ()->bounds ()->high.kind () == PROP_UNDEFINED) ++#define TYPE_ARRAY_LOWER_BOUND_IS_UNDEFINED(arraytype) \ ++ (arraytype->index_type ()->bounds ().low.kind () == PROP_UNDEFINED) ++#define TYPE_ARRAY_STRIDE_IS_UNDEFINED(arraytype) \ ++ (TYPE_BYTE_STRIDE(arraytype->index_type ()) == 0) ++ ++ ++#define TYPE_ARRAY_UPPER_BOUND_VALUE(arraytype) \ ++ (TYPE_HIGH_BOUND((arraytype)->index_type ())) ++ ++#define TYPE_ARRAY_LOWER_BOUND_VALUE(arraytype) \ ++ (TYPE_LOW_BOUND((arraytype)->index_type ())) ++ ++#define TYPE_ARRAY_BIT_STRIDE(arraytype) \ ++ (TYPE_BIT_STRIDE((arraytype)->index_type ())) ++ + /* C++ */ + + #define TYPE_SELF_TYPE(thistype) internal_type_self_type (thistype) diff --git a/gdb/parse.c b/gdb/parse.c --- a/gdb/parse.c +++ b/gdb/parse.c @@ -856,33 +847,33 @@ diff --git a/gdb/rust-exp.y b/gdb/rust-exp.y diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c --- a/gdb/rust-lang.c +++ b/gdb/rust-lang.c -@@ -1224,13 +1224,11 @@ rust_range (struct expression *exp, int *pos, enum noside noside) +@@ -1082,13 +1082,11 @@ rust_range (struct expression *exp, int *pos, enum noside noside) kind = (enum range_type) longest_to_int (exp->elts[*pos + 1].longconst); *pos += 3; - if (kind == HIGH_BOUND_DEFAULT || kind == NONE_BOUND_DEFAULT - || kind == NONE_BOUND_DEFAULT_EXCLUSIVE) + if ((kind & SUBARRAY_LOW_BOUND) == SUBARRAY_LOW_BOUND) - low = evaluate_subexp (NULL_TYPE, exp, pos, noside); + low = evaluate_subexp (nullptr, exp, pos, noside); - if (kind == LOW_BOUND_DEFAULT || kind == LOW_BOUND_DEFAULT_EXCLUSIVE - || kind == NONE_BOUND_DEFAULT || kind == NONE_BOUND_DEFAULT_EXCLUSIVE) + if ((kind & SUBARRAY_HIGH_BOUND) == SUBARRAY_HIGH_BOUND) - high = evaluate_subexp (NULL_TYPE, exp, pos, noside); + high = evaluate_subexp (nullptr, exp, pos, noside); - bool inclusive = (kind == NONE_BOUND_DEFAULT || kind == LOW_BOUND_DEFAULT); + bool inclusive = (!((kind & SUBARRAY_HIGH_BOUND_EXCLUSIVE) == SUBARRAY_HIGH_BOUND_EXCLUSIVE)); if (noside == EVAL_SKIP) return value_from_longest (builtin_type (exp->gdbarch)->builtin_int, 1); -@@ -1319,7 +1317,7 @@ rust_compute_range (struct type *type, struct value *range, +@@ -1177,7 +1175,7 @@ rust_compute_range (struct type *type, struct value *range, *low = 0; *high = 0; - *kind = BOTH_BOUND_DEFAULT; + *kind = SUBARRAY_NONE_BOUND; - if (TYPE_NFIELDS (type) == 0) + if (type->num_fields () == 0) return; -@@ -1327,15 +1325,14 @@ rust_compute_range (struct type *type, struct value *range, +@@ -1185,15 +1183,14 @@ rust_compute_range (struct type *type, struct value *range, i = 0; if (strcmp (TYPE_FIELD_NAME (type, 0), "start") == 0) { @@ -891,7 +882,7 @@ diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c *low = value_as_long (value_field (range, 0)); ++i; } - if (TYPE_NFIELDS (type) > i + if (type->num_fields () > i && strcmp (TYPE_FIELD_NAME (type, i), "end") == 0) { - *kind = (*kind == BOTH_BOUND_DEFAULT @@ -900,7 +891,7 @@ diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c *high = value_as_long (value_field (range, i)); if (rust_inclusive_range_type_p (type)) -@@ -1353,7 +1350,7 @@ rust_subscript (struct expression *exp, int *pos, enum noside noside, +@@ -1211,7 +1208,7 @@ rust_subscript (struct expression *exp, int *pos, enum noside noside, struct type *rhstype; LONGEST low, high_bound; /* Initialized to appease the compiler. */ @@ -909,7 +900,7 @@ diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c LONGEST high = 0; int want_slice = 0; -@@ -1451,7 +1448,7 @@ rust_subscript (struct expression *exp, int *pos, enum noside noside, +@@ -1309,7 +1306,7 @@ rust_subscript (struct expression *exp, int *pos, enum noside noside, error (_("Cannot subscript non-array type")); if (want_slice @@ -918,7 +909,7 @@ diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c low = low_bound; if (low < 0) error (_("Index less than zero")); -@@ -1469,7 +1466,7 @@ rust_subscript (struct expression *exp, int *pos, enum noside noside, +@@ -1327,7 +1324,7 @@ rust_subscript (struct expression *exp, int *pos, enum noside noside, CORE_ADDR addr; struct value *addrval, *tem; @@ -1416,7 +1407,7 @@ new file mode 100644 diff --git a/gdb/testsuite/gdb.fortran/vla-sizeof.exp b/gdb/testsuite/gdb.fortran/vla-sizeof.exp --- a/gdb/testsuite/gdb.fortran/vla-sizeof.exp +++ b/gdb/testsuite/gdb.fortran/vla-sizeof.exp -@@ -32,7 +32,8 @@ gdb_test "print sizeof(vla1)" " = 0" "print sizeof non-allocated vla1" +@@ -35,7 +35,8 @@ gdb_test "print sizeof(vla1)" " = 0" "print sizeof non-allocated vla1" gdb_test "print sizeof(vla1(3,2,1))" \ "no such vector element \\(vector not allocated\\)" \ "print sizeof non-allocated indexed vla1" @@ -1426,7 +1417,7 @@ diff --git a/gdb/testsuite/gdb.fortran/vla-sizeof.exp b/gdb/testsuite/gdb.fortra "print sizeof non-allocated sliced vla1" # Try to access value in allocated VLA -@@ -41,7 +42,7 @@ gdb_continue_to_breakpoint "vla1-allocated" +@@ -44,7 +45,7 @@ gdb_continue_to_breakpoint "vla1-allocated" gdb_test "print sizeof(vla1)" " = 4000" "print sizeof allocated vla1" gdb_test "print sizeof(vla1(3,2,1))" "4" \ "print sizeof element from allocated vla1" @@ -1435,7 +1426,7 @@ diff --git a/gdb/testsuite/gdb.fortran/vla-sizeof.exp b/gdb/testsuite/gdb.fortra "print sizeof sliced vla1" # Try to access values in undefined pointer to VLA (dangling) -@@ -49,7 +50,8 @@ gdb_test "print sizeof(pvla)" " = 0" "print sizeof non-associated pvla" +@@ -52,7 +53,8 @@ gdb_test "print sizeof(pvla)" " = 0" "print sizeof non-associated pvla" gdb_test "print sizeof(pvla(3,2,1))" \ "no such vector element \\(vector not associated\\)" \ "print sizeof non-associated indexed pvla" @@ -1445,7 +1436,7 @@ diff --git a/gdb/testsuite/gdb.fortran/vla-sizeof.exp b/gdb/testsuite/gdb.fortra "print sizeof non-associated sliced pvla" # Try to access values in pointer to VLA and compare them -@@ -58,7 +60,8 @@ gdb_continue_to_breakpoint "pvla-associated" +@@ -61,7 +63,8 @@ gdb_continue_to_breakpoint "pvla-associated" gdb_test "print sizeof(pvla)" " = 4000" "print sizeof associated pvla" gdb_test "print sizeof(pvla(3,2,1))" "4" \ "print sizeof element from associated pvla" @@ -1544,7 +1535,7 @@ new file mode 100644 diff --git a/gdb/valops.c b/gdb/valops.c --- a/gdb/valops.c +++ b/gdb/valops.c -@@ -3797,13 +3797,42 @@ value_of_this_silent (const struct language_defn *lang) +@@ -3756,13 +3756,42 @@ value_of_this_silent (const struct language_defn *lang) struct value * value_slice (struct value *array, int lowbound, int length) @@ -1588,25 +1579,25 @@ diff --git a/gdb/valops.c b/gdb/valops.c - array_type = check_typedef (value_type (array)); + /* Check for legacy code if we are actually dealing with an array or + string. */ - if (TYPE_CODE (array_type) != TYPE_CODE_ARRAY - && TYPE_CODE (array_type) != TYPE_CODE_STRING) + if (array_type->code () != TYPE_CODE_ARRAY + && array_type->code () != TYPE_CODE_STRING) error (_("cannot take slice of non-array")); -@@ -3813,45 +3842,155 @@ value_slice (struct value *array, int lowbound, int length) +@@ -3772,45 +3801,155 @@ value_slice (struct value *array, int lowbound, int length) if (type_not_associated (array_type)) error (_("array not associated")); -- range_type = TYPE_INDEX_TYPE (array_type); +- range_type = array_type->index_type (); - if (get_discrete_bounds (range_type, &lowerbound, &upperbound) < 0) - error (_("slice from bad array or bitstring")); -+ ary_low_bound = TYPE_LOW_BOUND (TYPE_INDEX_TYPE (array_type)); -+ ary_high_bound = TYPE_HIGH_BOUND (TYPE_INDEX_TYPE (array_type)); ++ ary_low_bound = array_type->index_type ()->bounds ()->low.const_val (); ++ ary_high_bound = array_type->index_type ()->bounds ()->high.const_val (); + + /* When we are working on a multi-dimensional array, we need to get the + attributes of the underlying type. */ + if (call_count > 1) + { -+ ary_low_bound = TYPE_LOW_BOUND (TYPE_INDEX_TYPE (elt_type)); -+ ary_high_bound = TYPE_HIGH_BOUND (TYPE_INDEX_TYPE (elt_type)); ++ ary_low_bound = elt_type->index_type ()->bounds ()->low.const_val (); ++ ary_high_bound = elt_type->index_type ()->bounds ()->high.const_val (); + elt_type = check_typedef (TYPE_TARGET_TYPE (elt_type)); + row_count = TYPE_LENGTH (array_type) + / TYPE_LENGTH (TYPE_TARGET_TYPE (array_type)); @@ -1623,12 +1614,12 @@ diff --git a/gdb/valops.c b/gdb/valops.c + + elt_size = TYPE_LENGTH (elt_type); + elt_offs = lowbound - ary_low_bound; ++ ++ elt_offs *= elt_size; - if (lowbound < lowerbound || length < 0 - || lowbound + length - 1 > upperbound) - error (_("slice out of range")); -+ elt_offs *= elt_size; -+ + /* Check for valid user input. In case of Fortran this was already done + in the calling function. */ + if (call_count == 1 @@ -1642,7 +1633,7 @@ diff --git a/gdb/valops.c b/gdb/valops.c + array by setting slice_range_size. */ + if (call_count == 1) + { -+ range_type = TYPE_INDEX_TYPE (array_type); ++ range_type = array_type->index_type (); + slice_range_size = ary_low_bound + elem_count - 1; + + /* Check if the array bounds are valid. */ @@ -1654,9 +1645,9 @@ diff --git a/gdb/valops.c b/gdb/valops.c + accordingly. */ + else + { -+ range_type = TYPE_INDEX_TYPE (TYPE_TARGET_TYPE (array_type)); ++ range_type = TYPE_TARGET_TYPE (array_type)->index_type (); + slice_range_size = ary_low_bound + (row_count * elem_count) - 1; -+ ary_low_bound = TYPE_LOW_BOUND (range_type); ++ ary_low_bound = range_type->bounds ()->low.const_val (); + } /* FIXME-type-allocation: need a way to free this type when we are @@ -1674,7 +1665,11 @@ diff --git a/gdb/valops.c b/gdb/valops.c - LONGEST offset - = (lowbound - lowerbound) * TYPE_LENGTH (check_typedef (element_type)); + struct type *element_type; -+ + +- slice_type = create_array_type (NULL, +- element_type, +- slice_range_type); +- slice_type->set_code (array_type->code ()); + /* When both CALL_COUNT and STRIDE_LENGTH equal 1, we can use the legacy + code for subarrays. */ + if (call_count == 1 && stride_length == 1) @@ -1682,12 +1677,8 @@ diff --git a/gdb/valops.c b/gdb/valops.c + element_type = TYPE_TARGET_TYPE (array_type); + + slice_type = create_array_type (NULL, element_type, slice_range_type); - -- slice_type = create_array_type (NULL, -- element_type, -- slice_range_type); -- TYPE_CODE (slice_type) = TYPE_CODE (array_type); -+ TYPE_CODE (slice_type) = TYPE_CODE (array_type); ++ ++ slice_type->set_code (array_type->code ()); - if (VALUE_LVAL (array) == lval_memory && value_lazy (array)) - slice = allocate_value_lazy (slice_type); @@ -1731,12 +1722,12 @@ diff --git a/gdb/valops.c b/gdb/valops.c + + slice_type = create_array_type (NULL, element_type, slice_range_type); + -+ /* If we have a one dimensional array, we copy its TYPE_CODE. For a -+ multi dimensional array we copy the embedded type's TYPE_CODE. */ ++ /* If we have a one dimensional array, we copy its type code. For a ++ multi dimensional array we copy the embedded type's type code. */ + if (call_count == 1) -+ TYPE_CODE (slice_type) = TYPE_CODE (array_type); ++ slice_type->set_code (array_type->code ()); + else -+ TYPE_CODE (slice_type) = TYPE_CODE (TYPE_TARGET_TYPE (array_type)); ++ slice_type->set_code ((TYPE_TARGET_TYPE (array_type)->code ())); + + v = allocate_value (slice_type); + @@ -1772,16 +1763,16 @@ diff --git a/gdb/valops.c b/gdb/valops.c + return v; } - /* Create a value for a FORTRAN complex number. Currently most of the + /* See value.h. */ diff --git a/gdb/value.h b/gdb/value.h --- a/gdb/value.h +++ b/gdb/value.h -@@ -1145,6 +1145,8 @@ extern struct value *varying_to_slice (struct value *); +@@ -1144,6 +1144,8 @@ extern struct value *varying_to_slice (struct value *); extern struct value *value_slice (struct value *, int, int); +extern struct value *value_slice_1 (struct value *, int, int, int, int); + - extern struct value *value_literal_complex (struct value *, struct value *, - struct type *); - + /* Create a complex number. The type is the complex type; the values + are cast to the underlying scalar type before the complex number is + created. */ diff --git a/gdb-vla-intel-fortran-vla-strings.patch b/gdb-vla-intel-fortran-vla-strings.patch index deea4b5..1e48ee8 100644 --- a/gdb-vla-intel-fortran-vla-strings.patch +++ b/gdb-vla-intel-fortran-vla-strings.patch @@ -33,7 +33,7 @@ git diff --stat -p gdb/master...gdb/users/bheckel/fortran-vla-strings diff --git a/gdb/NEWS b/gdb/NEWS --- a/gdb/NEWS +++ b/gdb/NEWS -@@ -805,6 +805,8 @@ SH-5/SH64 running OpenBSD SH-5/SH64 support in sh*-*-openbsd* +@@ -985,6 +985,8 @@ SH-5/SH64 running OpenBSD SH-5/SH64 support in sh*-*-openbsd* *** Changes in GDB 8.1 @@ -45,11 +45,11 @@ diff --git a/gdb/NEWS b/gdb/NEWS diff --git a/gdb/c-valprint.c b/gdb/c-valprint.c --- a/gdb/c-valprint.c +++ b/gdb/c-valprint.c -@@ -649,6 +649,28 @@ c_value_print (struct value *val, struct ui_file *stream, +@@ -572,6 +572,28 @@ c_value_print (struct value *val, struct ui_file *stream, else { /* normal case */ -+ if (TYPE_CODE (type) == TYPE_CODE_PTR ++ if (type->code () == TYPE_CODE_PTR + && 1 == is_dynamic_type (type)) + { + CORE_ADDR addr; @@ -64,7 +64,7 @@ diff --git a/gdb/c-valprint.c b/gdb/c-valprint.c + && (0 == type_not_associated (type))) + TYPE_TARGET_TYPE (type) = + resolve_dynamic_type (TYPE_TARGET_TYPE (type), -+ NULL, addr); ++ {}, addr); + } + else + { @@ -74,10 +74,10 @@ diff --git a/gdb/c-valprint.c b/gdb/c-valprint.c fprintf_filtered (stream, "("); type_print (value_type (val), "", stream, -1); fprintf_filtered (stream, ") "); -diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c ---- a/gdb/dwarf2read.c -+++ b/gdb/dwarf2read.c -@@ -1827,7 +1827,10 @@ static void read_signatured_type (struct signatured_type *); +diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c +--- a/gdb/dwarf2/read.c ++++ b/gdb/dwarf2/read.c +@@ -1562,7 +1562,10 @@ static void read_signatured_type (signatured_type *sig_type, static int attr_to_dynamic_prop (const struct attribute *attr, struct die_info *die, struct dwarf2_cu *cu, @@ -89,16 +89,25 @@ diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c /* memory allocation interface */ -@@ -13799,7 +13802,7 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu) +@@ -13631,7 +13634,7 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu) newobj->static_link = XOBNEW (&objfile->objfile_obstack, struct dynamic_prop); attr_to_dynamic_prop (attr, die, cu, newobj->static_link, -- dwarf2_per_cu_addr_type (cu->per_cu)); -+ dwarf2_per_cu_addr_type (cu->per_cu), NULL, 0); +- cu->addr_type ()); ++ cu->addr_type (), NULL, 0); } cu->list_in_scope = cu->get_builder ()->get_local_symbols (); -@@ -16565,7 +16568,7 @@ read_array_type (struct die_info *die, struct dwarf2_cu *cu) +@@ -16073,7 +16076,7 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu) + else + { + struct dynamic_prop prop; +- if (attr_to_dynamic_prop (attr, die, cu, &prop, cu->addr_type ())) ++ if (attr_to_dynamic_prop (attr, die, cu, &prop, cu->addr_type (), NULL, 0)) + type->add_dyn_prop (DYN_PROP_BYTE_SIZE, prop); + TYPE_LENGTH (type) = 0; + } +@@ -16764,7 +16767,7 @@ read_array_type (struct die_info *die, struct dwarf2_cu *cu) byte_stride_prop = (struct dynamic_prop *) alloca (sizeof (struct dynamic_prop)); stride_ok = attr_to_dynamic_prop (attr, die, cu, byte_stride_prop, @@ -107,7 +116,7 @@ diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c if (!stride_ok) { complaint (_("unable to read array DW_AT_byte_stride " -@@ -17325,7 +17328,7 @@ read_tag_string_type (struct die_info *die, struct dwarf2_cu *cu) +@@ -17522,7 +17525,7 @@ read_tag_string_type (struct die_info *die, struct dwarf2_cu *cu) struct attribute *attr; struct dynamic_prop prop; bool length_is_constant = true; @@ -116,7 +125,7 @@ diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c /* There are a couple of places where bit sizes might be made use of when parsing a DW_TAG_string_type, however, no producer that we know -@@ -17346,6 +17349,10 @@ read_tag_string_type (struct die_info *die, struct dwarf2_cu *cu) +@@ -17543,6 +17546,10 @@ read_tag_string_type (struct die_info *die, struct dwarf2_cu *cu) } } @@ -125,9 +134,9 @@ diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c + + /* If DW_AT_string_length is defined, the length is stored in memory. */ attr = dwarf2_attr (die, DW_AT_string_length, cu); - if (attr != nullptr && !attr_form_is_constant (attr)) + if (attr != nullptr && !attr->form_is_constant ()) { -@@ -17372,13 +17379,71 @@ read_tag_string_type (struct die_info *die, struct dwarf2_cu *cu) +@@ -17569,13 +17576,68 @@ read_tag_string_type (struct die_info *die, struct dwarf2_cu *cu) } /* Convert the attribute into a dynamic property. */ @@ -139,7 +148,7 @@ diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c } else if (attr != nullptr) { -+ if (attr_form_is_block (attr)) ++ if (attr->form_is_block ()) + { + struct attribute *byte_size, *bit_size; + struct dynamic_prop high; @@ -189,18 +198,15 @@ diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c + complaint (_("Could not parse DW_AT_string_length")); + } + -+ TYPE_RANGE_DATA (range_type)->high = high; ++ range_type->bounds ()->high = high; + } + else -+ { -+ TYPE_HIGH_BOUND (range_type) = DW_UNSND(attr); -+ TYPE_HIGH_BOUND_KIND (range_type) = PROP_CONST; -+ } ++ range_type->bounds ()->high.set_const_val (DW_UNSND(attr)); + /* This DW_AT_string_length just contains the length with no indirection. There's no need to create a dynamic property in this case. Pass 0 for the default value as we know it will not be -@@ -17392,6 +17457,20 @@ read_tag_string_type (struct die_info *die, struct dwarf2_cu *cu) +@@ -17589,6 +17651,14 @@ read_tag_string_type (struct die_info *die, struct dwarf2_cu *cu) } else { @@ -208,28 +214,22 @@ diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c + in this case. */ + attr = dwarf2_attr (die, DW_AT_byte_size, cu); + if (attr) -+ { -+ TYPE_HIGH_BOUND (range_type) = DW_UNSND(attr); -+ TYPE_HIGH_BOUND_KIND (range_type) = PROP_CONST; -+ } ++ range_type->bounds ()->high.set_const_val (DW_UNSND(attr)); + else -+ { -+ TYPE_HIGH_BOUND (range_type) = 1; -+ TYPE_HIGH_BOUND_KIND (range_type) = PROP_CONST; -+ } ++ range_type->bounds ()->high.set_const_val (1); + /* Use 1 as a fallback length if we have nothing else. */ length = 1; } -@@ -17407,6 +17486,7 @@ read_tag_string_type (struct die_info *die, struct dwarf2_cu *cu) - low_bound.data.const_val = 1; +@@ -17603,6 +17673,7 @@ read_tag_string_type (struct die_info *die, struct dwarf2_cu *cu) + low_bound.set_const_val (1); range_type = create_range_type (NULL, index_type, &low_bound, &prop, 0); } + char_type = language_string_char_type (cu->language_defn, gdbarch); type = create_string_type (NULL, char_type, range_type); -@@ -17858,7 +17938,8 @@ read_base_type (struct die_info *die, struct dwarf2_cu *cu) +@@ -18078,7 +18149,8 @@ read_base_type (struct die_info *die, struct dwarf2_cu *cu) static int attr_to_dynamic_prop (const struct attribute *attr, struct die_info *die, struct dwarf2_cu *cu, struct dynamic_prop *prop, @@ -238,18 +238,17 @@ diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c + const gdb_byte *additional_data, int additional_data_size) { struct dwarf2_property_baton *baton; - struct obstack *obstack -@@ -17885,9 +17966,30 @@ attr_to_dynamic_prop (const struct attribute *attr, struct die_info *die, - baton->locexpr.is_reference = false; + dwarf2_per_objfile *per_objfile = cu->per_objfile; +@@ -18108,6 +18180,26 @@ attr_to_dynamic_prop (const struct attribute *attr, struct die_info *die, break; } -+ + + if (additional_data != NULL && additional_data_size > 0) + { + gdb_byte *data; + + data = (gdb_byte *) obstack_alloc( -+ &cu->per_cu->dwarf2_per_objfile->objfile->objfile_obstack, ++ &cu->per_objfile->objfile->objfile_obstack, + DW_BLOCK (attr)->size + additional_data_size); + memcpy (data, DW_BLOCK (attr)->data, DW_BLOCK (attr)->size); + memcpy (data + DW_BLOCK (attr)->size, additional_data, @@ -264,17 +263,13 @@ diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c + baton->locexpr.size = DW_BLOCK (attr)->size; + } + - prop->data.baton = baton; - prop->kind = PROP_LOCEXPR; -- gdb_assert (prop->data.baton != NULL); -+ gdb_assert(prop->data.baton != NULL); + prop->set_locexpr (baton); + gdb_assert (prop->baton () != NULL); } - else if (attr_form_is_ref (attr)) - { -@@ -17920,9 +18022,29 @@ attr_to_dynamic_prop (const struct attribute *attr, struct die_info *die, - baton = XOBNEW (obstack, struct dwarf2_property_baton); +@@ -18142,11 +18234,31 @@ attr_to_dynamic_prop (const struct attribute *attr, struct die_info *die, baton->property_type = die_type (target_die, target_cu); baton->locexpr.per_cu = cu->per_cu; + baton->locexpr.per_objfile = per_objfile; - baton->locexpr.size = DW_BLOCK (target_attr)->size; - baton->locexpr.data = DW_BLOCK (target_attr)->data; baton->locexpr.is_reference = true; @@ -283,7 +278,7 @@ diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c + { + gdb_byte *data; + -+ data = (gdb_byte *) obstack_alloc (&cu->per_cu->dwarf2_per_objfile->objfile->objfile_obstack, ++ data = (gdb_byte *) obstack_alloc (&cu->per_objfile->objfile->objfile_obstack, + DW_BLOCK (target_attr)->size + additional_data_size); + memcpy (data, DW_BLOCK (target_attr)->data, + DW_BLOCK (target_attr)->size); @@ -300,10 +295,13 @@ diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c + baton->locexpr.size = DW_BLOCK (target_attr)->size; + } + - prop->data.baton = baton; - prop->kind = PROP_LOCEXPR; - gdb_assert (prop->data.baton != NULL); -@@ -18099,8 +18221,8 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) + prop->set_locexpr (baton); +- gdb_assert (prop->baton () != NULL); ++ gdb_assert (prop->baton() != NULL); + } + else + { +@@ -18308,8 +18420,8 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) } attr = dwarf2_attr (die, DW_AT_lower_bound, cu); @@ -314,7 +312,7 @@ diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c else if (!low_default_is_valid) complaint (_("Missing DW_AT_lower_bound " "- DIE at %s [in module %s]"), -@@ -18109,10 +18231,10 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) +@@ -18318,10 +18430,10 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) struct attribute *attr_ub, *attr_count; attr = attr_ub = dwarf2_attr (die, DW_AT_upper_bound, cu); @@ -326,80 +324,54 @@ diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c + if (attr_to_dynamic_prop (attr, die, cu, &high, base_type, NULL, 0)) { /* If bounds are constant do the final calculation here. */ - if (low.kind == PROP_CONST && high.kind == PROP_CONST) -@@ -18164,7 +18286,7 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) - struct type *prop_type - = dwarf2_per_cu_addr_sized_int_type (cu->per_cu, false); + if (low.kind () == PROP_CONST && high.kind () == PROP_CONST) +@@ -18372,7 +18484,7 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) + { + struct type *prop_type = cu->addr_sized_int_type (false); attr_to_dynamic_prop (attr_byte_stride, die, cu, &byte_stride_prop, - prop_type); + prop_type, NULL, 0); } struct dynamic_prop bit_stride_prop; -@@ -18185,7 +18307,7 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) - struct type *prop_type - = dwarf2_per_cu_addr_sized_int_type (cu->per_cu, false); +@@ -18392,7 +18504,7 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu) + { + struct type *prop_type = cu->addr_sized_int_type (false); attr_to_dynamic_prop (attr_bit_stride, die, cu, &bit_stride_prop, - prop_type); + prop_type, NULL, 0); } } -@@ -25879,7 +26001,7 @@ set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu) +@@ -24424,7 +24536,7 @@ set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu) + if (attr != NULL) { - struct type *prop_type - = dwarf2_per_cu_addr_sized_int_type (cu->per_cu, false); + struct type *prop_type = cu->addr_sized_int_type (false); - if (attr_to_dynamic_prop (attr, die, cu, &prop, prop_type)) + if (attr_to_dynamic_prop (attr, die, cu, &prop, prop_type, NULL, 0)) - add_dyn_prop (DYN_PROP_ALLOCATED, prop, type); + type->add_dyn_prop (DYN_PROP_ALLOCATED, prop); } - else if (attr != NULL) -@@ -25895,7 +26017,7 @@ set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu) + +@@ -24433,13 +24545,13 @@ set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu) + if (attr != NULL) { - struct type *prop_type - = dwarf2_per_cu_addr_sized_int_type (cu->per_cu, false); + struct type *prop_type = cu->addr_sized_int_type (false); - if (attr_to_dynamic_prop (attr, die, cu, &prop, prop_type)) + if (attr_to_dynamic_prop (attr, die, cu, &prop, prop_type, NULL, 0)) - add_dyn_prop (DYN_PROP_ASSOCIATED, prop, type); + type->add_dyn_prop (DYN_PROP_ASSOCIATED, prop); } - else if (attr != NULL) -@@ -25908,7 +26030,7 @@ set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu) + /* Read DW_AT_data_location and set in type. */ attr = dwarf2_attr (die, DW_AT_data_location, cu); - if (attr_to_dynamic_prop (attr, die, cu, &prop, -- dwarf2_per_cu_addr_type (cu->per_cu))) -+ dwarf2_per_cu_addr_type (cu->per_cu), NULL, 0)) - add_dyn_prop (DYN_PROP_DATA_LOCATION, prop, type); +- if (attr_to_dynamic_prop (attr, die, cu, &prop, cu->addr_type ())) ++ if (attr_to_dynamic_prop (attr, die, cu, &prop, cu->addr_type (), NULL, 0)) + type->add_dyn_prop (DYN_PROP_DATA_LOCATION, prop); - if (dwarf2_per_objfile->die_type_hash == NULL) + if (per_objfile->die_type_hash == NULL) diff --git a/gdb/f-typeprint.c b/gdb/f-typeprint.c --- a/gdb/f-typeprint.c +++ b/gdb/f-typeprint.c -@@ -197,15 +197,14 @@ f_type_print_varspec_suffix (struct type *type, struct ui_file *stream, - print_rank_only = true; - else if ((TYPE_ASSOCIATED_PROP (type) - && PROP_CONST != TYPE_DYN_PROP_KIND (TYPE_ASSOCIATED_PROP (type))) -- || (TYPE_ALLOCATED_PROP (type) -- && PROP_CONST != TYPE_DYN_PROP_KIND (TYPE_ALLOCATED_PROP (type))) -- || (TYPE_DATA_LOCATION (type) -- && PROP_CONST != TYPE_DYN_PROP_KIND (TYPE_DATA_LOCATION (type)))) -- { -- /* This case exist when we ptype a typename which has the dynamic -- properties but cannot be resolved as there is no object. */ -- print_rank_only = true; -- } -+ || (TYPE_ALLOCATED_PROP (type) -+ && PROP_CONST != TYPE_DYN_PROP_KIND (TYPE_ALLOCATED_PROP (type))) -+ || (TYPE_DATA_LOCATION (type) -+ && PROP_CONST != TYPE_DYN_PROP_KIND (TYPE_DATA_LOCATION (type)))) -+ /* This case exist when we ptype a typename which has the -+ dynamic properties but cannot be resolved as there is -+ no object. */ -+ print_rank_only = true; - - if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_ARRAY) - f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, -@@ -217,8 +216,9 @@ f_type_print_varspec_suffix (struct type *type, struct ui_file *stream, +@@ -217,8 +217,9 @@ f_type_print_varspec_suffix (struct type *type, struct ui_file *stream, else { LONGEST lower_bound = f77_get_lowerbound (type); @@ -410,7 +382,7 @@ diff --git a/gdb/f-typeprint.c b/gdb/f-typeprint.c /* Make sure that, if we have an assumed size array, we print out a warning and print the upperbound as '*'. */ -@@ -229,7 +229,7 @@ f_type_print_varspec_suffix (struct type *type, struct ui_file *stream, +@@ -229,7 +230,7 @@ f_type_print_varspec_suffix (struct type *type, struct ui_file *stream, { LONGEST upper_bound = f77_get_upperbound (type); @@ -419,7 +391,7 @@ diff --git a/gdb/f-typeprint.c b/gdb/f-typeprint.c } } -@@ -249,7 +249,7 @@ f_type_print_varspec_suffix (struct type *type, struct ui_file *stream, +@@ -249,7 +250,7 @@ f_type_print_varspec_suffix (struct type *type, struct ui_file *stream, case TYPE_CODE_REF: f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 1, 0, arrayprint_recurse_level, false); @@ -431,17 +403,17 @@ diff --git a/gdb/f-typeprint.c b/gdb/f-typeprint.c diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c -@@ -1939,7 +1939,8 @@ is_dynamic_type_internal (struct type *type, int top_level) +@@ -1977,7 +1977,8 @@ is_dynamic_type_internal (struct type *type, int top_level) type = check_typedef (type); /* We only want to recognize references at the outermost level. */ -- if (top_level && TYPE_CODE (type) == TYPE_CODE_REF) +- if (top_level && type->code () == TYPE_CODE_REF) + if (top_level && -+ (TYPE_CODE (type) == TYPE_CODE_REF || TYPE_CODE (type) == TYPE_CODE_PTR)) ++ (type->code () == TYPE_CODE_REF || type-> code() == TYPE_CODE_PTR)) type = check_typedef (TYPE_TARGET_TYPE (type)); /* Types that have a dynamic TYPE_DATA_LOCATION are considered -@@ -1972,10 +1973,10 @@ is_dynamic_type_internal (struct type *type, int top_level) +@@ -2017,10 +2018,10 @@ is_dynamic_type_internal (struct type *type, int top_level) || is_dynamic_type_internal (TYPE_TARGET_TYPE (type), 0)); } @@ -451,26 +423,26 @@ diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c case TYPE_CODE_ARRAY: + case TYPE_CODE_STRING: { - gdb_assert (TYPE_NFIELDS (type) == 1); + gdb_assert (type->num_fields () == 1); -@@ -2139,11 +2140,15 @@ resolve_dynamic_array_or_string (struct type *type, +@@ -2183,11 +2184,15 @@ resolve_dynamic_array_or_string (struct type *type, ary_dim = check_typedef (TYPE_TARGET_TYPE (elt_type)); -- if (ary_dim != NULL && TYPE_CODE (ary_dim) == TYPE_CODE_ARRAY) -+ if (ary_dim != NULL && (TYPE_CODE (ary_dim) == TYPE_CODE_ARRAY -+ || TYPE_CODE (ary_dim) == TYPE_CODE_STRING)) +- if (ary_dim != NULL && ary_dim->code () == TYPE_CODE_ARRAY) ++ if (ary_dim != NULL && (ary_dim->code () == TYPE_CODE_ARRAY ++ || ary_dim->code () == TYPE_CODE_STRING)) elt_type = resolve_dynamic_array_or_string (ary_dim, addr_stack); else elt_type = TYPE_TARGET_TYPE (type); -+ if (TYPE_CODE (type) == TYPE_CODE_STRING) ++ if (type->code () == TYPE_CODE_STRING) + return create_string_type (type, elt_type, range_type); + - prop = get_dyn_prop (DYN_PROP_BYTE_STRIDE, type); + prop = type->dyn_prop (DYN_PROP_BYTE_STRIDE); if (prop != NULL) { -@@ -2295,6 +2300,28 @@ resolve_dynamic_struct (struct type *type, +@@ -2533,6 +2538,25 @@ resolve_dynamic_struct (struct type *type, return resolved_type; } @@ -488,10 +460,7 @@ diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c + /* Resolve associated property. */ + prop = TYPE_ASSOCIATED_PROP (type); + if (prop != NULL && dwarf2_evaluate_property (prop, NULL, addr_stack, &value)) -+ { -+ TYPE_DYN_PROP_ADDR (prop) = value; -+ TYPE_DYN_PROP_KIND (prop) = PROP_CONST; -+ } ++ prop->set_const_val (value); + + return type; +} @@ -499,7 +468,7 @@ diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c /* Worker for resolved_dynamic_type. */ static struct type * -@@ -2349,6 +2376,9 @@ resolve_dynamic_type_internal (struct type *type, +@@ -2594,6 +2618,9 @@ resolve_dynamic_type_internal (struct type *type, case TYPE_CODE_ARRAY: resolved_type = resolve_dynamic_array_or_string (type, addr_stack); break; @@ -804,7 +773,7 @@ diff --git a/gdb/testsuite/gdb.fortran/print_type.exp b/gdb/testsuite/gdb.fortra # 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 -@@ -40,7 +41,7 @@ set complex [fortran_complex4] +@@ -42,7 +43,7 @@ set complex [fortran_complex4] # matches the string TYPE. proc check_pointer_type { var_name type } { gdb_test "ptype ${var_name}" \ @@ -813,7 +782,7 @@ diff --git a/gdb/testsuite/gdb.fortran/print_type.exp b/gdb/testsuite/gdb.fortra } gdb_breakpoint [gdb_get_line_number "Before pointer assignment"] -@@ -85,7 +86,8 @@ gdb_test "ptype twop" \ +@@ -87,7 +88,8 @@ gdb_test "ptype twop" \ [multi_line "type = PTR TO -> \\( Type two" \ " $int, allocatable :: ivla1\\(:\\)" \ " $int, allocatable :: ivla2\\(:,:\\)" \ @@ -823,7 +792,7 @@ diff --git a/gdb/testsuite/gdb.fortran/print_type.exp b/gdb/testsuite/gdb.fortra gdb_breakpoint [gdb_get_line_number "After value assignment"] gdb_continue_to_breakpoint "After value assignment" -@@ -97,11 +99,11 @@ gdb_test "ptype intv" "type = $int" +@@ -99,11 +101,11 @@ gdb_test "ptype intv" "type = $int" gdb_test "ptype inta" "type = $int \\(10,2\\)" gdb_test "ptype realv" "type = $real" @@ -840,7 +809,7 @@ diff --git a/gdb/testsuite/gdb.fortran/print_type.exp b/gdb/testsuite/gdb.fortra set test "ptype intap" gdb_test_multiple $test $test { -re "type = $int \\(10,2\\)\r\n$gdb_prompt $" { -@@ -111,4 +113,4 @@ gdb_test_multiple $test $test { +@@ -113,4 +115,4 @@ gdb_test_multiple $test $test { pass $test } } @@ -1001,7 +970,7 @@ new file mode 100644 diff --git a/gdb/testsuite/gdb.fortran/vla-value.exp b/gdb/testsuite/gdb.fortran/vla-value.exp --- a/gdb/testsuite/gdb.fortran/vla-value.exp +++ b/gdb/testsuite/gdb.fortran/vla-value.exp -@@ -35,7 +35,7 @@ gdb_breakpoint [gdb_get_line_number "vla1-init"] +@@ -37,7 +37,7 @@ gdb_breakpoint [gdb_get_line_number "vla1-init"] gdb_continue_to_breakpoint "vla1-init" gdb_test "print vla1" " = " "print non-allocated vla1" gdb_test "print &vla1" \ @@ -1010,7 +979,7 @@ diff --git a/gdb/testsuite/gdb.fortran/vla-value.exp b/gdb/testsuite/gdb.fortran "print non-allocated &vla1" gdb_test "print vla1(1,1,1)" "no such vector element \\\(vector not allocated\\\)" \ "print member in non-allocated vla1 (1)" -@@ -56,7 +56,7 @@ with_timeout_factor 15 { +@@ -58,7 +58,7 @@ with_timeout_factor 15 { "step over value assignment of vla1" } gdb_test "print &vla1" \ @@ -1019,7 +988,7 @@ diff --git a/gdb/testsuite/gdb.fortran/vla-value.exp b/gdb/testsuite/gdb.fortran "print allocated &vla1" gdb_test "print vla1(3, 6, 9)" " = 1311" "print allocated vla1(3,6,9)" gdb_test "print vla1(1, 3, 8)" " = 1311" "print allocated vla1(1,3,8)" -@@ -76,7 +76,7 @@ gdb_test "print vla1(9, 9, 9)" " = 999" \ +@@ -78,7 +78,7 @@ gdb_test "print vla1(9, 9, 9)" " = 999" \ # Try to access values in undefined pointer to VLA (dangling) gdb_test "print pvla" " = " "print undefined pvla" gdb_test "print &pvla" \ @@ -1028,7 +997,7 @@ diff --git a/gdb/testsuite/gdb.fortran/vla-value.exp b/gdb/testsuite/gdb.fortran "print non-associated &pvla" gdb_test "print pvla(1, 3, 8)" "no such vector element \\\(vector not associated\\\)" \ "print undefined pvla(1,3,8)" -@@ -85,7 +85,7 @@ gdb_test "print pvla(1, 3, 8)" "no such vector element \\\(vector not associated +@@ -87,7 +87,7 @@ gdb_test "print pvla(1, 3, 8)" "no such vector element \\\(vector not associated gdb_breakpoint [gdb_get_line_number "pvla-associated"] gdb_continue_to_breakpoint "pvla-associated" gdb_test "print &pvla" \ @@ -1040,7 +1009,7 @@ diff --git a/gdb/testsuite/gdb.fortran/vla-value.exp b/gdb/testsuite/gdb.fortran diff --git a/gdb/typeprint.c b/gdb/typeprint.c --- a/gdb/typeprint.c +++ b/gdb/typeprint.c -@@ -574,6 +574,25 @@ whatis_exp (const char *exp, int show) +@@ -565,6 +565,25 @@ whatis_exp (const char *exp, int show) printf_filtered (" */\n"); } @@ -1048,7 +1017,7 @@ diff --git a/gdb/typeprint.c b/gdb/typeprint.c + additional information about the target. + For example, in Fortran and C we are printing the dimension of the + dynamic array the pointer is pointing to. */ -+ if (TYPE_CODE (type) == TYPE_CODE_PTR ++ if (type->code () == TYPE_CODE_PTR + && is_dynamic_type (type) == 1) + { + CORE_ADDR addr; @@ -1060,7 +1029,7 @@ diff --git a/gdb/typeprint.c b/gdb/typeprint.c + if (addr != 0 + && type_not_associated (type) == 0) + TYPE_TARGET_TYPE (type) = resolve_dynamic_type (TYPE_TARGET_TYPE (type), -+ NULL, addr); ++ {}, addr); + } + LA_PRINT_TYPE (type, "", gdb_stdout, show, 0, &flags); @@ -1070,7 +1039,7 @@ diff --git a/gdb/valops.c b/gdb/valops.c --- a/gdb/valops.c +++ b/gdb/valops.c @@ -1553,6 +1553,19 @@ value_ind (struct value *arg1) - if (TYPE_CODE (base_type) == TYPE_CODE_PTR) + if (base_type->code () == TYPE_CODE_PTR) { struct type *enc_type; + CORE_ADDR addr; @@ -1085,24 +1054,24 @@ diff --git a/gdb/valops.c b/gdb/valops.c + + if (addr != 0) + TYPE_TARGET_TYPE (base_type) = -+ resolve_dynamic_type (TYPE_TARGET_TYPE (base_type), NULL, addr); ++ resolve_dynamic_type (TYPE_TARGET_TYPE (base_type), {}, addr); /* We may be pointing to something embedded in a larger object. Get the real type of the enclosing object. */ -@@ -1568,8 +1581,7 @@ value_ind (struct value *arg1) +@@ -1570,8 +1583,7 @@ value_ind (struct value *arg1) else - /* Retrieve the enclosing object pointed to. */ - arg2 = value_at_lazy (enc_type, -- (value_as_address (arg1) -- - value_pointed_to_offset (arg1))); -+ (addr - value_pointed_to_offset (arg1))); - + { + /* Retrieve the enclosing object pointed to. */ +- base_addr = (value_as_address (arg1) +- - value_pointed_to_offset (arg1)); ++ base_addr = (addr - value_pointed_to_offset (arg1)); + } + arg2 = value_at_lazy (enc_type, base_addr); enc_type = value_type (arg2); - return readjust_indirect_value_type (arg2, enc_type, base_type, arg1); diff --git a/gdb/valprint.c b/gdb/valprint.c --- a/gdb/valprint.c +++ b/gdb/valprint.c -@@ -1149,12 +1149,6 @@ value_check_printable (struct value *val, struct ui_file *stream, +@@ -1046,12 +1046,6 @@ value_check_printable (struct value *val, struct ui_file *stream, return 0; } diff --git a/gdb-vla-intel-stringbt-fix.patch b/gdb-vla-intel-stringbt-fix.patch index aedc7b1..1a2bbb1 100644 --- a/gdb-vla-intel-stringbt-fix.patch +++ b/gdb-vla-intel-stringbt-fix.patch @@ -27,10 +27,10 @@ cannot reproduce it. Thanks, Jan -diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c ---- a/gdb/dwarf2loc.c -+++ b/gdb/dwarf2loc.c -@@ -2154,6 +2154,20 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame, +diff --git a/gdb/dwarf2/loc.c b/gdb/dwarf2/loc.c +--- a/gdb/dwarf2/loc.c ++++ b/gdb/dwarf2/loc.c +@@ -2249,6 +2249,20 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame, ctx.per_cu = per_cu; ctx.obj_address = 0; @@ -50,7 +50,7 @@ diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c + scoped_value_mark free_values; - ctx.gdbarch = get_objfile_arch (objfile); + ctx.gdbarch = per_objfile->objfile->arch (); diff --git a/gdb/testsuite/gdb.fortran/dynamic-other-frame-stub.f90 b/gdb/testsuite/gdb.fortran/dynamic-other-frame-stub.f90 new file mode 100644 --- /dev/null diff --git a/gdb-vla-intel-tests.patch b/gdb-vla-intel-tests.patch index 4814b71..bfde742 100644 --- a/gdb-vla-intel-tests.patch +++ b/gdb-vla-intel-tests.patch @@ -18,12 +18,15 @@ diff --git a/gdb/testsuite/gdb.fortran/ptr-indentation.exp b/gdb/testsuite/gdb.f diff --git a/gdb/testsuite/gdb.fortran/ptype-on-functions.exp b/gdb/testsuite/gdb.fortran/ptype-on-functions.exp --- a/gdb/testsuite/gdb.fortran/ptype-on-functions.exp +++ b/gdb/testsuite/gdb.fortran/ptype-on-functions.exp -@@ -42,4 +42,4 @@ gdb_test "ptype say_numbers" \ +@@ -42,7 +42,7 @@ gdb_test "ptype say_numbers" \ "type = void \\(integer\\(kind=4\\), integer\\(kind=4\\), integer\\(kind=4\\)\\)" gdb_test "ptype fun_ptr" \ - "type = PTR TO -> \\( integer\\(kind=4\\) \\(\\) \\(REF TO -> \\( integer\\(kind=4\\) \\)\\) \\)" + "type = PTR TO -> \\( integer\\(kind=4\\) \\(\\) \\(REF TO -> \\( integer\\(kind=4\\)\\)\\)\\)" + + gdb_test "ptype say_string" \ + "type = void \\(character\\*\\(\\*\\), integer\\(kind=\\d+\\)\\)" diff --git a/gdb/testsuite/gdb.fortran/vla-func.exp b/gdb/testsuite/gdb.fortran/vla-func.exp new file mode 100644 --- /dev/null @@ -169,12 +172,12 @@ new file mode 100644 diff --git a/gdb/testsuite/gdb.fortran/vla-ptr-info.exp b/gdb/testsuite/gdb.fortran/vla-ptr-info.exp --- a/gdb/testsuite/gdb.fortran/vla-ptr-info.exp +++ b/gdb/testsuite/gdb.fortran/vla-ptr-info.exp -@@ -28,5 +28,5 @@ if ![runto_main] { +@@ -33,5 +33,5 @@ set real4 [fortran_real4] # Check the status of a pointer to a dynamic array. gdb_breakpoint [gdb_get_line_number "pvla-associated"] gdb_continue_to_breakpoint "pvla-associated" --gdb_test "print &pvla" " = \\(PTR TO -> \\( real\\(kind=4\\) \\(10,10,10\\) \\)\\) ${hex}" \ -+gdb_test "print &pvla" " = \\(PTR TO -> \\( real\\(kind=4\\) \\(10,10,10\\)\\)\\) ${hex}" \ +-gdb_test "print &pvla" " = \\(PTR TO -> \\( $real4 \\(10,10,10\\) \\)\\) ${hex}" \ ++gdb_test "print &pvla" " = \\(PTR TO -> \\( $real4 \\(10,10,10\\)\\)\\) ${hex}" \ "print pvla pointer information" diff --git a/gdb/testsuite/gdb.fortran/vla-stringsold.exp b/gdb/testsuite/gdb.fortran/vla-stringsold.exp new file mode 100644 diff --git a/gdb.spec b/gdb.spec index ca0845a..b218e62 100644 --- a/gdb.spec +++ b/gdb.spec @@ -31,13 +31,13 @@ Name: %{?scl_prefix}gdb # Freeze it when GDB gets branched %global snapsrc 20200208 # See timestamp of source gnulib installed into gnulib/ . -%global snapgnulib 20191216 +%global snapgnulib 20200630 %global tarname gdb-%{version} -Version: 9.2 +Version: 10.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: 8%{?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. @@ -205,10 +205,6 @@ Patch1119: gdb-testsuite-readline63-sigint-revert.patch #push=Should be pushed upstream. Patch2000: gdb-config.patch -# Fix type mismatch issue exposed by LTO -#push=Should be pushed upstream. -Patch2001: gdb-ltofix.patch - # Include the auto-generated file containing the "Patch:" directives. # See README.local-patches for more details. Patch9998: _gdb.spec.Patch.include @@ -497,7 +493,6 @@ done %endif %patch2000 -p1 -%patch2001 -p1 # The above patches twiddle a .m4 file for configure, so update the affected # configure files @@ -1189,6 +1184,18 @@ fi %endif %changelog +* Wed Nov 04 2020 Kevin Buettner - 10.1-1 +- Rebase to FSF GDB 10.1. +- Bump 'snapgnulib' date. +- Drop gdb-rhbz1818011-bfd-gcc10-error.patch. +- Drop gdb-rhbz1822715-fix-python-deprecation.patch. +- Drop gdb-rhbz1829702-fix-python39.patch. +- Drop gdb-rhbz1838777-debuginfod.patch. +- Drop gdb-rhbz1844458-use-fputX_unfiltered.patch. +- Drop gdb-rhbz1869484-deleted-working-directory. +- Adjust build-id related patches. +- Ajust VLA patches. + * Mon Nov 2 2020 Kevin Buettner - 9.2-8 - Backport patches fixing abort when working directory is deleted. (RHBZ 1869484, Sergio Durigan Junior) diff --git a/sources b/sources index 2a3425d..96507cc 100644 --- a/sources +++ b/sources @@ -1,3 +1,3 @@ SHA512 (gdb-libstdc++-v3-python-8.1.1-20180626.tar.xz) = a8b1c54dd348cfeb37da73f968742896be3dd13a4215f8d8519870c2abea915f5176c3fa6989ddd10f20020a16f0fab20cbae68ee8d58a82234d8778023520f8 SHA512 (v2.0.2.tar.gz) = bc256a57a8481e0be8220624da3ccf1fe4bf0ea83e9808fdf0aad6db865aee402a36e78285efb0316c016f57e0d6fc56b647ee8e9a2ad4b05bfc1ad68ddde535 -SHA512 (gdb-9.2.tar.xz) = 73635f00f343117aa5e2436f1e1597099e2bfb31ef7bb162b273fa1ea282c3fa9b0f52762e70bfc7ad0334addb8d159e9ac7cbe5998ca4f755ea8cf90714d274 +SHA512 (gdb-10.1.tar.xz) = 0dc54380435c6853db60f1e388b94836d294dfa9ad7f518385a27db4edd03cb970f8717d5f1e9c9a0d4a33d7fcf91bc2e5d6c9cf9e4b561dcc74e65b806c1537